この章の内容は次のとおりです。
Imaging APIのApplicationServiceおよびDocumentServiceインタフェースは、Imagingシステムでのアプリケーションとドキュメントの管理に使用されます。ドキュメントはすべて、イメージング・アプリケーションに関連付けられている必要があります。アプリケーションでは、様々なデフォルト機能が定義されます。これらの機能は、アプリケーションに関連付けられているドキュメントに適用されます。このように、アプリケーションは、1つのドキュメント・タイプを定義するテンプレートと考えることができます。通常は、1つのタイプのドキュメント(インボイス、企画書、契約書など)について、1つのアプリケーションを作成します。
この章では、リストのメカニズムや既存のアプリケーション定義を取得する方法、ドキュメントのアップロードや索引付けのメカニズムなど、アプリケーションでドキュメントの作成に使用されている基本的なメソッドの使い方を詳しく説明します。この章の最後にある例4-1に、ここで説明するトピックのサンプル・コードを示します。
Imaging APIは、Imagingシステム内で定義されているアプリケーションをリストに列挙する2つのメカニズム、ApplicationService.listApplicationsとDocumentService.listTargetApplicationsを提供しています。それぞれの操作は“Ability”パラメータを1つとります。このパラメータはユーザーのセキュリティ設定に基づいて、どのアプリケーションを返すかを指定します。ただし、これらは使用されているセキュリティ・フィルタの点で異なります。
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操作は定義自体の管理に使用するもので、定義のどのセクションが必要かを指定するためのパラメータを提供します。セクションのリクエストにはSectionSetを使用します。これは、SectionFlagのリストを渡すためのコンテナです。たとえば、アプリケーションのプロパティとフィールド定義セクションを取得するには、コール側コードは次のように定義されたSectionSetを渡します。
sectionSet =
Application.SectionSet.of(Application.SectionFlag.PROPERTIES,
Application.SectionFlag.FIELDDEFINITIONS);
しかし、DocumentService.getTargetApplicationは、一定のセクション・セットを戻します。このようなセクションはドキュメントでの作業に必要とされることが多いため、このセットには、プロパティとフィールド定義の両方が自動的に含まれます。
Imagingアプリケーションでドキュメントを作成する手順は2つのステップに分かれています。最初の手順では、DocumentContentService.uploadDocument操作を使用して、ドキュメントのバイナリ・データをImagingサーバーにアップロードします。この操作は一意のトークン(およびアップロード・トークン)を戻します。このトークンは続けて、DocumentService.createDocumentのコールに使用され、アプリケーションにこのドキュメントを索引付けします。このuploadTokenは、ユーザーがログアウトするまで、またはcreateDocumentコールかupdateDocumentコールで使用されるまで有効です。uploadTokenを使用できるのは1回のみです。
アップロード操作はjavax.activation.DataHandlerの形式でデータを受け取り、続けてドキュメントのコンテンツをjavax.activation.DataSource (通常は、javax.activation.FileDataSource)としてラップします。javax.mail.utilパッケージには、ByteArrayDataSourceも含まれます。これは、ドキュメントのコンテンツをInputStreamからラップできます。しかし、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、float、decimal |
|
FieldType.Number |
Integer、Long, |
|
FieldType.Text |
String |
表内では、太字の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());
}
}
}