送信物のダウングレードのためのカスタマイズ
このセクションでは、レプリケーション時に交換される情報モデルに変更を取り込むために行われる、さまざまな使用例と対応する操作について説明します。
使用例: 複数の Windchill リリースにわたるメタデータ変更の処理
最新バージョンの Windchill リリースの DTD に変更があった場合は、以下の操作を実行します。
1. DTD を比較して変更を特定します。
|
DTD ファイルの場所は以下のとおりです。
• Windchill 11.1 M020: Windchill/loadXMLFiles/standard11_1.dtd
|
2. 変更の
XSL 変換パターンを特定します。シナリオと例の詳細については、
XSL 変換シナリオを参照してください。
3. リリース固有の XSL テンプレートを更新し、それぞれの対応するソースバリエーションのフォルダをチェックインします。
4. これらを抽出して、コードベース/レジストリ内にある特定のフォルダをリリースします。
|
XSL テンプレートは、ソース DTD で定義されている DTD エレメント構造に基づいて作成されます。それぞれの XSL を修正する必要があります。包含構造は変更しないでください。
|
5. ダウングレード送信物を作成し、カスタムオブジェクトが含まれていることを確認します。
例
Windchill 11.2.0.0 では、WTPart DTD に属性 Attr1 が新しく追加されています。Windchill 11.1 M020 のダウングレード送信物の作成時に、XSL の変更の一部として Attr1 がフィルタされる必要があります。$(wt.codebase.location)/registry/XSLRepo/11.1.M020/WTPart.xsl にある既成のチェックイン済みの WTPart.xsl を更新する必要があります。
WTPart.xsl のその他のコンテンツは、現状のまま維持する必要があります。
XSL 変換シナリオに記載されているように、
Attr1 のコピーのみを新しい
XSL スクリプトに置き換える必要があります。
ユースケース: サポートされていないオブジェクトの処理
特定の Windchill リリースでのダウングレードがサポートされていないオブジェクトの場合、ダウングレード送信物の作成時にフィルタまたは除去されるオブジェクトのエレメントを指定するように xxx_filter.properties ファイルを設定します。ここでの XXX はアプリケーション開発者のモジュール名を指します。
ダウングレード送信物からのオブジェクトのフィルタ
ELEMENT1 は Windchill 11.2.0.0 リリースで追加された wt.TestObject オブジェクトのエレメントですが、wt.TestObject は Windchill 11.1 M020 ではサポートされてません。Windchill 11.2.0.0 で Windchill 11.1 M020 用のダウングレード送信物を作成する前に、ELEMENT1 がフィルタされるように xxx_filter.properties の tagsToFilter プロパティを設定します。xxx_filter.properties ファイルは $(wt.codebase.location)\registry\transformationEngine\filter\11.1.M020\xxx_filter.properties にあります。
tagsToFilter=ELEMENT1
ユースケース: サポートされていないソフトタイプの処理
最近の Windchill リリースで、あるソフトタイプのダウングレードがサポートされていない場合は、XPath で変換フィルタを追加して、ダウングレード中にソフトタイプをフィルタします。
ダウングレード送信物からのソフトタイプのフィルタ
Windchill 11.1 M020 へのダウングレード中にソフトタイプ org.rnd.ComputerPart を Windchill 11.2.0.0 からフィルタするには、次のように XPath で変換フィルタを追加します。
externalTypeId=WCTYPE|wt.part.WTPart|org.rnd.ComputerPart
XPath 変換フィルタは、次の場所で設定されています。
$(wt.codebase.location)/registry/transformationEngine/filter/11.1.M020/xpath_filter.xml
<?xml version =”1.0" encoding="UTF-8" standalone="yes"?>
<AdvancedXpathFilter xmlns=”http://www.ptc.com/AdvancedXpathFilter”>
<xpathFilterGroup>
<xpath>//WTPart/externalTypeId==”WCTYPE|wt.part.WTPart|org.rnd.ComputerPart”</xpath>
</xpathFilterGroup>
</AdvancedXpathFilter>
XPATH ベースのフィルタのパフォーマンスに関する注意事項
XPATH ベースのフィルタは、選択した XPATH に基づいてインデックスを作成する必要があります。これにより、ダウングレードプロセス中に使用される XMLDOCUMENT テーブルの挿入コストおよび削除コストを抑えることができます。パラメータ XPATH ベースのインデックスの機能を使用するには、Windchill シェルから次の手順を実行します。
windchill wt.pds.tools.xdb.CreateIndex <dbUser> <dbPassword> [debug]
ここで、
• dbUser - データベーススキーマのユーザー
• dbPassword - データベースのパスワード
• debug - デバッグモードで実行するオプションのパラメータ
パラメータなしでこのコマンドが実行された場合、使用法のメッセージが表示されます。
|
• オフラインモードでこのツールを実行します。
• 既成の XPATH フィルタとカスタマイズフィルタに対してこのツールを実行します。
• XMLDocument テーブルのインデックスが確認され、このツールが検証されます。
• このツールは、Windchill 11.2.0.0 リリースの Oracle データベースでのみサポートされます。
• SQL 計画、XPATH を使用する照会を確認し、XPATH フィルタ中の XDB インデックスの使用状況を検証します。
• 詳細は、XDB インデックスの Oracle 管理情報を参照してください。
|
AND および OR 条件に対する XPath のフィルタの定義
AND の条件:
• $(wt.codebase.location)/registry/transformationEngine/filter/11.1.M020/WTPart_xpath_filter.xml を作成します
• <xpathFilterGroup></xpathFilterGroup> 内で Xpath フィルタ条件を指定します。
OR の条件:
• $(wt.codebase.location)/registry/transformationEngine/filter/11.1.M020/WTPart_xpath_filter.xml を作成します
• 個別の <xpathFilterGroup></xpathFilterGroup> 内で個別の OR 条件を指定します。
依存フィルタの追加
依存フィルタは、xpath またはプロパティベースのフィルタによって必要なオブジェクトが除外される場合に、交換できない一連の依存オブジェクトをフィルタするために使用される Java ベースのフィルタです。
この例は、WTPart がフィルタされる場合の WTPartUsageLink のフィルタを示しています。
XMLFilterEntry
デフォルトでは、すべてのルートタグについて、デフォルトの XML フィルタエントリが localId および ufid に関する情報を保持します。ただし、usagelinkfilter エントリには、照会時に役割 A と役割 B の情報も含まれている必要があります。
例
package com.ptc.transformation.filter.test;
import com.ptc.transformation.core.TransformationException;
import com.ptc.transformation.filter.DefaultXMLFilterEntry;
public class WTPartUsageLinkFilterEntry extends DefaultXMLFilterEntry {
public static final String USES_OBJECT_REFERENCE_UFID = "/uses/ObjectReference/ufid";
public static final String USED_BY_OBJECT_REFERENCE_UFID = "/usedBy/ObjectReference/ufid";
private static final long serialVersionUID = 1L;
@Override
public void initialize(String rootTag) throws TransformationException {
super.initialize(rootTag);
// Capture RoleA and RoleB also as part of filter entry
getIdentityEntries().put(getRootTag() + USED_BY_OBJECT_REFERENCE_UFID, null);
getIdentityEntries().put(getRootTag() + USES_OBJECT_REFERENCE_UFID, null);
}
}
これは、初期化メソッドをオーバーライドして、いくつかのタグを ID キーの一部としてさらに追加します。
以下に示すように、Windchill サービス委任ファクトリパターンを使用して WTPartUsageLinkFilter エントリを設定できます。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Configuration SYSTEM "xconf.dtd">
<Configuration targetFile="codebase/service.properties">
<Service context="default" name="com.ptc.transformation.filter.DependencyFilter">
<Option cardinality="duplicate" requestor="java.lang.Object" selector="UsageLink" serviceClass="com.ptc.transformation.filter.test.UsageLinkFilter" />
</Service>
Service context="default" name="com.ptc.transformation.filter.XMLFilterEntry">
Option cardinality="duplicate" requestor="java.lang.Object" selector="WTPartUsageLink" serviceClass="com.ptc.transformation.filter.test.WTPartUsageLinkFilterEntry" />
/Service>
Service context="default" name="com.ptc.transformation.core.TransformationFilter">
Option serviceClass="com.ptc.windchill.transform.util.TestTransformationFilter" requestor="java.lang.Object" selector="xpath_filter" cardinality="duplicate" />
/Service>
</Configuration>
これらのエントリは、使用するモジュール固有のサービスコンフィギュレーションで設定できます。
UsageLinkFilter
依存フィルタの例として親子リンクフィルタがあり、これは WTPart の役割 A またはマスター ufid を持つ WTPart が役割 B にある場合に WTPartUsageLink をフィルタします。
例
package com.ptc.transformation.filter.test;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.ptc.transformation.core.TransformationContext;
import com.ptc.transformation.core.TransformationException;
import com.ptc.transformation.filter.DefaultDependencyFilter;
import com.ptc.transformation.filter.DependencyFilterPriority;
import com.ptc.transformation.filter.FilterIdentityKey;
import com.ptc.transformation.filter.XMLFilterEntry;
import com.ptc.transformation.filter.XMLLookUpService;
import wt.util.WTException;
import wt.util.WTPropertyVetoException;
@FilterIdentityKey(keys = { "WTPart"})
public class UsageLinkFilter extends DefaultDependencyFilter {
public static final String ROOT_TAG = "WTPartUsageLink";
public static final String usedByPath = "WTPartUsageLink/usedBy/ObjectReference/ufid";
public static final String usesPath = "WTPartUsageLink/uses/ObjectReference/ufid";
@Override
public Collection<XMLFilterEntry> execute(Collection<XMLFilterEntry> inputEntries, TransformationContext context)
throws TransformationException {
Collection<XMLFilterEntry> usageLinkEntries = new HashSet<>();
Set<String> masterUfids = new HashSet<>();
Set<String> ufids = new HashSet<>();
for (XMLFilterEntry xmlFilterEntry : inputEntries) {
for (Map.Entry<String, String> entry : xmlFilterEntry.getIdentityEntries().entrySet()) {
String key = entry.getKey();
if (key.contains("/masterUfid")) {
masterUfids.add(entry.getValue());
}
if (key.contains("/ufid")) {
ufids.add(entry.getValue());
}
}
}
XMLLookUpService service = XMLLookUpService.getInstance(context);
Map<String, Collection<String>> filterEntries = new HashMap<>();
if (!ufids.isEmpty())
filterEntries.put(usedByPath, ufids);
if (!masterUfids.isEmpty())
filterEntries.put(usesPath, masterUfids);
try {
usageLinkEntries = service.getXMLFilterEntries(ROOT_TAG, filterEntries);
} catch (WTException | WTPropertyVetoException e) {
throw new TransformationException(e);
}
return usageLinkEntries;
}
@Override
public int getPriority() {
return DependencyFilterPriority.LINK_OBJECT_PRIORITY;
}
}
これは、以下に示すように、FilterIdentityKey と呼ばれるアノテーションを設定します。
package com.ptc.transformation.filter;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
@Retention(RUNTIME)
public @interface DependentOn {
FilterIdentityKey[] value() default {};
}
これは、必要な依存タグと、その処理に必要な追加のフィルタアイデンティティを定義します。この場合、これは Part filter identity キーの一部として masterUfid を必要とするため、以下に示すように、これにアノテーションが付けられます。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Configuration SYSTEM "xconf.dtd">
<Configuration targetFile="codebase/service.properties">
<Service context="default" name="com.ptc.transformation.filter.DependencyFilter">
<Option cardinality="duplicate" requestor="java.lang.Object" selector="UsageLink" serviceClass="com.ptc.transformation.filter.test.UsageLinkFilter" />
</Service>
<Service context="default" name="com.ptc.transformation.filter.XMLFilterEntry">
<Option cardinality="duplicate" requestor="java.lang.Object" selector="WTPartUsageLink" serviceClass="com.ptc.transformation.filter.test.WTPartUsageLinkFilterEntry" />
</Service>
<Service context="default" name="com.ptc.transformation.core.TransformationFilter">
<Option serviceClass="com.ptc.windchill.transform.util.TestTransformationFilter" requestor="java.lang.Object" selector="xpath_filter" cardinality="duplicate" />
</Service>
</Configuration>
依存フィルタのカスタマイズの詳細については、
ダウングレード送信物の Windchill 依存フィルタを参照してください。
フィルタコンフィギュレーションの処理
フィルタコンフィギュレーションは、以下の場所にあります。
• Xpath ベースのフィルタ変更 - $(wt.codebase.location)/registry/transformationEngine/filter/<リリース ID>/xpath_filter.xml
• エレメント名に基づく XML ファイルの除去 - $(wt.codebase.location)/registry/transformationEngine/filter/11.1.M020/filter.properties
除去するエレメントをコンマ区切り値で追加します。
変換中のバッチサイズの処理
$(wt.codebase)/wt.properties で設定されているプロパティ com.ptc.transformation.batchSize を使用して、変換中に処理される XML の数のバッチサイズを制御できます。このプロパティは、変換前、変換中、および変換後に処理される XML の、エレメントハンドラプロセス中のメモリ内 InputSource 処理を制御します。デフォルト値は 10000 です。
さらに、wt.properties 内の以下のプロパティを設定して、メモリに維持する XML ファイルの数に応じてキャッシュとバッチサイズを指定します。このプロパティファイルは、Windchill/codebase
com.ptc.transformation.dom.cache=100
com.ptc.transformation.batchSize=10000
にあります。割り当てられているヒープ値に基づいて、これらのプロパティでファイル数を設定します。