AlfrescoとSolr(後編)
- Alfresco勉強会 第12回 -




                                     2012/12/12 @mryoshio




                       Copyright 2012 tachibanakikaku.com. All rights reserved.
目次


‣ 自己紹介

‣ 前回のおさらい

‣ ソースコード解説

‣ おわりに
自己紹介


‣ mryoshio
  → A社の社員

  → AlfrescoやLiferayのコンサルタント

  → ソースコードを読んだりカスタマイズしたりサポートしたり

  → Twitterとか色々なところにいます

  → もう少しPythonで遊びたいと思いつつできてない

  → 最近はこたつに入って仕事してます
前回のおさらい
AlfrescoとSolr


‣ Alfrescoとは
  → 英Alfresco社が提供するオープンソースソフトウェア。企業規模のコンテンツ
    管理を行える。それ以外に,Webコンテンツ管理やコラボレーションを低コ
    ストで行える

‣ Solrとは
  → Apache Luceneプロジェクトから派生した人気のある検索プラットフォー
    ム。ヒット部分のハイライト,ファセットサーチなど豊富な機能がある。ス
    ケーラブルで分散した検索やインデクスレプリケーションも可能
パターン1:AlfrescoとSolrが別居
パターン2:AlfrescoとSolrが同居
ソースコード解説
Alfresco Solr Plugin側


‣ (省略)
Alfresco側


‣ SolrSearchService
  → 前回やった

‣ SolrQueryHTTPClient
  → 前回やった

‣ Alfresco Solr Pluginでのインデクシングに
  必要な情報を渡すWeb Script
  → ここから
Web Script


‣ Alfresco Solr PluginへAlfrescoの情報を渡す
  → webapps/alfresco/WEB-INF/classes/alfresco/templates/
    webscripts/org/alfresco/repository/solr/に設定ファイル群が存在

     aclChangeSets,acls,aclsReaders

     model,modelsdiff

     nodeContent,nodes,nodesMetaData

     transactions
Javaクラスの指定


‣ 各Web Scriptで利用するJavaクラスの指定
     → webapps/alfresco/WEB-INF/classes/alfresco/web-scripts-
       application-context.xml

L.1431辺り
  <!--                                                                      -->
  <!-- SOLR                                                                 -->
  <!--                                                                      -->
  <!--                                                                      -->


 <bean id="solrSerializer" class="org.alfresco.repo.web.scripts.solr.SOLRSerializer" init-method="init">
   <property name="dictionaryService" ref="dictionaryService"/>
   <property name="namespaceService" ref="namespaceService"/>
 </bean>


  <bean id="webscript.org.alfresco.repository.solr.aclChangeSets.get"
      class="org.alfresco.repo.web.scripts.solr.AclChangeSetsGet"
      parent="webscript">
    <property name="solrTrackingComponent" ref="solrTrackingComponent"/>
  </bean>
(後略)
aclChangeSets


‣ 利用ファイル群
 → aclChangeSets.get.desc.xml(Web Script description)

 → aclChangeSets.get.json.ftl(FreeMarker Template)

 → org.alfresco.repo.web.scripts.solr.AclChangeSetsGet(Java)

‣ 目的
 → 特定時間以後のACL変更(List<AclChangeSet>)を取得する

‣ 引数
 → fromId,fromTime,maxResults(desc.xml)

 → toId,toTime(隠しパラメータ)
aclChangeSets(Call Tree)


‣ L.63 AclChangeSetsGet#executeImpl
  → L.157 SOLRTrackingComponentImpl#getAclChangeSets

  → L.88 SOLRDAOImpl#getAclChangeSets

     この後,iBatis経由でDBから値を取得


‣ solr-common-SqlMap.xml
  → select_ChangeSets_Summary

     返り値がAclChangeSetに格納される
acls


‣ 利用ファイル群
  → acls.post.desc.xml(Web Script description)

  → acls.post.json.ftl(FreeMarker Template)

  → org.alfresco.repo.web.scripts.solr.AclsGet(Java)

‣ 目的
  → 与えられたACL変更に対応するACLを取得する

‣ 引数
  → fromId,maxResults(desc.xml)
acls(Call Tree)


‣ L.60 AclsGet#executeImpl
  → L.113 #buildModel

  → L.171 SOLRTrackingComponentImpl#getAcls

  → L.115 SOLRDAOImpl#getAcls

     この後、iBatis経由でDBから値を取得


‣ solr-common-SqlMap.xml
  → select_AclsByChangeSetIds

     返り値がAclに格納される
aclsReaders


‣ 利用ファイル群
  → aclsReaders.post.desc.xml(Web Script description)

  → aclsReaders.post.json.ftl(FreeMarker Template)

  → org.alfresco.repo.web.scripts.solr.AclsReadersGet(Java)

