6.8.7 文書空間オブジェクトのプロパティの操作

ここでは,文書空間オブジェクトのプロパティの操作について説明します。

文書空間オブジェクトのプロパティとは,文書空間オブジェクトが持っているプロパティです。DMAオブジェクト上に値が存在するものと,DMAオブジェクトの状態を基に演算などによって求められるものがあります。文書空間オブジェクトのプロパティの詳細については,「2.11 文書空間オブジェクトのプロパティ」を参照してください。

文書空間オブジェクトのプロパティの操作は,次の2種類の操作に分けられます。

なお,プロパティ管理のモデルついては,「3.9 属性管理モデル」を参照してください。

<この項の構成>
(1) プロパティの値の参照
(2) プロパティの値の更新
(3) バージョン付きオブジェクトのプロパティの操作
(4) VARRAY型のプロパティの参照
(5) VARRAY型のプロパティの更新
(6) そのほかのオブジェクトのプロパティの操作

(1) プロパティの値の参照

文書空間オブジェクトのプロパティの値は,次の手順で参照します。

  1. 文書空間オブジェクトのプロパティの値を,Proxyオブジェクトのターゲットプロパティ値集合プロパティにロードします。
    ロードには,DbjObj#readPropertiesメソッドを使用します。
  2. プロパティ値集合を扱うインターフェース(DbjPropSetインターフェース)を取得します。
    DbjPropSetインターフェースは,ターゲットプロパティ値集合プロパティにロードしたProxyオブジェクトのプロパティ値集合を扱うインターフェースです。DbjPropSetインターフェースは,DbjObj#propSetメソッドを実行して取得します。
    このインターフェースには,プロパティの値をデータ型ごとに取得するためのメソッド(getIntValメソッド,getStringValメソッドなど)が定義されています。取得したい値のデータ型に応じたメソッドを実行します。

なお,文書空間オブジェクトのプロパティの値を,Proxyオブジェクトのターゲットプロパティ値集合プロパティにロードする方法として,次の2種類の方法があります。

プロパティの値の参照の流れを,次の図に示します。

図6-12 プロパティの値の参照の流れ

[図データ]

ここでは,まず,集合に指定したプロパティのプロパティ値集合を,Proxyオブジェクトにロードする例を示します。

// プロパティを参照する例1(取得するプロパティ名の集合を指定する方法)
 
 // docspc:DbjDocSpaceインターフェース
 
// 参照するプロパティ名を要素とする集合
// (TitleプロパティとAuthorプロパティ)を作成する
Set propdef = new HashSet();
propdef.add( "Title" );
propdef.add( "Author" );

// DbjObjインターフェースを取得する
DbjObj obj = docspc.createObjConnection( oiid );

// プロパティ値集合をProxyオブジェクトにロードする
obj.readProperties( propdef );

// Proxyオブジェクトのターゲットプロパティ値集合プロパティから
// プロパティ値を取得する
String title = obj.propSet().getStringVal("Title");
String author = obj.propSet().getStringVal("Author");

次に,すでにProxyオブジェクトにロードされているプロパティ値集合を,再度ロードする例を示します。

// プロパティを参照する例2
// (すでにロードされているプロパティ値集合を再度ロードする方法)
 
// 「プロパティを参照する例1」の続き
 
// プロパティ値集合をProxyオブジェクトに再度ロードする
//(TitleプロパティとAuthorプロパティの値が更新される)
obj.readProperties();

// Proxyオブジェクトのターゲットプロパティ値集合プロパティから
// プロパティ値を取得する
String title = obj.propSet().getStringVal("Title");
String author = obj.propSet().getStringVal("Author");

(2) プロパティの値の更新

文書空間オブジェクトのプロパティの値は,次の手順で更新します。

設定されているプロパティ値に関係なく,新しいプロパティ値を設定する場合
  1. プロパティ値集合(DbjPropSet)を作成します。
    DbjFactory#createPropSetメソッドなどで取得した,DbjPropSetインターフェースを使用します。DbjPropSetインターフェースでは,プロパティ値集合に値を設定するためのメソッド(setPropValメソッドおよびsetPropRefメソッド)が定義されています。
  2. プロパティ値集合の値を文書空間オブジェクトにフラッシュします。
    DbjObj#writePropertiesメソッドの,引数にプロパティ値集合(DbjPropSet)を指定できる形式を使用します。
