Saturday, March 15, 2014

Using UCM's RIDC to Check In Document in UCM from Java

Blog ini akan membahas bagaimana menggunakan API yang disediakan Webcenter Content (Universal Content Management System/UCM) untuk mengakses, menambahkan ataupun memodifikasi dokumen-dokumen yang ada di dalamnya. UCM menyediakan API yang disebut RIDC (Remote Intradoc Client) untuk mengeksekusi fungsionalitas dan fungsi-fungsi yang ada di UCM tanpa perlu langsung mengakses sistem. RIDC cocok digunakan apabila seseorang ingin membangun aplikasi Document Management yang menyimpan dokumen ke UCM, tapi ingin membangun sendiri antar mukanya tanpa menggunakan User Interface UCM.

Diharapkan anda sudah mengerti dan cukup familiar dengan Oracle Webcenter Content (Universal Content Management System/UCM) agar dapat memahami apa yang tertulis di blog ini.

Sebelum menggunakan RIDC, project yang anda buat harus meng-include file jar berikut:

oracle.ucm.ridc-11.1.1.jar

File ini dapat diambil di folder server tempat anda meng-instal Webcenter Content.

Contoh berikut dapat dipakai untuk melakukan Check In dokumen ke UCM berikut metadata-nya.
Penjelasan code saya lampirkan dalam bentuk comment "// comment", silahkan reuse code ini sebagaimana perlu.

package com.nostratech.jasper.service.generator;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import oracle.stellent.ridc.IdcClient;
import oracle.stellent.ridc.IdcClientException;
import oracle.stellent.ridc.IdcClientManager;
import oracle.stellent.ridc.IdcContext;
import oracle.stellent.ridc.model.DataBinder;
import oracle.stellent.ridc.model.DataObject;
import oracle.stellent.ridc.model.DataResultSet;
import oracle.stellent.ridc.model.TransferFile;
import oracle.stellent.ridc.protocol.ServiceResponse;

