Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

15
第 33 第 Alfresco 第第第 Alfresco 5.1 第第第第第第第第第第第第第第第第第 & Alfresco SDK 第第第第第第第第2016/05/25 @_tasky

Transcript of Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

Page 1: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

第 33 回 Alfresco 勉強会Alfresco 5.1 でコンテンツ自動削除を実装してみた( & Alfresco SDK を使った話も少々)

2016/05/25@_tasky

Page 2: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

自己紹介 私は…

◦ @_tasky 日頃は…

◦ 株式会社イージフで Alfresco や Liferay をいじってます◦ 2 児 (5 歳♀ , 2 歳♀ ) の父親業やってます◦ Ingress エージェント業も少々

Page 3: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

Contents

有効期限の過ぎたコンテンツのアーカイブ コンテンツ自動削除機能の概要 コンテンツ自動削除機能の実装

◦ Alfresco SDK◦ スケジュールジョブ

デモ

Page 4: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

有効期限の切れたコンテンツのアーカイブ よくある要件

◦ コンテンツの属性に有効期限を持たせる◦ 有効期限を過ぎたコンテンツを自動的にアーカイブ( or 削除)する

Effectivity (有効性)アスペクトの利用◦ Effective From (有効期限開始日)属性◦ Effective To (有効期限終了日)属性

が、 Effectivity アスペクトを付けたところで、有効期限終了日を考慮して何がしかの処理を行う機能は実装されていない ⇒ これを実装します

Page 5: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

コンテンツ自動削除機能の概要 コンテンツの属性に有効期限を持たせる

◦ 前述の Effectivity (有効性)アスペクトを使い、コンテンツにEffective From (有効期限開始日)と Effective To (有効期限終了日)を設定する ⇒ Alfresco のルール機能を使うと自動的に Effectivity アスペクトを付与することができる

有効期限を過ぎたコンテンツを自動的に削除する◦ 日次バッチ等を想定し、スケジュールジョブとして実装する◦ “Effectivity アスペクトを持つ && Effective To の値 < 今日”なコンテンツを削除する

⇒ Alfresco の一般的な Scheduled Job と同じ形で実装する

Page 6: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

コンテンツ自動削除機能の実装 Alfresco SDK (昔の Maven Alfresco SDK )を使って開発

◦ Alfresco Repository (Platform) のみのカスタマイズ プロジェクトの作成方法は以下の記事を参照

http://www.slideshare.net/terajun/alfresco26-alfresco-sdk

主要なポイントは以下のとおり◦ アーキタイプ : org.alfresco.maven.archetype:alfresco-amp-

archetype 2.2.0 (Alfresco Repository AMP アーキタイプ )◦ 生成された pom.xml の修正

<alfresco.version>5.1.f</alfresco.version>◦ Eclipse の Maven build Configuration

Goals : install Profiles : amp-to-war JRE : JavaSE-1.8 VM arguments : -Xms1G -Xmx2G -noverify

Page 7: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

コンテンツ自動削除機能の実装 config/alfresco/module/content-archive-sample/content/

service-context.xml◦ Spring bean 定義ファイル◦ ジョブ実装、ジョブ実体、トリガを定義

config/alfresco/module/content-archive-sample/alfresco-global.properties◦ bean 定義が参照するジョブ実行タイミング等を設定

IneffectiveContentArchiver.java◦ ジョブ処理内容の実装クラス

IneffectiveContentArchiveJob.java◦ ジョブ実体を表すクラス◦ bean 定義で指定された処理を実行する

Page 8: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

service-context.xml

ineffectiveContentArchiver : ジョブ処理内容の実装定義 ineffectiveContentArchiverJobDetail : ジョブ実体定義 ineffectiveContentArchiverTrigger : ジョブのスケジュール実行定義

<bean id="ineffectiveContentArchiver" class="jp.aegif.alfresco.repo.content.archive.IneffectiveContentArchiver">     <property name="searchService" ref="searchService" />     <property name="nodeService" ref="nodeService" />     <property name="transactionService" ref="transactionService" /></bean><bean id="ineffectiveContentArchiverJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">     <property name="jobClass" value="jp.aegif.alfresco.repo.content.archive.IneffectiveContentArchiveJob" />     <property name="jobDataAsMap">         <map>             <entry key="ineffectiveContentArchiver">                 <ref bean="ineffectiveContentArchiver" />             </entry>             <entry key="jobLockService">                 <ref bean="jobLockService" />             </entry>         </map>     </property></bean><bean id="ineffectiveContentArchiverTrigger" class="org.alfresco.util.CronTriggerBean">     <property name="jobDetail" ref="ineffectiveContentArchiverJobDetail" />     <property name="scheduler" ref="schedulerFactory" />     <property name="cronExpression" value="${ineffective.content.archive.cronExpression}" />     <property name="startDelay" value="${ineffective.content.archive.cronStartDelay}" /></bean>