設定されているプロパティ値を基に,新しいプロパティ値に更新する場合
  1. 更新したいプロパティの値を,Proxyオブジェクトにロードします。
    DbjObj#readPropertiesメソッドを使用します。
  2. Proxyオブジェクトのターゲットプロパティ値集合プロパティの値を更新します。
    Proxyオブジェクトのターゲットプロパティ値集合プロパティの値の操作には,DbjObj#PropSetメソッドで取得できるDbjPropSetインターフェースを使用します。このインターフェースでは,プロパティ値集合の値を参照するメソッド(getIntValメソッド,getStringValメソッドなど)が定義されています。また,プロパティ値集合の値を更新するメソッド(setPropValメソッドおよびsetPropRefメソッド)も定義されています。
  3. Proxyオブジェクトのターゲットプロパティ値集合プロパティの値のうち,特定のプロパティの値だけを文書空間オブジェクトに反映したい場合,反映するプロパティ名のコレクションを作成します。
    例えば,Proxyオブジェクトにロードしたプロパティのうち,一部だけを文書空間オブジェクトにフラッシュしたい場合などに,そのプロパティを指定します。
  4. プロパティ値集合の値を文書空間オブジェクトにフラッシュします。
    DbjObj#writePropertiesメソッドの,引数のない形式またはプロパティ名のコレクションを指定できる形式を使用します。

ここでは,まず,プロパティ値集合(DbjPropSet)の値を文書空間オブジェクトに設定する例を示します。

// プロパティを更新する例1(プロパティ値集合の値で更新する例)
 
 // docspc:DbjDocSpaceインターフェース
 
// 更新するプロパティ値集合(TitleプロパティとAuthorプロパティ)を作成する
DbjPropSet props = factory.createPropSet();
props.setPropVal( "Title", "report" );
props.setPropVal( "Author", "suzuki" );
 
// DbjObjインターフェースを取得する
DbjObj obj = docspc.createObjConnection( oiid );
 
// 文書空間オブジェクトのプロパティ値を更新する
obj.writeProperties( props );

次に,Proxyオブジェクトのターゲットプロパティ値集合プロパティにロードしたプロパティの値を更新して,文書空間オブジェクトにフラッシュする例を示します。

// プロパティを更新する例2(Proxyオブジェクトの値をフラッシュする方法)
 
 // docspc:DbjDocSpaceインターフェース
 
// 参照するプロパティ名を要素とする一覧
// (TitleプロパティとAuthorプロパティ)を作成する
Set propdef = new HashSet();
propdef.add( "Title" );
propdef.add( "Author" );

// DbjObjインターフェースを取得する
DbjObj obj = docspc.createObjConnection( oiid );

// プロパティ値集合をProxyオブジェクトにロードする
obj.readProperties( propdef );

// Titleプロパティの値に'#'を追加する
String title = obj.propSet().getStringVal("Title") + "#";
obj.propSet().setPropVal( "Title", title );

// 文書空間オブジェクトに
// TitleプロパティとAuthorプロパティの値をフラッシュする
obj.writeProperties();

Proxyオブジェクトのターゲットプロパティ値集合プロパティにロードしたプロパティの値を更新して,一部のプロパティの値だけを文書空間オブジェクトにフラッシュする例を示します。

// プロパティを更新する例3
// (Proxyオブジェクトの一部のプロパティ値をフラッシュする方法)
 
 // docspc:DbjDocSpaceインターフェース

// 参照するプロパティ名を要素とするコレクション
// (TitleプロパティとAuthorプロパティ)を作成する
Set propdef = new HashSet();
propdef.add( "Title" );
propdef.add( "Author" );
 
// DbjObjインターフェース取得
DbjObj obj = docspc.createObjConnection( oiid );
 
// プロパティ値集合をProxyオブジェクトにロードする
obj.readProperties( propdef );
 
// Titleプロパティの値に'#'を追加する
String title = obj.propSet().getStringVal("Title") + "#";
obj.propSet().setPropVal("Title", title);

