jp.terasoluna.fw.oxm.mapper.castor
クラス CastorOXMapperImpl

java.lang.Object
  上位を拡張 jp.terasoluna.fw.oxm.mapper.castor.CastorOXMapperImpl
すべての実装されたインタフェース:
OXMapper

public class CastorOXMapperImpl
extends Object
implements OXMapper

Castorを利用したオブジェクト-XML変換クラス。

オブジェクト-XMLの変換を明示的に指定する場合は、Castorマッピング定義ファイルが必要となる。 一つのCastorマッピング定義ファイルでオブジェクト→XML、XML→オブジェクト 相互の変換を行うことができる。 Castorマッピング定義ファイルは変換を行うオブジェクトのクラスと 同じパッケージ、同じ名前、拡張子”.xml”で配置すること。

Castorマッピング定義ファイルを省略した場合は、Castorのデフォルト変換ルールが適用される。

デフォルト変換を使用する場合のオプション デフォルト変換を使用する場合は、CastorのXMLネーミングオプションを 下記のように mixed と指定しておくこと。
castor.properties org.exolab.castor.xml.naming=mixed

このオプションの設定有無によって、下記のようにMarshall時の出力XMLが変化する。
デフォルトのままだと、Unmarshall時に問題があるため、このオプションを設定する。
【org.exolab.castor.xml.naming=lower (デフォルト)】 UserBean → <user-bean>
【org.exolab.castor.xml.naming=mixed】 UserBean → <userBean>

例)XML変換対象のオブジェクトが「sample.SampleBean」クラスの場合、 Castorマッピング定義ファイルはクラスパス上の「sample/SampleBean.xml」 ファイルとなる。

Castorマッピング定義ファイルの記述方法は、 Castorの仕様に準じている。 詳細はTERASOUNAのドキュメントを参照すること。

本クラスでは、一度Castorマッピング定義ファイルを読み込むと 内部でキャッシュされる。 キャッシュを利用しない場合、本クラスの cache属性をfalseにすること。

使用例

【変換対象のオブジェクト】

       public class SampleDto {
           private int userid;
           private String username;
           private Item[] item;
           ・・・
           (getter、setter)
       }
       public class Item {
           private int id;
           private String name;
           private int price;
           ・・・
           (getter、setter)
       }
 

【変換対象のXMLデータ】

       <sample-dto>
        <user-id>15</user-id>
        <user-name>user1</user-name>
        <item>
          <id>100</id>
          <name>item1</name>
          <price>1000</price>
        </item>
        <item>
          <id>101</id>
          <name>item2</name>
          <price>2000</price>
        </item>
       </sample-dto>
 

【変換対象のオブジェクト】

       SampleDto[0].userid[0] = 15
       SampleDto[0].name[0] = user1
       SampleDto[0].Item[0].id[0] = 100
       SampleDto[0].Item[0].name[0] = "item1"
       SampleDto[0].Item[0].price[0] = 1000
       SampleDto[0].Item[1].id[0] = 101
       SampleDto[0].Item[1].name[0] = "item2"
       SampleDto[0].Item[1].price[0] = 200
 

【Castorマッピング定義ファイル】

       <?xml version="1.0" encoding="UTF-8"?>
       <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Object Mapping DTD Version 1.0//EN"
                                       "http://castor.exolab.org/mapping.dtd">
       <mapping>
         <class name="sample.dto.SampleDto">
           <map-to xml="sample-dto"/>
           <field name="userid" type="int">
             <bind-xml name="user-id" node="element"/>
           </field>
            <field name="username" type="string">
             <bind-xml name="user-name" node="element"/>
           </field>
           <field name="item" type="sample.dto.Item" collection="array">
             <bind-xml name="Item" node="element"/>
          </field>
         </class>
         <class name="sample.dto.Item">
           <field name="id" type="int">
           </field>
           <field name="name" type="string">
           </field>
           <field name="price" type="int">
           </field>
         </class>
       </mapping> 
 