Page 9: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

alfresco-global.properties

ジョブ実行タイミング等を設定 bean 定義から参照される ineffective.content.archive.cronExpression :

◦ ジョブ実行タイミングの cron 表記◦ Quartz の cron フォーマットに従うので ”秒 分 時 日 月 曜日”

ineffective.content.archive.cronStartDelay : ◦ サーバ起動時の実行遅延(ミリ秒)

ineffective.content.archive.cronExpression=0 * * * * ?ineffective.content.archive.cronStartDelay=60000

Page 10: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

IneffectiveContentArchiver.java

Effectivity アスペクトを持ち、かつ Effectivity To (cm:to) 属性が今日より古いコンテンツを検索する ヒットしたコンテンツを削除する

◦ 正確には、ゴミ箱に入りますpublic void execute() {     transactionService.getRetryingTransactionHelper().doInTransaction(         new RetryingTransactionCallback<Object>() {             @Override             public Object execute() throws Throwable {                 String query = "+ASPECT:\"cm:effectivity\" +@cm\\:to:[MIN TO NOW]";                 ResultSet rs = null;                 SearchParameters sp = new SearchParameters();                 sp.setLanguage(SearchService.LANGUAGE_LUCENE);                 sp.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);                 sp.setQuery(query);                 rs = searchService.query(sp);                 for (NodeRef nodeRef : rs.getNodeRefs()) {                     nodeService.deleteNode(nodeRef);                 }                 logger.debug("Archive " + rs.length() + " nodes");                 return null;             }     });}

Page 11: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

IneffectiveContentArchiveJob.java

AbstractScheduledLockedJob を継承すると cluster aware なJob になる

bean 定義の jobDataAsMap で指定されたジョブ実装を読み込んで実行するpublic class IneffectiveContentArchiveJob extends AbstractScheduledLockedJob implements StatefulJob {     @Override     public void executeJob(JobExecutionContext context) throws JobExecutionException {         JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();         Object ineffectiveContentArchiverObject = jobDataMap.get("ineffectiveContentArchiver");         if (ineffectiveContentArchiverObject == null || !(ineffectiveContentArchiverObject instanceof IneffectiveContentArchiver)) {             throw new AlfrescoRuntimeException("Invalid JobData for IneffectiveContentArchiveJob");         }

         final IneffectiveContentArchiver ineffectiveContentArchiver = (IneffectiveContentArchiver)ineffectiveContentArchiverObject;         AuthenticationUtil.runAsSystem(new RunAsWork<Object>() {             @Override             public Object doWork() throws Exception {                 ineffectiveContentArchiver.execute();                 return null;             }         });     }}

Page 12: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

テスト用 Alfresco Share の準備 Alfresco Repository AMP アーキタイプを使うと、テスト用 Tomcatの起動ができる ただし、 Alfresco Repository (Platform) しか起動しないので、別途

Alfresco Share を起動する必要がある ⇒ Alfresco Share AMP アーキタイプを使って Maven Project を作成し、テスト用 Alfresco Share を起動する

主要なポイントは以下のとおり◦ アーキタイプ : org.alfresco.maven.archetype:share-amp-archetype 2.2.0◦ 生成された pom.xml の修正

<alfresco.version>5.1.f</alfresco.version> spring-surf-api dependency の記述変更

◦ Eclipse の Maven build Configuration Goals : install Profiles : amp-to-war Parameter : dependency.surf.version=6.3 JRE : JavaSE-1.8

<dependency> <groupId>org.alfresco.surf</groupId> <artifactId>spring-surf-api</artifactId> <version>${dependency.surf.version}</version> <scope>provided</scope></dependency>

Page 13: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

デモ 環境

◦ Windows 10◦ Alfresco Community Edition 5.1.f◦ Alfresco SDK 2.2.0

URL◦ Alfresco Repository : http://localhost:8080/alfresco/◦ Alfresco Share : http://localhost:8081/share/

サンプルコードhttps://bitbucket.org/tasuku_otani/content-archive-sample

Page 14: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

まとめ 有効期間を過ぎたコンテンツを自動削除するスケジュールジョブを作った 課題

◦ 有効期限終了日当日のコンテンツも削除しちゃってる◦ 削除じゃなくてアーカイブしたい

Page 15: Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた

おまけ aegif Labo blog やってます

http://aegif-labo.blogspot.jp/

2016/05/17 に Alfresco Community Edition 5.1.g がリリースされました◦ 5.1.f との差分は ImageMagick 脆弱性 (ImageTragick) 対応のみhttps://wiki.alfresco.com/wiki/Community_file_list_201605-GA