intra-mart Accel Platform IM-ContentsSearch for IM-Workflow 仕様書 第2版 2017-08-01

6. ワークフロークローラの拡張

ワークフロークローラでは、ワークフローの案件情報を「コンテンツ作成仕様 」の内容でSolrサーバに登録しますが、ワークフロークローラ用のリスナーを作成して追加することで、登録情報として独自の項目を追加することが可能です。
この章では、独自の項目を登録情報に追加するためのリスナーの作成方法について説明します。
なお、この章で登場する設定例やサンプルプログラムは、IM-Workflow で製品サンプルとして提供している「物品購買」の案件情報を文書の独自項目として追加することを目的としたサンプルです。

6.1. リスナーの呼び出し

ワークフロークローラは案件単位で案件情報を文書として登録していきますが、登録処理の直前に設定ファイルに定義されたリスナーを呼び出し、リスナーが存在した場合はリスナーの項目追加メソッドを実行します。

6.2. リスナーの設定

作成したリスナークラスは、plugin.xml で設定します。
  • 対象ファイル

    WEB-INF/plugin/jp.co.intra_mart.sample.contentssearch.workflow.crawler.listener/plugin.xml
    

    コラム

    WEB-INF/plugin 配下のプラグインフォルダ名は任意です。
    すでに存在するプラグインフォルダと重複しないフォルダ名を指定してください。
  • 設定例

    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
       <extension point="jp.co.intra_mart.foundation.contentssearch.workflow.crawler">
          <imwcrawler-add-listener id="jp.co.intra_mart.sample.contentssearch.workflow.crawler.listener">
             <listener-class>jp.co.intra_mart.sample.workflow.purchase.listener.WorkflowItemDataCrawlingAddListner</listener-class>
          </imwcrawler-add-listener>
       </extension>
    </plugin>
    

    タグについて説明します。

    • extension タグ

      固定指定です。
      上記のまま指定してください。
    • imwcrawler-add-listener タグ

      id 属性を必ず指定してください。拡張ポイントが共通のプラグインを複数定義する場合は、プラグイン間で重複しない id を指定してください。
    • listener-class タグ

      作成したリスナークラスを指定します。

    コラム

    ひとつの plugin.xml に複数のリスナークラスを指定する場合は、imwcrawler-add-listener タグを複数指定してください。

    <?xml version="1.0" encoding="UTF-8"?>
    <plugin>
       <extension point="jp.co.intra_mart.foundation.contentssearch.workflow.crawler">
          <imwcrawler-add-listener id="jp.co.intra_mart.sample.contentssearch.workflow.crawler.listener.item">
             <listener-class>jp.co.intra_mart.sample.workflow.purchase.listener.WorkflowItemDataCrawlingAddListner</listener-class>
          </imwcrawler-add-listener>
          <imwcrawler-add-listener id="jp.co.intra_mart.sample.contentssearch.workflow.crawler.listener.trip">
             <listener-class>jp.co.intra_mart.sample.workflow.purchase.listener.WorkflowTripDataCrawlingAddListner</listener-class>
          </imwcrawler-add-listener>
       </extension>
    </plugin>
    

6.3. リスナーの作成

作成するリスナーは以下のインタフェースを実装している必要があります。
jp.co.intra_mart.foundation.contentssearch.workflow.crawler.listener.WorkflowMatterCrawlingAddListener

6.3.1. 実処理の記述

登録情報に独自の項目を追加するための実処理は addInputContent メソッド内に記述します。
addInputContent メソッドの引数には、文書登録用オブジェクト、システム案件ID、ユーザデータID が渡されます。
リスナーでは以下の処理を行います。
  1. 引数のパラメータ情報を元に、アプリケーションデータを取得する。

  2. アプリケーションデータを登録情報に追加するか判定を行う。

    ※ 登録の要否判定内容はクローラの要件によって決定してください。

  3. 引数の文書登録用オブジェクトにアプリケーションデータを追加する。

    • 検索対象となるテキストフィールドにデータを登録したい場合

      jp.co.intra_mart.foundation.contentssearch.model.content.InputContent # addText メソッドを使用
    • 表示目的等の格納用データを登録したい場合

      jp.co.intra_mart.foundation.contentssearch.model.content.InputContent # addValue メソッドを使用して動的フィールドにデータを追加します。

    注意

    いずれのフィールド値にも null 値を設定することはできませんので、注意してください。