【実装コード(XML→オブジェクト)】


 CastorOXMapper oxmapper = new CastorOXMapperImpl();
 SampleDto bean = new SampleDto(); // このオブジェクトにXMLデータが格納される
 Reader reader = new FileReader("C:/sample/sampleDto.xml"); // 変換するXMLデータ
 
 // XML→オブジェクト変換
 oxmapper.unmarshal(reader, bean);
 

【実装コード(オブジェクト→XML)】


 CastorOXMapper oxmapper = new CastorOXMapperImpl();
 Writer writer = new OutputStreamWriter(System.out);
 
 // オブジェクト→XML
 oxmapper.marshal(bean, writer);
 

関連項目:
jp.terasoluna.fw.web.rich.springmvc.bind.XMLServletRequestDataBinder

フィールドの概要
static String CASTOR_MAPPINGFILE_SUFFIX
          Castorマッピング定義ファイルのサフィックス。
protected static String DEFAULT_CHARSET
          デフォルトの文字セット。
static String NESTED_FOLDER_SEPARATOR
          フォルダのセパレータ。
static String NESTED_PACKAGE_SEPARATOR
          パッケージのセパレータ。
 
コンストラクタの概要
CastorOXMapperImpl()
           
 
メソッドの概要
protected  org.exolab.castor.xml.Marshaller createMarshaller(Object in, Writer writer)
          マーシャラーを生成する。
protected  org.exolab.castor.xml.Unmarshaller createUnmarshaller(Object out)
          アンマーシャラーを生成する。
protected  org.exolab.castor.mapping.Mapping getCastorMapping(Class mappingClass)
          Castorマッピング定義ファイルを取得する。
 String getCharset()
          文字セットを取得する。
protected  String getMappingFilePath(Class mappingClass)
          Castorマッピングファイルのパスを取得する。
protected  XMLClassDescriptorResolverAndMappedClassSet getResolverAndMappedClassSetForMarshaller(Class mappingClass)
          MarshallerにセットするXMLClassDescriptorResolverと、 マッピング定義反映済みクラス集合のペア(XMLClassDescriptorResolverAndMappedClassSet)を取得する。
protected  URL getUrl(Class mappingClass)
          URLを取得する。
 boolean isCache()
          cacheを取得する。
 boolean isIndenting()
          indentingを取得する。
 boolean isPreserveWhitespaceAtMarshal()
          preserveWhitespaceAtMarshalを取得する。
 boolean isPreserveWhitespaceAtUnmarshal()
          preserveWhitespaceAtUnmarshalを取得する。
 boolean isSuppressXSIType()
          suppressXSITypeを取得する。
 boolean isUseDifferentResolverForEachOutputClass()
          useDifferentResolverForEachOutputClassを取得する。
 void marshal(Object in, Writer writer)
          オブジェクトをXMLに変換し、ストリームに書き込む。
 void setCache(boolean cache)
          cacheを設定する。
 void setCharset(String charset)
          文字セットを設定する。
 void setIndenting(boolean indenting)
          Marshallerオプション indentingを設定する

trueを設定すると、生成されるxmlがインデントされる。
 void setPreserveWhitespaceAtMarshal(boolean preserveWhitespaceAtMarshal)
          Marshallerオプション preserveWhitespaceを設定する。
 void setPreserveWhitespaceAtUnmarshal(boolean preserveWhitespaceAtUnmarshal)
          Unmarshallerオプション whitespacePreserveを設定する。
 void setSuppressXSIType(boolean suppressXSIType)
          Marshallerオプション suppressXSIType

Castorマッピング無設定化時にスキーマバリデータを適用する場合にtrueを設定する。
 void setUseDifferentResolverForEachOutputClass(boolean useDifferentResolverForEachOutputClass)
          Marshallerオプション useDifferentResolverForEachOutputClassを設定する

trueを設定すると、出力クラスごとに異なるXMLClassDescriptorResolverを使用する。
 void unmarshal(Document doc, Object out)
          DOMツリーをオブジェクトに変換する。
 void unmarshal(InputStream is, String argCharset, Object out)
          ストリームからXMLデータを取り出し、オブジェクトに変換する。
 void unmarshal(Reader reader, Object out)
          ストリームからXMLデータを取り出し、オブジェクトに変換する。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

