uCosminexus DocumentBroker Version 5 リファレンス API

[目次][用語][索引][前へ][次へ]

1.10.13 リンクの操作

ここでは,リンクの操作について説明します。

リンクを設定して管理できるのは,文書管理オブジェクトのうち,文書およびフォルダです。したがって,この項の説明中の文書管理オブジェクトとは,文書またはフォルダを指します。

また,フォルダを使用したリンクでは特に,リンク元オブジェクトであるフォルダを上位オブジェクト,リンク先オブジェクトである文書またはフォルダを下位オブジェクトといいます。

<この項の構成>
(1) リンクの操作の概要
(2) 文書管理オブジェクト作成時のリンクの設定
(3) 既存の文書管理オブジェクト間のリンクの設定
(4) リンクをたどる文書管理オブジェクトの参照
(5) リンクのプロパティの操作
(6) 文書管理オブジェクトの移動
(7) リンクの解除

(1) リンクの操作の概要

ここでは,リンクの操作の概要について説明します。

DocumentBrokerクラスライブラリで設定できるリンクは,次の2種類です。

リンク種別と,リンク元またはリンク先に設定できるオブジェクト種別の対応は,次に示す表のとおりです。

表1-8 リンク種別とリンク元またはリンク先に設定できるオブジェクト種別

リンク種別 リンク元オブジェクトの
オブジェクト種別
リンク先オブジェクトの
オブジェクト種別
直接型リンク バージョンなしフォルダ バージョンなし文書
バージョン付き文書
バージョンなしフォルダ
参照型リンク バージョンなしフォルダ バージョンなし文書
バージョン付き文書
バージョンなしフォルダ
文書間リンク バージョンなし文書
バージョン付き文書
バージョンなし文書
バージョン付き文書

リンクの操作には,次の操作があります。

リンクの操作には,文書またはフォルダのインターフェースであるDbjObjインターフェースを使用する方法と,リンクオブジェクトのインターフェースであるDbjLinkObjインターフェースを使用する方法があります。また,文書管理オブジェクトの作成と同時にリンクを設定する場合は,DbjDocSpaceインターフェースを使用してリンクを設定することもできます。なお,リンクオブジェクトは,リンク元の文書管理オブジェクトに属するオブジェクトです。DbjObjインターフェースを使用して操作する場合,リンクの設定,解除またはプロパティの変更などは,リンク元オブジェクトから実行します。リンクオブジェクトには,それぞれリンク識別子が設定されています。このリンク識別子を使用して,リンクを特定できます。

(2) 文書管理オブジェクト作成時のリンクの設定

リンクの設定には,2種類の方法があります。

なお,文書管理オブジェクトごとに,設定できるリンクの種別は異なります。

ここでは,DbjDocSpaceインターフェースのcreateXXX(XXXは作成する文書管理オブジェクトの種別によって異なります)メソッドを実行して,文書管理オブジェクトの作成と同時に既存の文書管理オブジェクトへのリンクを設定する方法について説明します。文書管理オブジェクトの作成については,「1.9.3 文書管理オブジェクトの作成」を参照してください。

文書管理オブジェクト作成時に,既存のフォルダからリンクを設定する例を示します。この例では,バージョン付き文書を,作成すると同時に二つのフォルダからリンクさせます。一つのフォルダからは直接型リンク,もう一つのフォルダからは参照型リンクでリンクさせます。リンクさせるオブジェクトについての情報は,DbjSetLinkInfoインターフェースのサブインターフェースを要素とするリストで指定します。

 
// 文書管理オブジェクト作成時に,既存のフォルダからのリンクを設定する例
 
  // factory:DbjFactoryインターフェース
  // docspc:DbjDocSpaceインターフェース
 
// リンク設定情報のリストを作成する
// parentoiid1, parentoiid2はそれぞれ上位オブジェクトのOIID
 
List<DbjSetLinkInfo> linklist = new ArrayList<DbjSetLinkInfo> ();
linklist.add( factory.createSetDCRLinkInfo(
              docspc.createObjConnection( parentoiid1 ),null ) );
linklist.add( factory.createSetRCRLinkInfo(
              docspc.createObjConnection( parentoiid2 ),null ) );
 