表示用に登録したデータを専用のレイアウトで検索結果画面に表示したい場合には、上記以外に以下の処理を行う必要があります。
  • 文書種別の追加

    jp.co.intra_mart.foundation.contentssearch.model.content.InputContent # addType メソッドを使用
  • テンプレートの作成

  • 追加した文書種別情報を設定ファイルに設定

テンプレートの作成・設定ファイルへの設定方法についての詳細は、「 IM-ContentsSearch プログラミングガイド 」を参照してください。

6.3.2. ワークフロークローラのサンプルプログラム

package jp.co.intra_mart.sample.workflow.purchase.listener;

import static jp.co.intra_mart.foundation.contentssearch.model.field.Fields.STRING;
import static jp.co.intra_mart.foundation.contentssearch.web.common.Constants.TREE_FACET_SEPARATOR;
import static jp.co.intra_mart.foundation.contentssearch.workflow.common.Constants.IMW_DOCUMENT_TYPE;
import jp.co.intra_mart.foundation.contentssearch.exception.ContentsSearchCrawlingException;
import jp.co.intra_mart.foundation.contentssearch.model.content.InputContent;
import jp.co.intra_mart.foundation.contentssearch.workflow.crawler.listener.WorkflowMatterCrawlingAddListener;
import jp.co.intra_mart.framework.base.event.EventException;
import jp.co.intra_mart.framework.base.event.EventManager;
import jp.co.intra_mart.framework.base.event.EventManagerException;
import jp.co.intra_mart.framework.base.event.EventPropertyException;
import jp.co.intra_mart.framework.system.exception.ApplicationException;
import jp.co.intra_mart.framework.system.exception.SystemException;
import jp.co.intra_mart.sample.workflow.purchase.model.event.SelectEvent;
import jp.co.intra_mart.sample.workflow.purchase.model.event.SelectEventResult;

/**
 * サンプル 物品購買用 クローラ登録文書追加リスナー
 * @author INTRAMART
 */
public class WorkflowItemDataCrawlingAddListner implements WorkflowMatterCrawlingAddListener {

    @Override
    public void addInputContent(final InputContent inputContent, final String systemMatterId, final String userDataId) throws ContentsSearchCrawlingException {
        EventManager eventManager;
        try {
            // 1.引数のパラメータ情報を元に、アプリケーションデータを取得する。
            eventManager = EventManager.getEventManager();
            final SelectEvent selectEvent = (SelectEvent) eventManager.createEvent("imw_sample_purchase", "select");
            selectEvent.setUserDataId(userDataId);
            final SelectEventResult eventResult = (SelectEventResult) eventManager.dispatch(selectEvent, true);
            // 2.アプリケーションデータを登録情報に追加するか判定を行う。
            if (eventResult.getModelObject() == null) {
                return;
            }
            final String itemName = eventResult.getModelObject().getItemName();
            if (itemName == null) {
                return;
            }
            // 3.引数の文書登録用オブジェクトにアプリケーションデータを追加する。
            // 3-1.テキストフィールドに品名を追加
            inputContent.addText(itemName);
            // 3-2.動的フィールドに品名を追加
            inputContent.addValue(STRING.toField("item_name_string"), itemName);
            // 3-3.文書種別の追加(静的ファセット)
            inputContent.addType(IMW_DOCUMENT_TYPE + TREE_FACET_SEPARATOR + "purchase"); // "workflow$purchase"
        } catch (final EventManagerException e) {
            throw new ContentsSearchCrawlingException(e);
        } catch (final EventPropertyException e) {
            throw new ContentsSearchCrawlingException(e);
        } catch (final EventException e) {
            throw new ContentsSearchCrawlingException(e);
        } catch (final SystemException e) {
            throw new ContentsSearchCrawlingException(e);
        } catch (final ApplicationException e) {
            throw new ContentsSearchCrawlingException(e);
        }
    }

}

6.4. サンプルモジュール

この章で紹介したリスナーの設定ファイル、およびサンプルプログラムをまとめたサンプルユーザモジュールです。