| パッケージ | net.user1.reactor.filters |
| インターフェイス | public interface IFilter |
| 実装元 | Filter, FilterSet |
| バージョン : | Reactor 1.0.0 |
IFilterインターフェイスはReactorのフィルタークラスが実装しなくてはならないメソッドを定義します。 フィルタークラスはクライアントの論理集合を指定し、一般的には対象を絞ったメッセージ送信を行う目的で使われます。 たとえば、フィルタークラスは "ミーティングルームにいる全てのモデレーター"、"有名人チャットの全傍聴者"、"ゲーム中で最低スコアを突破した全プレーヤー" などを指定するために使用できます。 Reactorのフィルタークラスはフィルタリングをサポートする全てのクライアントからサーバーへのコマンドで使用できます。主なものはRoomのsendMessage()メソッドのような "クライアントにメッセージ送信" コマンドです。
ビルトインのFilter, AttributeFilter, FilterSetクラスは全てIFilterを実装し、メッセージ用フィルターの生成に使用されます。 AttributeFilterクラスの使用法を実演するようなフィルタリングの例を考えてみましょう。 "red team"と"blue team"という二つのチームに分かれたクライアントが一つのルームに入室しているトリビアゲームを想像してください。 red teamのクライアントが仲間にだけチャットを送信したいときは、red teamを受信者として絞り込むフィルターと一緒にRoomのsendMessage()メソッドを使います。 このフィルターは"team"という名の属性に依存し、その属性はプレーヤーがチームに入ったときには常に設定されなければなりません。 その属性はクライアントのチームを決定し、トリビアゲームのルームをスコープとして持ちます。次のようになります。
clientManager.self().setAttribute("team", "red", "triviaroom");
red teamにメッセージを送信するためには、送信者のクライアントは最初にAttributeFilter(もっとも一般的なフィルターです)を生成します。
var filter:AttributeFilter = new AttributeFilter();
次に、そのクライアントはAttributeComparisonオブジェクトを生成します。これはクライアントがチームチャットを受信するために必ず持たなければいけない属性名と値を指定します。
var comparison:AttributeComparison = new AttributeComparison("triviaroom.team",
"red",
CompareType.EQUAL);
このコードは、あるクライアントがメッセージを受信するために、そのクライアントの"triviaroom.team"属性の値が"red"であることを要求します。 CompareType.EQUALは属性の値における比較の種類を指定します。 他の比較の種類は "等しくない"、"より小さい"、"以下"、"より大きい"、"以上"です。
フィルターにこのAttributeComparisonを追加するには、送信クライアントがそのフィルターのaddComparison()メソッドを使用します:
filter.addComparison(comparison);
そして最後に、クライアントからtriviaルームにそのチャットメッセージを送信します。このsendMessage()コールにフィルターを含めます:
room.sendMessage("TEAMCHAT", true, filter, "Anyone know the answer?");
今度はクライアントが他のチームにメッセージを送りたいと仮定します。ただし、今回はそのチーム内でランキング10以上のエキスパートだけとします。 クライアントは単純に"ranking"比較をフィルターに追加し、メッセージを送信します。 簡略化のために、今回はAttributeComparisonをインラインで作成します。
filter.addComparison(new AttributeComparison("triviaroom.ranking",
10, CompareType.GREATER_THAN_OR_EQUAL));
room.sendMessage("TEAMCHAT", true, filter, "Anyone know the answer?");
例1にコード全体を示します。
例1.redチームのランキング10位以上にのみメッセージを送信
var filter:AttributeFilter = new AttributeFilter();
var comparison:AttributeComparison = new AttributeComparison("triviaroom.team",
"red",
CompareType.EQUAL);
filter.addComparison(comparison);
filter.addComparison(new AttributeComparison("triviaroom.ranking",
10, CompareType.GREATER_THAN_OR_EQUAL));
room.sendMessage("TEAMCHAT", true, filter, "Anyone know the answer?");
例1にある2つの比較はフィルター内で論理"AND"関係にある点に注意してください。 これは、このメッセージはチームが"red"で、かつランキングが10位以上のクライアントにメッセージが送信されるということです。 全ての属性フィルターの比較はAND比較ですが、AndGroupとOrGroupによってネストされたORとANDの比較を生成することができます。 例えば、次ではOrGroupインスタンスを使ってヘルプメッセージを"presentation"ルームにいて"role"属性が"moderator"または"admin"に設定されている全てのクライアントに送ります。 今回は、属性のスコープは"presentation"ルームです。 もう一度、属性フィルターの生成から始めます。
var filter:AttributeFilter = new AttributeFilter();
var orGroup:OrGroup = new OrGroup();
orGroup.addComparison(new AttributeComparison("presentation.role",
"admin",
CompareType.EQUAL));
orGroup.addComparison(new AttributeComparison("presentation.role",
"moderator",
CompareType.EQUAL));
filter.addComparison(orGroup);
room.sendMessage("HELP", false, filter, "How do I change my password?");
例2にコード全体を示します:
例2.モデレーターまたは管理者にメッセージを送信
var filter:AttributeFilter = new AttributeFilter();
var orGroup:OrGroup = new OrGroup();
orGroup.addComparison(new AttributeComparison("presentation.role",
"admin",
CompareType.EQUAL));
orGroup.addComparison(new AttributeComparison("presentation.role",
"moderator",
CompareType.EQUAL));
filter.addComparison(orGroup);
room.sendMessage("HELP", false, filter, "How do I change my password?");
OrGroupオブジェクトはAndGroupオブジェクトと混ぜて複合的な理論関係を生成することができます。 例3では、1分以内にアクティブだったレベル5以上のモデレーター、または1分以内にアクティブだったアドミニストレーターにメッセージを送信する方法を示します。
例3.複合論理フィルター
var filter:AttributeFilter = new AttributeFilter();
var orGroup:OrGroup = new OrGroup();
var andGroup:AndGroup = new AndGroup();
andGroup.addComparison(new AttributeComparison("presentation.role",
"moderator",
CompareType.EQUAL));
andGroup.addComparison(new AttributeComparison("presentation.level",
5,
CompareType.GREATER_THAN_OR_EQUAL));
orGroup.addComparison(andGroup);
orGroup.addComparison(new AttributeComparison("presentation.role",
"admin",
CompareType.EQUAL));
filter.addComparison(orGroup);
filter.addComparison(new AttributeComparison("presentation.lastactive",
60000,
CompareType.LESS_THAN));
room.sendMessage("HELP", false, filter, "How do I change my password?");
複数フィルターはFilterSetオブジェクトを使用して結合することも可能です。
XMLフォーマット
内部的には、フィルターはUnion Filtering Protocol(UFP)として知られるシンプルなXML通信フォーマットで表されます。 次のコードは例1、例2、例3をUFPフォーマットで示します。 このコード中では、fはフィルターを、t="A"はタイプ="Attribute"を、aは属性を、nは名前を、cは比較を意味します。
例1のUFP
<f t="A">
<a c="eq"><n>triviaroom.team</n><v>red</v></a>
<a c="ge"><n>triviaroom.ranking</n><v>10</v></a>
</f>
例2のUFP
<f t="A">
<or>
<a c="eq"><n>presentation.role</n><v>admin</v></a>
<a c="eq"><n>presentation.role</n><v>moderator</v></a>
</or>
</f>
例3のUFP
<f t="A">
<or>
<and>
<a c="eq"><n>presentation.role</n><v>moderator</v></a>
<a c="ge"><n>presentation.level</n><v>5</v></a>
</and>
<a c="eq"><n>presentation.role</n><v>admin</v></a>
</or>
<a c="lt"><n>presentation.lastactive</n><v>60000</v></a>
</f>
theFilter.toXMLString()を使用します。 関連項目
| メソッド | 定義元 | ||
|---|---|---|---|
toXMLString():String このフィルターのXML表現を含むストリングを返します。Union Serverへの転送に適応しています。 | IFilter | ||