Monday, December 12, 2011

CMISとApache Chemistryと私

mryoshioです。

意味深なタイトルですが意味は無いです。
皆さんはApache ChemistryCMISという言葉をご存じでしょうか。
CMISというのはContent Management Interoperability Servicesの略であり、
コンテンツ管理システム (CMS/ECM)の標準規格です。
これを使うことで、異なるベンダのバックエンドデータへのアクセスが容易になります。
たとえば、弊社で扱っているAlfrescoはCMISインターフェースをもつため、
CMIS準拠のクライアントライブラリを使うことでAlfrescoリポジトリに対する
ドキュメントの作成や削除を簡単に行えます。

次にApache Chemistryについてですが、
これはCMISに準拠したクライアントやサーバを実装するためのJavaライブラリです。

実際にこのライブラリを使い、
JavaコンソールプログラムからAlfrescoリポジトリ内を操作してみましょう。
(Alfresco Community Edition 3.4dに対し動作確認済み)

  • リポジトリへの接続
  • SessionFactory sessionFactory = SessionFactoryImpl.newInstance();
    Map parameter = new HashMap();
    parameter.put(SessionParameter.USER, "admin");
    parameter.put(SessionParameter.PASSWORD, "admin");
    parameter.put(SessionParameter.ATOMPUB_URL, ALFRSCO_ATOMPUB_URL);
    parameter.put(SessionParameter.BINDING_TYPE,BindingType.ATOMPUB.value());
    parameter.put(SessionParameter.REPOSITORY_ID, REPOSITORY_ID);
    session = sessionFactory.createSession(parameter);
    return session.getRootFolder();
    
  • フォルダの作成
  • Map props = new HashMap();
    props.put(PropertyIds.OBJECT_TYPE_ID, "cmis:folder");
    props.put(PropertyIds.NAME, newFolderName);
    Folder newFolder = target.createFolder(props);
    return newFolder;
    
  • ドキュメントの作成
  • Map props = new HashMap();
    props.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
    props.put(PropertyIds.NAME, newDocName);
    System.out.println("This is a test document: " + newDocName);
    String content = "aegif Mind Share Leader Generating New Paradigms by aegif corporation.";
    byte[] buf = null;
    try {    
      buf = content.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {    
      e.printStackTrace();
    }
    ByteArrayInputStream input = new ByteArrayInputStream(buf);
    ContentStream contentStream = session.getObjectFactory().createContentStream(
        newDocName, buf.length, "text/plain; charset=UTF-8", input);
    target.createDocument(props, contentStream, VersioningState.MAJOR);
    
  • ドキュメントの削除
  • try {    
      CmisObject object = session.getObjectByPath(target.getPath() + delDocName);    
      Document delDoc = (Document) object;    
      delDoc.delete(true);
    } catch (CmisObjectNotFoundException e) {    
      System.err.println("Document is not found: " + delDocName);
    }
    

いかがだったでしょうか。
皆さんが想像されていたものと勝手が違ったかもしれません。
しかし、同じクライアントコードを使い
異なるリポジトリ (e.g. Alfresco, SharePoint)を操作できるようになれば
そのメリットは十分にあると言えるでしょう。

今回はApache Chemistryを使いましたが、
たとえばRubyベースであれば、CMISクライアント実装のActiveCMISがあります。
もし興味を持たれた方はこちらも併せてぜひご覧ください。

なお、サンプルコードを含むJavaクラスはここにあります。


@mryoshio

No comments: