ヘッダーをスキップ
Oracle® XML DB開発者ガイド
11gリリース2 (11.2)
B70200-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

31 Oracle XML DB Content Connectorの使用

この章では、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およびOracle XML DB Content Connectorの概要

この項では、次の項目について説明します。

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.jpgjcr: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について

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を使用して作成、取出し、および更新が可能です。

JCRで公開されるOracle XML DBリポジトリ

Oracle XML DB Content Connectorは、Oracle XML DBリポジトリのデータをJCRノードおよびプロパティとして表します。ファイルおよびフォルダは、それぞれ型がnt:filent:folderのノードとして表されます。そのコンテンツとメタデータは、ノード型がnt:resourceのノードとして公開されます。

この項では、次の項目について説明します。

JCRでのファイルおよびフォルダの公開例

フォルダMyFolderは、Oracle XML DBリポジトリのルート・フォルダに格納されています。フォルダには、Address.xmlCar.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は、MyFolderAddress.xmlCar.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"

JCRノード型に対するOracle拡張関数

Oracle XML DB Content Connectorがnt:filent:folder、およびnt:resourceの各ノード型の定義を補強することによって、Oracle XML DBリポジトリにある追加情報が取り込まれます。ノード型ojcr:foldernt:folderのスーパータイプとして追加され、ノード型ojcr:resourcent:resourceのスーパータイプとして追加されます。Oracle拡張関数は、すべて名前空間http://xmlns.oracle.com/jcr/1.0にあります。この名前空間は名前空間接頭辞ojcrにマップされます。

また、ノード型mix:referenceablent:fileおよびnt:folderのスーパータイプとして追加され、それらのリソースIDによってすべてのファイルとフォルダにアクセスできます。

バイナリ・コンテンツおよびXMLコンテンツ

プロパティjcr:dataにはファイルのバイナリ・コンテンツが入っています。jcr:dataは、ノードnt:fileではなくその子ノードjcr:contentのプロパティです。XMLコンテンツを含むファイルの場合、ノードjjcr: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では、このメタデータはXMLTypeRESの一連のXML要素として表されます。JCRでは、このメタデータは名前空間jcrおよびojcrのプロパティにマップされます。表31-1で、このマッピングについて説明します。

表31-1 Oracle XML DBリソースとJCRのマッピング

XPath ノードnt:fileまたはnt:folderからの相対パス

/Resource/CreationDate

jcr:created

/Resource/ModificationDate

jcr:content/jcr:lastModified

/Resource/Author

jcr:content/ojcr:author

/Resource/DisplayName

jcr:content/ojcr:displayName

/Resource/Comment

jcr:content/ojcr:comment

/Resource/Language

jcr:content/ojcr:language

/Resource/CharacterSet

jcr:content/jcr:encoding

/Resource/ContentType

jcr:content/jcr:mimeType

/Resource/Owner

jcr:content/ojcr:owner

/Resource/Creator

jcr:content/ojcr:creator

/Resource/LastModifier

jcr:content/ojcr:lastModifier


ユーザー定義メタデータ

ユーザー定義の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)への最新のコールの後にそのリソースが最初に検出されたパスが戻されます。JCRメソッド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 Content Connectorを使用してOracle XML DBリポジトリの情報にアクセスする方法について説明します。内容は次のとおりです。

CLASSPATHの設定

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

JCRリポジトリ・オブジェクトの取得

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 Reference』、パッケージoracle.jcrを参照してください。

ファイルのアップロードのためのサンプル・コード

例31-3は、Oracle XML DB Content Connectorを使用してローカル・ファイル・システムからOracle XML DBリポジトリへファイルをアップロードするJavaプログラムです。

例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

例31-3は、コマンドラインからコンパイルして実行できます。プログラムには、次のようなコマンドライン引数が必要です。

  • JDBCデータベースURL

  • ユーザーID

  • ユーザー・パスワード

  • ファイルをアップロードするOracle XML DBリポジトリのフォルダ

  • アップロードするファイル

  • MIMEタイプ

例31-4に、これを示します。

例31-4 コマンドラインを使用したファイルのアップロード

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

追加コード・サンプル

次の場所に追加サンプル・コードがあります。

$ORACLE_HOME/xdk/demo/java/jcr

コード・サンプルごとに、READMEファイルにその目的および使用方法が記述されています。

Oracle XML DB Content ConnectorのロギングAPI

Oracle XML DB Content Connectorは標準のjava.util.loggingフレームワークを使用します。そのフレームワークにより提供されたロギングAPIを使用して、ロギング動作を制御できます。たとえば、次のJavaコード・フラグメントはすべてのロギングを無効にします。

import java.util.logging.LogManager;
...
LogManager.getLogManager().reset();

サポートされているJCRコンプライアンス・レベル

JCRバージョン1.0を定義するJSR-170標準では、2つのコンプライアンス・レベルと一連のオプション機能が定義されています。Oracle XML DB Content Connectorでは、レベル1(読取り機能)とレベル2(書込み機能)がサポートされています。

Oracle XML DB Content Connectorの制限

この項では、Oracle XML DB Content Connectorの制限について説明します。

デフォルトのワークスペース名

単一のワークスペースがサポートされています。javax.jcr.Repositorylogin(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を戻します。

バイナリ・コンテンツとXMLコンテンツの間の相互作用

プロパティjcr:dataにはファイルのバイナリ・コンテンツが入っています。ファイル・コンテンツがXMLの場合、そのXMLコンテンツがJCRノードおよびプロパティとして公開されている場所にojcr:xmlContentノードも存在します。ojcr:xmlContentサブツリーへの変更は、それらの変更が保存されるまでjcr:dataプロパティに反映されません。jcr:dataプロパティとojcr:xmlContentサブツリーの両方を変更した場合、それらの変更が保存されるとojcr:xmlContentサブツリーが優先されます。

変更の保存順

クラスjavax.jcr.Sessionまたはクラスjavax.jcr.Itemsaveメソッドは、一時レイヤーで行われた変更を保存します。1つ以上のノードまたはプロパティが変更されている場合、JCRは変更の格納順を指定しません。Oracle XML DB Content Connectorは、次のものの変更を保存します。

  1. 既存のファイルとフォルダに、パスでソートされた順序で更新を適用します。

  2. 新しいファイルとフォルダを、パスでソートされた順序で作成します。

  3. 既存のファイルとフォルダを、パスでソートされた順序の逆順で移動します。

  4. 既存のファイルとフォルダを、パスでソートされた順序の逆順で削除します。

未定義のプロパティ

UNDEFINEDの定義を持つプロパティは、STRING値として格納されます。

ノード型nt:baseは抽象

ノード型nt:baseは抽象で、新しいノードの型としては指定できません。

自動作成されるノードjcr:content

型がnt:fileまたはnt:folderのノードを作成する場合、jcr:contentノードが子として自動的に作成されます。

保存によるノードjcr:xmltextの正規化

保存すると、連続したjcr:xmltextノードが単一jcr:xmltextノードの中に結合されます。このノードはXMLコンテンツまたはユーザー定義メタデータ内のテキストを表します。

ノード型mix:referenceable

ノード型nt:filent:folderおよびnt:resourceは、ミックスインノード型mix:referenceableのサブタイプです。現在、すべてのnt:filent:folderおよびnt:resourceノードは、UUIDで参照できます。mix:referenceableはどんな型のノードにも追加できません。

全文索引

PL/SQLパッケージDBMS_XDBT使用して、ファイル・コンテンツ上に全文索引を作成することができます。これにより、問合せで関数jcr:containsjcr:contentノードのプロパティjcr:dataに適用することができます。他のプロパティ上での全文索引はサポートされません。

XML SchemaのJCRでの使用

Oracle XML DB Content ConnectorはXML SchemaからJCRノード型を作成できます。

この項では、次の項目について説明します。

JCRで使用する場合にXML Schemaを登録する理由

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-5に、XML Schemaに基づくコンテンツを持つXML文書を示します。

例31-5 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-5のコンテンツは、例31-6で示すXML Schemaに関して有効です。

例31-6 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-7に示されています。

例31-7 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-8に示されています。

例31-8 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です。同様に、ノードnamestreetcity、およびstateのノード型はxsd:stringです。ノードzipのノード型はxsd:longで、その子であるjcr:xmltextjcr:xmlcharactersプロパティのプロパティ型はLONGです。

JCRを使用したXML Schemaの登録方法

JCRで使用するようXML Schemaを登録する前に、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchemaを使用してOracle XML DBで使用できるよう登録する必要があります。たとえば、場所がhttp://www.example.com/AddressのXML Schemaを登録するには、まず例31-9で示すように、まずOracle XML DBで使用できるよう登録します。次に、例31-10で示すように、Oracle XML DB Content Connector Java APIを使用してJCRで使用できるよう登録します。

例31-9 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-10 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を参照してください。


関連項目:

  • Oracle XML DBを使用したXML Schema登録の詳細は、「DBMS_XMLSCHEMAを使用したXML Schemaの管理」を参照してください。

  • JavaメソッドregisterXMLSchema()の詳細は、『Oracle Database XML Java API Reference』、パッケージoracle.jcrを参照してください。


XML SchemaからのJCRノード型の生成方法

この項では、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:integerxsd:decimalのサブタイプです。

各XML Schema組込み型は、JCRでその型の値を表す場合に使用するJCRプロパティ値型にマップします。

表31-2 JCRプロパティ値型にマップされるXML Schema組込み型

XML Schema組込み型 JCRプロパティ値型

xsd:anySimpleType

STRING

xsd:anyURI

STRING

xsd:base64Binary

BINARY

xsd:boolean

BOOLEAN

xsd:byte

LONG

xsd:date

DATE(1)

xsd:dateTime

DATE(1)

xsd:decimal

DOUBLE(2)

xsd:double

DOUBLE

xsd:duration

STRING

xsd:ENTITIES

STRING(3)

xsd:ENTITY

STRING

xsd:float

DOUBLE

xsd:gDay

STRING

xsd:gMonth

STRING

xsd:gMonthDay

STRING

xsd:gYear

STRING

xsd:gYearMonth

STRING

xsd:hexBinary

BINARY

xsd:ID

STRING

xsd:IDREF

STRING

xsd:IDREFS

STRING(3)

xsd:int

LONG

xsd:integer

LONG(2)

xsd:language

STRING

xsd:long

LONG

xsd:Name

STRING

xsd:NCName

STRING

xsd:negativeInteger

LONG

xsd:NMTOKEN

STRING

xsd:NMTOKENS

STRING(3)

xsd:nonNegativeInteger

LONG

xsd:nonPositiveInteger

LONG

xsd:normalizedString

STRING

xsd:NOTATION

STRING

xsd:positiveInteger

LONG

xsd:QName

STRING

xsd:short

LONG

xsd:string

STRING

xsd:time

DATE(1)

xsd:token

STRING

xsd:unsignedByte

LONG

xsd:unsignedInt

LONG

xsd:unsignedLong

LONG

xsd:unsignedShort

LONG


表31-2の注意:

  1. JCR DATEプロパティ型はjava.util.Calendarオブジェクトを使用してアクセスされます。Calendarではすべてのフィールドを設定する必要があるため、1970-01-01T00:00:00.000+00:00のマスクを使用して、Property.getDate()またはValue.getDate()をコールしたときに欠落したフィールドのデフォルト値が提供されます。これには省略された時間/分/秒の値(xsd:date用)、年/月/日の値(xsd:time用)、タイムゾーン値(xsd:datexsd:time、およびxsd:dateTime用)が含まれます。Property.getString()またはValue.getString()をコールすると、解析対象外文字列表現が戻されます。同様に、Property.setValue(String)またはProperty.setValue(valueFactory.createValue(String))を使用してマスクを適用せずにDATEプロパティを設定できます。

  2. 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値領域外の値に設定できます。

  3. xsd:ENTITIESxsd:IDREFSおよびxsd:NMTOKENSは複数値のSTRINGプロパティとしてJCRで表現されます。

XML Schema定義単純型

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

グローバルな要素宣言

JCRノード型はXML Schemaのグローバルな要素宣言ごとに作成されます。生成されたノード型のローカル名は、アンダースコア(_)をグローバルな要素宣言のローカル名の先頭に追加して作成されます。たとえば、名前空間修飾発注書XML Schemaでは、po:_purchaseOrderというノード型はpo:purchaseOrderというグローバル要素について作成されます。