alfresco勉強会#28 メタデータテンプレート
TRANSCRIPT
2015©
2015年6月24日
Jun Terashita
第28回 Alfresco勉強会 メタデータテンプレート
2015©2
自己紹介
•主にAlfrescoの導入支援コンサルティングやカスタマイズ開発をしています。
•緑陣営です。弊社にはガチ勢が数人いますが私はまったりやってます。
2015©3
発表内容
1. メタデータテンプレートとは
2. カスタムメタデータテンプレートを作ってみよう
3. デフォルトのテンプレートの上書き
1. メタデータテンプレートとは
2015©5
メタデータテンプレートとは• Alfresco Shareのドキュメントリストでシンプル表示モードと詳細表示モードに表示する属性情報(メタデータ)をカスタマイズするための仕組み
• コンテンツのタイプや保持するアスペクト、属性等、条件を評価して表示する属性情報を切り替えることが可能
• シンプル表示のみ、詳細表示のみ、両方に表示、という指定も可能
この部分
2015©6
デフォルトのメタデータテンプレート
...<metadata-templates> <!-- Default (fallback) --> <template id="default"> <banner index="10" id="lockBanner" evaluator="evaluator.doclib.metadata.hasLockBanner">{lockBanner}</banner> <banner index="20" id="syncTransientError" evaluator="evaluator.doclib.metadata.hasSyncTransientErrorBanner">{syncTransientError}</banner> <banner index="30" id="syncFailed" evaluator="evaluator.doclib.metadata.hasSyncFailedBanner">{syncFailed}</banner> <line index="10" id="date">{date}{size}</line> <line index="20" id="description" view="detailed">{description}</line> <line index="30" id="tags" view="detailed">{tags}</line> <line index="40" id="categories" view="detailed" evaluator="evaluator.doclib.metadata.hasCategories">{categories}</line> <line index="50" id="social" view="detailed">{social}</line> </template>...
• エンドユーザが目にするのはdefaultとisWorkingCopy
• WorkingCopy(オフライン編集中のファイル)にはtags, categories, socialの行を表示しない
webapps/share/WEB-INF/classes/alfresco/share-documentlibrary-config.xml
isWorkingCopyにはこの部分がない
2015©7
メタデータテンプレートの構成要素
要素 用途
evaluator テンプレートの使用条件(複数指定可能)
banner コンテンツ名の上に表示されるバナー
line コンテンツ名の下に表示される1行ずつの表示エリア
banner
line
2015©8
banner, lineの属性
要素 用途
index 表示順序指定(小さい順に表示される)
idバナー/ラインの名前(ID) ※テンプレート内で一意である必要がある
viewsimpleまたはdetailedを指定 ※何も指定しない場合は両方に表示される
evaluator 指定したEvaluatorが真を返す場合のみ表示する
2015©9
banner, lineの表示内容設定• 2通りの指定が可能
(A)クライアントサイドJavaScript(※)で事前定義されたレンダラを指定:{レンダラ名} ※webapps/share/components/documentlibrary/documentlist.js
(B)プロパティ名とラベルのリソースキーを指定:{プロパティ名 ラベルのリソースキー} (プロパティ名は「 : 」を「 _ 」に置換して指定)
...<template id="transferTarget"> <evaluator>evaluator.doclib.metadata.isTransferTarget</evaluator> <banner index="10" id="lockBanner" evaluator="evaluator.doclib.metadata.hasLockBanner">{lockBanner}</banner> <banner index="20" id="syncTransientError" evaluator="evaluator.doclib.metadata.hasSyncTransientErrorBanner">{syncTransientError}</banner> <banner index="30" id="syncFailed" evaluator="evaluator.doclib.metadata.hasSyncFailedBanner">{syncFailed}</banner> <line index="10" id="date">{date}</line> <line index="20" id="description" view="detailed">{description}</line> <line index="30" id="transferTarget" simpleView="true">{trx_enabled label.trx_enabled}{trx_endpointhost label.trx_endpointhost}{trx_endpointport label.trx_endpointport}</line></template>...
(B)の例
(A)の例webapps/share/WEB-INF/classes/alfresco/share-documentlibrary-config.xml
2. カスタムメタデータテンプレートを作ってみよう
2015©11
今回作ってみるサンプル• EXIFアスペクトが付いているコンテンツの詳細表示に「画像幅」「画像高」「露光時間」「F値」を追加し、「説明」は表示しない
• シンプル表示には「画像幅」「画像高」のみ表示する
こんなかんじに変える
2015©12
今回使用した環境• 標準のShareと比較しながら開発できるためメモリに余裕があるなら以下の構成がおすすめ
• リポジトリ
• Alfresco Community Edition 5.0.dをCentOS 7(VirtualBoxのVM)にインストーラでインストール
• カスタマイズするShare
• Alfresco SDK 2.1.0の「share-amp-archetype」を使用してEclipseで開発
• Alfrescoのバージョンはデフォルトのまま(今回は5.0.dが設定されている)
• Alfresco SDKについては以前のAlfresco勉強会の資料を参照 http://www.slideshare.net/terajun/alfresco26-alfresco-sdk
2015©13
作成するファイル• 今回は以下の5つのファイルを作成します
• 属性のラベルにOut-of-the-Boxのメッセージリソースが使用可能な場合は下の2行は不要
ファイル 用途
share-config-custom.xml カスタムメタデータテンプレートを定義
custom-slingshot-documentlibrary-context.xml
カスタムのEvaluatorを定義
custom-slingshot-application-context.xml
属性のラベルに使用するメッセージリソースファイルの読み込み設定
custom_label.properties custom_label_ja.properties
メッセージリソースファイル
2015©14
作成するファイルのパス• Alfresco SDKを使用してカスタマイズする場合はそれぞれ以下のパスに配置
• share-config-custom.xml以外はファイル名はなんでもよい(拡張子さえ合っていれば)
2015©15
カスタムメタデータテンプレートの定義• EXIFアスペクトが付いていれば真を返すEvaluator(後述)で評価し、画像幅、画像高、露光時間、F値を表示するテンプレートを定義
<alfresco-config> <config evaluator="string-compare" condition="DocumentLibrary"> <metadata-templates> <!-- Photos --> <template id="isPhoto"> <evaluator>evaluator.doclib.metadata.hasExif</evaluator> <line index="10" id="date">{date}{size}</line> <line index="20" id="exif_pixelDimension">{exif_pixelXDimension label.exif_pixelXDimension} {exif_pixelYDimension label.exif_pixelYDimension} </line> <line index="30" id="exif_exposureTime" view="detailed">{exif_exposureTime label.exif_exposureTime} </line> <line index="40" id="exif_fNumber" view="detailed">{exif_fNumber label.exif_fNumber} </line> <line index="50" id="tags" view="detailed">{tags}</line> <line index="60" id="categories" view="detailed" evaluator="evaluator.doclib.metadata.hasCategories">{categories}</line> <line index="70" id="social" view="detailed">{social}</line> </template> </metadata-templates> </config></alfresco-config>
EXIF情報表示用のライン
新たに定義したEvaluator(後述)
shared/classes/alfresco/web-extension/share-config-custom.xml または META-INF/share-config-custom.xml(JARに入れる場合)
2015©16
カスタムのEvaluatorの定義• EXIFアスペクトが付いているかどうか評価するEvaluatorを定義
<beans> <bean id="evaluator.doclib.metadata.hasExif" class="org.alfresco.web.evaluator.HasAspectEvaluator"> <property name="aspects"> <list> <value>exif:exif</value> </list> </property> </bean></beans>
shared/classes/alfresco/web-extension/custom-slingshot-documentlibrary-context.xml
2015©17
ラベル表示用のメッセージリソースの作成• メッセージリソースファイルの読み込み設定とメッセージリソースファイルを作成
• 日本語のみ必要な場合はメッセージリソースファイルを分ける必要はない
...<bean id="webscripts.custom.resources" class="org.springframework.extensions.surf.util.ResourceBundleBootstrapComponent"> <property name="resourceBundles"> <list> <value>alfresco.messages.custom_label</value> </list> </property></bean>...
label.exif_pixelXDimension=Image Widthlabel.exif_pixelYDimension=Image Heightlabel.exif_exposureTime=Exposure Timelabel.exif_fNumber=F Number
shared/classes/alfresco/web-extension/custom-slingshot-application-context.xml
label.exif_pixelXDimension=\u753b\u50cf\u5e45label.exif_pixelYDimension=\u753b\u50cf\u9ad8label.exif_exposureTime=\u9732\u5149\u6642\u9593label.exif_fNumber=F\u5024
shared/classes/alfresco/messages/custom_label.properties
shared/classes/alfresco/messages/custom_label_ja.properties
2015©18
カスタマイズを適用して動作確認
3. デフォルトのテンプレートの上書き
基本的にはここまでのカスタマイズでOK
でもオフライン編集すると isWorkingCopyのテンプレートが
効いてしまう
2015©22
EXIFアスペクトをもつファイルをオフライン編集すると
EXIF情報は表示されない
...<!-- Working Copies --><template id="isWorkingCopy"> <evaluator>evaluator.doclib.metadata.isWorkingCopy</evaluator> <banner index="10" id="lockBanner" evaluator="evaluator.doclib.metadata.hasLockBanner">{lockBanner}</banner> <banner index="20" id="syncTransientError" evaluator="evaluator.doclib.metadata.hasSyncTransientErrorBanner">{syncTransientError}</banner> <banner index="30" id="syncFailed" evaluator="evaluator.doclib.metadata.hasSyncFailedBanner">{syncFailed}</banner> <line index="10" id="date">{date}{size}</line> <line index="20" id="description" view="detailed">{description}</line></template>...
webapps/share/WEB-INF/classes/alfresco/share-documentlibrary-config.xml
このEvaluatorが先に評価される
WorkingCopyの表示内容も変えたい場合は?
2015©24
まずはコンテンツの状態でどのように表示内容を変えるか整理
EXIFアスペクトあり EXIFアスペクトなし
WorkingCopy ではない
さっき作った内容 defaultと同じ内容
WorkingCopy上の内容からtags,
categories, socialを削除isWorkingCopy と同じ内容
• EXIFアスペクトの有無とWorkingCopyかどうかで表示内容をどのように変えるか整理
2015©25
上書きする方法は2通り(1)メタデータテンプレートの設定をすべて上書きし、メタデータテンプレートのEvaluator
が評価される順番を書き換える
(2)isWorkingCopyのメタデータテンプレートを上書きし、個々の場合の条件を細かく設定する
(1)メタデータテンプレート全体の上書き
2015©27
DocumentLibraryの設定全体を上書き
...<!-- Document Library config section --><config evaluator="string-compare" condition="DocumentLibrary" replace="true">
<!-- Document List --> <doclist>... <!-- Custom Metadata Templates for the Document Library Browse View
Use view="simple" or view="detailed" to limit the display to one particular view. --> <metadata-templates> <!-- Default (fallback) --> <template id=“default">...</config>
• share-documentlibrary-config.xmlからcondition=“DocumentLibrary”の設定をshare-config-custom.xmlにすべてコピーし、replace=“true”というパラメータを設定※設定を書き換えない部分も含めてすべてコピーしないとエラーになってしまうので注意
shared/classes/alfresco/web-extension/share-config-custom.xml または META-INF/share-config-custom.xml(JARに入れる場合)
2015©28
メタデータテンプレートを定義する順番
EXIFアスペクトあり EXIFアスペクトなし
WorkingCopy ではない
さっき作った内容 defaultと同じ内容
WorkingCopy上の内容からtags,
categories, socialを削除isWorkingCopy と同じ内容
• 以下の順にメタデータテンプレートが評価されてほしい (②と③はどちらが先でもよい)
①
②
③
④
2015©29
メタデータテンプレートの定義の順番を書き換え
...<metadata-templates> <!-- Default (fallback) --> <template id="default"> <banner index="10" id="lockBanner" evaluator=“evaluator.doclib.metadata.hasLockBanner">{lockBanner}</banner>... </template>
<!-- EXIFアスペクトありのWorkingCopy --> <template id="isWorkingCopyWithExif"> <evaluator>evaluator.doclib.metadata.hasExif</evaluator> <evaluator>evaluator.doclib.metadata.isWorkingCopy</evaluator> <banner index="10" id="lockBanner" evaluator=“evaluator.doclib.metadata.hasLockBanner">{lockBanner}</banner>... </template>
<!-- EXIFアスペクトあり --> <template id="hasExif"> <evaluator>evaluator.doclib.metadata.hasExif</evaluator> <line index="10" id=“date">{date}{size}</line>... </template>
<!-- Working Copies --> <template id="isWorkingCopy">...
• defaultとisWorkingCopyの間に前ページの①と②のメタデータテンプレートを挿入(②はisWorkingCopyの後でもよい)
shared/classes/alfresco/web-extension/share-config-custom.xml または META-INF/share-config-custom.xml(JARに入れる場合)
①にはEvaluatorを2つ指定
2015©30
カスタマイズを適用して動作確認
(2)isWorkingCopyのテンプレートを上書き
2015©32
否定形のEvaluatorを定義
...<bean id=“evaluator.doclib.metadata.doesNotHaveExif" class="org.alfresco.web.evaluator.HasAspectEvaluator"> <property name="aspects"> <list> <value>exif:exif</value> </list> </property> <property name="negateOutput" value="true" /></bean><bean id="evaluator.doclib.metadata.isNotWorkingCopy" parent="evaluator.doclib.metadata.value"> <property name="accessor" value="workingCopy.isWorkingCopy" /> <property name="comparator"> <bean class="org.alfresco.web.evaluator.StringEqualsComparator"> <property name="value" value="true" /> </bean> </property> <property name="negateOutput" value="true" /></bean>...
shared/classes/alfresco/web-extension/custom-slingshot-documentlibrary-context.xml
• negateOutputというプロパティを使用して、EXIFアスペクトが付いていない時に真を返すEvaluatorとWorkingCopyではない時に真を返すEvaluatorを定義
2015©33
場合分けに対応するEvaluatorを定義(必須ではない)
...<bean id="evaluator.doclib.metadata.isWorkingCopyWithoutExif" class="org.alfresco.web.evaluator.ChainedMatchAllEvaluator"> <property name="evaluators"> <list> <ref bean="evaluator.doclib.metadata.isWorkingCopy" /> <ref bean="evaluator.doclib.metadata.doesNotHaveExif" /> </list> </property></bean><bean id="evaluator.doclib.metadata.isWorkingCopyWithExif" class="org.alfresco.web.evaluator.ChainedMatchAllEvaluator"> <property name="evaluators"> <list> <ref bean="evaluator.doclib.metadata.isWorkingCopy" /> <ref bean="evaluator.doclib.metadata.hasExif" /> </list> </property></bean><bean id="evaluator.doclib.metadata.isNotWorkingCopyWithExif" class="org.alfresco.web.evaluator.ChainedMatchAllEvaluator"> <property name="evaluators"> <list> <ref bean="evaluator.doclib.metadata.isNotWorkingCopy" /> <ref bean="evaluator.doclib.metadata.hasExif" /> </list> </property></bean>...
shared/classes/alfresco/web-extension/custom-slingshot-documentlibrary-context.xml
• ChainedMatchAllEvaluatorを使用し、ここまでに定義したEvaluatorの組み合わせで場合分けに対応する新たなEvaluatorを定義
• これは必須ではなく、先ほどの例のようにメタデータテンプレート側でEvaluatorの組み合わせを設定してもよい
2015©34
デフォルトのisWorkingCopyテンプレートを無効化
...<!-- isWorkingCopyテンプレートを無効化 --><template id="isWorkingCopy"> <evaluator>evaluator.doclib.action.disableAction</evaluator></template>...
• デフォルトのisWorkingCopyテンプレートを上書きし、常に偽を返すEvaluatorを使用して無効化※無効化せずに場合分けの1つとして内容を書き換えてもよい
shared/classes/alfresco/web-extension/share-config-custom.xml または META-INF/share-config-custom.xml(JARに入れる場合)
• slingshot-documentlibrary-context.xmlに定義されている • org.alfresco.web.evaluator.AlwaysFalseEvaluatorというクラスを使用している
2015©35
各Evaluatorに対応したメタデータテンプレートを定義
...<!-- EXIFアスペクトあり --><template id="isNotWorkingCopyWithExif"> <evaluator>evaluator.doclib.metadata.isNotWorkingCopyWithExif</evaluator> <line index="10" id="date">{date}{size}</line> <line index="20" id="exif_pixelDimension">{exif_pixelXDimension label.exif_pixelXDimension} {exif_pixelYDimension label.exif_pixelYDimension} </line> <line index="30" id="exif_exposureTime" view="detailed">{exif_exposureTime label.exif_exposureTime}</line> <line index="40" id="exif_fNumber" view="detailed">{exif_fNumber label.exif_fNumber}</line> <line index="50" id="tags" view="detailed">{tags}</line> <line index="60" id="categories" view="detailed" evaluator="evaluator.doclib.metadata.hasCategories">{categories}</line> <line index="70" id="social" view="detailed">{social}</line></template><!-- EXIFアスペクトありのWorkingCopy --><template id="isWorkingCopyWithExif"> <evaluator>evaluator.doclib.metadata.isWorkingCopyWithExif</evaluator> <banner index="10" id=“lockBanner" evaluator=“evaluator.doclib.metadata.hasLockBanner”>{lockBanner}</banner>...
• デフォルトのisWorkingCopyテンプレートを上書きし、常に偽を返すEvaluatorを使用して無効化
shared/classes/alfresco/web-extension/share-config-custom.xml または META-INF/share-config-custom.xml(JARに入れる場合)
2015©36
カスタマイズを適用して動作確認
以上
2015©38
今回のソースはここに置いてありますhttps://github.com/terajun/alfresco-metadata-template-sample