Oracle® Fusion Middleware Oracle Enterprise Repository統合ガイド 11g リリース1 (11.1.1.7) B72433-02 |
|
前 |
次 |
この章では、リポジトリ拡張性フレームワーク(REX)アーキテクチャについて説明し、OpenAPIを有効にしてWSDLを使用する方法について解説します。
この章では、次の項目について説明します。
REXは、プログラムでOracle Enterprise Repositoryに統合するWebサービスAPIです。これは、業界で認められた標準に基づいており、相互運用性とプラットフォームの独立性に重点を置いて設計されています。REXでは、Web Services Description Language (WSDL v1.1)で記述された、リモート・プロシージャ・コール(RPC)Webサービスを使用します。これにより、クライアントで、任意のプラットフォームやWebサービスをサポートする任意の実装言語を使用して、Oracle Enterprise Repositoryと相互に動作できます。たとえば、Oracle Enterprise RepositoryはJ2EEアプリケーションですが、REXを使用して.NETクライアントとプログラムで相互に動作できます。
注意: flashlineおよびregistryというインスタンスが、特にJavaパッケージ構造およびREXクラス名としてこのドキュメントで使用されています。 |
Oracle Enterprise RepositoryがSiteminderで保護されるように構成されているか、今後構成される場合、次のURLを無視するか、または保護しないようにポリシー・サーバーを構成して、OpenAPI統合が正しく機能できるようにする必要があります。
http://appserver.example.com/oer/services/
注意: このドキュメントで使用している例は説明用であり、Oracle Enterprise Repository WSDLのバージョン間のパッケージ構造の違いのためにコンパイルされません。使用しているバージョンのOracle Enterprise Repositoryに合うように、パッケージ構造を変更する必要があります。 |
REXの詳細は、Oracle Fusion Middleware Oracle Enterprise Repository拡張性フレームワーク(REX)のREX Javadocを参照してください。
図13-1に、REXのアーキテクチャを示します。
Oracle Enterprise RepositoryおよびREXの高度なアーキテクチャは、次の高度な目標を考慮して設計されています。
柔軟性
SOAP、WSDLおよびHTTPなどの業界で認められた標準に準拠しているクライアント・プラットフォームは、REXインタフェースを介してOracle Enterprise Repositoryと相互に動作できます。一般的なクライアント・プラットフォームとAPIが適切に連携することが検証されています。
拡張性
新機能がOracle Enterprise Repositoryに追加された際に、その機能にアクセスするためのサブシステムの追加プロセスが、Oracle Enterprise Repositoryの階層化アーキテクチャにより単純化されます。詳細は、13.2.4項「Oracle Enterprise Repository REXのバージョンの考慮事項」を参照してください。
簡潔性
エンドユーザーは、REXで使用可能な拡張機能を簡単に利用できます。
この項の内容は次のとおりです。
Oracle Enterprise RepositoryのREXを使用すると、様々なサブシステムにアクセスできます。これらのサブシステムは、システムの機能を論理的なカテゴリ(動作するエンティティのタイプとほぼ同様)に大まかにグループ化しています。このドキュメントの大部分は、これらのサブシステムに基づいた項で構成されています。
REXメソッドは、様々なサブシステムに基づいたスキームを使用して、名前が付けられています。このプロセスで使用されるアルゴリズムの詳細は、13.2.2項「CRUD-Qネーミング規則」を参照してください。REXで定義されているサブシステムは、次のとおりです。
許容値
アセット
アセット・タイプ
認証トークン
カテゴリ分け
カテゴリ分けタイプ
部門
抽出
インポート/エクスポート
プロジェクト
リレーションシップ
ロール
ユーザー
ベンダー
オープンAPIメソッドのネーミングで使用されているスキームは、CRUD-Qニーモニックに基づいています。CRUD-Qは、次の5つの操作を表しています。
C: 作成(Create)
R: 読取り(Read)
U: 更新(Update)
D: 削除(Delete)
Q: 問合せ(Query)
各メソッドは、次の例のように、そのメソッドが属するサブシステムの名前で始まり、次にそのサブシステム内で実行される操作の説明が続きます。
<サブシステム><操作>
たとえば、アセット・サブシステムで作成の操作を実行するメソッド名は、次のようになります。
assetCreate(...)
このネーミング規則を使用すると、次のような名前も考えられます。
assetRead(...) assetUpdate(...) assetDelete(...) assetQuery(...)
サブシステムにはCRUD-Qセット以外の操作が含まれていることがあります。また、CRUD-Qの操作をすべて含んでいるわけではありません。たとえば、ユーザーを削除できないので、userDeleteメソッドはありませんが、userDeactivateメソッドはあります。表13-1に、サブシステムがCRUD-Q操作以外に含めることのできる操作の詳細なリストを示します。
作成 | 読取り | 更新 | 削除 | 問合せ | その他の機能 | |
---|---|---|---|---|---|---|
許容値リスト |
はい |
はい |
はい |
はい |
はい |
許可、アクティブ化、割当て、非アクティブ化、登録、リタイア、発行、未許可、割当て解除、登録解除、未発行、カスタム・アクセス設定の変更 |
アセット |
はい |
はい |
はい |
はい |
はい |
|
アセット・タイプ |
はい |
はい |
はい |
はい |
はい |
|
カテゴリ分けタイプ |
はい |
はい |
はい |
はい |
はい |
|
部門 |
はい |
はい |
はい |
いいえ |
はい |
|
抽出 |
はい |
はい |
はい |
いいえ |
はい |
|
プロジェクト |
はい |
はい |
はい |
はい |
はい |
閉じる、開く、再割当て、抽出、ユーザーの削除 |
リレーションシップ |
はい |
はい |
はい |
いいえ |
はい |
|
ロール |
はい |
はい |
はい |
はい |
はい |
|
ユーザー |
はい |
はい |
はい |
いいえ |
はい |
アクティブ化、非アクティブ化、ロックアウト、未承認 |
ベンダー |
はい |
はい |
はい |
はい |
はい |
|
連絡先 |
はい |
はい |
はい |
はい |
はい |
特に断りがなければ、REXの呼出しはすべて原子的です。すなわち、すべての呼出しは、完全に成功するか、完全に失敗するかのいずれかです。
たとえば、あるバージョンのcategorizationUpdate
メソッドは、引数としてカテゴリ分けの更新の配列を取ります。この場合、カテゴリ分けの更新が1回失敗すると、カテゴリ分けの更新はすべて失敗します。
REXでは、次の基本的なWSDLデータ型およびWSDLで定義された複合の型が使用されています。
次の型の配列が返されます。
xsd:int
xsd:long
xsd:string
xsd:boolean
xsd:dateTime
次のURLのIDEまたはWebサービス・ツールキットを指して、REX WSDLを使用することにより、APIスタブを動的に生成できます。
http://appserver/oer/services/FlashlineRegistry?WSDL
OERとのカスタム統合をOracle BPM 11gから作成する場合は、かわりに次のURLを使用します。
http://appserver/oer/services/RexAPI?wsdl
Oracle Enterprise Repository REX WSDLのJavaスタブは、AXIS WSDL2javaユーティリティを使用して作成できます。
java -cp .;axis.jar; xerces.jar; commons-discovery.jar; commons-logging.jar; jaxen-full.jar; jaxrpc.jar; saaj.jar;wsdl4j.jar; xalan.jar org.apache.axis.wsdl.WSDL2Java
この変換プロセスの完了に必要なJARファイルは、次のとおりです。
axis.jar
xerces.jar
commons-discovery.jar
commons-logging.jar
jaxen-full.jar
jaxrpc.jar
saaj.jar
wsdl4j.jar
xalan.jar
注意: URL内のappserverは、Oracle Enterprise Repositoryがインストールされているサーバーの名前で置き換えてください。 |
Oracle Enterprise Repository REXはOracle Enterprise Repositoryと同様に発展します。このプロセスの結果として、REXの新旧バージョン間で非互換が起こることがあります。すべてのバージョン間の互換性の実現を目標としていますが、下位互換性が実現されるかどうかは予測できない場合もあります。したがって、制限が避けられない可能性があります。Oracle Enterprise Repository REXには、次の下位互換性拡張が含まれます。
Oracle Enterprise Repository Weサービスへの新しいメソッドの追加
WSDLでの新しい複合型の定義
これらの下位互換性への変更に関して、新機能を利用する必要がある場合にかぎり、クライアント・プロキシの再生成が必要になります。
非互換の変更を回避できない場合にかぎり、サービスのネームスペースが変更されます。このような変更の例には、既存の複合型の変更や、サービスのメソッドの署名における変更があります。この場合、最低限のコード変更があるので、クライアント・プロキシの再生成が必要です。以前のバージョンのREXから生成されたクライアント・プロキシでは、新しいサービスに接続できません。
複合型のネームスペースは変更されません。
この項では、オープンAPIの有効化およびWSDLの使用の開始方法などのREXの基本的な概念について説明します。この項の内容は次のとおりです。
この手順は、Oracle Enterprise Repositoryの「管理」画面で実行します。
「システム設定」をクリックします。
新しいシステム設定の有効化テキスト・ボックスにプロパティcmee.extframework.enabledを入力します。
「有効化」をクリックします。オープンAPIセクションが表示されます。
cmee.extframework.enabledプロパティにTrue
が設定されていることを確認します。
「保存」をクリックします。これで、REXがOracle Enterprise Repositoryインスタンス内で有効になっています。
REXを使用するための最初の手順は、Oracle Enterprise Repositoryサーバーとの通信に必要なクライアント側スタブの生成です。これは、通常、特定のWebサービス・ツールキットで提供されている自動ツールを使用して実行されます。この項では、様々な統合開発環境およびツールキットを使用して、クライアント・スタブを生成する方法について説明します。
この項の内容は次のとおりです。
Visual Studio .NET
ソリューション・エクスプローラで「Web References」ノードを右クリックし、図13-2に示すように、「Add Web Reference」を選択します。「Add Web Reference」ダイアログが表示されます。
図13-3に示すように、Web参照名を指定します。
適切なURLを指定してアプリケーション・サーバー(実行中の場合)から、あるいは、Eclipseプロジェクトのローカルの静的ファイルから、Oracle Enterprise Repository WSDLファイルを直接ロードできます。URLを使用する場合、このファイルは次の場所にあります(yourserverとappnameを適切な値に置き換えてください)。
http://yourserver:port/appname/services/FlashlineRegistry?wsdl
サービスのエンドポイントに接続します。Web参照を作成後、クライアント・サービス・プロキシのインスタンスを設定して、これを使用します。
flashline.FlashlineRegistryService registry = new flashline.FlashlineRegistryService();
(Web参照の設定に使用したWSDLファイルに含まれている)サービスのデフォルトURLがWebサービスの実際のアドレスではない場合、エンドポイント・アドレスを次のように変更できます。
registry.Url = "http://appserver/oer/services/FlashlineRegistry";
これで、アプリケーションがREXを介してOracle Enterprise Repositoryと相互に動作できるようになりました。
Eclipse - Lombozプラグイン
LombozプラグインはEclipseと連携しますが、WebサービスをサポートするEclipseプラグインが動作する必要があります。ほとんどのツールまたはプラグインは、通常、次の項目について要求されます。
WSDLファイルの場所
生成したコードが使用できるプロジェクトのソース・ディレクトリ
コンパイルするWSDLファイルのバージョン
適切なURLを指定してアプリケーション・サーバー(実行中の場合)から、あるいは、Eclipseプロジェクトのローカルの静的ファイルから、Oracle Enterprise Repository WSDLファイルを直接ロードできます。WSDL URLは、次の場所にあります(www.example.comとappnameを適切な値に置き換えてください)。
http://www.example.com/appname/services/FlashlineRegistry?wsdl
生成したクライアント・プロキシ・クラスのターゲットとして、プロジェクトのビルド・パスのソース・ディレクトリを選択します。
Oracle Enterprise Repository WSDLは、WSDL標準のバージョン1.1に準拠しています。
REXを使用するための最初の手順は、サーバーでの認証です。authTokenCreateメソッドを使用して認証が実行されます。このメソッドは、Oracle Enterprise Repositoryでの認証で使用する際に、ユーザーIDとパスワードを引数として取ります。IDとパスワードの認証が成功すると、認証トークンが返されます。このトークンは、後続のすべてのREXの呼出しで使用する必要があります。
有効なAuthTokenがすべてのREXメソッドに含まれていない場合、OpenAPIExceptionがスローされます。これは、authTokenCreateおよびauthTokenDelete以外のすべてのメソッドに適用されます。
次の例は、AuthTokenを取得してこれを後続のREX呼出しで使用する方法を示しています。
例13-1 AuthTokenを取得してREX呼出しで使用する方法
package com.example.flashlineclient; //The imports below are assumed for any of the included examples import javax.xml.rpc.ServiceException; import java.net.MalformedURLException; import java.net.URL; import java.rmi.RemoteException; import com.flashline.registry.openapi.service.v300.FlashlineRegistry; import com.flashline.registry.openapi.service.v300.FlashlineRegistryServiceLocator; import com.flashline.registry.openapi.base.OpenAPIException; import com.flashline.registry.openapi.entity.AuthToken; import com.flashline.registry.openapi.entity.Asset; public class FlexTest { public FlexTest () { } public static void main(String[] pArgs)throws OpenAPIException, RemoteException, ServiceException { try { FlashlineRegistry lRegistry = null; AuthToken lAuthToken = null; URL lURL = null; lURL = new URL("http://www.example.com/appname/services/FlashlineRegistry"); //"www.example.com" should be your server address //"appname" is the application name of the location that the Registry is running on //These two things must be changed to the proper values in every example lRegistry = new FlashlineRegistryServiceLocator().getFlashlineRegistry(lURL); lAuthToken = lRegistry.authTokenCreate("username", "password"); System.out.println(lAuthToken.getToken()); //displaying the authtoken as a string to the screen Asset lAsset = lRegistry.assetRead(lAuthToken, 559); //reading asset number 559 System.out.println(lAsset.getName()); //displaying the name of asset 559 to the screen } catch(OpenAPIException lEx) { System.out.println("ServerCode = "+ lEx.getServerErrorCode()); System.out.println("Message = "+ lEx.getMessage()); System.out.println("StackTrace:"); lEx.printStackTrace(); } catch (RemoteException lEx) { lEx.printStackTrace(); } catch (ServiceException lEx) { lEx.printStackTrace(); } catch (MalformedURLException lEx) { lEx.printStackTrace(); } System.out.println("execution completed"); System.exit(0); } }
認可
REXでは、Oracle Enterprise Repositoryアプリケーションと同じ認可ルールが実行されます。認可に使用するユーザーIDとパスワードでは、REXでユーザーに使用できる権限が判定されます。たとえば、プロジェクトに割り当てられた編集権限を持たない認証済のユーザーがprojectCreate REXメソッドを使用してプロジェクトを作成しようとした場合、OpenAPIExceptionがスローされます。
オープンAPIはSOAPフォルトでサーバー・エラーをクライアントに通知します。SOAPフォルトが処理される方法は、使用している言語とSOAPツールキットによって異なります。
この項では、一般的なプラットフォームとツールキットの組合せを使用して、クライアント・コード内でオープンAPIが生成した例外を検出して処理する方法を示します。
JavaとAXIS
オープンAPIがスローした例外は、SOAPフォルトとして転送されてから、AXISクライアント・ツールキットでJava例外としてデシリアライズされます。つまり、AXISは、SOAPフォルトを対応するクライアント側OpenAPIExceptionクラスにマップしようとします。サーバー側エラーは、com.flashline.registry.openapi.OpenAPIException
インスタンスとしてクライアントに示されます。したがって、クライアント・コードは、前述のコードから、次に示したコードで例外を取得できます。
try { lAsset = lRegistry.assetCreate(..); } catch(OpenAPIException lEx) { System.out.println("ServerCode = "+ lEx.getServerErrorCode()); System.out.println("Message = "+ lEx.getMessage()); System.out.println("StackTrace:"); lEx.printStackTrace(); } catch (RemoteException lEx) { lEx.printStackTrace(); } catch (ServiceException lEx) { lEx.printStackTrace(); } catch (MalformedURLException lEx) { lEx.printStackTrace(); }
.NET
.NETで使用済のWebサービスを使用することは、若干複雑です。すべてのサービス例外は、タイプSystem.Web.Services.Protocols.SoapException
の例外としてクライアント側で取得されます。このため、オープンAPIでスローされたOpenAPIException
で使用可能な拡張情報の取得は若干注意が必要です。.NET SoapExceptionプロパティは、SOAPフォルト・メッセージを示します。ただし、OpenAPIExceptionで提供された追加フィールド(標準SOAPフォルトに明示的にマップされているもの以外)は、.NET SoapExceptionのXML詳細プロパティを手動で解析して取得する必要があります。たとえば、次のようなコードは、サーバー側のエラー・コードとOpenAPIExceptionで返されたスタック・トレースを表示するために使用できます。
try { registry.testException(); } catch(SoapException exc) { XmlNode lNode = null; lNode = exc.Detail.SelectSingleNode("*/serverErrorCode"); if(lNode != null) Console.Out.WriteLine("Error Code: "+lNode.InnerText); lNode = exc.Detail.SelectSingleNode("*/serverStackTrace"); if(lNode != null) Console.Out.WriteLine("Server Stack Trace: \n"+lNode.InnerText); }
返されたSOAPフォルトがserverErrorCodeという名前の2つ以上のXML要素を含まないようにするために、*/serverErrorCodeよりも明示的なXPath式を使用することをお薦めします。
次のSOAPレスポンスは、SOAPフォルト・メッセージとして表されたOpenAPIException
を示します。
例13-2 SOAPフォルト・メッセージとして表されたOpenAPIException
<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <soapenv:Fault> <faultcode>soapenv:Server.userException</faultcode> <faultstring>Error [100], Severity [SEVERE]:An unkown server-side error occured. Please record stack trace (if available) and contact technical support.</faultstring> <detail> <com.flashline.cmee.openapi.OpenAPIException xsi:type="ns1:OpenAPIException" xmlns:ns1="http://base.openapi.registry.flashline.com"> <message xsi:type="xsd:string">Error [100], Severity [SEVERE]:An unkown server-side error occured. Please record stack trace (if available) and contact technical support.</message> <serverErrorCode xsi:type="xsd:int">100</serverErrorCode> <serverStackTrace xsi:type="xsd:string">java.lang.NullPointerException
 at java.util.HashMap.<init>(HashMap.java:214)
 ... at java.lang.Thread.run(Thread.java:534)
 </serverStackTrace> <severity xsi:type="xsd:string">SEVERE</severity> </com.flashline.cmee.openapi.OpenAPIException> </detail> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>