‣ 目的
  → 与えられたACLのreaderを取得する

‣ 引数
aclsReaders(Call Tree)


‣ L.60 AclsReadersGet#executeImpl
  → L.107 #buildModel

  → L.199 SOLRTrackingComponentImpl#getAclsReaders

  → L.1066 AclDAOImpl#getAccessControlList

  → #getAccessControlListImpl

     return AccessControlList
model


‣ 利用ファイル群
 → model.get.desc.xml(Web Script description)

 → org.alfresco.repo.web.scripts.solr.AlfrescoModelGet(Java)

‣ 目的
 → 与えられた名称のモデルを取得する

‣ 引数
 → modelQName(隠しパラメータ)
model(Call Tree)


‣ L.46 AlfrescoModelGet#execute
  → L.70 #handle

  → L.746 SOLRTrackingComponentImpl#getModel

  → L.75 DictionaryComponent#getModel

  → L.871 DictionaryDAOImpl#getModel

  → #getCompiledModel

     return CompiledModel
modelsdiff


‣ 利用ファイル群
 → modelsdiff.post.desc.xml(Web Script description)

 → modelsdiff.post.json.ftl(FreeMarker Template)

 → org.alfresco.repo.web.scripts.solr.AlfrescoModelsDiff(Java)

‣ 目的
 → 与えられたモデルの差分を取得する

‣ 引数
 → models(JSONArray,隠しパラメータ)
modelsdiff(Call Tree)


‣ L.42 AlfrescoModelsDiff#executeImpl
  → L.77 #buildModel

  → L.768 SOLRTrackingComponentImpl#getModelDiffs

  → L.67 DictionaryComponent#getAllModels

  → L.791 DictionaryDAOImpl#getModels

  → #getCompiledModels
nodeContent


‣ 利用ファイル群
 → nodeContent.get.desc.xml(Web Script description)

 → org.alfresco.repo.web.scripts.solr.NodeContentGet(Java)

‣ 目的
 → 与えられたノード属性の値をテキストで取得する

‣ 引数
 → nodeId,propertyQName(desc.xml)
nodeContent(Call Tree)


‣ L.202 NodeContentGet#execute
 → StreamContent#streamContentImpl

    ストリームとしてレスポンスをクライアントへ返す
nodes


‣ 利用ファイル群
 → nodes.post.desc.xml(Web Script description)

 → nodes.post.json.ftl(FreeMarker Template)

 → org.alfresco.repo.web.scripts.solr.NodesGet(Java)

‣ 目的
 → トランザクション内で更新/削除されたノードを取得する

‣ 引数
 → txnIds,fromTxnId,toTxnId,fromNodeId,toNodeId

 → excludeAspects,includeAspectsなど(全て隠しパラメータ)
nodes(Call Tree)


‣ L.183 NodesGet#executeImpl
  → L.296 SOLRTrackingComponentImpl#getNodes

  → L.149/L.155 SOLRDAOImpl#getNodes

     この後、iBatis経由でDBから値を取得


‣ solr-common-SqlMap.xml
  → select_Txn_Nodes

     返り値がNodeに格納される
nodesMetaData


‣ 利用ファイル群
 → nodesMetaData.post.desc.xml(Web Script description)

 → nodesMetaData.post.json.ftl(FreeMarker Template)

 → org.alfresco.repo.web.scripts.solr.NodesMetaDataGet(Java)

‣ 目的
 → 与えられたノードのメタデータを取得する

‣ 引数
 → nodeIds,fromNodeId,toNodeId,maxResults

 → includeAclId,includeAspectsなど(全て隠しパラメータ)
nodesMetaData(Call Tree)


‣ L.181 NodesMetaDataGet#executeImpl
 → L.735 SOLRTrackingComponentImpl#getNodesMetadata

 → NodeMetaDataQueryRowHandler#processResult

    callbackを使って最終的にMetaDataを取得
transactions


‣ 利用ファイル群
  → transactions.get.desc.xml(Web Script description)

  → transactions.get.json.ftl(FreeMarker Template)

  → org.alfresco.repo.web.scripts.solr.TransactionsGet(Java)

‣ 目的
  → 与えられた時間に含まれるトランザクションを取得する

‣ 引数
  → fromTxnId,fromCommitTime,maxResults(desc.xml)

  → minTxnId,maxTxnId,toCommitTime(隠しパラメータ)
transactions(Call Tree)


‣ L.68 TransactionsGet#executeImpl
  → L.280 SOLRTrackingComponentImpl#getTransactions

  → L.136 SOLRDAOImpl#getTransactions

     この後、iBatis経由でDBから値を取得


‣ solr-common-SqlMap.xml
  → select_Txns

     return Transaction
おわりに
参考


