如何编写 Exp/Imp 处理程序
编写适用于导出进程的导出处理程序
要为类创建导出处理程序,需要了解以下三点:
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 中,有一个名为 coreobjects.dtd 的文件,它是将导出/导入的所有对象的 DTD 文件。
如何编写类导出处理程序
1. 创建扩展 ClassExporterImporterTemplate 的类
2. 实现 exportAttributes(Object obj, Exporter exp) 方法,该方法从对象中检索数据并将其添加到 XML DOM 文档中。以下是此方法针对 "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 对象 (standardX20.dtd) 的 XML 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. 实现 exportAttribute(Object ob,IxbElement fileXML, Exporter exporter) 方法,该方法从对象中检索属性数据并将其添加到 XML DOM 文档中。以下是此方法针对 "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. 添加后,类的导出处理程序可能会调用此方法,以导出部件属性。
如何编写导入进程的处理程序
要为类创建导入处理程序,需要了解以下两点:
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>
具有 <dtd> 标记为 "standardX20.dtd" 的所有处理程序都是 Windchill 发行版本 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 包含用于操作处理程序的所有方法。
如何编写类 (元素) 导入处理程序
类的导入处理程序可分为两种类型:
• 版本化对象的导入处理程序。
• 非版本化对象的导入处理程序。
非版本化对象的处理程序
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 对象 (standardX20.dtd) 的 XML 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() 和 Actor。
• importObjectAttributes()
• 导入可在存储对象前导入的对象的所有属性。
• storeObject()
此方法在类 ExpImpForVersionedObject 中实现。对象的存储将被委派给 Actor 类,具体取决于 XML 文件中的操作者名称 (操作者名称通过导入应用程序写入至 XML 文件中)。特定对象处理程序不必担心 storeObject() 和 Actor。
• importObjectAttributesAfterStore()
导入在存储对象之后必须导入的对象的所有属性。
ExpImpForWTPart、ExpImpForDocument、ExpImpForEPMDocument 是版本化对象的导入处理程序示例。
|
4. 将条目添加到处理程序注册表文件 (<Windchill>\registry\ixb\handlers\coreX10.xml)。条目指定所导入类 (MyObject)、核心 Windchill 对象 (standardX20.dtd) 的 XML 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 包交付文件。多线程为优化性能提供了一种选择。可以使用 wt.ixb.export.maxThreads 特性控制多线程的使用,以导出 Windchill 包交付文件。可以使用 wt.ixb.import.maxThreads 特性控制多线程的使用,以导入 Windchill 收到的交付文件。
多线程特性
特性
|
说明
|
wt.ixb.import.batchSize
|
设置线程的批处理大小。
批处理大小对已收到的交付导入性能影响较小。可设置特性以确定每个导入批处理中的对象数。默认情况下,此特性设置为 10000。
|
wt.ixb.import.maxThreads
|
设置要导入的线程数。作业列表将分布在所定义的线程数中。
使用多个线程可对已收到的交付导入性能具有最重大的影响。线程共享相同的数据库连接,若达到阈值则可影响性能。对象数也可影响性能,对象数越多,使用多个线程时性能改进越好。一般情况下,一个线程足以用于增量包交付。初始包交付可从多个线程获益,尤其是在导入时间窗口为小窗口时。导入 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 收到的交付的导入性能相关的特性的详细信息,请参阅
处理收到的交付的最佳做法。