フィールドの詳細

DEFAULT_CHARSET

protected static final String DEFAULT_CHARSET
デフォルトの文字セット。

関連項目:
定数フィールド値

NESTED_PACKAGE_SEPARATOR

public static final String NESTED_PACKAGE_SEPARATOR
パッケージのセパレータ。

関連項目:
定数フィールド値

NESTED_FOLDER_SEPARATOR

public static final String NESTED_FOLDER_SEPARATOR
フォルダのセパレータ。

関連項目:
定数フィールド値

CASTOR_MAPPINGFILE_SUFFIX

public static final String CASTOR_MAPPINGFILE_SUFFIX
Castorマッピング定義ファイルのサフィックス。

関連項目:
定数フィールド値
コンストラクタの詳細

CastorOXMapperImpl

public CastorOXMapperImpl()
メソッドの詳細

unmarshal

public void unmarshal(Document doc,
                      Object out)
DOMツリーをオブジェクトに変換する。

定義:
インタフェース OXMapper 内の unmarshal
パラメータ:
doc - DOMツリー。
out - XMLから変換されたオブジェクト。

unmarshal

public void unmarshal(Reader reader,
                      Object out)
ストリームからXMLデータを取り出し、オブジェクトに変換する。

定義:
インタフェース OXMapper 内の unmarshal
パラメータ:
reader - XMLデータ。文字セットが指定されていない場合、 VMのデフォルト文字セットが使用される。
out - XMLから変換されたオブジェクト。

unmarshal

public void unmarshal(InputStream is,
                      String argCharset,
                      Object out)
ストリームからXMLデータを取り出し、オブジェクトに変換する。

引数argCharsetがnullまたは空文字の場合、 InputStreamReaderの文字セットとして属性charsetの値が使用される。
デフォルト設定では、属性charsetの値は"UTF-8"である。

定義:
インタフェース OXMapper 内の unmarshal
パラメータ:
is - XMLデータ。
argCharset - 文字セット。
out - XMLから変換されたオブジェクト。

createUnmarshaller

protected org.exolab.castor.xml.Unmarshaller createUnmarshaller(Object out)
アンマーシャラーを生成する。 Castorマッピング定義の設定を行う。

パラメータ:
out - 出力対象のオブジェクト
戻り値:
アンマーシャラー

marshal

public void marshal(Object in,
                    Writer writer)
オブジェクトをXMLに変換し、ストリームに書き込む。

定義:
インタフェース OXMapper 内の marshal
パラメータ:
in - XMLに変換するオブジェクト
writer - 変換したXMLを書き込むライター

createMarshaller

protected org.exolab.castor.xml.Marshaller createMarshaller(Object in,
                                                            Writer writer)
マーシャラーを生成する。 Castorマッピング定義を設定する。

パラメータ:
in - XML変換対象のオブジェクト
writer - 出力用ライター
戻り値:
マーシャラー

getCastorMapping

protected org.exolab.castor.mapping.Mapping getCastorMapping(Class mappingClass)
Castorマッピング定義ファイルを取得する。 cache属性がtrueの場合、読み込んだCastorマッピング定義ファイルを キャッシュする。falseの場合、キャッシュは行わない。

パラメータ:
mappingClass - マッピング対象のクラス
戻り値:
Castorマッピング定義ファイル

getUrl

protected URL getUrl(Class mappingClass)
URLを取得する。

パラメータ:
mappingClass - マッピング対象のクラス
戻り値:
リソースのURLインスタンス

getMappingFilePath

protected String getMappingFilePath(Class mappingClass)
Castorマッピングファイルのパスを取得する。

パラメータ:
mappingClass - マッピングするクラス。
戻り値:
Castorマッピングファイルのパス

getResolverAndMappedClassSetForMarshaller

protected XMLClassDescriptorResolverAndMappedClassSet getResolverAndMappedClassSetForMarshaller(Class mappingClass)
MarshallerにセットするXMLClassDescriptorResolverと、 マッピング定義反映済みクラス集合のペア(XMLClassDescriptorResolverAndMappedClassSet)を取得する。