// バージョン付き文書を作成する
DbjObj obj = docspc.createVrDocument(
         "mdmClass_CfgH",  
           // バージョニングオブジェクトのトップオブジェクトクラス
         "mdmClass_Document",
           // バージョンオブジェクトのトップオブジェクトクラス
         null,                 // 初期プロパティは設定しない
         null,                 // 初期コンテンツは登録しない
         linklist );           // リンク設定情報のリスト
 

(3) 既存の文書管理オブジェクト間のリンクの設定

ここでは,既存の文書管理オブジェクトからほかの文書管理オブジェクトにリンクを設定する方法について説明します。この操作には,リンク元オブジェクトの,DbjObj#linkメソッドを使用します。メソッドの引数には,リンク先オブジェクトを,次のどちらかのリストで指定します。

リストの要素をDbjSetLinkInfoインターフェースのサブインターフェースにすると,リンク先のオブジェクトごとにリンク種別を設定できます。例えば,「文書1は直接型リンクで関連付けて,文書2は参照型リンクで関連付けたい」という場合は,この形式を使用します。

リストの要素をDbjObjインターフェースにすると,リストに指定したすべてのリンク先オブジェクトを,引数に指定したリンク種別で一括して関連付けられます。例えば,「複数の文書をまとめて直接型リンクで関連付けたい」という場合は,この形式を使用できます。ただし,この形式で指定できるリンク種別は,直接型リンクまたは参照型リンクだけです。

ここでは,まず,リストの要素をDbjSetLinkInfoインターフェースのサブインターフェースにして,個々にリンク設定情報を指定する例を示します。

 
// DbjSetLinkInfoインターフェースを使用して
// 個々にリンク設定情報を指定する例
 
  // factory:DbjFactoryインターフェース
  // docspc:DbjDocSpaceインターフェース
 
// リンク設定情報のリストを作成する
// childoiid1, childoiid2はそれぞれリンク先オブジェクトのOIID
List<DbjSetLinkInfo> linklist = new ArrayList<DbjSetLinkInfo> ();
linklist.add( factory.createSetDCRLinkInfo(
              docspc.createObjConnection( childoiid1 ),null ) );
linklist.add( factory.createSetRCRLinkInfo(
              docspc.createObjConnection( childoiid2 ),null ) );
 
// フォルダのDbjObjインターフェースを取得する
DbjObj obj = docspc.createObjConnection( parentoiid );
 
// リンク先オブジェクトにリンクを設定する
// 二つのオブジェクトがフォルダから直接型リンクと参照型リンクで
// 関連付けられる
obj.link( linklist );
 

次にDbjObjインターフェースを使用して,複数の文書管理オブジェクトをまとめて関連付ける例を示します。

 
// DbjObjインターフェースを使用して
// 同じリンク種別で関連付ける例
 
  // docspc:DbjDocSpaceインターフェース
 
// リンク対象となるリンク先オブジェクトのリストを作成する
// childoiid1, childoiid2はそれぞれリンク先オブジェクトのOIID
List<DbjObj> childlist = new ArrayList<DbjObj>();
childlist.add( docspc.createObjConnection( childoiid1 ) );
childlist.add( docspc.createObjConnection( childoiid2 ) );
 
// フォルダのDbjObjインターフェースを取得する
DbjObj obj = docspc.createObjConnection( parentoiid );
 
// リンク先オブジェクトにリンクを設定する
// 二つのオブジェクトがフォルダから直接型リンクで関連付けられる
obj.link( DbjDef.LINK_DCR, childlist );
 

また,DbjObj#linkメソッドを使用して,検索結果として取得したオブジェクトをまとめて一つのフォルダに関連付けることもできます。

検索結果として取得したオブジェクトをまとめてフォルダに関連付ける例を示します。

 
// 検索結果として取得したオブジェクトをまとめてフォルダに関連付ける例
 
  // docspc:DbjDocSpaceインターフェース
  // parentObj:上位オブジェクトのインターフェース
 
// 関連付けるリンク先オブジェクトを検索する
DbjResultSet result = docspc.executeSearch(
             "SELECT dmaProp_OIID  FROM DV  WHERE ...",
             null,
             null );
 
// 検索結果として取得したOIIDを基に
// DbjObjListインターフェースを取得する
// (検索結果の0列目がdmaProp_OIIDである)
DbjObjList childlist = docspc.createObjList(result, 0 , null);
 
// 上位オブジェクトからリンクを設定する
// 検索結果が上位オブジェクトに直接型リンクで関連付けられる
parentObj.link( DbjDef.LINK_DCR, childlist );

(4) リンクをたどる文書管理オブジェクトの参照

リンクによって関連付けられた文書管理オブジェクトは,リンクをたどって参照できます。ここでは,リンクをたどって文書管理オブジェクトを参照する方法について説明します。

文書またはフォルダのインターフェースを使用して,リンクをたどって文書管理オブジェクトを参照する場合に使用するメソッドとリンク種別の関係を,次の表に示します。

表1-9 リンクをたどる参照に使用するメソッドとリンク種別の関係

メソッド たどる元になる文書管理オブジェクト リンク種別
getDCRParent 文書
フォルダ
直接型リンク
getParentList 文書
フォルダ
直接型リンク
参照型リンク
getChildList フォルダ 直接型リンク
参照型リンク
getRelList 文書 文書間リンク

ここでは,直接型リンク,参照型リンクをたどる参照をたどる参照と,文書間リンクをたどる参照について,分けて説明します。

(a) 直接型リンクまたは参照型リンクをたどる参照

ここでは,フォルダを使用した関連付けの場合の,直接型リンク,参照型リンクをたどる参照について説明します。

上位オブジェクトから下位オブジェクトを取得する場合,DbjObj#getChildListメソッドを使用します。このメソッドでは,上位オブジェクトから下位オブジェクトを関連付けているリンクオブジェクトのリストを扱うインターフェース(DbjLinkObjListインターフェース)を取得できます。メソッド実行時には,「直接型リンクだけを取得したい」,「直接型リンクと参照型リンクを取得したい」など,リンクの種別も指定できます。次に,DbjLinkObjListインターフェースの要素であるDbjLinkObjインターフェースを取得して,DbjLinkObj#getTargetObjメソッドによって,下位オブジェクトのインターフェースを取得します。

下位オブジェクトから上位オブジェクトを取得する場合,DbjObj#getParentListメソッドを使用します。このメソッドでは,下位オブジェクトを上位オブジェクトに関連付けているリンクオブジェクトのリストを扱うインターフェース(DbjLinkObjListインターフェース)を取得できます。メソッド実行時には,リンクの種別を指定できます。次に,DbjLinkObjListインターフェースの要素であるDbjLinkObjインターフェースを取得して,DbjLinkObj#getOwnerObjメソッドによって,それぞれの上位オブジェクトのインターフェースを取得します。

また,上位オブジェクトと下位オブジェクトが直接型リンクで関連付けられている場合,下位オブジェクトのDbjObj#getDCRParentメソッドで,リンクオブジェクトを取得しないで,直接上位オブジェクトのインターフェースを取得することもできます。

フォルダを使用したリンクを設定している場合の,リンクをたどる参照に使用するメソッドの関係について,次の図に示します。

図1-17 リンクをたどる参照に使用するメソッドの関係(フォルダを使用する場合)

[図データ]

取得した上位オブジェクトまたは下位オブジェクトを一括操作したい場合は,DbjLinkObjListインターフェースを取得してから,DbjLinkObjList#getOwnerObjListまたはDbjLinkObjList#getTargetObjListメソッドを実行して,DbjObjListインターフェースを取得することもできます。複数オブジェクトを一括操作する場合の詳細については,「1.10.14 複数の文書管理オブジェクトの一括操作」を参照してください。

ここでは,まず,上位オブジェクトから直接型リンクで関連付けられている下位オブジェクトを取得して,下位オブジェクトのOIIDの一覧を出力する例を示します。

 
// 下位オブジェクトのOIIDの一覧を出力する例
 
  // parentObj:DbjObjインターフェース
  // (上位オブジェクトのインターフェース)
 
// 下位オブジェクトを取得する
DbjLinkObjList objlist = parentObj.getChildList(
            null,               // 取得するプロパティは指定しない
            null,               // リンクのプロパティは指定しない
            DbjDef.LINK_DCR,    // 直接型リンクだけを取得する
            DbjDef.OBJTYPE_DOC, // 文書だけを取得する
            null );             // 検索結果取得情報は指定しない
 