public class UCM {
    private  IdcClientManager myIdcClientManager;
    private  IdcClient myIdcClient;
    private  IdcContext myIdcContext;
    public String addContent(String fileName,String dDocTitle){
        
        try {
            // Instantiate IdcClientManager untuk menginisiasi koneksi ke server UCM
             myIdcClientManager = new IdcClientManager();
             // masukkan nama Server UCM anda dan port RIDC
             // Default Port adalah 4444 (anda dapat mengubahnya melalui Enterprise Manager
             myIdcClient=myIdcClientManager.createClient("idc://ServerHostName:4444");
             
             myIdcContext = new IdcContext("sysadmin");
             ServiceResponse myServiceResponse = null;
                InputStream fileStream = null;
                
                fileStream = new FileInputStream(fileName);
                long fileLength = new File(fileName).length();
                
                // Data binder akan menyimpan pasangan metadata dan value
                // Misal: myRequestDataBinder.putLocal("dDocAuthor", "Darwin");
                // Ini akan menyimpan pasangan metadata dDocAuthor = Darwin
                // Apabila kita melakukan check in, maka Author document akan di-set menjadi Darwin
                // Apabila kita melakukan search, maka dokumen yang dicari adalah yang Author-nya adalah Darwin
                
                DataBinder myRequestDataBinder = myIdcClient.createBinder();
                
                // Nama service UCM yang akan dipanggil (Check in, Search dsb.)
                // Dalam kasus ini adalah Check in
                // Anda dapat melihat list service-service di tab Administrator 
                myRequestDataBinder.putLocal("IdcService", "CHECKIN_UNIVERSAL");
                myRequestDataBinder.putLocal("dDocType", "Application");
                // Judul Dokumen
                myRequestDataBinder.putLocal("dDocTitle", dDocTitle);
                // Nama Author dokumen
                myRequestDataBinder.putLocal("dDocAuthor", "darwin");
                // Security Group, anda dapat membuat custom security group atau memanfaatkan default (Public)
                myRequestDataBinder.putLocal("dSecurityGroup", "Public");
                myRequestDataBinder.putLocal("dDocAccount", "");
                
                // Format Dokumen
                myRequestDataBinder.putLocal("dFormat", "text/html");
                
                // Folder di UCM, tempat kita akan menyimpan Dokumen 
                // Folder yang secara default ada di UCM adalah Contribution Folder
                // Value untuk Parameter xCollectionID adalah ID Folder, bukan string
                // Untuk itu, kita menggunakan getFolderIDFromPath untuk menentukan ID dari Contribution Folder
                
                myRequestDataBinder.putLocal("xCollectionID",
                Long.toString(getFolderIdFromPath("/Contribution Folders/")));
                
                // File yang akan kita check in
                myRequestDataBinder.addFile("primaryFile",new TransferFile(fileStream, fileName, fileLength, "text/html"));
                myServiceResponse = myIdcClient.sendRequest(myIdcContext,myRequestDataBinder);
                
                String myResponseString =myServiceResponse.getResponseAsString();
        
                System.out.println("Uploaded file details: \n" +myResponseString);

                
                // Cek hasil API call
                DataBinder binder = myServiceResponse.getResponseAsBinder();
                    System.out.println("End");
                    
                    // Ambil URL dokumen setelah di-check in
                    String docUrl=binder.getLocal("WebfilePath");
                      int index=docUrl.lastIndexOf("groups/");
                      String folder=docUrl.substring(index, docUrl.length());
                       System.out.println( index + "entered string is: "+folder);
                      index=0;
                        index=folder.lastIndexOf("~");
                        folder=folder.substring(0,index);
                     // return hasil URL check in
                    return "http://hostname/cs/"+folder+".pdf";
                    
        } catch (IdcClientException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "failed";
    

    }
    
    // ambil ID dari sebuah Folder
    // Parameter adalah String Nama Folder, me-return ID dari folder tersebut jika ada di UCM
    private long getFolderIdFromPath(String myFolderPath) {

        ServiceResponse myServiceResponse = null;
        Long myFolderId = null;
        try {
            
            DataBinder myRequestDataBinder = myIdcClient.createBinder();
            // gunakan service COLLECTION_INFO untuk mendapatkan informasi folder
            myRequestDataBinder.putLocal("IdcService", "COLLECTION_INFO");
            
            
            myRequestDataBinder.putLocal("hasCollectionPath", "true");
            // ambil collection path dari folder yang ingin dicari
            myRequestDataBinder.putLocal("dCollectionPath", myFolderPath);
            myServiceResponse = myIdcClient.sendRequest(myIdcContext,
            myRequestDataBinder);
            DataBinder myResponseDataBinder =
            myServiceResponse.getResponseAsBinder();
            DataResultSet myDataResultSet =
            myResponseDataBinder.getResultSet("PATH");
            DataObject myDataObject =
            myDataResultSet.getRows().get(myDataResultSet.getRows().size() - 1);
            
            // ambil ID dari collection yang kita cari
            myFolderId = new Long(myDataObject.get("dCollectionID"));
            System.out.println("Folder id: " + myFolderId);
        } catch (IdcClientException idcce) {
        System.out.println("IDC Client Exception occurred. Unable to retrieve folder id from path. Message: " + idcce.getMessage() +" Stack trace: ");
            idcce.printStackTrace();
            } catch (Exception e) {
            System.out.println("Exception occurred. Unable to retrieve folder id from path. Message: " + e.getMessage() + ", Stack trace: ");
            e.printStackTrace();
            } finally {
            if (myServiceResponse != null) {
            myServiceResponse.close();
            }
            }
        return 0;
    }
    

}



Anda dapat menggunakan potongan code diatas untuk bermacam-macam ide.
Sebagai contoh, saya menggunakn code diatas dalam sebuah aplikasi Jasper yang men-generate file .pdf. Ketika Jasper saya meng-generate sebuah dokumen PDF, saya memanggil method diatas: addContent(lokasiFileYangInginDiupload, namaDokumenSetelahDimasukkanKeUCM). Secara otomatis semua report yang di-generate di Jasper saya juga akan ter-archive ke UCM untuk pencarian lebih lanjut di masa yang akan datang.
Anda dapat bereksplorasi untuk menggunakan API UCM untuk bermacam-macam kegunaan dalam document management. Selamat Mencoba!


Have fun!



No comments:

Post a Comment