この章の内容は次のとおりです。
Imaging APIには、ドキュメントのメタデータとドキュメントのコンテンツの両方を更新するためのDocumentService.updateDocument操作が用意されています。この操作は、DocumentContentService.uploadDocument操作から返されたuploadTokenと、フィールド値の変更を含むFieldValueインスタンスのリストの両方を受入れます。これらのパラメータのどちらか、または両方が提供されます。これは更新されるのが、フィールド値のみであるか、ドキュメントのコンテンツのみであるか、またはフィールド値とコンテンツの両方であるかを表します。この章の最後にある例7-1に、ここで説明するトピックのサンプル・コードを示します。
Imagingアプリケーションでドキュメントのコンテンツを更新する手順は2つのステップに分かれています。最初の手順では、DocumentContentService.uploadDocument操作を使用して、ドキュメントのバイナリ・データをImagingサーバーにアップロードします。この操作は一意のアップロード・トークンを戻します。このトークンは続けて、DocumentService.updateDocumentのコールに使用され、アプリケーションにこのドキュメントを索引付けします。このuploadTokenは、ユーザーがログアウトするまで、またはcreateDocumentコールかupdateDocumentコールで使用されるまで有効です。uploadTokenを使用できるのは1回のみです。
Imaging APIのDocument.FieldValueクラスは、ドキュメントの索引付けの際にドキュメントのメタデータを提供するために使用されます。FieldValuesは、Document.FieldValueインスタンスのjava.util.Listとして、udpateDocumentに渡されます。リストの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をupdateDocumentとともに使用する場合、リストは、ドキュメントのアプリケーションで定義されたすべてのフィールドを含む必要はありません。変更が必要なフィールド値のみ指定する必要があります。また、ドキュメントを更新するときには、指定されていないフィールドは無視されます。必須と定義されていないフィールドについては、リストにFieldValueを含め、その値をnullに設定することにより、値を故意にnullにすることもできます。これを実行する場合、FieldValueは、Javaタイプnullに基づいて必要なフィールド・タイプを決定できないため、Imaging FieldTypeを受け入れるFieldValueコンストラクタを使用する必要があります。
例7-1は、このセクションで説明した基本概念を示しています。
例7-1 ドキュメント更新の例
package devguidesamples; import java.io.FileOutputStream; import java.io.IOException; 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.BasicUserToken; import oracle.imaging.Document; import oracle.imaging.DocumentContentService; import oracle.imaging.DocumentService; import oracle.imaging.ImagingException; import oracle.imaging.NameId; import oracle.imaging.RenderOptions; import oracle.imaging.RenderPage; import oracle.imaging.RenderResult; import oracle.imaging.Rendition; import oracle.imaging.Search; import oracle.imaging.SearchArgument; import oracle.imaging.SearchService; import oracle.imaging.SearchValue; import oracle.imaging.ServicesFactory; import oracle.imaging.TypedValue; import oracle.imaging.UserToken; public class UpdateDocumentSample { public static void main(String[] args) throws IOException { 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 SearchService searchService = servicesFactory.getSearchService(); DocumentService docService = servicesFactory.getDocumentService(); DocumentContentService docContentService = servicesFactory.getDocumentContentService(); // The find the document with invoice number 1234 using the Invoices search List<SearchArgument> searchArguments = new ArrayList<SearchArgument>(); SearchValue searchValue = new SearchValue(SearchValue.Type.NUMBER, 1234); SearchArgument searchArgument = new SearchArgument("Invoice Number", searchValue); searchArgument.setOperatorValue(Search.Operator.EQUAL); searchArguments.add(searchArgument); Search.ResultSet resultSet = searchService.executeSavedSearch(new NameId("Invoices"), searchArguments); if (resultSet.getTotalResults() == 0) { System.out.println("Document not found"); } String documentId = resultSet.getResults().get(0).getDocumentId(); // update field values only. List<Document.FieldValue> fieldValues = new ArrayList<Document.FieldValue>(); fieldValues.add(new Document.FieldValue("Amount", new BigDecimal("99.95"))); docService.updateDocument(documentId, null, fieldValues, false); // update document content String fileName = "C:/PathToImages/NewInvoice1234.tif"; DataHandler fileData = new DataHandler(new FileDataSource(fileName)); String uploadToken = docContentService.uploadDocument(fileData, "invoice1234.tif"); docService.updateDocument(documentID, uploadToken, null, false); // update field values and document content at once fieldValues = new ArrayList<Document.FieldValue>(); fieldValues.add(new Document.FieldValue("Receive Date", new Date())); //now fileName = "C:/PathToImages/AnotherNewInvoice1234.tif"; fileData = new DataHandler(new FileDataSource(fileName)); uploadToken = docContentService.uploadDocument(fileData, "invoice1234.tif"); docService.updateDocument(documentID, uploadToken, fieldValues, false); } finally { if (servicesFactory != null) { servicesFactory.logout(); } } } catch (ImagingException e) { System.out.println(e.getMessage()); } } }