// 下位オブジェクトのOIID一覧を出力する
for(int i = 0 ; i < objlist.size(); i++ ) {
  System.out.println("Child OIID["+i+"]="
  + objlist.getLinkObj(i).getTargetObj().getOiid() );
}
 

次に,下位オブジェクトから参照型リンクで関連付けられている上位オブジェクトの一覧を取得して,上位オブジェクトのOIIDの一覧を出力する例を示します。

 
// 上位オブジェクトのOIIDの一覧を出力する例
 
  // childObj:DbjObjインターフェース
  // (下位オブジェクトのインターフェース)
 
// 上位オブジェクトを取得する
DbjLinkObjList linklist
        = childObj.getParentList(
            null,               // 取得するプロパティは指定しない
            null,               // リンクのプロパティは指定しない
            DbjDef.LINK_RCR,    // 参照型リンクだけを取得する
            DbjDef.OBJTYPE_FOLDER, // フォルダを取得する
            null );             // 検索結果取得情報は指定しない
 
// DbjObjListインターフェースを取得する
DbjObjList objlist = linklist.getOwnerObjList();
 
// 上位オブジェクトのOIID一覧を出力する
for(int i = 0 ; i < objlist.size(); i++ ) {
  System.out.println("Parent OIID["+i+"]="
           + objlist.getObj(i).getOiid() );
}
(b) 文書間リンクをたどる参照

文書間リンクをたどってオブジェクトを参照する場合,DbjObj#getRelListメソッドを使用します。リンク元オブジェクトからリンク先オブジェクトを取得する場合も,リンク先オブジェクトからリンク元オブジェクトを取得する場合も,同じメソッドを使用します。リンク先オブジェクト,リンク元オブジェクトのどちらを取得するかは,メソッドの引数にリレーション種別として指定します。

DbjObj#getRelListメソッドを実行すると,DbjLinkObjListインターフェースが取得できます。このインターフェースから,要素であるDbjLinkObjインターフェースを取得します。DbjLinkObjインターフェースを使用してリンク元オブジェクトを取得する場合は,DbjLinkObj#getOwnerObjメソッドを,リンク先オブジェクトを取得する場合は,DbjLinkObj#getTargetObjメソッドを実行します。

文書間リンクを設定している場合に,リンクをたどる参照に使用するメソッドの関係について,次の図に示します。

図1-18 リンクをたどる参照に使用するメソッドの関係(文書間リンクを使用する場合)

[図データ]

また,取得したリンク元オブジェクトまたはリンク先オブジェクトを一括操作したい場合は,DbjLinkObjListインターフェースを取得してから,DbjLinkObjList#getOwnerObjListまたはDbjLinkObjList#getTargetObjListメソッドを実行して,DbjObjListインターフェースを取得することもできます。

ここでは,リンク元文書からリンク先文書の一覧を取得して,リンク先文書のOIIDの一覧を出力する例を示します。

 
// リンク先オブジェクトのOIIDの一覧を出力する例
 
  // obj:DbjObjインターフェース
 
// リンク先オブジェクトを取得する
DbjLinkObjList objlist = obj.getRelList(
           null,                    // 取得するプロパティは指定しない
           null,                    // リンクのプロパティは指定しない
           DbjDef.RELATIONEND_HEAD, // リンク先オブジェクトを取得する
           DbjDef.OBJTYPE_DOC,      // 文書だけを取得する
           null );                  // 検索結果取得情報は指定しない
 
// リンク先オブジェクトのOIID一覧を出力する
for(int i = 0 ; i < objlist.size(); i++ ) {
  System.out.println("OIID["+i+"]="
  + objlist.getLinkObj(i).getTargetObj().getOiid() );
}

(5) リンクのプロパティの操作

リンクのプロパティとは,リンクオブジェクトに設定されているプロパティのことです。

リンクのプロパティも,ほかの文書管理オブジェクトのプロパティと同様に,Proxyオブジェクト(リンクProxyオブジェクト)のリンクプロパティ値集合プロパティにロードして参照します。また,更新する場合は,リンクProxyオブジェクトのリンクプロパティ値集合プロパティの値をフラッシュします。

リンクのプロパティのロードとフラッシュに使用するメソッドを次に示します。