useDifferentResolverForEachOutputClass属性がfalseの場合、 mappingClassに関わらず、唯一の共有XMLClassDescriptorResolverAndMappedClassSetを返す。
useDifferentResolverForEachOutputClass属性がtrueの場合、 mappingClass単位で共有しているXMLClassDescriptorResolverAndMappedClassSetを返す。
cache属性がfalseの場合は、常に、新たなXMLClassDescriptorResolverAndMappedClassSetを返す。

パラメータ:
mappingClass - 出力クラス
戻り値:
XMLClassDescriptorResolver
関連項目:
XMLClassDescriptorResolverAndMappedClassSet

isCache

public boolean isCache()
cacheを取得する。

戻り値:
cache属性

isIndenting

public boolean isIndenting()
indentingを取得する。

戻り値:
indenting属性

isPreserveWhitespaceAtMarshal

public boolean isPreserveWhitespaceAtMarshal()
preserveWhitespaceAtMarshalを取得する。

戻り値:
preserveWhitespaceAtMarshal属性

isPreserveWhitespaceAtUnmarshal

public boolean isPreserveWhitespaceAtUnmarshal()
preserveWhitespaceAtUnmarshalを取得する。

戻り値:
preserveWhitespaceAtUnmarshal属性

isSuppressXSIType

public boolean isSuppressXSIType()
suppressXSITypeを取得する。

戻り値:
suppressXSIType属性

isUseDifferentResolverForEachOutputClass

public boolean isUseDifferentResolverForEachOutputClass()
useDifferentResolverForEachOutputClassを取得する。

戻り値:
useDifferentResolverForEachOutputClass属性

setCache

public void setCache(boolean cache)
cacheを設定する。

パラメータ:
cache - cache属性に設定する値

getCharset

public String getCharset()
文字セットを取得する。

戻り値:
文字セット。

setCharset

public void setCharset(String charset)
文字セットを設定する。

パラメータ:
charset - 文字セット。

setSuppressXSIType

public void setSuppressXSIType(boolean suppressXSIType)
Marshallerオプション suppressXSIType

Castorマッピング無設定化時にスキーマバリデータを適用する場合にtrueを設定する。

falseを設定するとネストしたBeanをMarshallする時に、 生成するXMLドキュメントに「xmlns:xsi」及び「xsi:type」を付与する。
このネームスペースが付与されると、Castorマッピング無設定化時に スキーマバリデータを使用した場合、正しくUnmarshallできない。
そのため、スキーマバリデータを使用する場合には、このオプションをtrueに 設定する。
false
       <resultReserveParam>
         <reserveDetailList 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:type="java:sample.ReserveDetail">
         </reserveDetailList>
       </resultReserveParam>
 

true(デフォルト)
       <resultReserveParam>
         <reserveDetailList>
         </reserveDetailList>
       </resultReserveParam>
 

パラメータ:
suppressXSIType - 設定する suppressXSIType

setPreserveWhitespaceAtUnmarshal

public void setPreserveWhitespaceAtUnmarshal(boolean preserveWhitespaceAtUnmarshal)
Unmarshallerオプション whitespacePreserveを設定する。

trueを設定すると、全ての要素について空白を保持 したままアンマーシャルが行われる。
falseの場合でも、「xml:space="preserve"」が指定された 要素については、空白を保持したままアンマーシャルされる。 全電文に対して有効になるため、使用には注意が必要である。 デフォルト値はfalse

パラメータ:
preserveWhitespaceAtUnmarshal - 設定する whitespacePreserve

setPreserveWhitespaceAtMarshal

public void setPreserveWhitespaceAtMarshal(boolean preserveWhitespaceAtMarshal)
Marshallerオプション preserveWhitespaceを設定する。

trueを設定すると生成するドキュメントのルートノードに 「xml:space="preserve"」を付与する。
全電文に対して有効になるため、使用には注意が必要である。 デフォルト値はtrue

