前回はカテゴリープロパティのSimpleCategoryPropertyの使い方を見てみました。今回は、もう少し複雑な値を保持できるExtendedCategoryPropertyの使い方を見てみることにします。
ドキュメント
コンポーネントを作成する場合によく読む2つのドキュメントですが・・・
コンポーネント開発者ガイド
コンポーネント/マッパー関数定義ファイル書式ガイド
ExtendedCategoryPropertyについての説明はありません。
そのかわりではありませんが、JavaDocはあります。
ExtendedCategoryProperty
JavaDocの説明に以下のように書いてあります。
行ごとにMapを持ちすべての列の名前と値をそれに保持するCategoryPropertyです。
SimpleCategoryPropertyを継承してます。
そして、getAttributeMapメソッドを持っています。これが肝ですね。
説明には以下のように書いてあります。
名前を指定してその行に対応するMapを取得します。 取得されるMapではキー、値ともにStringです。(Valueオブジェクトではありません。)
SimpleCategoryPropertyにメソッドが追加されているだけということになります。
ということは、SimpleCategoryPropertyと同じように動くのでは?ということで、前回のコードを少し修正してコンポーネントを作成してみます。
xsc定義ファイルではカテゴリープロパティの名前を「ExtendedCategory」へ変更しました。
<Category key="Name" name="ExtendedCategory">
<Property name="Name" toolTip="Name" type="string"/>
<Property name="Type" toolTip="data type" type="choice">
<Value>String</Value>
<ChoiceItem ref="DataType"/>
</Property>
<Property name="Default" toolTip="Default value" type="string"/>
</Category>
使用するクラスが「ExtendedCategoryProperty」になり変数名も「_extendedCategory」に変わりましたが、やってることは同じです。
private ExtendedCategoryProperty _extendedCategory = new ExtendedCategoryProperty("ExtendedCategory");
registerProperty(_extendedCategory);
Iterator it = _extendedCategory.keySet().iterator();
while (it.hasNext()) {
String name = (String)it.next();
String msg = "extended " + name + " = " + _extendedCategory.getValue(name) + _extendedCategory.getValue(name).getType();
context.info(msg);
}
デザイナーで見てみると、SimpleCategoryPropertyのときと同じです。
上記メソッドのように_extendedCategory.getValue(name)で取得するValueオブジェクトの型はTypeで指定した型となります。
xsc定義ファイルでCategoryの「key」と指定したPropertyの値で、Valueオブジェクトで取得するという動作はSimpleCategoryPropertyと同じです。では、ExtendedCategoryPropertyを使う理由は?
もちろんgetAttributeMapメソッドです。
getAttributeMap
このメソッドは「名前を指定してその行に対応するMapを取得します。」という機能です。以下のような場合の動作を見てみます。
「名前を指定して」の「名前」はNameの値になります。
名前だからNameなのではなく、xscファイルで「key="Name"」と定義しているからNameなのだと思いがちですが、ExtendedCategoryPropertyの仕様です。
JavaDocにも書いてないですが、ソースにはSimpleCategoryProperty継承しているからそうだよね的な・・・今回も忘れててややはまりました。
xscファイルで「key="Name"」は何に効いてくるのかといいますと、デザイナーで始めに設定する値で空にできないなどの動作になります。UI以外のカテゴリープロパティの値の持ち方などはJavaのクラスがCategoryPropertyを継承していればどのようにも実装できます。
ちょっと脱線しましたので戻ります。
getAttributeMap("Value1");
で取得できるMapは以下の3つのキー値マッピングを持っています。
キー | 値 |
---|---|
Name | Value1 |
Type | String |
Default | one |
ここで取得できる6つの"Name"、"Value1"、"Type"、"String"、"Default"、"one"は全てStringです。
使い方
ExtendedCategoryPropertyを見てきましたが、使うタイミングとしては、SimpleCategoryPropertyに追加の情報を保持させたくなった場合に使うというのがベストな感じがします。SimpleCategoryPropertyとして作成していれば、Name、Type、Defaultの各プロパティは持っているでしょうから、行の値としてはgetValueメソッドでValueオブジェクトを取得できます。さらに追加したプロパティを取得するときにgetAttributeMapメソッドを使って取得します。
以下の場合、Other1とOther2へ設定された値を取得するのに使用します。
また、上記状態で保存されたxfpファイルを見てみるとName2の行にはOther1アトリビュートが保存されていないことがわかります。よってName2で取得したMapにはキーOther1は存在しませんので、注意してください。
<fe:AdditionalProp name="ExtendedCategory">
<fe:Row Default="One" Name="Name1" Other1="AAA" Other2="BBB" Type="String"/>
<fe:Row Default="2" Name="Name2" Other2="2" Type="Integer"/>
</fe:AdditionalProp>
まとめ
ExtendedCategoryPropertyまで使用すれば、やりたいことはできるのかな~とは思います。いや独自のクラスを作りたい!という方は是非チャレンジしてみてください。