Thursday, January 22, 2015

それ、CMISで繋げます(Liferay篇その2)

前回はLiferay上のDocuments and Mediaポートレットに対して、CMISリポジトリであるNemakiWareをバックエンドとして繋いでみました。 今回はそのリポジトリに対してどんなアクションが行えるか見てみましょう。 CMISはContent Management Interoperability Serviceというくらいなので、繋いでしまえば文書管理のオペレーションを行えるわけです。

一覧画面

Liferay側の機能ですが、表示形式を変えることができます。
各アイテムの横にある矢印ボタンをクリックすると、そのアイテムに対するアクションを行うことができます。

アクションの種類として、コンテキストメニューにダウンロード、編集、移動、チェックアウト、削除が見えています。

また、新規アイテムは画面上部のAddから作成します。フォルダ/ドキュメントの2種類しか選べないようです。
CMISではドメインモデルとして、フォルダやドキュメントであるにしてもさまざまなカスタムタイプを定義できますが、次の新規作成画面を見てもタイプやそのカスタム属性を入力できる場所は見当たりません。編集画面も同様で、ファイル実体と、名前の変更だけが可能です。

また、各アイテムの詳細情報を表示したければそのアイテムを一覧上でクリックします。メタデータとバージョン履歴が表示されます。メタデータはCMISのごく基本的な属性のうち一部が表示されています。
バージョン履歴では、以前のバージョンをダウンロードしたり、以前のバージョンを復活させる(ver1.1がある状態でver1.0をrevertすると、ver2.0としてver1.0が復活する)こともできます。このrevert自体はCMISで定義されたサービスではありませんが、以前のバージョンの内容で通常の更新アクションを内部的に実行していると思われます。

Documens and Mediaでは通常プレビューも存在すれば表示されますが、CMIS上のコンテンツに対しては、ファイル内容のプレビュー表示はないようです(CMISでは、プレビュー画像のようなものをクライアントに伝えることはできますが、プレビュー画像のデータ型が仕様で決まっているわけではありません)。

チェックアウト

文書管理機能らしいアクションといえば、チェックアウト/チェックインは欠かせません。
共有リポジトリ上で、特定のユーザが作業中は他のユーザから触れないようにファイルをロックしておくことはもちろん、更新作業中のファイルのスナップショットもなるべくローカルマシンに隠蔽しておくのではなくサーバ側に寄せて文書管理の対象とすることができます。

ではtest_02.txtをチェックアウトしてみましょう。

 ……あれれ?
 ロックされたものの、矢印ボタンも消えてアクションできなくなっています。
他のユーザに対してロックするのはよいですが、自分自身もロックしてしまったのでしょうか(いえ、そんなことはありません)。

 どうしてこうなった

結論からいうと、チェックアウトについてのCMIS仕様に関する解釈がLiferayとNemakiWareで食い違っているためだと思われます。

まずCMISではチェックアウトすると、作業用コピーが独立したオブジェクトとして自動で作成されます。この作業用コピーは、ver.1.0やver.1.1といったバージョンに似ていますが、あくまでバージョンではないとされています(仕様書2.1.13.15.1)。
ドメインモデルの考え方としてはバージョンではないのですが、サービスの方にあるgetAllVersionsメソッドでは作業用コピーも返すことになっているので、元のドキュメントから作業用コピーをたどっていくことは可能です。

一方、スクリーンショットにあるアイテム一覧は、CMISのgetChildrenメソッドによってあるフォルダの子要素一覧として取得されていると考えられます。getChildrenメソッドでは原則的には「最新のバージョン」を返すことになっているのですが、作業用コピーはバージョンではないので、getChildrenでは返されません。作業用コピーを返すためには別途、getCheckedOutDocsというメソッドが用意されています。

NemakiWareの場合、getChildrenで作業用コピーを返していないので、チェックアウトでロックされた元のドキュメントだけが表示されてしまっているのです。ロックされているのでアクションもできませんし、Liferayのバージョン履歴からは作業用コピーをたどることもできませんでした。

getChildrenで作業用コピーを返すことが明示的に禁じられているわけではないので、作業用コピーもgetChildrenで返すリポジトリはあり得ます。実際、Alfrescoがそうなっています。

 CMISリポジトリとしてAlfrescoをLiferayに接続してみると、2つ同じアイテムがありますが、片方には矢印ボタンがついていますね。作業用コピーに対してチェックインや、チェックアウトのキャンセルができる、みたいです。

「みたいです」、というのは、実際にはAlfrescoの場合もLiferayからちゃんとしたチェックインができるわけではないからです。

まず作業用コピーを更新して、スナップショットをサーバに保存しておくためにEditを開いてみます。なぜか真っ白。これでは編集できません。
ではチェックインを実行してみると、チェックイン時に更新画面は開かれず、いきなり以下の状態になります。 ロックは解除されましたが、これではロック中にファイル内容を変更してアップロードすることができません。

まとめ

  • Liferayに接続したCMISリポジトリに対して、基本的なCRUDは可能
  • Liferayからのチェックアウト/ チェックインには難あり。
    • Liferay側のCMIS仕様の解釈に問題がある?
      • 筆者の解釈では、作業用コピーはgetAllVersionsかgetCheckedOutDocsで取得すべき
      • LiferayはgetChildrenで作業用コピーが返されると期待しているのかも(Alfrescoのように、チェックインするためのアクションボタンが表示されていた)
    • CMISの解釈はさておき、Alfrescoにとくに最適化されているのかと思いきや、Alfrescoでも見かけだけでちゃんと機能していない
  • とはいえ、Liferayは別に文書管理ソフトウェアではないのだから、ファイルのシンプルな読み書きだけできればそれで充分かもしれません。
というわけで、チェックアウト/チェックインに関しては残念な結果となってしまいました。今後のアクションとして、原因を正確に切り分けた上で、LiferayのJIRAに投稿するなどしようと思っています。

(文:linzhixing)

No comments: