SDO API による anyType タグの処理は、他のいずれの複合タイプとも異なる点はありません。
anyType が他の複合タイプと異なるのは、そのインスタンス・データとシリアライゼーション/デシリアライゼーションだけです。これらはビジネス・オブジェクトのみに対する内部概念であり、フィールドへまたはフィールドからマップされるデータが valid.Complex タイプであるかどうかの判別は、単一タイプ (Customer、Address など) に限られます。しかし、anyType は、タイプに関係なく、すべての DataObject を許容します。maxOccurs > 1 の場合、リスト内の各 DataObject は異なるタイプであってもかまいません。
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://AnyType"> <xsd:complexType name="AnyType"> <xsd:sequence> <xsd:element name="person" type="xsd:anyType"/> </xsd:sequence> </xsd:complexType> </xsd:schema> <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://Customer"> <xsd:complexType name="Customer"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://Employee" targetNamespace="http://Employee"> <xsd:complexType name="Employee"> <xsd:sequence> <xsd:element name="id" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> DataObject anyType = ... DataObject customer = ... DataObject employee = ... // person を Customer に設定する anyType.set("person", customer); // インスタンス・データは Customer になる // 「Customer」を表示する System.out.println(anyType.getDataObject("person").getName()); // person を Employee に設定する anyType.set("person", employee); // インスタンス・データは Employee になる // 「Employee」を表示する System.out.println(anyType.getDataObject("person").getName());
anySimpleType とまったく同じように、anyType はシリアライゼーション時に xsi:type を使用して、DataObject の意図されたタイプがデシリアライゼーション時に維持されるようにします。したがって、「Customer」に設定した場合、XML は次のようになります。
<?xml version="1.0" encoding="UTF-8"?> <p:AnyType xsi:type="p:AnyType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:customer="http://Customer" xmlns:p="http://AnyType"> <person xsi:type="customer:Customer"> <name>foo</name> </person> </p:AnyType>
また、「Employee」に設定した場合は、以下のようになります。
<?xml version="1.0" encoding="UTF-8"?> <p:AnyType xsi:type="p:AnyType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:employee="http://Employee" xmlns:p="http://AnyType"> <person xsi:type="employee:Employee"> <id>foo</id> </person> </p:AnyType>
また、AnyType では、ラッパー DataObject を通じて単純タイプの値を設定できます。それらのラッパー DataObjects は、「value」(エレメント) という、単純タイプ値を保持する単一プロパティーを持ちます。SDO API は、get<Type>/set<Type> API を使用した場合、これらの単純タイプとラッパー DataObject を自動的にラップおよびアンラップするためにオーバーライドされています。型キャストのない get/set API は、このラッピングを行いません。
DataObject anyType = ... // set<Type> API を anyType Property について呼び出すと、自動的に // ラッパー DataObject が作成される anyType.setString("person", "foo"); // 通常の get/set API は、オーバーライドされないので、 // ラッパー DataObject を返す DataObject wrapped = anyType.get("person"); // ラップされた DataObject は「value」Property を持つ // 「foo」を表示する System.out.println(wrapped.getString("value")); // get<Type> API は自動的に DataObject をアンラップする // 「foo」を表示する System.out.println(anyType.getString("person"));
ラッパー DataObject は、シリアライズされる場合、Java™ インスタンス・クラスの anySimpleType マッピングとまったく同じように、xsi:type フィールドで XSD タイプへシリアライズされます。したがって、この設定は、次のようにシリアライズされます。
<?xml version="1.0" encoding="UTF-8"?> <p:AnyType xsi:type="p:AnyType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=" http://www.w3.org/2001/XMLSchema" xmlns:p="http://AnyType"> <person xsi:type="xsd:string">foo</person> </p:AnyType>
xsi:type が指定されていないか、指定された xsi:type が正しくない場合は、例外が throw されます。自動ラッピングのほかに、BOFactory createDataTypeWrapper(Type, Object) により、set() API で使用するラッパーを手動で作成できます。ここで、Type はラップされるデータの SDO 単純タイプで、Object は、ラップされるデータです。
Type stringType = boType.getType("http://www.w3.org/2001/XMLSchema", "string"); DataObject stringType = boFactory.createByMessage(stringType, "foo");
DataObject がラッパー・タイプであるかどうかを判別するには、BOType isDataTypeWrapper(Type) を呼び出すことができます。
DataObject stringType = ... boolean isWrapper = boType.isDataTypeWrapper(stringType.getType());
他の複合タイプの場合、フィールド間でデータを移動するには、データが同じタイプである必要があります。しかし、AnyType には任意の複合タイプを含めることができるので、フィールド内のインスタンス・データによって、マッピングなしの直接の移動が可能な場合と可能でない場合があります。
プロパティー Type の URI と Name を使用して、プロパティーが anyType タイプであるかどうかを判別できます。それらは、「commonj.sdo」と「DataObject」になります。すべてのデータは、anyType に挿入するのに有効です。したがって、以下のマッピング・ルールが導出されます。