ここでは,リンクの操作について説明します。
リンクを設定して管理できるのは,文書空間オブジェクトのうち,文書およびフォルダです。したがって,この項の説明中の文書空間オブジェクトとは,文書またはフォルダを指します。
また,フォルダを使用したリンクでは特に,リンク元オブジェクトであるフォルダを上位オブジェクト,リンク先オブジェクトである文書またはフォルダを下位オブジェクトといいます。
ここでは,リンクの操作の概要について説明します。
Java クラスライブラリで設定できるリンクは,次の5種類です。
これらのリンクを使用した管理モデルについては,「3.5 リンクモデル」「3.6 バージョンなしフォルダによる管理モデル」および「3.7 バージョン付きフォルダによる管理モデル」を参照してください。
リンク種別と,リンク元またはリンク先に設定できるオブジェクト種別の対応は,次に示す表のとおりです。
表6-7 リンク種別とリンク元またはリンク先に設定できるオブジェクト種別
リンク種別 | リンク元オブジェクトの オブジェクト種別 | リンク先オブジェクトの オブジェクト種別 |
---|---|---|
直接型リンク | バージョンなしフォルダ バージョン付きフォルダ | バージョンなし文書 バージョン付き文書 バージョンなしフォルダ バージョン付きフォルダ |
参照型リンク | バージョンなしフォルダ バージョン付きフォルダ | バージョンなし文書 バージョン付き文書 バージョンなしフォルダ バージョン付きフォルダ |
構成管理型リンク (構成管理モードはFIXモード, FLOATINGモードどちらでも可) | バージョンなしフォルダ※1 バージョン付きフォルダ | バージョン付き文書※2 バージョン付きフォルダ |
文書間リンク | バージョンなし文書 バージョン付き文書 | バージョンなし文書 バージョン付き文書 |
注※1 トップオブジェクトクラスが,edmClass_ContainerVersionクラスまたはそのサブクラス以外(dmaClass_Containerクラスなど)の場合,構成管理型リンクは設定できません。
注※2 トップオブジェクトクラスがedmClass_VersionTracedDocVersionクラスまたはそのサブクラス以外(dmaClass_DocVersionクラスなど)の場合,構成管理の対象にはなりません。
リンクの操作には,次の操作があります。
リンクの操作には,文書またはフォルダのインターフェースであるDbjObjインターフェースを使用する方法と,リンクオブジェクトのインターフェースであるDbjLinkObjインターフェースを使用する方法があります。また,文書空間オブジェクトの作成と同時にリンクを設定する場合は,DbjDocSpaceインターフェースを使用してリンクを設定することもできます。なお,リンクオブジェクトは,リンク元の文書空間オブジェクトに属するオブジェクトです。DbjObjインターフェースを使用して操作する場合,リンクの設定,解除またはプロパティの変更などは,リンク元オブジェクトから実行します。リンクオブジェクトには,それぞれリンク識別子が設定されています。このリンク識別子を使用して,リンクを特定できます。
リンクの設定には,2種類の方法があります。
なお,文書空間オブジェクトごとに,設定できるリンクの種別は異なります。
ここでは,DbjDocSpaceインターフェースのcreateXXX(XXXは作成する文書空間オブジェクトの種別によって異なります)メソッドを実行して,文書空間オブジェクトの作成と同時に既存の文書空間オブジェクトへのリンクを設定する方法について説明します。文書空間オブジェクトの作成については,「6.7.3 文書空間オブジェクトの作成」を参照してください。
文書空間オブジェクト作成時に,既存のフォルダからリンクを設定する例を示します。この例では,バージョン付き文書を,作成すると同時に二つのフォルダからリンクさせます。一つのフォルダからは直接型リンク,もう一つのフォルダからは参照型リンクでリンクさせます。リンクさせるオブジェクトについての情報は,DbjSetLinkInfoインターフェースのサブインターフェースを要素とするリストで指定します。
// 文書空間オブジェクト作成時に,既存のフォルダからのリンクを設定する例
// factory:DbjFactoryインターフェース
// docspc:DbjDocSpaceインターフェース
// リンク設定情報のリストを作成する
// parentoiid1, parentoiid2はそれぞれ上位オブジェクトのOIID
List linklist = new ArrayList();
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 ); // リンク設定情報のリスト
ここでは,既存の文書空間オブジェクトからほかの文書空間オブジェクトにリンクを設定する方法について説明します。この操作には,リンク元オブジェクトの,DbjObj#linkメソッドを使用します。メソッドの引数には,リンク先オブジェクトを,次のどちらかのリストで指定します。
リストの要素をDbjSetLinkInfoインターフェースのサブインターフェースにすると,リンク先のオブジェクトごとにリンク種別を設定できます。例えば,「文書1は直接型リンクで関連付けて,文書2は参照型リンクで関連付けたい」という場合は,この形式を使用します。
リストの要素をDbjObjインターフェースにすると,リストに指定したすべてのリンク先オブジェクトを,引数に指定したリンク種別で一括して関連付けられます。例えば,「複数の文書をまとめて直接型リンクで関連付けたい」という場合は,この形式を使用できます。ただし,この形式で指定できるリンク種別は,直接型リンクまたは参照型リンクだけです。
ここでは,まず,リストの要素をDbjSetLinkInfoインターフェースのサブインターフェースにして,個々にリンク設定情報を指定する例を示します。
// DbjSetLinkInfoインターフェースを使用して
// 個々にリンク設定情報を指定する例
// factory:DbjFactoryインターフェース
// docspc:DbjDocSpaceインターフェース
// リンク設定情報のリストを作成する
// childoiid1, childoiid2はそれぞれリンク先オブジェクトのOIID
List linklist = new ArrayList();
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 childlist = new ArrayList();
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 );
リンクによって関連付けられた文書空間オブジェクトは,リンクをたどって参照できます。ここでは,リンクをたどって文書空間オブジェクトを参照する方法について説明します。
文書またはフォルダのインターフェースを使用して,リンクをたどって文書空間オブジェクトを参照する場合に使用するメソッドとリンク種別の関係を,次の表に示します。
表6-8 リンクをたどる参照に使用するメソッドとリンク種別の関係
メソッド | たどる元になる文書空間オブジェクト | リンク種別 |
---|---|---|
getDCRParent | 文書 フォルダ | 直接型リンク |
getParentList | 文書 フォルダ | 直接型リンク 参照型リンク 構成管理型リンク※ |
getChildList | フォルダ | 直接型リンク 参照型リンク 構成管理型リンク※ |
getRelList | 文書 | 文書間リンク |
注※ 構成管理モードはFIXモード,FLOATINGモードどちらでも使用できます。ただし,フォルダの構成要素であるDMAオブジェクトが,ContainerVersionオブジェクト(edmClass_ContainerVersionクラスまたはそのサブクラスを基に作成したオブジェクト)でない場合,構成管理型リンクは使用できません。
ここでは,直接型リンク,参照型リンクまたは構成管理型リンクをたどる参照と,文書間リンクをたどる参照について,分けて説明します。
ここでは,フォルダを使用した関連付けの場合の,直接型リンク,参照型リンクまたは構成管理型リンクをたどる参照について説明します。
上位オブジェクトから下位オブジェクトを取得する場合,DbjObj#getChildListメソッドを使用します。このメソッドでは,上位オブジェクトから下位オブジェクトを関連付けているリンクオブジェクトのリストを扱うインターフェース(DbjLinkObjListインターフェース)を取得できます。メソッド実行時には,「直接型リンクだけを取得したい」,「直接型リンクと参照型リンクを取得したい」,「FLOATINGモードの構成管理型リンクを取得したい」など,リンクの種別も指定できます。次に,DbjLinkObjListインターフェースの要素であるDbjLinkObjインターフェースを取得して,DbjLinkObj#getTargetObjメソッドによって,下位オブジェクトのインターフェースを取得します。
下位オブジェクトから上位オブジェクトを取得する場合,DbjObj#getParentListメソッドを使用します。このメソッドでは,下位オブジェクトを上位オブジェクトに関連付けているリンクオブジェクトのリストを扱うインターフェース(DbjLinkObjListインターフェース)を取得できます。メソッド実行時には,リンクの種別を指定できます。次に,DbjLinkObjListインターフェースの要素であるDbjLinkObjインターフェースを取得して,DbjLinkObj#getOwnerObjメソッドによって,それぞれの上位オブジェクトのインターフェースを取得します。
また,上位オブジェクトと下位オブジェクトが直接型リンクで関連付けられている場合,下位オブジェクトのDbjObj#getDCRParentメソッドで,リンクオブジェクトを取得しないで,直接上位オブジェクトのインターフェースを取得することもできます。
フォルダを使用したリンクを設定している場合の,リンクをたどる参照に使用するメソッドの関係について,次の図に示します。
図6-17 リンクをたどる参照に使用するメソッドの関係(フォルダを使用する場合)
取得した上位オブジェクトまたは下位オブジェクトを一括操作したい場合は,DbjLinkObjListインターフェースを取得してから,DbjLinkObjList#getOwnerObjListまたはDbjLinkObjList#getTargetObjListメソッドを実行して,DbjObjListインターフェースを取得することもできます。複数オブジェクトを一括操作する場合の詳細については,「6.8.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() );
}
文書間リンクをたどってオブジェクトを参照する場合,DbjObj#getRelListメソッドを使用します。リンク元オブジェクトからリンク先オブジェクトを取得する場合も,リンク先オブジェクトからリンク元オブジェクトを取得する場合も,同じメソッドを使用します。リンク先オブジェクト,リンク元オブジェクトのどちらを取得するかは,メソッドの引数にリレーション種別として指定します。
DbjObj#getRelListメソッドを実行すると,DbjLinkObjListインターフェースが取得できます。このインターフェースから,要素であるDbjLinkObjインターフェースを取得します。DbjLinkObjインターフェースを使用してリンク元オブジェクトを取得する場合は,DbjLinkObj#getOwnerObjメソッドを,リンク先オブジェクトを取得する場合は,DbjLinkObj#getTargetObjメソッドを実行します。
文書間リンクを設定している場合に,リンクをたどる参照に使用するメソッドの関係について,次の図に示します。
図6-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() );
}
構成管理型リンクの構成管理モードは,次のどれかのインターフェースのメソッドで変更できます。
これらのインターフェースで,次のメソッドが提供されています。
バージョン付きフォルダのインターフェース(DbjObjインターフェース)を使用する場合,構成管理モードを変更するリンクオブジェクトは,リンク識別子で特定します。リンク識別子のリストを指定することで,複数のリンクの構成管理モードを一度に変更できます。また,そのバージョン付きフォルダからFIXモードで関連付けているすべてのリンクをまとめてFLOATINGモードに変更することもできます。
リンクオブジェクトのインターフェース(DbjLinkObjインターフェース)を使用する場合,ターゲットリンクオブジェクトの構成管理モードを変更できます。リンクオブジェクトのリストのインターフェース(DbjLinkObjListインターフェース)を使用すると,リストに含まれるDbjLinkObjインターフェースのターゲットリンクオブジェクトの構成管理モードが,一括して変更できます。
構成管理モードを変更する例を示します。
// 構成管理モードを変更する例
// docspc:DbjDocSpaceインターフェース
// バージョン付きフォルダのすべての構成管理型リンクを
// FIXモードに変更する(DbjObjインターフェースを使用する例)
DbjObj obj = docspc.createObjConnection( oiid );
obj.changeToVTFix();
// バージョン付きフォルダのすべての構成管理型リンクを
// FLOATINGモードに変更する
// (DbjLinkObjListインターフェースを使用する例)
DbjLinkObjList linklist = obj.getChildList(
null,
null,
DbjDef.LINK_VCR,
DbjDef.OBJTYPE_ANY,
null );
linklist.changeToVTFloat();
// 一つの構成管理型リンクの構成管理モードを
// FIXモードに変更する(DbjLinkObjインターフェースを使用する例)
linklist.getLinkObj(0).changeToVTFix();
リンクのプロパティとは,リンクオブジェクトに設定されているプロパティのことです。
リンクのプロパティも,ほかの文書空間オブジェクトのプロパティと同様に,Proxyオブジェクト(リンクProxyオブジェクト)のリンクプロパティ値集合プロパティにロードして参照します。また,更新する場合は,リンクProxyオブジェクトのリンクプロパティ値集合プロパティの値をフラッシュします。
リンクのプロパティのロードとフラッシュに使用するメソッドを次に示します。
リンクのプロパティを参照および更新する例を示します。
// リンクのプロパティの参照と更新の例
// 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 propdef = new HashSet();
propdef.add("Title");
// 取得するリンクのプロパティ名のコレクションを作成する
Set linkpropdef = new HashSet();
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メソッドでロードできるプロパティおよび取得できるインターフェースは,次の図のようになります。
図6-19 DbjObj#getChildListメソッドでロードできるプロパティと取得できるインターフェース
フォルダから直接型リンクで関連付けられている文書空間オブジェクトを,別のフォルダから直接型リンクで関連付けるように変更できます。これによって,あるフォルダで管理していた文書やフォルダを,別のフォルダに移動するような管理ができます。文書空間オブジェクトの移動には,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 );
リンクは,次のどれかのメソッドで解除します。
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 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();