7 ドキュメントの更新
この章の内容は、次のとおりです。
7.1 ドキュメントの更新について
Imaging APIはドキュメントのメタデータとドキュメントのコンテンツの両方を更新するためのDocumentService.updateDocument操作を提供します。この操作はDocumentContentService.uploadDocument操作から返されるuploadTokenと、フィールド値の変更が含まれるFieldValueインスタンスのリストの両方を受け入れます。これらのパラメータのいずれか、または両方が提供されますが、これは、更新がフィールド値のみの更新の場合と、ドキュメントのコンテンツのみの更新の場合と、フィールド値とコンテンツの両方の更新の場合があることを意味します。この章の最後にある例7-1に、ここで説明するトピックのサンプル・コードを示します。
7.2 改訂されたドキュメント・コンテンツのアップロード
Imagingアプリケーションでのドキュメントの作成更新は2段階のプロセスです。最初のステップで、ドキュメントのバイナリ・データはDocumentContentService.uploadDocument操作を使用してImagingサーバーにアップロードされます。この操作により、固有のアップロード・トークンが返され、これを使用して以降のDocumentService.updateDocumentへのコールが行われて、アプリケーションにドキュメントの索引が作成されます。このuploadTokenは、ユーザーがログアウトするか、createDocumentまたはupdateDocumentコールに使用されるまで有効です。一度しか使用されない場合もあります。
7.3 ドキュメントのメタデータの更新
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、浮動小数点数、10進数 |
FieldType.Number |
整数、長整数、 |
FieldType.Text |
文字列 |
表内では、太字のJavaタイプは、FieldTypeに関連付けられたネイティブ・タイプです。FieldValueは、表内の他のタイプをネイティブ・タイプに強制的に変更します。強制プロセスにおいて値の精度が失われる場合があるため、ネイティブ・タイプ以外のタイプを使用する際には注意が必要です。
FieldValuesをupdateDocumentとともに使用する場合、リストは、ドキュメントのアプリケーションで定義されたすべてのフィールドを含む必要はありません。変更が必要なフィールド値のみ指定する必要があります。また、ドキュメントを更新するときには、指定されていないフィールドは無視されます。必須と定義されていないフィールドについては、リストにFieldValueを含め、その値をnullに設定することにより、値を故意にnullにすることもできます。これを実行する場合、FieldValueは、Javaタイプnullに基づいて必要なフィールド・タイプを決定できないため、Imaging FieldTypeを受け入れるFieldValueコンストラクタを使用する必要があります。
7.4 ドキュメント更新の例
例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()); } } }