リンクのプロパティのロードに使用するメソッド
  • DbjObj#getChildListメソッド
  • DbjObj#getParentListメソッド
  • DbjObj#getRelListメソッド
  • DbjLinkObj#readPropertiesメソッド
  • DbjLinkObjList#readPropertiesメソッド
DbjObjインターフェースのメソッドは,一覧の取得と同時にリンクのプロパティをロードします。なお,文書管理オブジェクトのプロパティも同時にロードできます。
リンクのプロパティのフラッシュに使用するメソッド
  • DbjObj#linkメソッド
  • DbjDocSpace#createDocumentメソッド
  • DbjDocSpace#createVrDocumentメソッド
  • DbjDocSpace#createFolderメソッド
  • DbjLinkObj#writePropertiesメソッド
  • DbjLinkObjList#writePropertiesメソッド
DbjObjインターフェースおよびDbjDocSpaceインターフェースのメソッドでは,リンクの設定と同時にリンクのプロパティをフラッシュします。

リンクのプロパティを参照および更新する例を示します。

 
// リンクのプロパティの参照と更新の例
 
  // factory:DbjFactoryインターフェース
  // parentObj:DbjObjインターフェース
  // (フォルダのインターフェース)
 
// 特定のフォルダから下位オブジェクトを取得する
DbjLinkObjList linklist = parentObj.getChildList(
                           null,
                           null,
                           DbjDef.LINK_DCR,
                           DbjDef.OBJTYPE_ANY,
                           null );
 
// 更新するプロパティのプロパティ値集合を作成する
DbjPropSet props = factory.createPropSet();
props.setPropVal( "status", 0 );
 
// linklistの先頭の要素の,リンクのプロパティを更新する
DbjLinkObj linkObj = linklist.getLinkObj(0);
linkObj.writeProperties( props );
 

次に,DbjLinkObjListインターフェースを使用して,複数のリンクのプロパティを,一括して更新する例を示します。

 
// 複数のリンクのプロパティの参照と更新の例
 
  // factory:DbjFactoryインターフェース
  // parentObj:DbjObjインターフェース
  // (フォルダのインターフェース)
 
// 特定のフォルダから下位オブジェクトを取得する
DbjLinkObjList linklist = parentObj.getChildList(
                           null,
                           null,
                           DbjDef.LINK_DCR,
                           DbjDef.OBJTYPE_ANY,
                           null );
 
// 更新するプロパティのプロパティ値集合を作成する
DbjPropSet props = factory.createPropSet();
props.setPropVal( "status", 0 );
 
// 複数のリンクのプロパティを更新する
linklist.writeProperties( props );
 

リンクのプロパティと同時に,下位オブジェクトのプロパティを参照する例を示します。

 
// リンクのプロパティと同時に下位オブジェクトのプロパティも参照する例
 
  // parentObj:DbjObjインターフェース
 
// 取得する下位オブジェクトのプロパティ名のコレクションを作成する
Set<String> propdef = new HashSet<String>();
propdef.add( "Title" );
 
// 取得するリンクのプロパティ名のコレクションを作成する
Set<String> linkpropdef = new HashSet<String>();
linkpropdef.add( "num" );
 
// フォルダから下位オブジェクトを取得する
DbjLinkObjList linklist
     = parentObj.getChildList(
          propdef,            // 取得する下位オブジェクトのプロパティ
          linkpropdef,        // 取得するリンクのプロパティ
          DbjDef.LINK_DCR,
          DbjDef.OBJTYPE_ANY,  
          null ); 
 
// 先頭のリンクのプロパティを出力する
System.out.println(
  linklist.getLinkObj(0).propSet().getIntVal( "num" ) );
 
// 下位オブジェクトのインターフェースのリストを取得して,
// 先頭のリンクで関連付けているオブジェクトのプロパティを出力する
System.out.println( 
  linklist.getLinkObj(0).getTargetObj()
  .propSet().getStringVal( "Title" ) );
 

なお,このコーディング例のDbjObj#getChildListメソッドでロードできるプロパティおよび取得できるインターフェースは,次の図のようになります。

図1-19 DbjObj#getChildListメソッドでロードできるプロパティと取得できるインターフェース

[図データ]

(6) 文書管理オブジェクトの移動

