エクスポート/インポートハンドラの作成方法
エクスポート処理のエクスポートハンドラの作成
クラスのエクスポートハンドラを作成するには、以下の 3 点を理解しておく必要があります。
1. ハンドラの情報が含まれている XML ファイルの使用方法
2. エクスポートまたはインポートされるオブジェクトに関する情報が含まれている DTD ファイルの更新方法
3. ハンドラの作成方法
ハンドラの情報が含まれている XML ファイル
これらの XML ファイルは、<Windchill>\codebase\registry\ixb\handlers フォルダにあります。フォルダ全体が XML タグのルートエレメントとして処理され、フォルダ内の XML ファイルのコンテンツが子エレメントとして処理されます。そのため、このフォルダ内の XML ファイルは十分に形成されず、以下のような内容で構成されます。
<classExporter>
<class>
[絶対パス名を使用してエクスポートされるオブジェクトのクラス名]
</class>
<dtd>
[クラスに使用する DTD の保存場所を指定する DTD 文字列]
</dtd>
<targetTag>default</targetTag>
<handler>
[オブジェクトのエクスポートに使用されるハンドラのクラス名]
</handler>
</classExporter>
例:
<classExporter>
<class>wt.part.WTPart</class>
<dtd>standardX20.dtd</dtd>
<targetTag>default</targetTag>
<handler>wt.ixb.handlers.forclasses.ExpImpForWTPart</handler>
</classExporter>
<dtd> タグ "standard.dtd" が付いたハンドラはすべて、Windchill リリース 10.X のオブジェクトをエクスポートするためのハンドラです。
例:
<classExporter>
<class>wt.part.WTPart</class>
<dtd>standardX20.dtd</dtd>
<targetTag>default<targetTag>
<handler>wt.ixb.handlers.forclasses.ExpImpForWTPart60</handler>
</classExporter>
wt.ixb.handlers.forclasses.ExpImpForWTPart クラスは Windchill リリース 10.X フォーマットの wt.part.WTPart クラスをエクスポートするためのハンドラであることがわかります。
IxbHandlersManager クラスには、ハンドラの操作に必要なすべてのメソッドが含まれます。
DTD ファイル
<Windchill>\codebase\registry\ixb\dtds\standardX20.dtd フォルダには、エクスポートまたはインポートされるすべてのオブジェクトに使用する DTD ファイルである coreobjects.dtd という名前のファイルがあります。
クラスのエクスポートハンドラの作成方法
1. ClassExporterImporterTemplate を拡張するクラスを作成します。
2. オブジェクトのデータを読み込んで XML DOM ドキュメントに追加するメソッド exportAttributes(Object obj, Exporter exp) を実装します。以下は、"MyClass" のオブジェクトでのこのメソッドの例を示します。
public void exportAttributes (Object object, Exporter exporter) throws WTException {
try {
MyClass ob = (MyClass)object;
// export the local id
IxbHndHelper.exportAttribute(
ExpImpForLocalIdAttr.class, ob, fileXML, exporter);
// export other attributes that are specific to
// MyObject; e.g. name, number
IxbHndHelper.exportAttribute(
ExpImpForMyObjectAttr.class, ob, fileXML, exporter);
// export version information
IxbHndHelper.exportAttribute(
ExpImpForVersionAttr.class, ob, fileXML, exporter);
// export content
IxbHndHelper.exportAttribute(
ExpImpForContentAttr.class, ob, fileXML, exporter);
}
catch (Exception e) {
LogHelper.devExc ( e,
"exportAttributes: could not export
object=<"+object+">");
}
}
3. エクスポートされるオブジェクトタイプに適切なルートタグを返す getRootTag() メソッドをオーバーライドします。以下は、"MyClass" のオブジェクトでのこのメソッドの例を示します。
protected String getRootTag() {
return "MyClass";
}
4. ハンドラ XML ファイル (<Windchill>\registry\ixb\handlers\coreX10.dtd) に、エクスポートされるクラス (com.mycompany.MyObject)、コア Windchill オブジェクト用 XML DTD (standardX20.dtd)、クラス用のハンドラ (wt.ixb.handlers.forclasses.ExpImpForMyObject) を指定するエントリを追加します。以下にエントリの例を示します。
<classExporter>
<class>com.mycompany.MyObject</class>
<dtd>standardX20.dtd</dtd>
<targetTag>default</target>
<handler>wt.ixb.handlers.forclasses.ExpImpForMyObject</handler>
</classExporter>
属性エクスポートハンドラの作成方法
異なるクラスの属性を同じ方法でエクスポートする必要がある場合、または属性を専用のハンドラで処理する場合は、属性ハンドラを作成できます。この手順を以下に示します。
1. AttrExporterImporterTemplate を拡張する Java クラスを作成します。
2. オブジェクトの属性データを読み込んで XML DOM ドキュメントに追加するメソッド exportAttribute(Object ob,IxbElement fileXML, Exporter exporter) を実装します。以下は、オブジェクト "MyObject" でのこのメソッドの例を示します。このメソッドは、オブジェクトの部品タイプと部品ソースを取得します。
public void exportAttribute (
Object obj,
IxbElement fileXML,
Exporter exporter) throws WTException {
try {
MyClass ob = (MyClass) obj;
LocalizableMessage localMessage1 = ob.getDisplayType();
Locale locale1 = new Locale("English", "US");
String dispType = localMessage1.getLocalizedMessage(locale1);
fileXML.addValue(IxbHndHelper.XML_ATTR_PARTTYPE, dispType);
fileXML.addValue(
IxbHndHelper.XML_ATTR_SOURCE,ob.getSource ().toString() );
}
catch (Exception e) {
LogHelper.devExc (e,
"Exception in ExpImpForLTPartAttr, ob=<"+obj+">");
}
}
3. これを追加した後、クラスのエクスポートハンドラは、このメソッドを呼び出して部品の属性をエクスポートできます。
インポート処理のハンドラの作成方法
クラスのインポートハンドラを作成するには、以下の 2 点を理解しておく必要があります。
1. ハンドラの情報が含まれている XML ファイル
2. ハンドラの作成方法
ハンドラの情報が含まれている XML ファイル
これらの XML ファイルは <Windchill>\codebase\registry\ixb\handlers フォルダにあります。
フォルダ全体が XML タグのルートエレメントとして処理され、フォルダ内の XML ファイルのコンテンツが子エレメントとして処理されます。そのため、このフォルダ内の XML ファイルは十分に形成されず、以下のような内容で構成されます。
<elementImporter>
<tag>
[絶対パス名を使用せずにインポートされるオブジェクトのクラス名 ]
</tag>
<dtd>
[クラスに使用する DTD の保存場所を指定する DTD 文字列]
</dtd>
<handler>
[オブジェクトのインポートに使用されるハンドラのクラス名]
</handler>
</elementImporter>
例:
<elementImporter>
<tag>WTPart</tag>
<dtd>standardX20.dtd</dtd>
<handler>wt.ixb.handlers.forclasses.ExpImpForWTPart</handler>
</elementImporter>
standardX20.dtd タグ "Windchill" が付いたハンドラはすべて、<dtd> リリース 10.X のオブジェクトをインポートするためのハンドラです。
次に例を示します。
<elementImporter>
<tag>WTPart</tag>
<dtd>standardX20.dtd</dtd>
<handler>wt.ixb.handlers.forclasses.ExpImpForWTPart</handler>
</elementImporter>
wt.ixb.handlers.forclasses.ExpImpForWTPart クラスは Windchill リリース 10.X の wt.part.WTPart クラスをインポートするためのハンドラであることがわかります。
IxbHandlersManager クラスには、ハンドラを操作するすべてのメソッドが含まれます。
クラス (エレメント) のインポートハンドラの作成方法
クラスのインポートハンドラは、以下の 2 種類に分類できます。
• バージョン化オブジェクトのインポートハンドラ
• 非バージョン化オブジェクトのインポートハンドラ
非バージョン化オブジェクトのハンドラ
1. ClassExporterImporterTemplate を拡張する Java クラスを作成します。
2. 以下のメソッドを実装します。public Object createObject (IxbElement fileXML, Importer importer)
3. 必要に応じて以下のメソッドをオーバーライドします。
public Object importObjectsAttributes ( List<ElementObjectpair> pairs,
Importer importer);
public ObjectstoreObjects (
List<ElementObjectPair> pairs,
Importer importer);
public Object,importObjectsAttributesAfterStore(
List<ElementObjectPair> pairs,
Importer importer);
public Object findAmongExistingObjectsInternal (IxbElement fileXML,
Importer importer);
|
createObject()、importObjectsAttributes()、storeObjects()、importObjectsAttributesAfterStore() の順序でオブジェクトがインポートされます。
• createObject(): データベースにオブジェクトが存在しない場合 (findAmongExistingObjects で見つからなかった場合) は、オブジェクトが作成され、オブジェクトのすべての Ufid 属性がインポートされます。
• importObjectsAttributes(): オブジェクト storeObjects() のすべての属性をインポートします。メソッド storeObjects() は PersistenceHelper.manager.store() を呼び出します。
• importObjectsAttributesAfterStore(): オブジェクトの保存後に、インポートする必要があるすべての属性をインポートします。
|
4. ハンドラのレジストリファイル (<Windchill>\registry\ixb\handlers\coreX10) にエントリを追加します。このエントリは、インポート中のクラス (MyObject)、コア Windchill オブジェクトの XML DTD (standardX20.dtd)、および com.ptc.mypackage.ExpImpForMyObject クラスのハンドラを指定します。以下にエントリの例を示します。
<elementImporter>
<tag>MyObject</tag>
<dtd>standardX20.dtd</dtd>
<handler>com.ptc.mypackage.ExpImpForMyObject</handler>
</ elementImporter >
リンクオブジェクトのハンドラ
1. ExpImpForLinkObject を拡張する Java クラスを作成します。
2. 以下のメソッドを実装します。public Object createObject (IxbElement fileXML, Importer importer)
3. 以下のメソッドをオーバーライドします。
protected abstract Class getLinkClass();
protected abstract String getLinkRoleATag();
protected abstract String getLinkRoleBTag();
protected abstract LinkStoreOwnershipType getLinkStoreOwnershipType();
protected abstract Persistable getRoleAObject(IxbElement, Importer);
protected abstract Persistable getRoleAObject(IxbElement, Importer);
protected abstract Object createLinkObject(IxbElement, Importer,
Persistable roleAObj, Persistable roleBObj);
4. 必要に応じて以下のメソッドをオーバーライドします。
public Object importObjectAttributes ( Object ob,
IxbElement fileXML,
Importer importer);
public Object storeObjects (List<ElementObjectPair> elements,
Importer importer);
public Object importObjectAttributesAfterStore(IxbElement fileXML,
Importer importer);
public Object findAmongExistingObjectsInternal (IxbElement fileXML,
Importer importer);
非バージョン化オブジェクト (リンクオブジェクト) のインポートハンドラは非常に簡単で、以下の任意のクラスを例として参照できます。
• ExpImpForWTPartDescribeLink
• ExpImpForWTPartReferenceLink
バージョン化オブジェクトのハンドラ
1. ExpImpVersionedObject を拡張する Java クラスを作成します。
2. 以下のメソッドを実装します。
◦ public List<IxbHndHelper.ElementObjectPair> getMasters(Collection<IxbElement>, Importer, WTcontainerRef): データベース内にインポートするオブジェクトのバージョンが存在する場合は、ElementObjectPair のリストを返します。
3. 必要に応じて以下のメソッドをオーバーライドします。
public Object importObjectsAttributes ( List<IxbHndHelper.ElementObjectPair>,
Importer importer);
public Object importObjectsAttributesAfterStore(
List<IxbHndHelper.ElementObjectPair>,
Importer importer);
public Object findAmongExistingObjectsInternal (
IxbElement fileXML,,Importer importer);
|
createObject()、importObjectAttributes()、storeObjects()、importObjectAttributesAfterStore() の順序でオブジェクトがインポートされます。
• createObject()
このメソッドは、ExpImpForVersionedObject クラスで実装されます。オブジェクトの作成は Actor クラスに委任され、XML ファイルのアクター名に依存します (アクター名は、インポートアプリケーションによって XML ファイルに書き込まれます)。個々のオブジェクトハンドラは、createObject() およびアクターを考慮する必要はありません。
• importObjectAttributes()
• オブジェクトを保存する前に、インポートできるオブジェクトの属性をすべてインポートします。
• storeObject()
このメソッドは、ExpImpForVersionedObject クラスで実装されます。オブジェクトの保存は Actor クラスに委任され、XML ファイルのアクター名に依存します (アクター名は、インポートアプリケーションによって XML ファイルに書き込まれます)。個々のオブジェクトハンドラは、storeObject() およびアクターを考慮する必要はありません。
• importObjectAttributesAfterStore()
オブジェクトの保存後に、インポートする必要があるオブジェクトの属性をすべてインポートします。
バージョン化オブジェクトのインポートハンドラの例として、ExpImpForWTPart、ExpImpForDocument、ExpImpForEPMDocument があります。
|
4. ハンドラのレジストリファイル (<Windchill>\registry\ixb\handlers\coreX10.xml) にエントリを追加します。このエントリは、インポート中のクラス (MyObject)、コア Windchill オブジェクトの XML DTD (standardX20.dtd)、および com.ptc.mypackage.ExpImpForMyObject クラスのハンドラを指定します。以下にエントリの例を示します。
<elementImporter>
<tag>MyObject</tag>
<dtd>standardX20.dtd</dtd>
<handler>com.ptc.mypackage.ExpImpForMyObject</handler>
</ elementImporter >
属性インポートハンドラの作成方法
異なるクラスの属性を同じ方法でインポートする必要がある場合、または属性を専用のハンドラで処理する場合は、属性ハンドラを作成できます。この手順を以下に示します。
1. AttrExporterImporterTemplate を拡張する Java クラスを作成します。
2. 必要に応じて以下のメソッドをオーバーライドします。
◦ prepareForCheckConflicts(Importer importer): コンフリクトチェックを準備します。特定のハンドラによって実装されることはほとんどありません。
◦ checkConflictForAttribute( Object existingOb, IxbElement fileXML, Importer importer) : このメソッドは、特定の属性のコンフリクトをチェックします。そのため、データベースの既存の属性とインポートする属性のコンフリクトが生じる可能性がある場合は、このメソッドをオーバーライドする必要があります。
importAttribute ( Object object,
IxbElement fileXML,
Importer importer):
XML DOM ドキュメントの属性データを読み込んでインポートオブジェクトに設定します。このメソッドは、特定の属性に合わせてオーバーライドする必要があります。
object MyObject に属性 MyAttr を設定する importAttribute() の例を示します。
public Object importAttribute
( Object object,
IxbElement fileXML,
Importer importer)
throws WTException {
String myAttr;
try{
myAttr = fileXML.getValue(IxbHndHelper.XML_ATTR_MYATTR);
// XML_ATTR_MYATTR tag must be defined in IxbHndHelper
}
catch (Exception exc){
// The paragraph bellows allows the import process continue,
// even when the import of MyAttr fails. If the programmer
// wants the import process to stop when the import of
// MyAttr fails, please assign ob=null and throw exception
System.out.println(
"Exception when getting MyAttr in importAttribute");
System.out.println("MyAttr attribute is not imported");
return object;
}
MyObject ob = (MyObject) object;
try {
MyObjectHelper.service.setMyAttr(ob, myAttr);
}
catch (Exception e) {
if (! importer.
attributeExporterImporterManager.
overrideConflicts) {
ob = null;
throw e;
}
else{
// override the conflict by doing something here…
}
}
finally{
return ob;
}
マルチスレッドに関する注意事項
Windchill 10.2 M010 以降、マルチスレッドを使用して Windchill パッケージ送信ファイルをエクスポートおよびインポートできます。マルチスレッドでは、パフォーマンスの最適化に使用できる 1 つのオプションが提供されます。複数のスレッドを使用する Windchill パッケージ送信ファイルのエクスポートは、wt.ixb.export.maxThreads プロパティを使用して制御されます。複数のスレッドを使用する Windchill 受信送信物ファイルのインポートは、wt.ixb.import.maxThreads プロパティを使用して制御されます。
マルチスレッドプロパティ
|
インポートマルチスレッドプロパティは、インポート可能なパッケージの受信送信物のインポートにのみ適用されます。
|
プロパティ
|
説明
|
wt.ixb.import.batchSize
|
スレッドのバッチサイズを設定します。
バッチサイズは、受信送信物のインポートパフォーマンスにそれほど大きな影響を与えません。各インポートバッチ内のオブジェクト数を決定するためのプロパティを設定できます。デフォルトでは、このプロパティは 10000 に設定されます。
|
wt.ixb.import.maxThreads
|
インポートのためのスレッド数。ジョブリストは、ユーザーの定義するスレッド数に分散されます。
マルチスレッドの使用は、受信送信物のインポートパフォーマンスに最も大きな影響を与えます。スレッドが同じデータベース接続を共有するので、その数がしきい値に到達すると、パフォーマンスに影響する可能性があります。オブジェクト数もパフォーマンスに影響する可能性があります。オブジェクト数が増えるほど、マルチスレッドを使用したときにパフォーマンスが大きく向上するようになります。一般的に、差分パッケージ送信には 1 つのスレッドで十分です。特にインポートタイムウィンドウが小さい場合、最初のパッケージ送信がマルチスレッドによるメリットを得ることになります。CAD オブジェクトをインポートする場合、このプロパティが 1 に設定されている必要があります。デフォルトでは、このプロパティは 1 に設定されます。
|
wt.ixb.import.maxThreads プロパティの値は、インポートに使用するトランザクション数を決定する wt.ixb.import.noOfParallelImportPaths プロパティと組み合わせて使用します。
• 単一トランザクションのシナリオ: wt.ixb.import.noOfParallelImportPaths プロパティを 1 に設定した場合、wt.ixb.import.maxThreads プロパティの値は、インポートに使用するスレッドの合計数になります。
• 複数トランザクションのシナリオ: wt.ixb.import.noOfParallelImportPaths の値を 1 より大きい数に設定した場合、wt.ixb.import.maxThreads プロパティの値は、インポートトランザクションごとに使用されるスレッドの数になります。
|
|
wt.ixb.import.objPerThreadGuidance
|
各スレッドに含まれるオブジェクトの数を設定します。
|
wt.ixb.export.maxThreads
|
エクスポートに使用するスレッドの最大数を設定します。オブジェクトの数が少なくなれば、それに応じてスレッドの数も減少します。推奨される数は 2 です。
|
wt.ixb.export.objPerThreadGuidance
|
各スレッドに含まれるオブジェクトの数を設定します。
|
関連ドキュメント
このプロパティや、
Windchill のパッケージ送信のファイルエクスポートパフォーマンスに影響する可能性があるその他の使用可能なプロパティについては、
パッケージ操作に関する最良事例を参照してください。
Windchill の受信送信物のインポートパフォーマンスに関連するプロパティについては、
受信送信物の処理の最良事例を参照してください。