この章では、Oracle XML DB Content Connectorを使用してOracle XML DBリポジトリにアクセスする方法について説明します。
Oracle XML DB Content Connectorは、JSR-170としてJavaコミュニティが開発した標準Java APIであるContent Repository API for Java(JCRとも呼ばれる)を実装します。
この章の内容は次のとおりです。
この項では、次の項目について説明します。
JCR 1.0は、アプリケーションがコンテンツ・リポジトリと対話するための標準Java APIを定義します。
|
関連項目: Java Community Processの『Content Repository for Java technology API』、http://jcp.org/en/jsr/detail?id=170。第4章(JSR-170の仕様)でJCR 1.0の簡単な概要を説明しています。 |
JCRはコンテンツ・リポジトリのデータをノードのツリーとしてモデル化します。ノードはそれぞれ、1つ以上の子ノードを持つことができます。ルート・ノード以外のすべてのノードは、親ノードを1つのみ持ちます。
子ノードに加えて、各ノードは1つ以上のプロパティを持つことができます。プロパティは、単純な名前と値の組合せです。たとえば、コンテンツ・リポジトリで特定のファイルを表すノードには、値がファイルの作成日であるjcr:createdというプロパティがあります。
各プロパティにはプロパティ型があります。たとえば、jcr:createdプロパティには値を有効な日時にするよう要求するDATEというプロパティ型があります。
同様に、各ノードにはノード型があります。たとえば、ファイルを表すノードにはnt:fileというノード型があります。ノード型は、ノードが持つことが可能または必要な子ノードおよびプロパティを制御します。たとえば、nt:file型のすべてのノードにはjcr:createdプロパティがあります。
ノードとプロパティには名前が付けられているため、パスで指定できます。JCRでは絶対パスと相対パスの両方がサポートされています。たとえば、絶対パス
/My Documents/pictures/puppy.jpg/jcr:created
は、ファイルpuppy.jpgのjcr:createdプロパティに変換されます。また、次の相対パスにより、このプロパティをMy Documentsフォルダに対して指定できます。
pictures/puppy.jpg/jcr:created
ノード名およびプロパティ名は、名前空間修飾にできます。XML同様、JCRはコロンで区切られた名前空間接頭辞を使用して、jcr:createdなどの名前空間修飾名を表します。XMLと異なり、JCRではリポジトリ全体の名前空間レジストリで名前空間接頭辞とURIのマッピングが記録されます。たとえば、jcr接頭辞はURI http://www.jcp.org/jcr/1.0にマップされます。
Oracle XML DB Content Connectorにより、JCR 1.0 Java APIを使用してOracle XML DBリポジトリにアクセスできます。アプリケーションは、スタンドアロンJava仮想マシンまたはJ2EEコンテナのいずれかで動作できます。
|
注意: 今回のリリースでは、Oracle XML DB Content ConnectorをデータベースOracle JVM(データベース・プロセス内で使用可能なJava仮想マシン)で使用できません。データベース層でContent Connectorを使用するには、スタンドアロンJava仮想マシンまたはJ2EEコンテナのいずれかを使用する必要があります。 |
Oracle XML DBリポジトリのファイルおよびフォルダは、JCRノード(およびそれらのノードのプロパティ)として表されます。それらは、JCR APIを使用して作成、取出し、および更新が可能です。
Oracle XML DB Content Connectorは、Oracle XML DBリポジトリのデータをJCRノードおよびプロパティとして表します。ファイルおよびフォルダは、それぞれ型がnt:fileとnt:folderのノードとして表されます。そのコンテンツとメタデータは、ノード型がnt:resourceのノードとして公開されます。
この項では、次の項目について説明します。
フォルダMyFolderは、Oracle XML DBリポジトリのルート・フォルダに格納されています。フォルダには、Address.xmlとCar.jpgの2つのファイルが入っています。
ファイルAddress.xmlには次のXMLコンテンツが入っています。
<Address country="US"> <name>Alice Smith</name> <street>123 Maple Street</street> <city>Mill Valley</city> <state>CA</state> <zip>90952</zip> </Address>
ファイルCar.jpgには自動車の写真であるバイナリ・コンテンツが入っています。また、次のユーザー定義XMLメタデータが入っています。
<i:ImageMetadata> <Height>640</Height> <Width>480</Width> <RGB R="44" G="123" B="74"/> </i:ImageMetadata>
Oracle XML DB Content Connectorは、MyFolder、Address.xml、Car.jpgをJCRノードおよびプロパティとして公開します。例31-1は、JCRノードとプロパティのツリーとして表されるフォルダMyFolderを示します。
例31-1 MyFolderのJCRノード表現
この表現では、太字体はノード、イタリック体はノード型、標準体はプロパティを示し、山カッコで囲んだイタリック体(<>)はバイナリ・データなどの省略されたデータを示します。
[root] (nt:folder) jcr:created="2001-01-01T00:00:00.000Z" jcr:content (nt:resource) jcr:data=null jcr:lastModified="2001-01-01T00:00:00.000Z" ojcr:owner="SYS" ojcr:creator="SYS" ojcr:lastModifier="SYS" ojcr:displayName="" ojcr:language="en-US" MyFolder (nt:folder) jcr:created="2001-01-01T00:00:00.000Z" jcr:content (nt:resource) jcr:data=null jcr:lastModified="2001-01-01T00:00:00.000Z" ojcr:owner="ALICE" ojcr:creator="BOB" ojcr:lastModifier="CHARLIE" ojcr:author="BOB" ojcr:comment="An application folder" ojcr:displayName="MyFolder" ojcr:language="en-US" ojcr:links (ojcr:links) ojcr:folderLink (ojcr:linkProperties) ojcr:linkType="Hard" ojcr:linkSource=<RESID of the root folder> ojcr:linkTarget=<RESID of folder MyFolder> ojcr:linkName="MyFolder" Address.xml (nt:file) jcr:created="2005-09-01T12:34:56.789Z" jcr:content (nt:resource) jcr:encoding="UTF-8" jcr:mimeType="text/xml" jcr:data=<binary representation of the XML content> jcr:lastModified="2005-09-01T12:34:56.789Z" ojcr:owner="ALICE" ojcr:creator="BOB" ojcr:lastModifier="CHARLIE" ojcr:author="BOB" ojcr:displayName="Address.xml" ojcr:language="en-US" ojcr:xmlContent (nt:unstructured) Address country="US" name jcr:xmltext jcr:xmlcharacters="Alice Smith" street jcr:xmltext jcr:xmlcharacters="123 Maple Street" city jcr:xmltext jcr:xmlcharacters="Mill Valley" state jcr:xmltext jcr:xmlcharacters="CA" zip jcr:xmltext jcr:xmlcharacters="90952" ojcr:links (ojcr:links) ojcr:folderLink (ojcr:linkProperties) ojcr:linkType="Hard" ojcr:linkSource=<RESID of folder MyFolder> ojcr:linkTarget=<RESID of file Address.xml> ojcr:linkName="Address.xml" Car.jpg (nt:file) jcr:created="2004-02-12T16:15:23.247Z" jcr:content (nt:resource) jcr:mimeType="image/jpeg" jcr:data=<binary content of file Car.jpg> jcr:lastModified="2004-02-12T17:20:25.314Z" ojcr:owner="ALICE" ojcr:creator="BOB" ojcr:lastModifier="CHARLIE" ojcr:author="BOB" ojcr:displayName="A shiny red car!" ojcr:language="en-US" i:ImageMetadata Height jcr:xmltext jcr:xmlcharacters="640" Width jcr:xmltext jcr:xmlcharacters="480" RGB R="44" G="123" B="74" ojcr:links (ojcr:links) ojcr:folderLink (ojcr:linkProperties) ojcr:linkType="Hard" ojcr:linkSource=<RESID of folder MyFolder> ojcr:linkTarget=<RESID of file Car.jpg> ojcr:linkName="Car.jpg"
Oracle XML DB Content Connectorがnt:file、nt:folder、およびnt:resourceの各ノード型の定義を補強することによって、Oracle XML DBリポジトリにある追加情報が取り込まれます。ノード型ojcr:folderがnt:folderのスーパータイプとして追加され、ノード型ojcr:resourceがnt:resourceのスーパータイプとして追加されます。Oracle拡張関数は、すべて名前空間http://xmlns.oracle.com/jcr/1.0にあります。この名前空間は名前空間接頭辞ojcrにマップされます。
また、ノード型mix:referenceableがnt:fileおよびnt:folderのスーパータイプとして追加され、それらのリソースIDによってすべてのファイルとフォルダにアクセスできます。
プロパティjcr:dataにはファイルのバイナリ・コンテンツが入っています。jcr:dataは、ノードnt:fileではなくその子ノードjcr:contentのプロパティです。XMLコンテンツを含むファイルの場合、ノードjcr:contentには子ノードojcr:xmlContentがあり、そこでXMLコンテンツに一連のJCRノードとプロパティとしてアクセスできます。例31-1で参照されるファイルAddress.xmlがこのようなファイルに該当します。リポジトリのXMLファイルのXMLコンテンツは、JCRで定義されたドキュメント・ビュー・シリアライズを使用してJCRノードとプロパティにマップされます。その場合、次のようになります。
XML要素は、JCRノードとして公開されます。
XML属性は、JCRプロパティとして公開されます。
XMLテキストは、jcr:xmltextというノード内のjcr:xmlcharactersというJCRプロパティとして公開されます。
Oracle XML DBリポジトリは、各リポジトリ・ファイルおよびフォルダのメタデータを保持します。データベース・ビューRESOURCE_VIEWおよびPATH_VIEWでは、このメタデータはXMLType列RESの一連のXML要素として表されます。JCRでは、このメタデータは名前空間jcrおよびojcrのプロパティにマップされます。表31-1で、このマッピングについて説明します。
表31-1 Oracle XML DBリソースとJCRのマッピング
| XPath | ノードnt:fileまたはnt:folderからの相対パス |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ユーザー定義のXMLメタデータは、リポジトリ・ファイルまたはフォルダのjcr:content子ノードの下でJCRノードおよびプロパティとして公開されます。XMLファイル同様、XMLメタデータは、JCRで定義されるドキュメント・ビュー・シリアライズを使用してJCRノードとプロパティにマップされます。このシリアライズの詳細は、「バイナリ・コンテンツおよびXMLコンテンツ」を参照してください。
例31-1では、ファイルCar.jpgにこのユーザー定義メタデータが入っています。
<i:ImageMetadata> <Height>640</Height> <Width>480</Width> <RGB R="44" G="123" B="74"/> </i:ImageMetadata>
次のJCRパスによってWidth値を取得します。
/My Folder/Car.jpg/jcr:content/i:ImageMetadata/ Width/jcr:xmltext/jcr:xmlcharacters
JCRでは、親ノードは各ノードとプロパティには1つのみありますが、ルート・ノードにはありません。そのため、各JCRノードまたはプロパティには絶対パスが1つのみ存在します。
しかし、Oracle XML DBリポジトリでは、リソース(ファイルまたはフォルダ)を子の寿命を制御するハード・リンクまたは子の寿命を制御しない弱いリンクのいずれかで複数の親フォルダにリンクさせることができます。その結果、リソースに複数のパスが存在することになり、リソースは複数の親を持つことができます。
パスの解決時に、Oracle XML DB Content Connectorはハード・リンクおよび弱いリンクの両方を検索します。リソースに複数のパスが存在する場合、JCRメソッドgetPath()により、そのセッションによるsave()またはrefresh(boolean)への最新のコールの後にそのリソースが最初に検出されたパスが戻されます。メソッドgetParent()はそのパスのターゲットとなっているフォルダを戻します。
リソースが複数リンクのターゲットで、複数の親フォルダがある場合、リソースのすべての親のリストを取得すると便利な場合が多くあります。Oracle XML DB Content Connectorはこのリストを、ノードnt:fileまたはnt:folderに対するパスjcr:content/ojcr:links/ojcr:folderLinkを持つ型ojcr:linkPropertiesのノードとして表します。リソースの親ごとに1つのojcr:folderLinkノードが存在します。
ノードojcr:folderLinkには次のプロパティがあります。
ojcr:linkType: リンク・タイプ(HardまたはWeak)
ojcr:linkSource: 親フォルダのリソースID
ojcr:linkTarget: 子ファイルまたはフォルダのリソースID
ojcr:linkName: その親の子ファイルまたはフォルダの名前
この項では、Oracle XML DB Content Connectorを使用してOracle XML DBリポジトリの情報にアクセスする方法について説明します。この項では、次の項目について説明します。
Oracle XML DB Content Connectorには、Java CLASSPATH変数に次のエントリが必要です。
$ORACLE_HOME/lib/jcr-1.0.jar
$ORACLE_HOME/lib/ojcr.jar
$ORACLE_HOME/lib/xmlparserv2.jar
$ORACLE_HOME/jlib/xquery.jar
Oracle XML DB Content Connectorでは、oracle.jcr.OracleRepositoryは、JCRリポジトリへのエントリ・ポイントとなるJCRインタフェースjavax.jcr.Repositoryを実装します。例31-2のコード・フラグメントは、Oracle XML DBリポジトリのRepositoryオブジェクトの取得方法を示しています。
例31-2リポジトリ・オブジェクトの取得方法を示すコード・フラグメント
import oracle.jcr.OracleRepository;
import oracle.jcr.OracleRepositoryFactory;
import oracle.jcr.xdb.XDBRepositoryConfiguration;
import oracle.jdbc.pool.OracleDataSource;
...
XDBRepositoryConfiguration configuration =
new XDBRepositoryConfiguration();
OracleDataSource ods =
(OracleDataSource)configuration.getDataSource();
// databaseURL is a JDBC database URL.
ods.setURL(databaseURL);
// OracleRepository implements javax.jcr.Repository.
OracleRepository repository =
OracleRepositoryFactory.createOracleRepository(configuration);
OracleRepositoryは、java.io.Serializableおよびjavax.naming.Referenceableの両方を実装します。これによりアプリケーションのデプロイ時にOracleRepositoryオブジェクトを作成および構成し、JNDIディレクトリにすぐに使用できるOracleRepositoryオブジェクトを格納できます。実行時に、アプリケーションはJNDIディレクトリから構成済のOracleRepositoryオブジェクトを取得できます。JCRの仕様でお薦めするこの方法により、デプロイメントと実行時の懸案事項が区別されます。
Oracle XML DB Content Connectorでは、JCR名前空間レジストリを構成する接頭辞とURIのマッピングはOracleRepository構成の一部として格納されます。
|
関連項目: 『Oracle Database XML Java APIリファレンス』、パッケージoracle.jcrを参照してください。 |
例31-3は、Oracle XML DB Content Connectorを使用してローカル・ファイル・システムからOracle XML DBリポジトリへファイルをアップロードするJavaプログラムです。コマンドラインからこの例をコンパイルし、実行してください。プログラムには、次のようなコマンドライン引数が必要です。
JDBCデータベースURL
ユーザーID
ユーザー・パスワード
ファイルをアップロードするOracle XML DBリポジトリのフォルダ
アップロードするファイル
MIMEタイプ
次に例を示します。
export CLASSPATH=.:$ORACLE_HOME/lib/jcr-1.0.jar:$ORACLE_HOME/lib/ojcr.jar:$ORACLE_HOME/lib/xmlparserv2.jar:$ORACLE_HOME/jlib/xquery.jar
javac UploadFile.java
java UploadFile jdbc:oracle:oci:@ quine password /public MyFile.txt text/plain
例31-3 Oracle XML DB Content Connectorを使用したファイルのアップロード
import java.io.FileInputStream;
import javax.jcr.Node;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import oracle.jcr.OracleRepository;
import oracle.jcr.OracleRepositoryFactory;
import oracle.jcr.xdb.XDBRepositoryConfiguration;
import oracle.jdbc.pool.OracleDataSource;
public class UploadFile
{
public static void main(String[] args)
throws Exception
{
String databaseURL = args[0];
String userName = args[1];
String password = args[2];
String parentPath = args[3];
String fileName = args[4];
String mimeType = args[5];
// Get the JCR Repository object.
XDBRepositoryConfiguration configuration =
new XDBRepositoryConfiguration();
OracleDataSource ods =
(OracleDataSource)configuration.getDataSource();
ods.setURL(databaseURL);
OracleRepository repository =
OracleRepositoryFactory.createOracleRepository(configuration);
// Create a JCR Session.
SimpleCredentials sc =
new SimpleCredentials(userName, password.toCharArray());
Session session = repository.login(sc);
// Get the parent node.
Node parentNode = (Node)session.getItem(parentPath);
// Get the child contents.
FileInputStream inputStream = new FileInputStream(fileName);
// Create child node.
Node node = parentNode.addNode(fileName, "nt:file");
Node contentNode = node.getNode("jcr:content");
contentNode.setProperty("jcr:mimeType", mimeType);
contentNode.setProperty("jcr:data", inputStream);
// Save changes and logout.
session.save();
session.logout();
}
}
// EOF
次の場所に追加サンプル・コードがあります。
$ORACLE_HOME/xdk/demo/java/jcr
コード・サンプルごとに、READMEファイルにその目的および使用方法が記述されています。
Oracle XML DB Content Connectorは標準のjava.util.loggingフレームワークを使用します。そのフレームワークにより提供されたロギングAPIを使用して、ロギング動作を制御できます。たとえば、次のJavaコード・フラグメントはすべてのロギングを無効にします。
import java.util.logging.LogManager; ... LogManager.getLogManager().reset();
JCRバージョン1.0を定義するJSR-170標準では、2つのコンプライアンス・レベルと一連のオプション機能が定義されています。Oracle XML DB Content Connectorでは、レベル1(読取り機能)とレベル2(書込み機能)がサポートされています。
この項では、Oracle XML DB Content Connectorの制限について説明します。
単一のワークスペースがサポートされています。javax.jcr.Repositoryのlogin(Credentials, String)メソッドまたはlogin(String)メソッドをコールする場合は、ワークスペース名を必ず空の文字列("")またはNULLにしてください。
javax.jcr.Itemのメソッドsave()およびrefresh()は、型がnt:fileまたはnt:folderのノードでのみコールできます。または、javax.jcr.Sessionのメソッドmove()およびjavax.jcr.Workspaceのメソッドcopy()およびmove()は、ノードnt:fileおよびnt:folderでのみコールできます。
javax.jcr.ItemのメソッドisNew()およびisModified()は、項目自体ではなく、項目を含むファイルまたはフォルダの状態を戻します。メソッドisNew()は、ファイルまたはフォルダがJCR一時レイヤーで作成されているが保存されていない場合にtrueを戻します。メソッドisModified()は、ファイルまたはフォルダがJCR一時レイヤーで変更されているが保存されていない場合にtrueを戻します。
プロパティjcr:dataにはファイルのバイナリ・コンテンツが入っています。ファイル・コンテンツがXMLの場合、そのXMLコンテンツがJCRノードおよびプロパティとして公開されている場所にojcr:xmlContentノードも存在します。ojcr:xmlContentサブツリーへの変更は、それらの変更が保存されるまでjcr:dataプロパティに反映されません。jcr:dataプロパティとojcr:xmlContentサブツリーの両方を変更した場合、それらの変更が保存されるとojcr:xmlContentサブツリーが優先されます。
クラスjavax.jcr.Sessionまたはクラスjavax.jcr.Itemのsaveメソッドは、一時レイヤーで行われた変更を保存します。1つ以上のノードまたはプロパティが変更されている場合、JCRは変更の格納順を指定しません。Oracle XML DB Content Connectorは、次のものの変更を保存します。
既存のファイルとフォルダに、パスでソートされた順序で更新を適用します。
新しいファイルとフォルダを、パスでソートされた順序で作成します。
既存のファイルとフォルダを、パスでソートされた順序の逆順で移動します。
既存のファイルとフォルダを、パスでソートされた順序の逆順で削除します。
保存すると、連続したjcr:xmltextノードが単一jcr:xmltextノードの中に結合されます。このノードはXMLコンテンツまたはユーザー定義メタデータ内のテキストを表します。
Oracle XML DB Content ConnectorはXML SchemaからJCRノード型を作成できます。
この項では、次の項目について説明します。
XMLデータは、ファイル・コンテンツまたはユーザー定義メタデータとしてOracle XML DBリポジトリに格納できます。いずれの場合も、XMLデータはXML Schemaに基づいて作成できます。XML Schemaに基づくデータはOracle XML DBで登録されたXML Schemaに対して検証されます。
デフォルトでは、XML文書コンテンツとユーザー定義メタデータに対応するJCRノードの型は、XMLデータがXML Schemaに基づいていてもJCRにより定義される汎用ノード型であるnt:unstructuredになります。Oracle XML DBリポジトリはXML Schemaに対してOracle XML DB Content Connectorを通して行われた変更を検証しますが、JCRでメタデータにアクセスしたり、型指定したりすることはできません。
ただし、Oracle XML DB Content ConnectorによりXML SchemaをJCRで使用できるよう登録できます。これによりContent Connectorは、XML Schema単純型、複合型、グローバルな要素宣言のJCRノード型を登録XML Schemaに生成します。
XMLデータをJCRノードとして公開する場合、Content Connectorはそのルート要素のXML属性xsi:schemaLocationまたはxsi:noNamespaceSchemaLocationの値に基づいて、XMLデータがJCRで使用するために登録されたXML Schemaに準拠するかどうか判断します。XMLデータがJCR登録XML Schemaに準拠する場合、XMLデータは、汎用ノード型nt:unstructuredを使用せずに、XML Schemaから生成されたノード型のJCRノードとして公開されます。
また、生成されたJCRノード型を使用してXML文書コンテンツおよびユーザー定義メタデータを作成したり、更新したりできます。
例31-4に、XML Schemaに基づくコンテンツを持つXML文書を示します。
例31-4 XML Schemaに基づくコンテンツを持つXML文書
<Address country="US"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation=
"http://www.example.com/Address">
<name>Alice Smith</name>
<street>123 Maple Street</street>
<city>Mill Valley</city>
<state>CA</state>
<zip>90952</zip>
</Address>
例31-4のコンテンツは、例31-5で示すXML Schemaに関して有効です。
例31-5 XML Schema
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="USAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:long"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:NMTOKEN"
fixed="US"/>
</xsd:complexType>
</xsd:schema>
最初は、このXML SchemaはJCRで使用できるように登録されていません。XMLコンテンツを表すJCRノードおよびプロパティは、例31-6に示されています。
例31-6 JCRで使用するために登録されていないXMLコンテンツのJCR表現
ojcr:xmlContent (nt:unstructured) Address (nt:unstructured) country="US" (String) name (nt:unstructured) jcr:xmltext(ojcr:xmltext) jcr:xmlcharacters="Alice Smith" (String) street (nt:unstructured) jcr:xmltext(ojcr:xmltext) jcr:xmlcharacters="123 Maple Street" (String) city (nt:unstructured) jcr:xmltext(ojcr:xmltext) jcr:xmlcharacters="Mill Valley" (String) state (nt:unstructured) jcr:xmltext(ojcr:xmltext) jcr:xmlcharacters="CA" (String) zip (nt:unstructured) jcr:xmltext (ojcr:xmltext) jcr:xmlcharacters="90952" (String)
XML SchemaはJCRで使用できるように登録されています。JCRノードおよびプロパティは例31-7に示されています。
例31-7 JCRで使用するために登録されているXMLコンテンツのJCR表現
ojcr:xmlContent (nt:unstructured) Address (USAddress) country="US" (String) name (xsd:string) jcr:xmltext(ojcr:xmltext) jcr:xmlcharacters="Alice Smith" (String) street (xsd:string) jcr:xmltext(ojcr:xmltext) jcr:xmlcharacters="123 Maple Street" (String) city (xsd:string) jcr:xmltext(ojcr:xmltext) jcr:xmlcharacters="Mill Valley" (String) state (xsd:string) jcr:xmltext(ojcr:xmltext) jcr:xmlcharacters="CA" (String) zip (xsd:long) jcr:xmltext (ojcr:xmltext) jcr:xmlcharacters="90952" (Long)
ノードAddressのノード型はUSAddressです。同様に、ノードname、street、city、およびstateのノード型はxsd:stringです。ノードzipのノード型はxsd:longで、その子であるjcr:xmltextのjcr:xmlcharactersプロパティのプロパティ型はLONGです。
JCRで使用するようXML Schemaを登録する前に、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchemaを使用してOracle XML DBで使用できるよう登録する必要があります。たとえば、場所がhttp://www.example.com/AddressのXML Schemaを登録するには、まず例31-8で示すように、まずOracle XML DBで使用できるよう登録します。次に、例31-9で示すように、Oracle XML DB Content Connector Java APIを使用してJCRで使用できるよう登録します。
例31-8 Oracle XML DBで使用するためのXML Schemaの登録
BEGIN
DBMS_XMLSCHEMA.registerSchema(
schemaurl=>'http://www.example.com/Address',
schemadoc=>bfileContainingSchema,
local=>false,
enablehierarchy=>DBMS_XMLSCHEMA.ENABLE_HIERARCHY_RESMETADATA);
END;
/
|
注意: グローバルに登録されたXML Schema(local=>false)のみJCRで使用できます。 |
例31-9 JCRで使用するためのXML Schemaの登録
import oracle.jcr.nodetype.OracleNodeTypeManager;...
OracleNodeTypeManager ntm = (OracleNodeTypeManager)
session.getWorkspace().getNodeTypeManager();
ntm.registerXMLSchema("http://www.example.com/Address", null);
JCRで使用できるよう登録されたXML SchemaのリストはOracleRepositoryオブジェクトに格納されています。JCRの仕様でお薦めしているように、OracleRepositoryオブジェクトをJNDIディレクトリに格納することで、この登録データを保存できます。
JCRでは、各ノード型は一意の名前である必要があります。デフォルトでは、Oracle XML DB Content Connectorは登録済のXML Schemaに対応するJCRノード型をXML Schemaのターゲット名前空間に生成します。同じ名前空間の2つのXML Schemaや、名前が同じXML Schema宣言型を登録する場合、JCRノード型が生成される名前空間にオーバーライドすることで、名前のクラッシュを回避できます。詳細は、メソッドregisterXMLSchema()のJavadocを参照してください。
|
関連項目:
|
この項では、JCRで使用できるよう登録されているXML SchemaからのOracle XML DB Content ConnectorによるJCRノード型の生成方法について説明します。
JCRおよびXML Schemaの型モデルは似ていますが、同じではありません。XML Schemaには、JCRで表現されない側面もあります。たとえば、XML Schema単純型の制約ファセットの中にはJCRから検出できないものもあります。そうした場合でも、それらはOracle XML DB Content Connectorにより適用されます。
一般的には、XML Schemaから生成されたJCRノード型は、JCRや他のインタフェース関係なく、そのXML Schemaに準拠するXMLデータが作成または更新されるときに実行されるXML Schema検証を補強したり、損なったり、変更することはありません。
JCRノード型はXML Schema組込み型ごとに提供されています。たとえば、JCRノード型xsd:decimalは組込み型xsd:decimalに対応します。
JCRノード型の継承階層は、組込み型の継承階層に従います。たとえば、xsd:integerはxsd:decimalのサブタイプです。
各XML Schema組込み型は、JCRでその型の値を表す場合に使用するJCRプロパティ値型にマップします。
表31-2 JCRプロパティ値型にマップされるXML Schema組込み型
| XML Schema組込み型 | JCRプロパティ値型 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表31-2の注意:
JCR DATEプロパティ型はjava.util.Calendarオブジェクトを使用してアクセスされます。Calendarではすべてのフィールドを設定する必要があるため、1970-01-01T00:00:00.000+00:00のマスクを使用して、Property.getDate()またはValue.getDate()をコールしたときに欠落したフィールドのデフォルト値が提供されます。これには省略された時間/分/秒の値(xsd:date用)、年/月/日の値(xsd:time用)、タイムゾーン値(xsd:date、xsd:time、およびxsd:dateTime用)が含まれます。Property.getString()またはValue.getString()をコールすると、解析対象外文字列表現が戻されます。同様に、Property.setValue(String)またはProperty.setValue(valueFactory.createValue(String))を使用してマスクを適用せずにDATEプロパティを設定できます。
xsd:decimalおよびxsd:integerの値領域は、(Java doubleおよびlong値としてアクセスされた)対応するJCR型DOUBLEおよびLONGの値領域を超えます。そのため、xsd:decimalおよびxsd:integer値のいくつかは文字列としてJCRでのみアクセスできます。たとえば、bigIntegerProperty.getLong()はjavax.jcr.ValueFormatExceptionを発生させますが、bigIntegerProperty.getString()は解析対象外文字列表現を戻します。同様に、Property.setValue(String)またはProperty.setValue(valueFactory.createValue(String))を使用して、DOUBLEまたはLONGプロパティをJCR値領域外の値に設定できます。
xsd:ENTITIES、xsd:IDREFSおよびxsd:NMTOKENSは複数値のSTRINGプロパティとしてJCRで表現されます。
JCRノード型はXML Schemaで定義された単純型ごとに作成されます。JCRノード型の継承階層は、XML Schema型の継承階層に従います。
リスト単位で派生した単純型は、複数値のJCRプロパティ定義により表現されます。
共用体単位で派生した単純型は、プロパティ型がUNDEFINEDのJCRプロパティ定義により表現されます。
無名単純型に対応するJCRノード型には、統合名anonymousNodeType#sequenceNumberがあります。アプリケーションは統合名に応じて決まるものではありません。統合名はセッション間で同じであることが保証されず、JCRで使用するためにXML Schemaが登録または登録抹消されたり、登録XML Schemaの定義が変更されたりするときに変更される可能性があります。
JCRノード型はXML Schemaで定義された複合型ごとに作成されます。JCRノード型の継承階層は、XML Schema型の継承階層に従います。
XML Schema複合型に対応するJCRノード型:
複合型の属性宣言ごとにプロパティ定義が作成されます。複合型で名前により参照される属性宣言または属性グループは、調和して定義されているかのように処理されます。
複合型に属性ワイルド・カードがある場合に、未処理のプロパティ定義が作成されます。
子ノード定義は、複合型の内容モデルの一意の名前の要素宣言ごとに作成されます。名前により参照される要素宣言またはモジュール・グループは、調和して定義されているかのように処理されます。要素宣言が代用グループの先頭にある場合、子ノード定義も代用グループ内の要素宣言ごとに作成されます。
複合型に要素ワイルド・カードがある場合に、未処理の子ノード定義が作成されます。
xsd:mixed="true"であるため、またはxsd:simpleContent定義であるため、複合型によりXMLテキストが可能な場合にjcr:xmltext子ノード定義が作成されます。
複合型のJCRノード型は子ノードを順序付けします。
型がJCRを使用して拡張関数で得られたのか、制限で得られたのかを判断することはできません。
無名複合型に対応するJCRノード型には、統合名anonymousNodeType#sequenceNumberがあります。アプリケーションは統合名に応じて決まるものではありません。統合名はセッション間で同じであることが保証されず、JCRで使用するためにXML Schemaが登録または登録抹消されたり、登録XML Schemaの定義が変更されたりするときに変更される可能性があります。