この章の内容は次のとおりです。
Imagingシステムでアプリケーションおよびドキュメントを管理するには、Imaging APIであるApplicationServiceおよびDocumentServiceのインタフェースを使用します。すべてのドキュメントはImagingアプリケーションと関連付けられている必要があります。このアプリケーションで多くのデフォルト機能が定義されると、それらはこのアプリケーションに関連付けられた各ドキュメントに適用されます。このように、アプリケーションは単一のドキュメント・タイプを定義するテンプレートと考えることができます。一般的に、1つのタイプのドキュメント(請求書、提案書、契約書など)に対して1つのアプリケーションが作成されます。
この章では、リストのメカニズムや既存のアプリケーション定義を取得する方法、ドキュメントのアップロードや索引付けのメカニズムなど、アプリケーションでドキュメントの作成に使用されている基本的なメソッドの使い方を詳しく説明します。この章の最後にある例4-1に、ここで説明するトピックのサンプル・コードを示します。
Imaging APIにはImagingシステム内で定義されるアプリケーションのリストを列挙するために、ApplicationService.listApplicationsおよびDocumentService.listTargetApplicationsの2つのメカニズムが用意されています。各操作は、ユーザーのセキュリティ設定に基づいてどのアプリケーションを返すかを指定する「Ability」パラメータを受け入れます。ただし、どのセキュリティ・フィルタが使用されるかだけは異なります。
ApplicationService.listApplicationsは、アプリケーション定義セキュリティに基づいてアプリケーションを戻します。Ability.VIEWは、呼出し側ユーザーが表示権限を持つすべてのアプリケーションを戻します。Ability.MANAGEパラメータは、ユーザーが削除または変更権限を持つアプリケーションをすべて戻します。この操作は本来、アプリケーション定義を管理するために書かれたコードのためにあります。
DocumentService.listTargetApplicationsは、アプリケーション内でのユーザーのドキュメント権限、つまりユーザーはそのアプリケーションで、ドキュメントの表示権限と作成権限のどちらを持つかに基づいてアプリケーションを戻します。クライアントがドキュメントを直接操作しているときには、この操作が最良の選択です。
これらの操作はどちらも、アプリケーションの数値IDとテキスト名を特定するNameIdオブジェクト、java.util.Listを戻します。
リスト・アプリケーションと同様、Imaging APIはアプリケーションのために定義されたフィールドの詳細を取得する2種類の操作、ApplicationService.getApplicationとDocumentService.getTargetApplicationを提供しています。これらの操作も、ユーザーがリクエストしたアプリケーションの取得を許可されているかどうかの判断に使用される権限によって使い分けられます。ApplicationService.getApplicationには、アプリケーションの表示権限が必要です。DocumentService.getTargetApplicationには、ドキュメントの表示権限が必要です。
Application.getApplication操作は、定義そのものを管理する際に使用するように意図されており、定義のどの部分が必要とされるかを指定するパラメータを提供します。各部分はSectionFlagのリストを渡すコンテナであるSectionSetを使用してリクエストされます。たとえば、アプリケーションのプロパティおよびフィールド定義のセクションを取得するために、コール側のコードは次のように定義されたSectionSetを渡します。
sectionSet = Application.SectionSet.of(Application.SectionFlag.PROPERTIES, Application.SectionFlag.FIELDDEFINITIONS);
しかし、DocumentService.getTargetApplicationは、一定のセクション・セットを戻します。このようなセクションはドキュメントでの作業に必要とされることが多いため、このセットには、プロパティとフィールド定義の両方が自動的に含まれます。
Imagingアプリケーションでのドキュメントの作成は2段階のプロセスです。最初の手順で、ドキュメントのバイナリ・データはDocumentContentService.uploadDocument操作を使用してImagingサーバーにアップロードされます。この操作により、固有のトークン(アップロード・トークン)が返され、これを使用して以降のDocumentService.createDocumentへのコールが行われて、アプリケーションにドキュメントの索引が作成されます。このuploadTokenは、ユーザーがログアウトするか、createDocumentまたはupdateDocumentコールに使用されるまで有効です。一度しか使用されない場合もあります。
アップロード操作はデータをjavax.activation.DataHandler形式で受け入れます。その後、ドキュメントのコンテンツをjavax.activation.DataSource (通常はjavax.activation.FileDataSource)としてラップします。javax.mail.utilパッケージにはInputStreamからドキュメントのコンテンツをラップできるByteArrayDataSourceも含まれています。ただし、ByteArrayDataSourceはアップロードの前にクライアント上のメモリにドキュメント全体をロードするため、大容量のドキュメントに使用する場合は注意が必要です。DataHandlersおよびDataSourcesの使用法の詳細は、javax.activation およびjavax.mail.utilパッケージのJavadocを参照してください。
Imaging APIのDocument.FieldValueクラスは、ドキュメントの索引付けの際にドキュメントのメタデータを提供するために使用されます。FieldValuesは、Document.FieldValueインスタンスのjava.util.Listとして、createDocumentに渡されます。リストのFieldValueはそれぞれ、アプリケーションのFieldDefinitionにマップされます。
Document.FieldValueオブジェクトは、NameId定義クラスがアプリケーション・フィールド定義にマッピングするようフィールドIDまたはフィールド名によって定義できるという点で、NameId定義クラスと同様に機能します。この両方が指定される場合、名前値ではなくID値が使用されます。
Document.FieldValueには、値のプロパティも含まれます。この値の型はフィールド定義のImaging FieldTypeと互換性がある必要があります。Imagingの値のタイプは、使用されるJavaタイプによって自動的に決定します。次の表に、Imagingのフィールド・タイプと互換性のあるJavaタイプの対応を示します。
Imagingのフィールド・タイプ | Javaタイプ |
---|---|
FieldType.Date |
java.util.Date、java.util.GregorianCalendar |
FieldType.Decimal |
java.math.BigDecimal、浮動小数点数、10進数 |
FieldType.Number |
整数、長整数、 |
FieldType.Text |
文字列 |
表内では、太字のJavaタイプは、FieldTypeに関連付けられたネイティブ・タイプです。FieldValueは、表内の他のタイプをネイティブ・タイプに強制的に変更します。強制プロセスにおいて値の精度が失われる場合があるため、ネイティブ・タイプ以外のタイプを使用する際には注意が必要です。
FieldValuesをcreateDocumentとともに使用するときは、必須と定義されているフィールド値をすべて提供する必要があります。必須ではないフィールドについては、リストにFieldValueを含め、その値をnullに設定することにより、値を故意にnullにすることもできます。これを実行する場合、FieldValueは、Javaタイプnullに基づいて必要なフィールド・タイプを決定できないため、Imaging FieldTypeを受け入れるFieldValueコンストラクタを使用する必要があります。
例4-1は、このセクションで説明した基本概念を示しています。
例4-1 テキスト
package devguidesamples; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; import javax.activation.DataHandler; import javax.activation.FileDataSource; import oracle.imaging.Application; import oracle.imaging.ApplicationService; import oracle.imaging.BasicUserToken; import oracle.imaging.Document; import oracle.imaging.DocumentContentService; import oracle.imaging.DocumentService; import oracle.imaging.ImagingException; import oracle.imaging.NameId; import oracle.imaging.ServicesFactory; import oracle.imaging.UserToken; public class CreateDocumentSample { public static void main(String[] args) { try { // try-catch UserToken credentials = new BasicUserToken("ipmuser", "ipmuserpwd"); ServicesFactory servicesFactory = ServicesFactory.login(credentials, Locale.US, "http://ipmhost:16000/imaging/ws"); try { // try-finally to ensure logout DocumentService docService = servicesFactory.getDocumentService(); DocumentContentService docContentService = servicesFactory.getDocumentContentService(); NameId invoicesAppNameId = null; // List the viewable applications to confirm that "Invoices" exists List<NameId> appsList = docService.listTargetApplications(Document.Ability.CREATEDOCUMENT); for (NameId nameId: appsList) { if (nameId.getName().equals("Invoices")) { invoicesAppNameId = nameId; } } if (invoicesAppNameId == null) { System.out.println("Invoices application not found."); return; } // Upload document content String fileName = "C:/PathToImages/invoice1234.tif"; DataHandler fileData = new DataHandler(new FileDataSource(fileName)); String uploadToken = docContentService.uploadDocument(fileData, "invoice1234.tif"); // Index the document List<Document.FieldValue> fieldValues = new ArrayList<Document.FieldValue>(); fieldValues.add(new Document.FieldValue("Invoice Number", 1234)); fieldValues.add(new Document.FieldValue("Purchase Order", 4321)); fieldValues.add(new Document.FieldValue("Vendor", "Acme Supply")); fieldValues.add(new Document.FieldValue("Amount", new BigDecimal("99.95"))); fieldValues.add(new Document.FieldValue("Receive Date", new Date())); docService.createDocument(uploadToken, invoicesAppNameId, fieldValues, true); } finally { if (servicesFactory != null) { servicesFactory.logout(); } } } catch (ImagingException e) { System.out.println(e.getMessage()); } } }