パブリッシングの高度なカスタマイズ
パブリッシングの拡張ポイント
メッセージボディの作成または処理中には、カスタマイズを実装可能ないくつかのポイントがあります。変換後の委任も実装できます。
サービス構造のトラバーサル
この汎用委任 ServiceStructureTraversing は、入力サービス構造に影響を与えずに、シリアライズされる出力サービス構造を修正します。この委任は、翻訳やパブリッシングを含むトラバーサル全般に適用されます。
登録
service.properties.xconf ファイルに以下を追加することで委任 ServiceStructureTraversing を登録します。
<Service context="default" name="com.ptc.arbortext.windchill.siscore.
traversal.ServiceStructureTraversing">
<Option serviceClass="YourCustomTraversingClassName"
requestor="wt.part.WTPart" selector="null"/>
</Service>
ServiceStructureTraversing インタフェース
package com.ptc.arbortext.windchill.siscore.traversal;
import java.util.List;
import wt.part.WTPart;
import wt.util.WTException;
/*
* Interface that allows customization of the nodes returned from
* StandardTraversalService.
* Children may be added, removed and reordered.
*/
public interface ServiceStructureTraversing {
boolean children(WTPart parent, List<pubNode> children)
throws WTException;
}
children() API メソッド
トラバーサルの次の段階でパラメータ children の修正された値を使用するには true を返します。
このメソッドは各ノードの子にアクセスする前に呼び出されます。このメソッドは以下をサポートしています。
◦ 子ノードの追加
◦ 子ノードの除去
◦ 子ノードの再配置
パラメータ:
◦ parent
トラバーサルコードが現在アクセスしているサービス構造ノード
◦ children
パラメータ parent の子ノード
カスタムコンテンツ準備チェッカー
委任 CustomContentReadyChecker は、パブリッシング時に各ダイナミックドキュメント (複合ドキュメントのメンバーリンクや、部品リストから参照されるグラフィックを含む) を検査し、コンテンツをパブリッシングする準備が整っているかどうかを判別します。この委任は、翻訳の準備が整っているかどうかを判別するときに使用されますが、ドキュメント自体の準備が整っているかどうかも判別できます。
パブリッシング規則パラメータ OnContentHolderLinkFailed は、ドキュメントまたはその翻訳の準備が整っていない場合にパブリッシングリクエストをどのように処理するかを定義します。
登録
service.properties.xconf ファイルに以下を追加することで委任 CustomContentReadyChecker を登録します。
<Service name="com.ptc.arbortext.windchill.publisher.
CustomContentReadyChecker">
<Option serviceClass="CustomContentCheckerClassName"
requestor="null" selector="null"/>
</Service>
CustomContentReadyChecker インタフェース
package com.ptc.arbortext.windchill.publisher;
import wt.fc.Persistable;
import wt.util.WTException;
import com.ptc.arbortext.windchill.publisher.payload.PayloadContext;
public interface CustomContentReadyChecker {
boolean isTranslatedContentReady(
Persistable source,
Persistable trans,
PayloadContext context) throws WTException;
// if PTC_DD_TRANSLATE=="yes" && lang set
boolean isContentReady(
Persistable source,
PayloadContext context) throws WTException; // else this
}
isTranslatedContentReady() API メソッド
ドキュメントの準備が整っている場合には true を返し、整っていない場合には false を返します。
このメソッドは、ドキュメントとその翻訳の状態をチェックして、パブリッシングの準備が整っているかどうかを判別します。
パラメータ:
◦ source
ドキュメントのコンテンツ
◦ trans
◦ ドキュメントの翻訳済みコンテンツ
◦ context
メッセージボディのコンテキスト (パブリッシング規則パラメータおよびその他のパブリッシング情報を含む)
isContentReady() API メソッド
ドキュメントの準備が整っている場合には true を返し、整っていない場合には false を返します。
このメソッドは、ドキュメントの状態をチェックして、パブリッシングの準備が整っているかどうかを判別します。
パラメータ:
◦ source
ドキュメントのコンテンツ
◦ context
メッセージボディのコンテキスト (パブリッシング規則パラメータおよびその他のパブリッシング情報を含む)
セキュリティラベル収集
委任 SecurityLabelAggregator は、パブリッシングされるデータとそのセキュリティラベルに基づいて、パブリッシングされる製品表現のセキュリティラベルを設定します。
パブリッシングプロセスにおいて、Windchill Service Information Manager は、メッセージボディで収集された各エレメントのセキュリティラベルを収集し、セキュリティラベル属性を付与します。ビジネスロジックに基づいてセキュリティラベルを収集する SecurityLabelAggregator インタフェースを使用して、収集されたエレメントのセキュリティラベル階層を定義できます。
インタフェースでは、次のセキュリティラベルを処理します。
• 構造内のすべての WTParts
• すべてのリンクされた WTDocument、EPMDocument、グラフィック、および部品リストオブジェクト
• ドキュメントからリンクしたすべてのフラグメント
• 部品リストとドキュメントからリンクしたすべてのグラフィック
• メッセージボディに含まれるすべての製品表現
|
(メタデータだけでなく) コンテンツがメッセージボディに含まれないかぎり、参照オブジェクトは除外されます。
バンドルのパブリッシングでは、セキュリティラベルはサポートされていません。
|
登録
service.properties.xconf ファイルに以下を追加することで委任 SecurityLabelAggregator を登録します。
<Service name="com.ptc.arbortext.windchill.publisher.
SecurityLabelAggregator">
<Option serviceClass="CustomSecurityLabelAggregatorClassName"
requestor="null" selector="null"/>
</Service>
SecurityLabelAggregator インタフェース
package com.ptc.arbortext.windchill.publisher;
import java.util.Map;
import wt.access.SecurityLabeled;
import wt.util.WTException;
public interface SecurityLabelAggregator {
/**
*
* @param mergeTo is the output. Initially it has other labels
* @param finalTarget is the object in which the final result is saved
* @param mergeFrom is a collection of labels that will be merged to
* mergeTo.
* @param mergeFromObject is the object where mergeFrom is retrieved.
* If mergeFromObject is a representation, its target object
* is used.
* @param options are the parameters that can be used to control the
* merging.
* @throws WTException, when thrown, the current publish job fails.
*/
public void aggregate(Map<String, String> mergeTo,
SecurityLabeled finalTarget, Map<String, String> mergeFrom,
SecurityLabeled mergeFromObject, Map<String, String> options)
throws WTException;
/**
*
* The method tests if the security labels need the PE alternate
* transaction archive.
* If there is a label called ITAR, an implementation could return true.
* PE would put the publish job's transaction archive in the alternate
* archive.
* @param securityLabels are the aggregated security labels
* @param options parameters
* @return true if secure and false if public
*/
public boolean isSecured(Map<String, String> securityLabels,
Map<String, String> options) throws WTException;
}
aggregate() API メソッド
void を返します。
このメソッドは、メッセージボディに収集されたすべてのデータのセキュリティラベルに基づいて、ターゲットの製品表現の最終的なセキュリティラベルを設定します。
パラメータ:
◦ mergeTo
finalTarget のセキュリティラベルのコレクション。このメソッドが呼び出されたときに、この変数にいくつかのセキュリティラベルがすでに含まれていることがあります。
◦ finalTarget
最終的なセキュリティラベルが保管されるオブジェクト。
◦ mergeFrom
mergeFromObejct のセキュリティラベルのコレクション。これらのセキュリティラベルは、最終的なセキュリティラベルがどのように設定されているかを判断するのに役立ちます。
◦ mergeFromObject
一部のセキュリティラベルを含むオブジェクト
◦ options
パブリッシング規則パラメータとその値のマップ
isSecured() API メソッド
true または false を返します。
このメソッドは、収集された最終的なセキュリティラベルをチェックして、パブリッシングされた製品表現を保護するかどうかを決定します。isSecured() が true を返した場合、パブリッシングされた製品表現を保護されたフォルダに配置する必要があります。Arbortext Publishing Engine 上で安全なトランザクションアーカイブを設定する必要があります。
パラメータ
◦ securityLabels
セキュリティのために適用する最終的なセキュリティラベル
◦ options
パブリッシング規則パラメータとその値のマップ
エレメントフィルタ
委任 ElementFilter を使用して、サービス構造のメッセージボディから情報エレメントを除外できます。たとえば、この委任を使用して、特定のセキュリティラベルを持つ情報エレメントをメッセージボディから除外できます。
コンテンツオブジェクト (EPMDocument など) や部品リストのいずれかの子がフィルタされる場合にはそれ自体をフィルタする必要があり、フィルタしない場合、不完全なドキュメントや部品リストがパブリッシングされてエラーが発生する可能性があります。
登録
service.properties.xconf ファイルに以下を追加することで委任 ElementFilter を登録します。
<Service name="com.ptc.arbortext.windchill.publisher.payload.ElementFilter">
<Option serviceClass="CustomElementFilterClassName"
requestor="null" selector="null"/>
</Service>
ElementFilter インタフェース
package com.ptc.arbortext.windchill.publisher.payload;
import wt.fc.Persistable;
import wt.fc.collections.WTList;
import wt.util.WTException;
/**
* An interface that is used to filter information elements based on
* customized criteria. Only one instance is used for the whole payload.
*
*/
public interface ElementFilter {
/**
*
* @param context
* @param curElement it could be WTPart, PartList
* @param associated a list of Persistable objects. If the current
* element is a structured document, such as dynamic document,
* only its root dynamic document is included.
* Depending on business logic, users may need to check the children.
* @return true means we don't include the Element. Otherwise,
* include the element. If the element is not included and the
* publishing stops, an exception is expected.
* @throws WTException
*/
public boolean filter(PayloadContext context, Persistable curElement,
WTList associated) throws WTException;
}
filter() API メソッド
メッセージボディから curElement を除外するには true を返します。curElement を含めるには false を返します。
このメソッドは、サービス構造内の各情報エレメントをチェックして、フィルタすべきかどうかを判別します。
パラメータ:
◦ context
メッセージボディのコンテキスト (パブリッシング規則パラメータおよびその他の情報を含む)。
◦ curElement
メッセージボディに追加可能なサービス構造ノード、部品リスト、または部品リストのイラストレーション。
◦ associated
curElement に関連付けられている永続可能オブジェクトのコレクション。たとえば、curElement がダイナミックドキュメントを指す情報構造ノードである場合、パラメータ associated にはダイナミックドキュメントが含まれます。
カスタムメタデータソースプロバイダ
委任
CustomMetaDataSourceProvider では、任意の部品リストアイテムまたはサービス構造内の任意のノードに追加のメタデータソースを提供できます。追加のメタデータソースは既存のメタデータソースの後ろに追加されてから XML ファイルにシリアライズされます。通常は、
publishable_attset.xml ファイルの設定に基づいて各構造ノードと各部品リストアイテムからメタデータソースが収集されます。詳細については、
属性の設定を参照してください。
登録
service.properties.xconf ファイルに以下を追加することで委任 CustomMetaDataSourceProvider を登録します。
<Service name="com.ptc.arbortext.windchill.siscore.operation.
CustomMetaDataSourceProvider">
<Option serviceClass="CustomMetaDataSourceProviderClassName"
requestor="null" selector="wt.part.WTPart|com.ptc.sis.Base|
com.ptc.sis.BaseDiv "/>
</Service>
CustomMetaDataSourceProvider インタフェース
package com.ptc.arbortext.windchill.siscore.operation;
import java.util.List;
import wt.fc.ObjectToObjectLink;
import wt.fc.Persistable;
import wt.util.WTException;
public interface CustomMetaDataSourceProvider {
List<SISMetaDataSource> getCustomDataSources(Persistable targetNode,
ObjectToObjectLink linkToNode,
Persistable rootNode,
SISOperationServerContext hookContext) throws WTException;
}
getCustomDataSources() API メソッド
既存のメタデータソースの後ろに追加されてからターゲットノードにシリアライズされるカスタムメタデータソースのコレクションを返します。
このメソッドは指定されたソースの追加のメタデータを収集します。
パラメータ:
◦ targetNode
値は次のいずれかです。
▪ このメソッドが呼び出されたときに情報構造またはパブリッシング構造内でアクセスされているノード
▪ 部品リストオブジェクトがシリアライズされる際に部品リストからリンクされる wt.part.WTPart
▪ ダイナミックドキュメントなど、メッセージボディに追加されるコンテンツオブジェクト (そのオブジェクトのメタデータがマニフェストで必要な場合)
◦ linkToNode
このメソッドが呼び出されたときの親ノードからの targetNode へのリンクルートノード、または委任 ServiceStructureTraversing によってツリーに追加されたノードでは、これは null になることがあります。部品リストアイテムの場合、これは PartListItem にリンクされている wt.part.WTPart です。コンテンツオブジェクトの場合、これは EPMDescribedByLink などの特殊リンクであることがあります。
◦ rootNode
サービス構造または部品リストオブジェクトのルート。
◦ hookContext
実行されている操作のタイプおよび構造に適用されるフィルタについての情報を提供する SISOperationServerContext コンテキスト。
カスタムメタデータの翻訳の提供
翻訳対象のカスタムメタデータを操作する場合は、RawMetaDataSource の PropertyValue クラスから addTranslation() メソッドを使用します。以下に例を示します。
RawMetaDataSource.Property p = new RawMetaDataSource.
Property("token2", "property_type", null, authorLang);
p.setLocalizable(true);
RawMetaDataSource.PropertyValue v = new RawMetaDataSource.
PropertyValue("value12", "value_token", "value_key");
v.addTranslation("fr", "value12_fr");
v.addTranslation("de", "value12_de");
p.addValue(v);
properties.add(p);
data.setProperties(properties);
フランス語 (バンドルのデフォルト) のメタデータの結果は、以下のようになります。
<Metadata source="RawSoftType">
<Property name="token2">
<Value xml:lang="en" transidref="...">value12</Value>
<Value xml:lang="en" transidref="...">value12_2</Value>
</Property>
</Metadata>
translation.xml (PDF のデフォルト) のメタデータの結果は、以下のようになります。
<Target xml:lang="fr">
...
<Value transid="07ecb4cfd68fab55">value12_fr</Value>
<Value transid="07ecb4cfd68fse54">value12_2_fr</Value>
...
</Target>
委任で Localizable を "true" に設定することによって、プロパティ値に関して、バンドルに表示できる翻訳が存在することを指示できます。addTranslation() メソッドは、特定の言語のカスタム翻訳を提供できます。委任では、1 つの PropertyValue に対して複数の翻訳を設定できます。特定言語のバンドルがパブリッシングされると、適切な翻訳 (提供されている場合) がバンドルに表示されます。
プロパティがローカライズ可能とマークされている一方で、パブリッシングのターゲット言語の翻訳が委任では提供されていない場合、パブリッシングのジョブは失敗します (CompleteTranslationCheck パブリッシング規則が "true" に設定されている場合)。
収集されたタイムスタンプのカスタムメタデータの比較
カスタムメタデータでは、収集されたタイムスタンプの詳細が partlist の SIM.lastUpdated 属性と EPM ドキュメントの SIM.lastUpdatedMetadata 属性を介して提供されます。CustomMetaDataSourceProvider 委任の RawMetadasource 内の AttributeMetaDataSource クラスの getTimeStamp() メソッドを使用します。
パブリッシングには getTimeStamp() によって返されたルートコンテンツ (コンテンツホルダーの下のダイナミックドキュメントおよび PartList) の値が含まれ、残りのコンテンツは無視されます。たとえば、子ダイナミックドキュメントのカスタムデータにもタイムスタンプが含まれている場合、親の計算されたタイムスタンプ内のこの情報はパブリッシングに含まれません。
タイムスタンプは RawMetadasource から返され、AttributeMetaDataSource クラスで定義されています。
public class AttributeMetaDataSource implements SISMetaDataSource {
private WTReference targetRef;
protected List<Property> properties;
protected List<Object> incrementalList;
protected long timeStamp;
マニフェストカスタムメタデータソースプロバイダ
ManifestCustomMetaDataSourceProvider 委任はコンテンツのメタデータソースを追加および除去するとともに、メッセージボディ内の
manifest.xml ファイルに含まれている既存のメタデータに新規属性を追加します。追加のメタデータソースは既存のメタデータソースの後ろに追加されてから XML ファイルにシリアライズされます。既存のメタデータソースは、通常はサービスエフェクティビティです。メッセージボディのサービス構造コンテンツ (ダイナミックドキュメント、部品リストなど) をシリアライズする際に、
manifest_attset.xml での設定に基づいてメタデータソースが収集されます。詳細については、
属性の設定を参照してください。
登録
service.properties.xconf ファイルに以下を追加することで委任 ManifestCustomMetaDataSourceProvider を登録します。
<Service name="com.ptc.arbortext.windchill.siscore.operation.
ManifestCustomMetaDataSourceProvider">
<Option cardinality="singleton" serviceClass=
"ManifestCustomMetaDataSourceProviderClassName"
requestor="null" />
</Service>
セレクタ属性によってコンテキストが指定されます。クラスは singleton として登録されます。オブジェクトを複数のスレッドで同時に再使用できるようにします。
ManifestCustomMetaDataSourceProvider インタフェース
package com.ptc.arbortext.windchill.siscore.operation;
import java.util.List;
import java.util.Map;
import wt.fc.WTReference;
import wt.fc.collections.WTKeyedMap;
import wt.util.WTException;
public interface ManifestCustomMetaDataSourceProvider {
/**
*
* @param currentData
* @param hookContext
* @return
* @throws WTException
*/
Map<WTReference, List<SISMetaDataSource>> getCustomDataSources
(WTKeyedMap currentData,SISOperationServerContext hookContext)
throws WTException;
}
getCustomDataSources() API メソッド
ターゲットの参照とそのカスタムメタデータ情報のマップが返されます。
パラメータ:
◦ currentData
この値は、ターゲットの参照とその子のマップです。
◦ hookContext
実行されている操作のタイプおよび構造に適用されるフィルタについての情報を提供する SISOperationServerContext コンテキスト。
メタデータを追加する場合の例
オブジェクト OperationMetaDataSource を初期化します。
OperationMetaDataSource om = new OperationMetaDataSource
(OperationMetaDataSource.E_Operation.Add);
WTArrayList list = new WTArrayList();
list.add(PersistableObject);
om.setTargets(list);
オブジェクト OperationMetaDataSource が返されます。
Map<WTReference, List<SISMetaDataSource>> ret = new HashMap
<WTReference, List<SISMetaDataSource>>
List<SISMetaDataSource> src = new ArrayList<SISMetaDataSource>()
src.add(om);
ret.put(targetRef, src);
メタデータを除去する場合の例
オブジェクト OperationMetaDataSource を初期化します。
OperationMetaDataSource om = new OperationMetaDataSource
(OperationMetaDataSource.E_Operation.Remove);
WTArrayList list = new WTArrayList();
list.add(PersistableObject);
om.setTargets(list);
オブジェクト OperationMetaDataSource が返されます。
Map<WTReference, List<SISMetaDataSource>>
ret = new HashMap<WTReference,
List<SISMetaDataSource>>List<SISMetaDataSource> src = new
ArrayList<SISMetaDataSource>();
src.add(om);
ret.put(targetRef, src);
属性を既存のメタデータに追加する場合の例
オブジェクト AttributeMetaDataSource を初期化します。
AttributeMetaDataSource am = new AttributeMetaDataSource(ref);
List<RawMetaDataSource.Property> properties = new ArrayList
<RawMetaDataSource.Property>();
RawMetaDataSource.Property p = new RawMetaDataSource.Property
("NewCustomAttributeId", null);
RawMetaDataSource.PropertyValue v = new RawMetaDataSource.PropertyValue
(ref.toString(), null, null);
p.addValue(v);
properties.add(p);
am.setProperties(properties);
オブジェクト AttributeMetaDataSource が返されます。
Map<WTReference, List<SISMetaDataSource>>
ret = new HashMap<WTReference,
List<SISMetaDataSource>>List<SISMetaDataSource> src = new
ArrayList<SISMetaDataSource>();
src.add(am);
ret.put(targetRef, src);
カスタムメタデータの翻訳の提供
翻訳対象のカスタムメタデータを操作する場合は、RawMetaDataSource の PropertyValue クラスから addTranslation() メソッドを使用します。以下に例を示します。
RawMetaDataSource.Property p = new RawMetaDataSource.
Property("token2", "property_type", null, authorLang);
p.setLocalizable(true);
RawMetaDataSource.PropertyValue v = new RawMetaDataSource.
PropertyValue("value12", "value_token", "value_key");
v.addTranslation("fr", "value12_fr");
v.addTranslation("de", "value12_de");
p.addValue(v);
properties.add(p);
data.setProperties(properties);
フランス語 (バンドルのデフォルト) のメタデータの結果は、以下のようになります。
<Metadata source="RawSoftType">
<Property name="token2">
<Value xml:lang="en" transidref="...">value12</Value>
<Value xml:lang="en" transidref="...">value12_2</Value>
</Property>
</Metadata>
translation.xml (PDF のデフォルト) のメタデータの結果は、以下のようになります。
<Target xml:lang="fr">
...
<Value transid="07ecb4cfd68fab55">value12_fr</Value>
<Value transid="07ecb4cfd68fse54">value12_2_fr</Value>
...
</Target>
委任で Localizable を "true" に設定することによって、プロパティ値に関して、バンドルに表示できる翻訳が存在することを指示できます。addTranslation() メソッドは、特定の言語のカスタム翻訳を提供できます。委任では、1 つの PropertyValue に対して複数の翻訳を設定できます。特定言語のバンドルがパブリッシングされると、適切な翻訳 (提供されている場合) がバンドルに表示されます。
プロパティがローカライズ可能とマークされている一方で、パブリッシングのターゲット言語の翻訳が委任では提供されていない場合、パブリッシングのジョブは失敗します (CompleteTranslationCheck パブリッシング規則が "true" に設定されている場合)。
収集されたタイムスタンプのマニフェストカスタムメタデータの比較
カスタムメタデータでは、収集されたタイムスタンプの詳細が partlist の SIM.lastUpdated 属性と EPM ドキュメントの SIM.lastUpdatedMetadata 属性を介して提供されます。ManifestCustomMetadataSourceProvider 委任の RawMetadasource 内の AttributeMetaDataSource クラスの getTimeStamp() メソッドを使用します。
パブリッシングには getTimeStamp() によって返されたルートコンテンツ (コンテンツホルダーの下のダイナミックドキュメントおよび PartList) の値が含まれ、残りのコンテンツは無視されます。たとえば、子ダイナミックドキュメントのカスタムデータにもタイムスタンプが含まれている場合、親の計算されたタイムスタンプ内のこの情報はパブリッシングに含まれません。
public class AttributeMetaDataSource implements SISMetaDataSource {
private WTReference targetRef;
protected List<Property> properties;
protected List<Object> incrementalList;
protected long timeStamp;
|
このフックから返されたメタデータは、差分のみパブリッシングの対象として監視されません。
|
カスタム翻訳フック
CustomTranslationHook はパブリッシング中に Windchill 属性の翻訳された値を読み込むことができます。戻り値 null は、翻訳が存在しないことを意味します。パブリッシング出力は translation.xml に含まれます。指定された属性は、メッセージボディに含まれる localizable_attset.xml コンフィギュレーションファイルに含まれている必要があります。
登録
次のようなエントリを sis.service.properties.xconf ファイルに追加することによって、カスタム翻訳フックの委任を登録します。
<Service name="com.ptc.arbortext.windchill.siscore.CustomTranslationHook">
<Option serviceClass="YourCustomTranslationHookClassName"
requestor="null" selector="null"/>
</Service>
CustomTranslationHook インタフェース
package com.ptc.arbortext.windchill.siscore.translation;
import wt.util.WTException;
public abstract class CustomTranslationHook {
/**
*
* @param softtype Windchill soft type name
* @param attributeName Windchill soft attribute name
* @param sourceLanguage source or authored language of attributeValue
* @param attributeValue attributeValue to fetch translation for
* @param targetLanguage target language of translation to fetch
* @throws WTException
*/
public abstract String translateAttribute(String softtype,
String attributeName, String sourceLanguage,
String attributeValue, String targetLanguage)
throws WTException;
}
translateAttribute() API メソッド
このメソッドは、翻訳された属性値を読み込む属性を指定します。
翻訳が存在する場合、指定した属性の翻訳文字列が戻り値になります。このメソッドで null が返るか例外が発生した場合、翻訳は存在せず、その属性のソース文字列が使用されます。
パラメータ:
◦ softtype
サービス構造の Windchill サブタイプ
◦ attributeName
Windchill サブタイプの属性名
◦ sourceLanguage
attributeValue のソース (作成) 言語
◦ attributeValue
翻訳を読み込む属性値
◦ targetLanguage
翻訳を読み込むターゲット言語
メッセージボディ内のカスタムフォルダ
CustomArtifactProvider 委任は、カスタム成果物をメッセージボディバンドルに含めるためのフックを提供します。
登録
CustomArtifactProvider 委任を登録するには、以下のようなエントリを sis.service.properties.xconf ファイルに追加します。
<Service name="com.ptc.arbortext.windchill.publisher.payload.CustomArtifactProvider">
<Option serviceClass="YourCustomArtifactProviderImplementation"
requestor="null" selector="null"/>
</Service>
CustomArtifactProvider インタフェース
package com.ptc.arbortext.windchill.publisher.payload;
import com.ptc.wvs.common.util.VSResult;
import wt.util.WTException;
public interface CustomArtifactProvider {
/**
* This method is passed the path for a newly created empty temporary
* directory as well as the payload context object.
* @param tempDirPath : empty temporary directory
* @param context : payload context object
* @return VSResult.SUCCESSFUL or VSRESULT.FAIL
* @throws WTException
*/
public VSResult initiateCustomFolder(String tempDir, PayloadContext context) throws WTException;
/**
* If the method returns VSResult.SUCCESSFUL, then the contents of the directory
* will be copied to the custom folder in the payload.
Otherwise if the method returns VSRESULT.FAIL, the temporary directory
will be permanently deleted with including its content in the payload.
* @return VSResult.SUCCESSFUL or VSRESULT.FAIL
* @throws WTException
*/
public VSResult publishCustomFolder() throws WTException;
/**
* cleanUp is called regardless what happens to publish
* to clean up resources in customization.
*/
public void cleanUp();
initiateCustomFolder() API メソッド
このメソッドには、新規作成される空の一時ディレクトリのパスとともにメッセージボディコンテキストオブジェクトが渡されます。このメソッドが VSResult.FAIL を返すと、パブリッシングジョブが停止し、エラーを返します。
パラメータ:
◦ tempDir
空の一時ディレクトリ
◦ context
メッセージボディコンテキストオブジェクト
VSResult.SUCCESSFUL または VSRESULT.FAIL を返します。
publishCustomFolder() API メソッド
このメソッドは、一時ディレクトリのコンテンツを修正します。たとえば、いくつかの成果物を ZIP 圧縮します。
VSResult.SUCCESSFUL または VSRESULT.FAIL を返します。このメソッドが VSResult.SUCCESSFUL を返す場合は、ディレクトリのコンテンツがメッセージボディ内のカスタムフォルダにコピーされます。このメソッドが VSRESULT.FAIL を返す場合、一時ディレクトリは、コンテンツがメッセージボディ内に保持されたまま、完全に削除されます。
ディレクトリとファイルの名前をエンコードするメソッド
encodePayloadFileName ユーティリティは、割合スタイルのエンコード方式を使用することにより、ディレクトリのファイル名またはメッセージボディ内またはパブリッシングバンドル内の成果物に含まれている特殊文字をエンコードします。このユーティリティは、ファイル名に含まれている特殊文字および英数字以外の文字を、アンダースコア (_) 文字と、置き換え対象文字を表す後続の 16 進数 (#) 値に置き換えます。
以下の文字は、エンコード時にエスケープされません。
• A-Z (大文字ラテン文字)
• a-z (小文字ラテン文字)
• 0–9 (アラビア数字)
• . (ピリオド)
• ~ (チルド)
ユーティリティのメソッド署名:
public static String encodePayloadFileName(String fname)
ユーティリティの完全修飾メソッド署名:
com.ptc.arbortext.windchill.publisher.payload.util.FileNameUtil.encodePayloadFileName(String fname)
fname はファイル名です。
非アクティブの製品階層ノードのパブリッシング
CustomPHHook は、製品階層ツリーに含まれていない製品階層ノードを検出し、非アクティブなノードとしてパブリッシングします。ノードがツリーの一部である場合は、非アクティブとしてマークされます。ノードがツリーの一部ではない場合は、ルート PH の子として挿入され、非アクティブとしてマークされます。
登録
カスタム製品階層フックの委任を登録するには、以下のようなエントリを sis.service.properties.xconf ファイルに追加します。
<Service name="com.ptc.arbortext.windchill.publisher.payload.CustomPHHook">
<Option cardinality="singleton" serviceClass="YourCustomPHHook"
requestor="null" selector="null"/>
</Service>
CustomPHHook インタフェース
package com.ptc.arbortext.windchill.publisher.extract;
import com.ptc.arbortext.windchill.publisher.payload.PayloadContext;
import wt.fc.collections.WTCollection;
import wt.filter.NavigationCriteria;
import wt.part.WTPart;
import wt.util.WTException;
Public abstract class CustomPHHook {
public abstract WTCollection getInactivePHNodes(WTPart rootPH, NavigationCriteria phNC, PayloadContext payloadContext);
}
getInactivePHNodes() API メソッド
製品階層内の非アクティブノードである WTPart のコレクションを返します。このメソッドが製品階層の一部ではないノードを返す場合、またはオブジェクトが WTPart ではない場合、例外が発生します。このメソッドが製品階層ツリーに含まれていないノードまたは部品を返す場合、そのノードは、新しい製品階層情報エレメントとして構造に追加されます。
パラメータ:
◦ rootPH
製品階層構造のルート
◦ phNC
製品階層のナビゲーション基準
◦ payloadContext
コンテキスト
変換後の委任
PostConvertDelegate では、パブリッシングジョブの後で Arbortext Publishing Engine から返る応答をポストプロセスできます。この応答には、エラーや警告を含む composerlog.xml ファイル内の情報が含まれます。この情報によってワークフロー操作または電子メール通知が開始します。この委任はパブリッシングジョブの成否にかかわらず呼び出されます。
PostConvertDelegate で例外が発生した場合、その例外は WVS ログに記録されますが、パブリッシングジョブのステータスは変わりません。
登録
WVS パブリッシングパラメータ PostConvertDelegate をパブリッシング規則に追加し、カスタム委任のクラス名を指定することによって、変換後のカスタム委任を登録します。この例を次に示します。
<worker name="com.ptc.arbortext.wvs/PostConvertDelegate">
com.ptc.arbortext.windchill.publisher.CustomPostConvertDelegate</worker>
PostConvertDelegate インタフェース
package com.ptc.arbortext.windchill.publisher;
import java.io.InputStream;
import java.util.Map;
import com.ptc.wvs.common.util.VSResult;
import com.ptc.wvs.server.publish.PublishParams;
import wt.fc.collections.WTCollection;
import wt.representation.Representable;
import wt.representation.Representation;
import wt.util.WTException;
/**
* The abstract class is designed to invoke after the response is returned
* from PE whether the publish job fails or succeeds.
*/
public abstract class PostConvertDelegate {
/**
* The method is invoked after getting response from PE.
* Its result is displayed in the WVS monitor.
* Any exception it throws is logged in method server log,
* but doesn't affect existing publish process;
*
* @param representable is the target object
* @param targetRep is the targeted representation in the targeted object.
* It is not null only for republishing or incremental publishing.
* @param parameters are publishing parameters for this publishing job.
* @param responseStreams is the map that includes all the file names
* and file output streams
* @param publishedList is the list of content included in the payload.
* If it is null, audit is disabled.
* @return is the messages sent to WVS job monitor */
public abstract VSResult execute(Representable representable,
Representation targetRep,
PublishParams parameters,
Map<String, InputStream> responseStreams,
WTCollection publishedList) throws WTException;
}
execute() API メソッド
戻り値が WVS ジョブモニターに表示されます。
このメソッドは、パブリッシングジョブの応答が Arbortext Publishing Engine から返された直後に呼び出されます。
パラメータ:
◦ representable
パブリッシングされたターゲットオブジェクト
◦ targetRep
ターゲットオブジェクト内のターゲット製品表現。このパラメータは再パブリッシングおよび差分のみパブリッシングにのみ使用されます。null でない場合、ターゲットオブジェクトの以前の製品表現が含まれます。その他の場合はすべて null です。
◦ parameters
このパブリッシングジョブに使用されたパブリッシング規則パラメータ
◦ responseStreams
応答用のすべてのファイル名とファイル出力ストリームを含むマップ
◦ publishedList
メッセージボディに含まれているコンテンツのコレクション。監査が無効である場合には null になります。