Reflex Core/Reflex Mapperの概要

C.Reflex Core Module

  • ReflexCoreにより、POJOからXMLやJSONにシリアライズ、逆にPOJOからXMLやJSONにデシリアライズできます。
  • これはオリジナルのXStream(http://xstream.codehaus.org/)を拡張し、属性やテキストノード、名前空間の指定などができるようにしています。
  • xstreamのライブラリである xstream-1.1.2.jar およびプルパーサ xpp3-min1.1.3.4.RC8.jarを当ライブラリを追加することで使用できるようになります。
  • https://github.com/reflexworks/reflexcore にオープンソースとして公開しています。

C1.記述ルール

(以降、クラス、プロパティのことをJavaのクラス、fieldとします。また、要素名、属性、名前空間、QNAME、テキストノードはXMLのこととします。)

  • クラス名、プロパティ名がxmlのタグ(要素名)に対応します。プロパティの先頭は大文字(Uppercase)になり、xml/jsonの要素名の先頭はデフォルトでは小文字(Lowercase)となります。
  • シリアライズ(デシリアライズ)対象となるプロパティはpublicでなければなりません。privateのものやgetter/setterなどのmethodは無視されます。また、public fieldでもfinal修飾子が付くものは無視されます。
  • Java5のGenericsをすることで、parent.child.・・.bar のように連結表記で記述できます。
  • 型には、intなどのプリミティブ型の他、String、Dateなどを指定できます。Date型の場合は、ISO8601のタイムゾーン付きフォーマット(拡張表記,+09:00など)になります。
  • 同じクラス名であってもパッケージ名が異なれば違う要素として扱います。例えば、Listfoo.SampleとListbar.Sampleは区別されます。(v1.0)
  • com.google.appengine.api.datastore.Text型をサポートしています。500文字以上になる場合はStringの代わりにText型を使用してください。(v1.0)
  • JSONの配列(二次元)に変換する場合はプロパティfinal int _$$colの値に配列の要素数を設定します。また要素名は定義せず、テキストノード(_$$text)を使用してください。(詳しくは、JSONArrayTest)

C2.XML名前空間の指定

  • 名前空間をJavaのパッケージ名に関連づけします。名前空間とパッケージ名をペアとするパラメータを指定することで複数個の名前空間を指定できます。
  • _$$nsプロパティをつけることで、クラス名に名前空間宣言を付けることができます。JSONでは単に$$nsプロパティになります。
  • _$で始まるプロパティを先頭行から書くことでクラス名に属性を付けることができます。これは名前空間宣言を示す_$$nsプロパティの次の行でかつ要素名を示すプロパティの前の行に書く必要があります。JSONでは単なるプロパティになります。

C3.属性の指定

  • プロパティ名に_$を付けることで属性となります。例えば、entry_$titleとすると、要素entryにtitleという属性が追加されます。JSONでは単なるプロパティになります。
  • プロパティ名では要素名QNAMEの':'の代わりに'$'に置き換えたものになります。例えば、要素名のxmlns:atomはプロパティ名ではxmlns$atomとなります。JSONも同様に$に置き換えたものになります。

C4.テキストノード

  • プロパティ名を_$$textとすることでテキストノードになります。_$$textはどのプロパティより後ろの行になければなりません。JSONでは単なる$textプロパティになります。

C5.特殊文字の変換

  • プロパティの先頭の_(アンダースコア)は無視されます
  • 要素名にハイフン(-)が含まれる場合はクラス、プロパティではアンダースコア2つ(__)に変換されます。CaseSensitiveです。

M.ReflexMapper

  • ReflexMapperは、ソフトスキーマ、つまり、テンプレートによる自由なスキーマ定義を可能にするライブラリです。
  • https://github.com/reflexworks/reflexmapper にオープンソースとして公開しています。

M1.テンプレートとクラスの関係

  • テンプレートに項目名を記述することで自由にスキーマを定義できます。 また、型の指定、親子関係や繰り返しといった構造の定義、必須チェックや最大/最小チェック、バリデーション、Index、暗号化指定などができます。(Indexなどの機能を利用するには別途TaggingServicecore等のライブラリが必要です)
  • テンプレートに定義した項目は全てEntryクラスのフィールド名かその下の階層クラスになります。下の階層クラスは、それぞれの名称のクラスであり、さらにそのクラス内に、テンプレートの一段下がった階層のフィールドが定義されています。
  • 例えば、fooの下にbar、その下にbazを定義すると、Javaでは、entry.foo.bar.bazというように記述でき、fooやbarはクラスのインスタンス、bazはbarのプロパティになります。
  • Entryクラスには全ての子要素を定義していますが、必要に応じてEntryクラスから該当のフィールドを使用してください。
  • FeedにはEntryを複数件格納できます。
  • 詳細については、「Tagging Serviceとvte.cx engine テンプレートによるスキーマ定義」を参照してください。

M2.テンプレートから静的クラスの生成

  • 以下のように、引数にテンプレートと出力先を指定してFeedTemplateMapperクラスを実行することで、テンプレートからクラスを生成することができます。
  • Javaの予約語と同じプロパティ名がある場合には先頭に_(アンダーバー)が付きます。
    java FeedTemplateMapper {テンプレートファイル名} {出力先フォルダ}
    
    例)java FeedTemplateMapper template.txt target
  • 出力先フォルダに移動して以下を実行することでjarファイルを生成できます。
    jar -cvf {ファイル名}.jar パッケージ名
    
    例)jar -cvf entity.jar _sample