// 文書空間オブジェクトに
// Titleプロパティの値だけをフラッシュする
Set updateprop = new HashSet();
updateprop.add( "Title" );
obj.writeProperties( updateprop );

(3) バージョン付きオブジェクトのプロパティの操作

バージョン付きオブジェクトのプロパティを操作する場合,バージョニングオブジェクトのプロパティとバージョンオブジェクトのプロパティを同時に操作できます。

バージョニングオブジェクトのプロパティとバージョンオブジェクトのプロパティは,データベース上では,次に示すように異なるDMAオブジェクト上に定義されています。

バージョニングオブジェクトのプロパティ
dmaClass_ConfigurationHistoryクラスまたはそのサブクラスのオブジェクトに定義されています。
バージョンオブジェクトのプロパティ
  • バージョン付き文書の場合は,dmaClass_DocVersionクラスまたはそのサブクラスのオブジェクトに定義されています。
  • バージョン付きフォルダの場合は,edmClass_ContainerVersionクラスまたはそのサブクラスのオブジェクトに定義されています。

バージョニングオブジェクトのプロパティとバージョンオブジェクトのプロパティは,バージョンオブジェクトのプロパティ名に@プレフィックスを付けて指定することで,明示的に区別して指定します。

例えば,バージョン付き文書のバージョニングオブジェクトに文書全体の著者名を表すAuthorプロパティが定義されていて,バージョンオブジェクトにもバージョンごとの著者名を表すAuthorプロパティが定義されている場合,バージョンオブジェクトのAuthorプロパティは,"@Author"として指定します。これは,Proxyオブジェクトのターゲットプロパティ値集合プロパティにロードしたプロパティ値集合を扱う場合でも同じです。バージョニングオブジェクトとバージョンオブジェクトのプロパティを同時に操作する場合は,バージョンオブジェクトのプロパティ名に「@」を付けて区別します。

ただし,バージョン付きオブジェクトのプロパティを扱う場合でも,バージョンオブジェクトのDbjObjインターフェースを取得して操作する場合には,「@」は付けません。例えば,バージョン付きオブジェクトから直接カレントバージョンのプロパティを取得する場合は「@」を付けますが,バージョン付きオブジェクトからカレントバージョンのDbjObjインターフェースを取得して,そのインターフェースを使用してバージョンオブジェクトのプロパティを取得する場合は「@」を付けません。

バージョン付きオブジェクトのプロパティの操作を次の図に示します。

図6-13 バージョン付きオブジェクトのプロパティの操作

[図データ]

ここでは,バージョニングオブジェクトのAuthorプロパティとバージョンオブジェクトのAuthorプロパティを同時に取得して参照する例を示します。

// バージョン付きオブジェクトのプロパティを参照する例
 
 //docspc:DbjDocSpaceインターフェース
 
// 参照するプロパティ名を要素とするコレクションを作成する
Set propdef = new HashSet();
propdef.add( "Author" );
propdef.add( "@Author" );
 
// バージョニングオブジェクトのDbjObjインターフェースを取得する
DbjObj obj = docspc.createObjConnection( oiid );
 
// プロパティ値集合をProxyオブジェクトにロードする
obj.readProperties( propdef );
 
// バージョニングオブジェクトのAuthorプロパティを取得する
String authorOfVersioning = obj.propSet().getStringVal("Author");
 
// バージョンオブジェクトのAuthorプロパティを取得する
String authorOfVersion = obj.propSet().getStringVal("@Author");

(4) VARRAY型のプロパティの参照

VARRAY型のプロパティは,可変長配列を値とするプロパティです。可変長配列は,パラメタクラスのDbjVArrayインターフェースを使用して操作します。

VARRAY型のプロパティの値は,次のどちらかの方法で取得できます。

これらのインターフェースを使用して,VARRAY型のプロパティを参照する手順は,次のとおりです

  1. Proxyオブジェクトに文書空間オブジェクトのプロパティをロードして,DbjPropSetインターフェースを取得します。または,検索を実行して,検索結果集合のDbjResultSetインターフェースを取得します。
  2. DbjPropSetインターフェースまたはDbjResultSetインターフェースからDbjVArrayインターフェースを取得します。
    • DbjPropSet#getVArrayRefメソッドまたはDbjResultSet#getVArrayRefメソッドを使用した場合は,VARRAY型のプロパティに設定された可変長配列の参照を取得できます。
    • DbjPropSet#getVArrayValメソッドまたはDbjResultSet#getVArrayValメソッドを使用した場合は,VARRAY型のプロパティに設定された可変長配列のコピーを取得できます。
  3. DbjVArrayインターフェースのメソッドで値を取得します。