false
       <resultReserveParam>
         <reserveDetailList>
         </reserveDetailList>
       </resultReserveParam>
 

true(デフォルト)
       <resultReserveParam xml:space="preserve">
         <reserveDetailList>
         </reserveDetailList>
       </resultReserveParam>
 

*

パラメータ:
preserveWhitespaceAtMarshal - 設定するpreserveWhitespace

setIndenting

public void setIndenting(boolean indenting)
Marshallerオプション indentingを設定する

trueを設定すると、生成されるxmlがインデントされる。

※注意:preserveWhitespaceAtMarshal が false の時のみ有効

パラメータ:
indenting - 設定する indenting

setUseDifferentResolverForEachOutputClass

public void setUseDifferentResolverForEachOutputClass(boolean useDifferentResolverForEachOutputClass)
Marshallerオプション useDifferentResolverForEachOutputClassを設定する

trueを設定すると、出力クラスごとに異なるXMLClassDescriptorResolverを使用する。 (同一出力クラス内で共通の、XMLClassDescriptorResolverを使用する。)

false(デフォルト)を設定すると、全クラス共通のXMLClassDescriptorResolverを使用する。

出力クラスの構成で、クラスを以下のように使い回しており、 以下に記述した条件を全て満たす場合、 XMLClassDescriptorResolverを出力クラスごとに分ける必要があるため、 trueを設定する。
 ・条件1:出力クラスClassA、ClassXの構造が以下のようになっている。
   ・ClassA (マッピング定義ファイルClassA.xmlに、ClassAのマッピング定義がある)
    + item1 String等
    + item2 String等
    …
   ・ClassX (マッピング定義ファイルClassX.xmlに、ClassX、ClassAの定義がある)
    + beanA ClassA (ClassXに、ClassA型/ClassAの配列型/List<ClassA>型のいずれかのフィールドがある)
     + item1 String等
     + item2 String等
     …
   ※ClassAのフィールドに、他のJavaBeanを含んでいる場合も該当する。
   ※「出力クラス(上記のClassA)を、他の出力クラス(上記のClassX)で使用している」というのが条件の内容。
 ・条件2:ClassA.xmlに記述されたClassAのマッピング定義とClassX.xmlに記述されたClassAのマッピング定義が異なる。
 

・出力クラスを使い回していない場合(出力クラスのフィールドに、出力クラス以外の共通JavaBeanを使い回すのは可)(条件1を満たさない)
・マッピング定義ファイル無しで自動マッピングを行っている場合(条件2を満たさない)
・マッピング定義ファイルはあるが同一クラスに対するマッピング定義の記述が統一されている場合(条件2を満たさない)
は、デフォルトのfalseでよい。

特殊ケースとして、 ある共通クラスを、ある出力クラスを処理する場合は自動マッピング、ある出力クラスを処理する場合はマッピング定義ファイルを使用する、 というケース(以下を参照)では、XMLClassDescriptorResolverを出力クラスごとに分ける必要があるため、 trueを設定する。
 ・ClassA (マッピング定義ファイルClassA.xmlに、ClassAとCommonClassのマッピング定義がある)
   ・CommonClass
    + item1 String等
    …
 ・ClassB (マッピング定義ファイル無し)
   ・CommonClass
    + item1 String等
    …
 ※XMLClassDescriptorResolverを出力クラス(上記のClassA, ClassB)ごとに分けておかなければ、
  ClassA処理後に、ClassB内のCommonClassを処理する際、自動マッピングではなく、ClassA.xml内のCommonClassのマッピング定義が有効になってしまう。
 

trueにすると、XMLClassDescriptorResolverを出力クラスごとに分離して共有することになるため、 false(デフォルト)の時に比べ、以下のようになる。
・メモリを多く使用する。
・自動マッピング時には、他の出力クラス解析時に解析済みの共通クラスであっても、出力クラスが異なれば再度解析を行う必要があるため、処理の高速化が遅れる。

パラメータ:
useDifferentResolverForEachOutputClass - 設定するuseDifferentResolverForEachOutputClass


Copyright © 2012. All Rights Reserved.