ObjectSet アプリケーションによるオブジェクト構造のナビゲーション
インポートまたはエクスポートでは、ナビゲーション <rule> 要素の下に新しいオプション要素 <loadCondition> が追加されました。これらの規則は、<Windchill>\codebase\registry\ixb\object_set_handlers の下の XML ファイルにあります。
<loadCondition> 要素には、完全修飾された <className> および <methodName> があります。オブジェクトのナビゲーションフレームワークは、戻り値を使用して指定したメソッドを呼び出します。メソッドは静的でブールを返す必要があり、引数は取りません。指定したメソッドは true のみを返し、規則が読み込まれます。<loadCondition> が存在しない場合は、デフォルトで規則が読み込まれます。
<loadCondition> 要素が存在する場合、フレームワークでは指定したメソッドが呼び出され、規則を読み込むかどうかが決定されます。
要素は以下のようになります。
<loadCondition>
<className>xxxx</className>
<methodName>yyy</methodName>
</loadCondition>
例:
<loadCondition>
<className>wt.ixb.objectset.ObjectSetHelper</className>
<methodName>isPDMLinkInstalled</methodName>
</loadCondition>
オブジェクト収集
オブジェクトがエクスポート処理に渡されると、ObjectSet アプリケーションはオブジェクトの構造をナビゲーションして、関連するオブジェクトをすべて収集します。
ナビゲーションの定義は、ナビゲーション規則ファイルと呼ばれる XML ファイルのセットから取得されます。さらに、単純なナビゲーションでは不十分で、いくらかのプログラミングロジックを適用する必要がある場合、ObjectSet アプリケーションでは、ジェネレータおよびフィルタと呼ばれる Java クラスを使用して、エクスポートするオブジェクトのセットを収集します。
ナビゲーション規則ファイルは <Windchill>\codebase\registry\ixb\object_set_handlers フォルダにあります。
ナビゲーション規則
ナビゲーション規則には、ジェネレータとフィルタという2つのタイプがあります。
• ジェネレータは、オブジェクトの構造の中を走査し、"子部品"、"詳細"、"参照" など、エクスポートされるすべてのオブジェクトを取得するために、アプリケーションで使用される規則です。
• フィルタは、エクスポート処理から特定のオブジェクトを除外するために、エクスポートされるオブジェクトに適用される規則です。たとえば、"タイムフィルタ" を使用して、指定した期間内に修正されたオブジェクトをエクスポートするように選択できます。これは現在使用できる唯一の OOTB フィルタです。
使用可能なジェネレータ ID は、<Windchill>\codebase\registry\ixb\object_set_handlers フォルダにある XML ファイルで <setGenerator> タグを使用して定義されています。これらのジェネレータ ID のリストは、1 つ目の引数として false を渡して IXBHelper.service.getGeneratorList() を呼び出すことによって取得できます。この呼び出しにより、システムで使用可能なすべてのジェネレータが返されます。
1 つ目の引数として true を渡して IXBHelper.service.getGeneratorList() を呼び出した場合、エンドユーザー選択用 GUI に表示されるジェネレータのリストが返ります。これにより、エンドユーザーに表示しないジェネレータを非表示にできます。これらのジェネレータを非表示にするには、ジェネレータの XML ファイルの <display> タグを false に設定します。
例: 以下は WTPart 用の <Windchill>\codebase\registry\ixb\object_set_handlers\product_struct.xml ファイルから抜粋したパラグラフです。
<setGenerator>
<id>productStructureNavigator</id>
<handler>
wt.ixb.objectset.handlers.navigator.ProductStructureNavigator
</handler>
<dialogClassName>
wt.clients.ixb.exp.NavigatorSearchDialog
</dialogClassName>
<localizedName>
<localizedString>
<class>wt.ixb.objectset.objectSetResource</class>
<key>PRODUCT_STRUCTURE_NAME</key>
</localizedString>
</localizedName>
タグ
オブジェクトのナビゲーション
このメカニズムでは、XML 規則に従った Windchill オブジェクトの "ナビゲータ" を使用します。シード (トップレベル) オブジェクトを与えると、指定された規則を使用してオブジェクト間を移動します。ナビゲーションは、DB リンク、外部キー、または指定されたメソッドを使用して実行できます。以下に WTPart の規則定義の例を示します。シードは Folder オブジェクトです。
<Windchill>\codebase\registry\ixb\object_set_handlers\product_struct.xml
<handler>
wt.ixb.objectset.handlers.navigator.ProductStructureNavigator
</handler>
...
<schema>
...
<rule>
<for>wt.part.WTPart</for>
<go>
<byMethod>
<method>navigateFromWTPartToDescribeByDoc</method>
</byMethod>
</go>
</rule>
<rule>
<for>wt.part.WTPartDescribeLink</for>
<go>
<fromForeignKey>
<targetClass>wt.doc.WTDocument</targetClass>
<getMethodName>getDescribedBy</getMethodName>
</fromForeignKey>
</go>
</rule>
...
</schema>
上記の例には使用可能な両方のタイプのナビゲーションが示されています。ナビゲートメソッドを使用して WTPart から wt.part.WTPartDescribeLink に移動し、そこからメソッド getDescribedBy を使用して WTPart を説明する WTDocument を取得します。これにより、重要なセマンティック手順を実行できます。
オブジェクトを収集した後、定義済みのフィルタセットを使用してオブジェクトを除外できます。フィルタ定義は、同じオブジェクト設定レジストリに保存されています。以下に、日付/時刻フィルタの例を示します。
<Windchill>\codebase\registry\ixb\object_set_handlers\ filter_by_time.xml
<setFilter>
<id>filterByTime</id>
<handler>wt.ixb.objectset.handlers.FilterByTime</handler>
<dialogClassName>
wt.clients.ixb.exp.FilterByTimeDialog
</dialogClassName>
<localizedName>
<localizedString>
<class>wt.ixb.objectset.objectSetResource</class>
<key>FILTER_BY_TIME_NAME</key>
</localizedString>
</localizedName>
<parameters>
</parameters>
</setFilter>
オブジェクト収集と同様に、フィルタメカニズムも StandardIXBService レベルでエクスポートアプリケーションと組み合わされます。分離も可能です。
新しいナビゲータの追加
新しいナビゲータを実装するには、多くの場合、以下の手順を実行する必要があります。
1. ナビゲーションのロジックを記述する XML 規則ファイルを実装します。例として、<Windchill>\codebase\registry\ixb\object_set_handlers\product_struct.xml を参照してください。
2. wt.ixb.objectset.handlers.navigator.GeneralNavigator のサブクラスを実装します。必要に応じて次のメソッドを実装します。
◦ public boolean canBeUsedAsTopLevelObject(Persistable obj)
◦ public String getTopLevelObjectLocalizedImage(Persistable obj)
|
規則ファイルに指定されたすべてのメソッドを実装する必要があります。
|
このようなナビゲーションメソッドは、オブジェクトを取得してパラメータからナビゲーションし、エクスポートセットに追加される列挙を返します。たとえば、以下の規則を指定するとします。
<byMethod>
<method>navigateFromObject1ToObject2</method>
</byMethod>
この場合、以下の Java メソッドを実装する必要があります。
public Enumeration navigateFromObject1ToObject2 (Persistable ob)
throws WTException
既存のジェネレータおよびフィルタのリスト
この付録では、以下の呼び出しを行って、IX オブジェクト収集メカニズムを使用する GUI 開発者に役立つ情報を提供します。ObjectSetHelper.computeObjectSetForGivenGeneratorsAndFilters(generatorIds, generatorParams, filterIds, filterParams);
例
すべての子を持つ部品
genId[0] = “productStructureNavigator”;
genParams[ 0] = “wt.part.WTPart:6789”;
WTHashSet objects = (WTHashSet) ObjectSetHelper.
computeObjectSetForGivenGeneratorsAndFilters( genIds,
genParams,
new String [0 ],
new String [0 ]);
キャビネットとフォルダ (サブフォルダを含む) 内のすべてのオブジェクト
genId[0] = genId[ 1] = “folderContent”;
genParams[ 0] = “wt.folder.Cabinet:1865”;
genParams[ 1] = “wt.folder.Subfolder:5674”;
WTHashSet objects = (WTHashSet) ObjectSetHelper.
computeObjectSetForGivenGeneratorsAndFilters( genIds,
genParams,
new String [0 ],
new String [0 ]);
| フィルタがない場合は、filterIds および filterParams に新しい String[0] を渡すことができます (例外が発生するので、Null を渡さないでください)。 |
GUI の文字列定数を取得する方法については、<Windchill>Windchill\srclib\wnc\Carambola-java.jar を参照してください。
ジェネレータリスト
文字列 ID | 説明 | ローカライズされた名前 - 英語 (GUI) | 文字列としてのパラメータ |
---|
folderContent | 指定のキャビネットまたはフォルダ (サブフォルダを含む) 内のすべてのオブジェクトを収集します。 | キャビネットおよびフォルダのコンテンツ | <class name: oid>、例: wt.folder.Subfolder: 1234 または wt.folder.Cabinet: 1234 |
productStructureNavigator | 指定した部品のすべての子 (その部品で使用されている部品やその部品について説明するドキュメントなど) を集めます。 | 製品構造 (アクティブなコンフィギュレーション仕様を基に作成) | <class name: oid>、例: wt.part.WTPart:123 4 (トップレベルオブジェクトの場合)このオブジェクトは、WTPart のインスタンスである必要があります。 |
productStructureNavigatorEPM | 指定の CAD ドキュメントのすべての子を収集します。 | CAD ドキュメント/ダイナミックドキュメント構造 (最新のコンフィギュレーション仕様を基に作成) | <class name: oid>、例: wt.epm.EPMDocu ment:1234 (トップレベルオブジェクトの場合)このオブジェクトは、EPMDocument のインスタンスである必要があります。 |
productStructureNavigatorWithEPM | 指定の部品のすべての子 (関連 CAD ドキュメントを含む) を収集します。 | CAD ドキュメント/ダイナミックドキュメントのある製品構造 (アクティブなコンフィギュレーション仕様を基に作成) | <class name: oid>、例: wt.part.WTPart:123 4 (トップレベルオブジェクトの場合)このオブジェクトは、WTPart のインスタンスである必要があります。 |
singleDocument | 指定のドキュメントのみを取得します。 | ドキュメント | <class name: oid>、例: wt.doc.WTDocume nt:1234 |
| <class_name:oid> は事実上、オブジェクトのローカル ID です。 このほかにも、特定のインストール環境でのみ使用可能なジェネレータがあります。 |
フィルタリスト
文字列 ID | 説明 | ローカライズされた名前 - 英語 (GUI) | 文字列としてのパラメータ |
---|
filterByTime | 指定の期間よりも前または後に修正されたオブジェクトを除外します。 | 「修正日別に表示」 | <timeFrom#timeTo>、ここで、timeFrom および timeTo は "null" または Timestamp.toString() |
エクスポート/インポートアプリケーションの例:
現在の Windchill エクスポート OOTB GUI および StandardIXBService は、エクスポートアプリケーションです。
OOTB Windchill エクスポート GUI は、IXBHelper を通じて StandardIXBService (エクスポートアプリケーション (サーバー)) のエクスポート処理を呼び出すエクスポートアプリケーション (クライアント) です。
ObjectExportParameters exportParam = new ObjectExportParameters ();
exportParam.setActionName(actorName);
exportParam.setClientFileName(jarFileName);
exportParam.setContainer(container);
exportParam.setDetailedLog(detailedLog);
exportParam.setGuiId(reqGUIid);
exportParam.setPolicyFile(policyFile);
exportParam.setPreviewOnly(isPreview);
exportParam.setRuleFile(ruleF);
exportParam.setValidation(false);
exportParam.setGenerators(generators);
exportParam.setFilters(filters);
exportParam.setLocale(RB.getLocale());
exportParam.setJarInJarFlag(jarInJar);
exportParam.getContextData().setIXApplicationContext(appContext);
try{
String formatType = WTProperties.getAppletProperties().
getProperty("wt.ixb.export.formatType");
if(formatType != null){
exportParam.setFormatType(ExportImportFormatType.
toExportImportFormatType(formatType));
}
}catch(Exception e){
}
IXBExpImpStatus status = IXBHelper.service.doExport ( exportParam);
• IXBHelper は wt.ixb.clientAccess のクラスです。StandardIXBService クラスのメソッド doExport(…) を呼び出してエクスポート処理を実行します。
• IXBExpImpStatus は、エクスポート/インポート処理に関する情報を含む wt.ixb.clientsAccess のクラスであり、サーバーとクライアント間でエクスポート/インポートステータスを渡すために使用されます。
• generatorIds - 前述の定義を参照してください。
• generatorParams は、エクスポートされるトップレベルオブジェクトのオブジェクト ID の配列です。現在のエクスポート GUI で NavigatorSearchDialog を使用してこれらのオブジェクトを選択します。選択が終了すると、このダイアログは、オブジェクト ID としてナビゲータ ID、ジェネレータ ID、およびシードオブジェクトを持つ IXBSelectedNavInfo のリストを返します。オブジェクト obj が指定されると、IXBHelper.service.getObjectId(obj) を使用してオブジェクト ID を取得できます。
• filterIds - 前述の定義を参照してください。
• filterParams は、フィルタのタイプに基づいて、エクスポート処理から除外またはエクスポート処理に含めるオブジェクトを設定するオブジェクト属性の配列です。
• ruleFile は、エクスポート処理の規則ファイルです。このファイルは Exporter に提供されてエクスポート処理のチューナーを作成します。
• guiId は、エクスポート処理を呼び出す GUI の ID です。GUIid の作成方法の例については、wt.clients.ixb.util.ExpImpServerRequest クラスの recordGuiIdInContext() メソッドを参照してください。
• detailLog は、ステータスメッセージの詳細が必要かどうかを示します。
• stDtd は、使用するエクスポート/インポートハンドラのバージョンを指定します。これは、下位互換性をサポートするために使用します。stDtd が Null または空 ("") の場合は、現在の Windchill に基づいて STRING_DTD が計算されます。
• IXBHelper.service.doExport(…) メソッドが呼び出されると、StandardIXBService のメソッド doExportImpl(…) が呼び出されます。
メソッドの説明:
◦ 一般的なエクスポートハンドラである ExportHandler ハンドラを作成します。これは StandardIXBService の内部クラスです。
◦ 以下を呼び出して、エクスポートされるオブジェクトのリストを取得します。
ObjectSetHelper.computeObjectSetForGivenGeneratorsAndFilters (
generatorIds,
generatorParams,
filterIds,
filterParams);
◦ エクスポートを実行するクラス Exporter のインスタンスを作成します。
◦ Exporter は、isPreview (true/false) に応じて、このドキュメントの Exporter クラスのセクションで説明した Exporter クラスのメソッドを呼び出して、プレビューまたは実際のエクスポートを実行します。
◦ ExportHandler ハンドラのクリーンアップメソッドを呼び出します。
インポートアプリケーション
現在の Windchill インポート GUI および StandardIXBService は、インポートアプリケーションです。現在の Windchill インポート OOTB GUI は、IXBHelper を通じて StandardIXBService (インポートアプリケーションサーバー) のインポート処理を呼び出すインポートアプリケーションクライアントです。
ObjectImportParameters importParam = new ObjectImportParameters ();
importParam.setActionName(actorName);
importParam.setContainer(container);
importParam.setDataFile(dataF);
importParam.setDetailedLog(detailedLog);
importParam.setGuiId(reqGUIid);
importParam.setPolicyFile(policyFile);
importParam.setPreviewOnly(isPreview);
importParam.setRuleFile(ruleF);
importParam.setValidation(true);
importParam.setLocale(RB.getLocale());
importParam.setOverrideConflicts(overrideC);
importParam.setContainerMappingFile(containerMappingFile);
importParam.getContextData().setIXApplicationContext(appContext);
IXBExpImpStatus status = IXBHelper.service.doImport (importParam );
StandardIXBService クラスのメソッド doImport(…) を呼び出してインポート処理を実行します。
IXBExpImpStatus は、エクスポート/インポート処理に関する情報を含む wt.ixb.clientsAccess のクラスであり、サーバーとクライアント間でエクスポート/インポートのステータスを渡すために使用されます。
ruleFile は、エクスポート処理の規則ファイルです。このファイルは Importer に提供されてインポート処理のチューナーを作成します。
dataFile は、インポートされるオブジェクトの XML ファイルが含まれている jar ファイルです。
overrideConflicts は、オーバーライド可能なコンフリクトをオーバーライドする必要があるかどうかを指定します。
isPreview は、実際のインポートを実行するか、コンフリクトをチェックしてインポートされるオブジェクトを表示するかを指定します。
guiId は、エクスポート処理を呼び出す GUI の ID です。GUIid の作成方法の例については、wt.clients.ixb.util.ExpImpServerRequest クラスの recordGuiIdInContext() メソッドを参照してください。
detailLog は、ステータスメッセージの詳細が必要かどうかを示します。
creatorName は、インポートされたトップレベルオブジェクト (例: EPMDocument、WTDocument、WTPart) の作成方法を指定します。
stDtd は、使用するエクスポート/インポートハンドラのバージョンを指定します。これは、下位互換性をサポートするために使用します。stDtd が Null または空 ("") の場合は、現在の Windchill システムのバージョンに基づいて STRING_DTD が計算されます。
IXBHelper.service.doImport(…) メソッドが呼び出されると、StandardIXBService のメソッド doImportImpl(…) が呼び出されます。
メソッドの説明:
• インポートハンドラによって使用される作成者の名前を WTContext に追加します。
• 一般的なインポートハンドラである ImportHandler ハンドラを作成します。
• jar.getFileNamesByExtension ("xml") を呼び出して、Jar ファイルからインポートされる XML ファイルのリストを取得します。
• インポートを実行するクラス Importer のインスタンスを作成します。
• メソッド doImportImpl(…) は、isPreview (true/false) に応じて、Importer の適切なメソッドを呼び出してプレビューまたは実際のインポートを実行します。
◦ importer.doImport(stream);
◦ importer.doPreview(stream);
• その他 (importer.doImport(fn, tag) と importer.doPreview(fn,tag)) は最適化用であり、これらは XML ファイルの命名方法に依存します。これは特定のエクスポート/インポートアプリケーション (wt.clients.ixb と StandardIXBService) のための機能です。
• クライアントにログメッセージを送信して戻します。
簡単なエクスポートハンドラのサンプルコード
import java.io.File;
import java.io.PrintStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;
import wt.pom.Transaction;
import wt.content.ApplicationData;
import wt.content.ContentItem;
import wt.content.Streamed;
import wt.ixb.publicforapps.ApplicationExportHandlerTemplate;
import wt.ixb.publicforhandlers.IxbElement;
import wt.ixb.publicforapps.Exporter;
import wt.ixb.publicforapps.IxbHelper;
import wt.ixb.objectset.ObjectSetHelper;
import wt.util.WTException;
import wt.util.WTMessage;
import wt.ixb.clientAccess.IXBJarWriter;
import wt.fc.Persistable;
public class SimpleApplicationExportHandler extends ApplicationExportHand
lerTemplate{
private File targetDir = null;
private PrintStream log = null;
private IXBJarWriter jw = null;
private File resJar = null;
private int fileNum = 0; //counter for exported content files
private HashSet contentFileNames = new HashSet(); //to handle
content files with the same name
public static final String NAME_IS_TAG = "TAG";
public final static String CONTENT_SUBDIR = "CONTENTS";
public SimpleApplicationExportHandler(File tmp_storeDir, PrintStream a_log)
throws WTException{
if (!tmp_storeDir.exists()){
tmp_storeDir.mkdirs();
}
targetDir = tmp_storeDir;
log = a_log;
}
public String storeContent (Object ob) throws WTException
{
String storeName = null;
if(ob instanceof ApplicationData)
{
ApplicationData obj = (ApplicationData)ob;
String fileName = obj.getFileName();
try
{
storeName = this.computeUniqueFileName(fileName);
Streamed sd = (Streamed)obj.getStreamData().getObject();
InputStream is = sd.retrieveStream();
jw.addEntry(is, storeName);
}
catch (IOException ioe)
{
throw new WTException(ioe);
}
}
return storeName;
}
public String storeDocument(IxbElement elem, String dtd)
throws WTException
{
try {
String tag = elem.getTag();
String fn = NAME_IS_TAG+"-"+tag+"-"+(fileNum++)+".xml";
File file = new File(targetDir,fn);
FileOutputStream stream
= new FileOutputStream (file);
elem.store(stream, dtd); stream.close();
jw.addEntry(file);
file.delete();
}
catch (IOException ioe){
throw new WTException(ioe);
}
}
public void storeLogMessage(String resourceBundle,
String messageKey,
Object[] textInserts)
throws WTException{
WTMessage m = new WTMessage(resourceBundle, messageKey, textInserts);
String s = m.getLocalizedMessage();
log.println(s);
}
public void storeLogMessage(String resourceBundle, String messageKey,
Object[] textInserts, int importanceLevel)
throws WTException{
storeLogMessage (resourceBundle, messageKey, textInserts);
}
public void exportObjectContent (Object obj, Exporter exporter, Content
Item item, String exportFileName)
throws WTException {
if (item instanceof ApplicationData) {
ApplicationData ad = (ApplicationData) item;
Streamed streamedIntfc = (Streamed) ad.getStreamData().getObject();
try{
InputStream is = streamedIntfc.retrieveStream();
jw.addEntry(is, exportFileName);
}
catch (IOException ioe){
throw new WTException(ioe);
}
}
}
private String computeUniqueFileName (String fn) throws IOException {
//compute file name in jar (should be unique)
if (contentFileNames.contains(fn)) {
// if simple content's name already has been used then look for
// name in form name-123.ext
// As a result will have names like: design.doc, design-23.doc,
design-57.doc, ...
int i = fn.lastIndexOf('.');
String fn_n = ( i>0 ? fn.substring(0, i) : fn);
String fn_t = ( i>0 ? fn.substring(i+1) : "" );
while (true) {
fn = (i>0 ?
fn_n + '-' + (fileNum++) + '.' + fn_t :
fn_n + '-' + (fileNum++)
);
if (!contentFileNames.contains(fn)) break;
}
}
contentFileNames.add(fn);
String fnInJar = CONTENT_SUBDIR + "/" + fn;
return fnInJar;
}
public File doExport( WTContainerRef container,
String[] generatorIds,
String[] generatorParams,
String[] filterIds,
String[] filterParams,
File ruleFile,
File policyFile,
String actionName,
String stDtd,
File resultingJar)
throws WTException{
//init jar file
resJar = resultingJar;
try{
jw = new IXBJarWriter(resultingJar);
}
catch (IOException ioe){
throw new WTException(ioe);
}
//adopt incoming rule file
IxbElement clientSettingsElement = null;
if (ruleFile!=null) {
try{
InputStream clientSettingsStream = new FileInputStream(ruleFile);
clientSettingsElement = IxbHelper.newIxbDocument
(clientSettingsStream,
false);
}
catch(IOException ioe){
throw new WTException(ioe);
}
}
//create exporter
Exporter exporter = null;
if ( policyFile==null ) { // policy rule is null; export action is
expected ...
exporter = IxbHelper.newExporter (this, IxbHelper.STANDARD_DTD,
clientSettingsElement, null, actionName );
}
else{
exporter = IxbHelper.newExporter (this, IxbHelper.STANDARD_DTD,
clientSettingsElement, policyFile, null );
}
//gen set of items to export
Set res = ObjectSetHelper.computeObjectSetForGivenGeneratorsAndFil
ters (generatorIds, generatorParams, filterIds, filterParams);
Iterator iter = res.iterator();
Transaction trx = new Transaction();
try {
if ( !(actionName != null && actionName.equals(wt.ixb.tuner.Exp
ortActionHelper.NO_ACTION_CMD) )){
trx.start();
}
while (iter.hasNext()) {
Persistable ob = (Persistable)iter.next();
exporter.doExport(ob);
}
exporter.finalizeExport();
if ( !(actionName != null && actionName.equals(wt.ixb.tuner.Exp
ortActionHelper.NO_ACTION_CMD) )){
trx.commit();
}
trx = null;
}
finally {
if (trx != null) {
if ( !(actionName != null && actionName.equals(wt.ixb.tuner.
ExportActionHelper.NO_ACTION_CMD) )){
trx.rollback();
}
trx = null;
}
}
try{
jw.finalizeJar();
}
catch(IOException ioe){
throw new WTException (ioe);
}
return resJar;
}
}
簡単なインポートハンドラのサンプルコード
import java.io.File;
import java.io.PrintStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;
import wt.pom.Transaction;
import wt.content.ApplicationData;
import wt.content.ContentItem;
import wt.content.Streamed;
import wt.ixb.publicforapps.ApplicationImportHandlerTemplate;
import wt.ixb.publicforhandlers.IxbElement;
import wt.ixb.publicforhandlers.IxbHndHelper;
import wt.ixb.publicforapps.IxbDocument;
import wt.ixb.publicforapps.Importer;
import wt.ixb.publicforapps.IxbHelper;
import wt.ixb.objectset.ObjectSetHelper;
import wt.ixb.actor.actions.IxbActionsHelper;
import wt.util.WTException;
import wt.util.WTMessage;
import wt.ixb.clientAccess.IXBJarReader;
import wt.fc.Persistable;
import javax.xml.transform.stream.StreamSource;
public class SimpleApplicationImportHandler
extends ApplicationImportHandlerTemplate{
private IXBJarReader jr = null;
private PrintStream log = null;
public SimpleApplicationImportHandler(PrintStream a_log){
log = a_log;
}
public InputStream getContentAsInputStream (String contentId)
throws WTException {
try{
return jr.getStreamByName (contentId);
}
catch(IOException ioe){
throw new WTException(ioe);
}
}
public void storeLogMessage(String resourceBundle,
String messageKey, Object[] textInserts)
throws WTException{
WTMessage m = new WTMessage(resourceBundle, messageKey, textInserts);
log.println(m.getLocalizedMessage());
}
public void doImport(WTContainerRef container,
File ruleFile,
File dataFile,
boolean _overrideConflicts,
String actorName,
File policyFile,
File containerMappingFile)
throws WTException{
try{
jr = new IXBJarReader(dataFile);
}
catch(IOException ioe){
throw new WTException (ioe);
}
//prepare rule file
String ruleFileName = (ruleFile!=null)? ruleFile.getAbsolutePath(): null;
//prepare container mapping file
String containerMappingFileName = (containerMappingFile!=null)?containerMappingFile.getAbsolutePath(): null;
//prepare policy file
String policyFileName = (policyFile!=null)?policyFile.getAbsolutePath(): null;
StreamSource xslPolicyFile = null;
if (policyFile!=null) {
xslPolicyFile = new StreamSource(policyFile.getAbsolutePath());
}
Boolean overrideConflicts = new Boolean (_overrideConflicts);
Importer importer = IxbHelper.newImporter(this,
container,
IxbHelper.STANDARD_DTD,
ruleFileName,
policyFileName,
containerMappingFileName,
actorName,
overrideConflicts,
null /*validate*/);
String [] fns = jr.getNonContentFileNamesByExtension ("xml");
boolean validate = IxbHndHelper.getIxbProperty("import.parser.validate",
false);
for (int i=0; i<fns.length; i++) {
String fn = fns[i];
InputStream stream = null;
try{
stream = jr.getStreamByName (fns[i]);
}
catch (IOException ioe){
throw new WTException (ioe);
}
IxbDocument doc = IxbHelper.newIxbDocument(stream, validate);
//if policyFile == null, apply actorName to XML Document before pass
it to importer
if (policyFile == null){
IxbElement rootElem = doc.getRootElement();
//XML_ACTION_KEY = "actionInfo/action"
IxbElement actionElement =
doc.getElement(IxbActionsHelper.XML_ACTION_KEY);
if (actionElement == null){
rootElem.addValue(IxbActionsHelper.XML_ACTION_KEY,
actorName);
}
else {
rootElem.removeChildElement( actionElement);
rootElem.addValue(IxbActionsHelper.XML_ACTION_KEY,
actorName);
}
}
else { //apply policy file
doc =
IxbActionsHelper.writeActionAndParametersToFileXML(doc,xslPolicyFile);
}
//set elem ready for import
importer.doImport(doc);
}
//perform actual import
importer.finalizeImport();
}
}