フォルダから直接型リンクで関連付けられている文書管理オブジェクトを,別のフォルダから直接型リンクで関連付けるように変更できます。これによって,あるフォルダで管理していた文書やフォルダを,別のフォルダに移動するような管理ができます。文書管理オブジェクトの移動には,DbjObj#moveメソッドを使用します。

フォルダに直接型リンクでリンク付けられている文書を移動する例を示します。

 
// フォルダに直接型リンクでリンク付けられている文書を移動する例
 
  // docspc:DbjDocSpaceインターフェース
  // parentObj:DbjObjインターフェース
 
// フォルダに直接型リンクで関連付けている文書一覧を取得する
DbjLinkObjList linklist = parentObj.getChildList(
                            null,
                            null,
                            DbjDef.LINK_DCR,
                            DbjDef.OBJTYPE_DOC,
                            null );
 
// 先頭の要素の文書を別なフォルダに移動する
DbjObj parentObj2 = docspc.createObjConnection( parentoiid2 );
linklist.getLinkObj(0).getTargetObj().move( parentObj2 );

(7) リンクの解除

リンクは,次のどれかのメソッドで解除します。

リンク元オブジェクトのインターフェース(DbjObjインターフェース)を使用する場合
  • DbjObj#unlinkメソッド
  • DbjObj#unlinkByLinkIdメソッド
リンクオブジェクトのインターフェース(DbjLinkObjインターフェース)を使用する場合
  • DbjLinkObj#removeObjectメソッド
リンクオブジェクトのリストのインターフェース(DbjLinkObjListインターフェース)を使用する場合
  • DbjLinkObjList#removeObjectsメソッド

DbjObjインターフェースおよびDbjLinkObjListインターフェースのメソッドで解除する場合,複数のリンクをまとめて解除できます。さらに,DbjObjインターフェースのメソッドでは,解除するリンクを特定することもできます。この場合は,下位オブジェクトのDbjObjインターフェースのリスト,リンクのDbjLinkObjインターフェースのリストまたはリンク識別子のリストを指定します。

DbjLinkObjListインターフェースおよびDbjLinkObjインターフェースのメソッドを使用して解除する場合は,リンクオブジェクトそのものを削除することで,リンクを解除します。

まず,DbjObjインターフェースを使用して,下位オブジェクトを指定して解除する例を示します。

 
// 下位オブジェクトを指定してリンクを解除する例
 
  // parentObj:DbjObjインターフェース
  // (フォルダのインターフェース)
 
// リンクの一覧を取得する
DbjLinkObjList linklist = parentObj.getChildList(
                              null,
                              null,
                              DbjDef.LINK_DCR|DbjDef.LINK_RCR,
                              DbjDef.OBJTYPE_ANY,
                              null );
 
// 下位オブジェクトの一覧を取得する
DbjObjList childlist = linklist.getTargetObjList();
 
// 指定した下位オブジェクトとのリンクをすべて解除する
parentObj.unlink( childlist );
 

次に,DbjObjインターフェースを使用して,リンク識別子を指定してリンクを解除する例を示します。

 
// リンク識別子を指定してリンクを解除する例
 
  // parentObj:DbjObjインターフェース
  // (フォルダのインターフェース)
 
// リンクの一覧を取得する
DbjLinkObjList linklist = parentObj.getChildList(
                              null,
                              null,
                              DbjDef.LINK_DCR|DbjDef.LINK_RCR,
                              DbjDef.OBJTYPE_ANY,
                              null );
 
// リンク識別子の一覧を取得する
List<String> linkIdList = linklist.getLinkIdList();
 
// 指定した下位オブジェクトとのリンクをすべて解除する
parentObj.unlinkByLinkId( linkIdList );
 

DbjLinkObjインターフェースおよびDbjLinkObjListインターフェースを使用して,リンクオブジェクトを削除してリンクを解除する例を示します。

 
// リンクオブジェクトを削除してリンクを解除する例
 
  // parentObj:DbjObjインターフェース
  // (フォルダのインターフェース)
 
// 特定のフォルダの下位オブジェクトを取得する
DbjLinkObjList linklist = parentObj.getChildList(
                              null,
                              null,
                              DbjDef.LINK_DCR,
                              DbjDef.OBJTYPE_ANY,
                              null );
 
// 先頭のリンクだけを解除する
linklist.getLinkObj(0).removeObject();
 
// 複数のリンクを一括して解除する
linklist.removeObjects();