ここでは,DbjPropSetインターフェースを使用してVARRAY型のプロパティを参照する例を示します。この例では,次の図に示す文書空間オブジェクトのVARRAY型のプロパティを対象にします。

図6-14 例で使用するVARRAY型のプロパティ

[図データ]

// VARRAY型のプロパティを参照する例
 
 //docspc:DbjDocSpaceインターフェース
 
Set propdef = new HashSet();
propdef.add( "arr" );
 
// VARRAY型のプロパティの値をロードする
DbjObj obj = docspc.createObjConnection( oiid );
obj.readProperties( propdef );
 
// Proxyオブジェクトのターゲットプロパティ値集合プロパティから,
// DbjVArrayインターフェースの参照を取得する
DbjVArray varray = obj.propSet().getVArrayRef( "arr" );

// VARRAY型のプロパティの各要素の値を出力する
for (int i=0; i<varray.size();i++){
 System.out.println("Title["+i+"]="
                 varray.propSet(i).getStringVal( "Title" ) );
 System.out.println("Author["+i+"]="
                 varray.propSet(i).getStringVal( "Author" ) );
}

(5) VARRAY型のプロパティの更新

VARRAY型のプロパティは,次のような手順で更新します。

  1. 可変長配列の要素に指定するプロパティ名のコレクションを作成します。
  2. 可変長配列を作成します。
  3. 可変長配列の要素を作成します。
  4. 要素に値を設定します。
  5. 4.を可変長配列の要素として追加します。
    4.と5.は要素の数だけ繰り返します。
  6. 可変長配列を,VARRAY型のプロパティの値としてプロパティ値集合に設定します。
  7. プロパティ値集合を,文書空間オブジェクトにフラッシュします。

VARRAY型のプロパティを更新する例を示します。なお,対象とするVARRAY型のプロパティは,図6-14と同じです。

// VARRAY型のプロパティを更新する例
 
 // factory:DbjFactoryインターフェース
 // docspc:DbjDocSpaceインターフェース
 // obj:DbjObjインターフェース

// 可変長配列の要素のプロパティ名のコレクションを作成する
Set propdef = new HashSet();
propdef.add( "Title" );
propdef.add( "Author" );
propdef.add( "Number" );

// 可変長配列を作成する
DbjVArray varray = factory.createVArray( propdef );

// 可変長配列の要素を作成する
DbjPropSet elm = factory.createPropSet();

// 一つ目の要素に値を設定する
elm.setPropVal( "Title" , "report1" );
elm.setPropVal( "Author" , "suzuki" );

// 可変長配列に一つ目の要素を追加する
varray.addPropSet( elm );

// 二つ目の要素に値を設定する
elm.setPropVal( "Title" , "report2" );
elm.setPropVal( "Author" , "hitachi" );

// 可変長配列に二つ目の要素を追加する
varray.addPropSet( elm );

// Numberプロパティの値を要素ごとに設定する
for(int i = 0; i < varray.size(); i ++ ) {
   // 可変長配列の要素を参照してNumberプロパティの値を設定する
   varray.propSet(i).setPropVal( "Number",i );
}

// プロパティ値集合を作成する
// (arrプロパティに可変長配列の値を設定する)
DbjPropSet props = factory.createPropSet();
props.setPropVal( "arr" , varray );

// 文書空間オブジェクトにプロパティ値集合をフラッシュする
obj.writeProperties( props );

(6) そのほかのオブジェクトのプロパティの操作

レンディションのプロパティの操作,およびリンクオブジェクトのプロパティの操作は,この項で説明したプロパティの操作とは異なるインターフェースおよびメソッドを使用して実行します。

レンディションのプロパティの操作については,「6.8.11 マルチレンディション文書のレンディションの操作」を参照してください。

リンクオブジェクトのプロパティの操作については,「6.8.13 リンクの操作」を参照してください。