‣ ソースコード関連
 → https://wiki.alfresco.com/wiki/
   Alfresco_SVN_Development_Environment

 → http://wiki.alfresco.com/wiki/Source_Code
Copyright 2012 tachibanakikaku.com. All rights reserved.

AlfrescoとSolr(後編)

  • 1.
    AlfrescoとSolr(後編) - Alfresco勉強会 第12回- 2012/12/12 @mryoshio Copyright 2012 tachibanakikaku.com. All rights reserved.
  • 2.
    目次 ‣ 自己紹介 ‣ 前回のおさらい ‣ソースコード解説 ‣ おわりに
  • 3.
    自己紹介 ‣ mryoshio → A社の社員 → AlfrescoやLiferayのコンサルタント → ソースコードを読んだりカスタマイズしたりサポートしたり → Twitterとか色々なところにいます → もう少しPythonで遊びたいと思いつつできてない → 最近はこたつに入って仕事してます
  • 4.
  • 5.
    AlfrescoとSolr ‣ Alfrescoとは → 英Alfresco社が提供するオープンソースソフトウェア。企業規模のコンテンツ 管理を行える。それ以外に,Webコンテンツ管理やコラボレーションを低コ ストで行える ‣ Solrとは → Apache Luceneプロジェクトから派生した人気のある検索プラットフォー ム。ヒット部分のハイライト,ファセットサーチなど豊富な機能がある。ス ケーラブルで分散した検索やインデクスレプリケーションも可能
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
    Alfresco側 ‣ SolrSearchService → 前回やった ‣ SolrQueryHTTPClient → 前回やった ‣ Alfresco Solr Pluginでのインデクシングに 必要な情報を渡すWeb Script → ここから
  • 11.
    Web Script ‣ AlfrescoSolr PluginへAlfrescoの情報を渡す → webapps/alfresco/WEB-INF/classes/alfresco/templates/ webscripts/org/alfresco/repository/solr/に設定ファイル群が存在 aclChangeSets,acls,aclsReaders model,modelsdiff nodeContent,nodes,nodesMetaData transactions
  • 12.
    Javaクラスの指定 ‣ 各Web Scriptで利用するJavaクラスの指定 → webapps/alfresco/WEB-INF/classes/alfresco/web-scripts- application-context.xml L.1431辺り <!-- --> <!-- SOLR --> <!-- --> <!-- --> <bean id="solrSerializer" class="org.alfresco.repo.web.scripts.solr.SOLRSerializer" init-method="init"> <property name="dictionaryService" ref="dictionaryService"/> <property name="namespaceService" ref="namespaceService"/> </bean> <bean id="webscript.org.alfresco.repository.solr.aclChangeSets.get" class="org.alfresco.repo.web.scripts.solr.AclChangeSetsGet" parent="webscript"> <property name="solrTrackingComponent" ref="solrTrackingComponent"/> </bean> (後略)
  • 13.
    aclChangeSets ‣ 利用ファイル群 →aclChangeSets.get.desc.xml(Web Script description) → aclChangeSets.get.json.ftl(FreeMarker Template) → org.alfresco.repo.web.scripts.solr.AclChangeSetsGet(Java) ‣ 目的 → 特定時間以後のACL変更(List<AclChangeSet>)を取得する ‣ 引数 → fromId,fromTime,maxResults(desc.xml) → toId,toTime(隠しパラメータ)
  • 14.
    aclChangeSets(Call Tree) ‣ L.63AclChangeSetsGet#executeImpl → L.157 SOLRTrackingComponentImpl#getAclChangeSets → L.88 SOLRDAOImpl#getAclChangeSets この後,iBatis経由でDBから値を取得 ‣ solr-common-SqlMap.xml → select_ChangeSets_Summary 返り値がAclChangeSetに格納される
  • 15.
    acls ‣ 利用ファイル群 → acls.post.desc.xml(Web Script description) → acls.post.json.ftl(FreeMarker Template) → org.alfresco.repo.web.scripts.solr.AclsGet(Java) ‣ 目的 → 与えられたACL変更に対応するACLを取得する ‣ 引数 → fromId,maxResults(desc.xml)
  • 16.
    acls(Call Tree) ‣ L.60AclsGet#executeImpl → L.113 #buildModel → L.171 SOLRTrackingComponentImpl#getAcls → L.115 SOLRDAOImpl#getAcls この後、iBatis経由でDBから値を取得 ‣ solr-common-SqlMap.xml → select_AclsByChangeSetIds 返り値がAclに格納される
  • 17.
    aclsReaders ‣ 利用ファイル群 → aclsReaders.post.desc.xml(Web Script description) → aclsReaders.post.json.ftl(FreeMarker Template) → org.alfresco.repo.web.scripts.solr.AclsReadersGet(Java) ‣ 目的 → 与えられたACLのreaderを取得する ‣ 引数
  • 18.
    aclsReaders(Call Tree) ‣ L.60AclsReadersGet#executeImpl → L.107 #buildModel → L.199 SOLRTrackingComponentImpl#getAclsReaders → L.1066 AclDAOImpl#getAccessControlList → #getAccessControlListImpl return AccessControlList
  • 19.
    model ‣ 利用ファイル群 →model.get.desc.xml(Web Script description) → org.alfresco.repo.web.scripts.solr.AlfrescoModelGet(Java) ‣ 目的 → 与えられた名称のモデルを取得する ‣ 引数 → modelQName(隠しパラメータ)
  • 20.
    model(Call Tree) ‣ L.46AlfrescoModelGet#execute → L.70 #handle → L.746 SOLRTrackingComponentImpl#getModel → L.75 DictionaryComponent#getModel → L.871 DictionaryDAOImpl#getModel → #getCompiledModel return CompiledModel
  • 21.
    modelsdiff ‣ 利用ファイル群 →modelsdiff.post.desc.xml(Web Script description) → modelsdiff.post.json.ftl(FreeMarker Template) → org.alfresco.repo.web.scripts.solr.AlfrescoModelsDiff(Java) ‣ 目的 → 与えられたモデルの差分を取得する ‣ 引数 → models(JSONArray,隠しパラメータ)
  • 22.
    modelsdiff(Call Tree) ‣ L.42AlfrescoModelsDiff#executeImpl → L.77 #buildModel → L.768 SOLRTrackingComponentImpl#getModelDiffs → L.67 DictionaryComponent#getAllModels → L.791 DictionaryDAOImpl#getModels → #getCompiledModels
  • 23.
    nodeContent ‣ 利用ファイル群 →nodeContent.get.desc.xml(Web Script description) → org.alfresco.repo.web.scripts.solr.NodeContentGet(Java) ‣ 目的 → 与えられたノード属性の値をテキストで取得する ‣ 引数 → nodeId,propertyQName(desc.xml)
  • 24.
    nodeContent(Call Tree) ‣ L.202NodeContentGet#execute → StreamContent#streamContentImpl ストリームとしてレスポンスをクライアントへ返す
  • 25.
    nodes ‣ 利用ファイル群 →nodes.post.desc.xml(Web Script description) → nodes.post.json.ftl(FreeMarker Template) → org.alfresco.repo.web.scripts.solr.NodesGet(Java) ‣ 目的 → トランザクション内で更新/削除されたノードを取得する ‣ 引数 → txnIds,fromTxnId,toTxnId,fromNodeId,toNodeId → excludeAspects,includeAspectsなど(全て隠しパラメータ)
  • 26.
    nodes(Call Tree) ‣ L.183NodesGet#executeImpl → L.296 SOLRTrackingComponentImpl#getNodes → L.149/L.155 SOLRDAOImpl#getNodes この後、iBatis経由でDBから値を取得 ‣ solr-common-SqlMap.xml → select_Txn_Nodes 返り値がNodeに格納される
  • 27.
    nodesMetaData ‣ 利用ファイル群 →nodesMetaData.post.desc.xml(Web Script description) → nodesMetaData.post.json.ftl(FreeMarker Template) → org.alfresco.repo.web.scripts.solr.NodesMetaDataGet(Java) ‣ 目的 → 与えられたノードのメタデータを取得する ‣ 引数 → nodeIds,fromNodeId,toNodeId,maxResults → includeAclId,includeAspectsなど(全て隠しパラメータ)
  • 28.
    nodesMetaData(Call Tree) ‣ L.181NodesMetaDataGet#executeImpl → L.735 SOLRTrackingComponentImpl#getNodesMetadata → NodeMetaDataQueryRowHandler#processResult callbackを使って最終的にMetaDataを取得
  • 29.
    transactions ‣ 利用ファイル群 → transactions.get.desc.xml(Web Script description) → transactions.get.json.ftl(FreeMarker Template) → org.alfresco.repo.web.scripts.solr.TransactionsGet(Java) ‣ 目的 → 与えられた時間に含まれるトランザクションを取得する ‣ 引数 → fromTxnId,fromCommitTime,maxResults(desc.xml) → minTxnId,maxTxnId,toCommitTime(隠しパラメータ)
  • 30.
    transactions(Call Tree) ‣ L.68TransactionsGet#executeImpl → L.280 SOLRTrackingComponentImpl#getTransactions → L.136 SOLRDAOImpl#getTransactions この後、iBatis経由でDBから値を取得 ‣ solr-common-SqlMap.xml → select_Txns return Transaction
  • 31.
  • 32.
    参考 ‣ ソースコード関連 →https://wiki.alfresco.com/wiki/ Alfresco_SVN_Development_Environment → http://wiki.alfresco.com/wiki/Source_Code
  • 33.