この章では、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の定義が変更されたりするときに変更される可能性があります。