検証
エンティティをOracle Enterprise Repositoryに保存しようとする際に、入力内容の検証が試行されます。欠落しているデータや無効なデータがあると、サーバーは、フィールドのリストとそれぞれのエラーが含まれるOpenAPIExceptionをスローします。
詳細は、「例外処理」を参照してください。
基準オブジェクトは、現在、用語とグループ化のさらに柔軟性の高い表現に移行しています。このオブジェクトが発生すると、これらの変更は、基準オブジェクトを使用して問合せを実行する場合に、特定のAPI機能を使用できるかどうかに影響します。サブシステムでは、対応する基準オブジェクトのみ直接評価されます。このドキュメントで説明しないかぎり、基礎となるSearchTermGroupの拡張機能は使用されません。
バイナリ・データの送信(添付ファイル)
様々なREXメソッドでは、クライアントとサーバー間で大量のバイナリ・データの送受信を必要とする場合があります。たとえば、インポート/エクスポート・サブシステムでは、インポート元からペイロードを送信するメソッドやエクスポート済アセットを表すペイロードを受信するメソッドが提供されています。
通常、バイナリ・データは、WebサービスのRPC起動によって、Dynamic Internet Message Exchange(DIME)、SOAP with Attachments (SwA)またはBase-64エンコーディングを介して、転送されます。それぞれに長所と短所がありますが、3つすべてを直接サポートしているクライアントは少数です。
Oracle Enterprise RepositoryのオープンAPIは、バイナリ・データの転送に3つのメカニズムすべてをサポートしています。詳細は、次の項を参照してください。バイナリ・データの転送に提供されているメソッドには3つのバージョンがあり、それぞれが異なる転送メカニズムをサポートしています。たとえば、エクスポート結果を取得するには、ユーザーは次のメソッドのいずれかを選択できます。
importGetResultsB64
base-64エンコーディング形式でエクスポート結果を取得します。これは、あまり一般的ではありませんが、クライアントがbase-64データをエンコードまたはデコードできる場合は、どのプラットフォームでも使用できます。
importGetResultsDIME
DIMEプロトコルを使用して、エクスポート結果を添付ファイルとして取得します。これは、ほとんどの.NETクライアントに優先される選択肢です。
importGetResultsSwA
SOAP with Attachments (SwA)プロトコルを使用して、エクスポート結果を添付ファイルとして取得します(MIMEベース)。
.NETとMicrosoft Web Services Enhancement(WSE)キットでのDIME添付ファイルの使用
Microsoftでは、標準の.Net Webサービス・ツールキットの拡張を提供しています。Microsoft Web Services Enhancement(WSE)キットでは、Dynamic Internet Messaging Exchange(DIME)プロトコルを使用して、Webサービスを介した添付ファイルの送受信などの拡張機能を提供しています。
次のコード・スニペットは、DIME添付ファイルによるデータ送信の例を示しています。
例13-3 DIME添付ファイルによるデータ送信の例
// relax the requirement for the server to understand ALL headers. This MUST be // done, or the call with the attachment fails. After the call, if you wish, // you can set this back to "true" registry.RequestSoapContext.Path.EncodedMustUnderstand= "false"; // clear the attachments queue registry.RequestSoapContext.Attachments.Clear(); registry.RequestSoapContext.Attachments.Add( new Microsoft.Web.Services.Dime.DimeAttachment("0", "application/zip", Microsoft.Web.Services.Dime.TypeFormatEnum.MediaType, "c:\\tmp\\import.zip")); // start an import running on the server registry.importExecute(lAuthToken, "flashline", null, "FEA Flashpack Import", null); // do some polling (calls to importStatus) to monitor the import progress, // if you wish
次のコード・スニペットは、DIME添付ファイルによるデータ受信の例を示しています。
例13-4 DIME添付ファイルによるデータ受信の例
// relax the requirement for the server to understand ALL headers. This MUST be // done, or the call with the attachment fails. After the call, if you wish, // you can set this back to "true" registry.RequestSoapContext.Path.EncodedMustUnderstand= "false"; // clear the attachments queue registry.RequestSoapContext.Attachments.Clear(); // start an export flashline.ImpExpJob lJob = registry.exportExecute(lAuthToken, "flashline", null, "Complete Export", "flashline", "<entitytypes> <entitytype type=\"acceptableValueList\"> <entities> <entity id=\"100\"/> </entities> </entitytype> </entitytypes>"); // do some polling (calls to exportStatus) to watch the progress of the // export, if you wish... // this call blocks until either the method returns (or an exception is thrown), // or the call times out. registry.exportGetResultsDIME(lAuthToken, lJob); // check to see if the call resulted in attachments being returned... if(registry.ResponseSoapContext.Attachments.Count > 0) { Stream lStream = registry.ResponseSoapContext.Attachments[0].Stream; // write the data out somewhere... }
添付ファイルとJava AXISクライアントでのSOAPの使用
Axisクライアントでは、SOAP添付ファイルをJavaで処理する機能が提供されています。詳細は、http://www-106.ibm.com/developerworks/webservices/library/ws-soapatt/
を参照してください。
次のコード・スニペットは、データ受信の例を示しています。
byte[] lResults = null; ImpExpJob lExportJob = mFlashlineRegistrySrc.exportExecute(mAuthTokenSrc,"flashline",null, "Export Assets","default", createAssetQuery().toString()); lExportJob = mFlashlineRegistrySrc.exportStatus(mAuthTokenSrc, lExportJob); lResults = mFlashlineRegistrySrc.exportGetResultsB64(mAuthTokenSrc, lExportJob); // write the results out to disk in a temp file File lFile = null; String lTempDirectory = System.getProperty("java.io.tmpdir"); lFile = new File(lTempDirectory + File.separator + "impexp.zip"); FileOutputStream lOS = new FileOutputStream(lFile); BufferedOutputStream lBOS = new BufferedOutputStream(lOS); lBOS.write(lResults); lBOS.flush(); lBOS.close(); lOS.close();
次のコード・スニペットは、DIME添付ファイルによるデータ送信の例を示しています。
// open file and attach as data source InputStream lIS = new FileInputStream(lFile); ((Stub)mFlashlineRegistryDest)._setProperty (Call.ATTACHMENT_ENCAPSULATION_FORMAT, Call.ATTACHMENT_ENCAPSULATION_FORMAT_DIME); ByteArrayDataSource lDataSource = new ByteArrayDataSource(lIS, "application/x-zip-compressed"); DataHandler lDH = new DataHandler(lDataSource); // add the attachment ((Stub)mFlashlineRegistryDest).addAttachment(lDH); ImpExpJob lJob = mFlashlineRegistryDest.importExecute(mAuthTokenDest, "flashline", null, "Import Assets Test", null);