intra-mart Accel Platform IM-LogicDesigner拡張プログラミングガイド 第3版 2016-12-01

8. フロートリガ

本章では、 IM-Propagation を利用したフローを実行するトリガを追加する方法を解説します。
IM-Propagation の詳細は「IM-Propagation 仕様書」を参照してください。

トリガを追加するには、以下のクラスを作成する必要があります。
  • カテゴリ
  • 受信するデータを格納するためのクラス
  • データ変換クラス (Decoder)
  • データ処理クラス (Procedure)
  • マッピング設定
カテゴリは一度作成を行ったら、再利用することが可能です。

注意

ここでは、「IM-Propagationプログラミングガイド」 - 「データを送る側の実装」を用いて送られてきたデータを受信した際にフローを実行するトリガを例に説明を行います。
データの送信側の実装が存在しない場合、トリガ設定を行ってもフローは実行されません。

8.1. カテゴリの作成

はじめに、トリガが所属するカテゴリの作成を行います。
カテゴリは全てJavaクラスで作成する必要があります。
カテゴリは jp.co.intra_mart.foundation.logic.trigger.category.TriggerEventCategory インタフェースを実装したカテゴリクラスを作成してください。
package org.example.logicdesigner.trigger;

import jp.co.intra_mart.foundation.logic.trigger.category.TriggerEventCategory

public class MyTriggerCategory implements TriggerEventCategory {

    @Override
    public String getCategoryId() {
        return "my_trigger_category";
    }

    @Override
    public String getDisplayName() {
        return "サンプルカテゴリ";
    }

    @Override
    public int getSortNumber() {
        return 100;
    }
}
  • getCategoryId には、カテゴリのIDとなる文字列を返却するよう実装します。
    getCategoryIdには、 im_ で始まる文字列は利用できません。
  • getDisplayName は、画面上に表示されるカテゴリ名を返却するよう実装します。
    多言語化を行う場合には、MessageManager API等を利用して利用者のロケールに沿ったカテゴリ名を返却するよう実装を行う必要があります。
  • getSortNumber は、カテゴリを表示する際に利用するソート順です。getSortNumberの値が小さい数ほど先頭に表示されます。

8.2. 受信するデータを格納するためのクラスの作成

受信するデータを格納するためのクラス(以下、「独自モデル」)を用意します。
独自モデルについては、「IM-Propagationプログラミングガイド」 - 「受信するデータを格納するためのクラスを作成する」を参照してください。
package org.example.logicdesigner.trigger;

public class MyTriggerData {

    private String resourceId;

    private String url;

    public String getResourceId() {
        return resorceId;
    }

    public String getUrl() {
        return url;
    }

    public void setResourceId(String resourceId) {
        this.resourceId = resorceId;
    }

    public void setUrl(String url) {
        this.url = url;
    }

}
独自モデルのプロパティに利用可能なデータ型は以下の通りです。
  • プリミティブ型
  • java.lang.String
  • java.lang.Boolean
  • java.lang.Byte
  • java.lang.Character
  • java.lang.Short
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Float
  • java.lang.Double
  • java.math.BigDecimal
  • java.math.BigInteger
  • java.util.Calendar
  • java.util.Date
  • java.util.Locale
  • java.util.TimeZone
  • jp.co.intra_mart.foundation.i18n.datetime.DateTime
  • jp.co.intra_mart.foundation.i18n.datetime.Duration
  • java.sql.Date
  • java.sql.Timestamp
  • jp.co.intra_mart.foundation.logic.data.basic.ByteArrayBinary
  • jp.co.intra_mart.foundation.logic.data.basic.InputStreamBinary
  • jp.co.intra_mart.foundation.service.client.file.PublicStorage
  • jp.co.intra_mart.foundation.service.client.file.SessionScopeStorage
  • java.util.Mapを実装するクラス java.util.HashMap等
  • java.lang.Object
上記のデータ型を内包する java.util.Collection インタフェース、または、java.util.List インタフェースの実装クラス(ArrayList, LinkedList等)を利用することが可能です。
Collection、Listを利用した場合には、そのプロパティのゲッタメソッドに @TypeHint アノテーションを付与し、Collection、Listが内包する型を指定する必要があります。
@TypeHint(String.class)
public List<String> getListData() {
    return listData;
}

8.3. データ変換クラスの作成

次に、「送受信モデル(Generic)」を「独自モデル」に変換する機能を提供するクラス(以下、「データ変換クラス」)を用意します。
データ変換クラスについて、詳しくは「IM-Propagationプログラミングガイド」 - 「受信側のデータ変換クラス(Decoder)を作成する」を参照してください。
package org.example.logicdesigner.trigger;

import jp.co.intra_mart.foundation.propagation.exception.ConvertException;
import jp.co.intra_mart.foundation.propagation.receiver.AbstractDecoder;

public class MyTriggerDecoder extends AbstractDecoder<SampleGenericData, MyTriggerData> {

    @Override
    public MyTriggerData decode(final SampleGenericData generic) throws ConvertException {
        MyTriggerData data = new MyTriggerData();
        data.setResourceId(generic.getResourceId());
        data.setUrl(generic.getUrl());
        return data;
    }

    @Override
    public Class<SampleGenericData> getGenericDataClass() {
        return SampleGenericData.class;
    }

}

8.4. データ処理クラスの作成

次に、メインのクラスとなるデータ処理クラスを実装していきます。
データ処理クラスは、jp.co.intra_mart.system.logic.trigger.propagation.LogicFlowPropagationTrigger クラスを継承して作成してください。
また、データ処理クラスには jp.co.intra_mart.foundation.logic.annotation.TriggerEvent アノテーションを付与する必要があります。 TriggerEventアノテーションが付与されたクラスは起動時にフローを実行するトリガとして読み込まれます。
package org.example.logicdesigner.trigger;

import jp.co.intra_mart.foundation.logic.annotation.TriggerEvent;
import jp.co.intra_mart.system.logic.trigger.propagation.LogicFlowPropagationTrigger;

@TriggerEvent(eventId="my_trigger", category=MyTriggerCategory.class, index=1)
public class MyTrigger extends LogicFlowPropagationTrigger<MyTriggerData> {
}
  • TriggerEvent アノテーションには、そのトリガのID(eventId)、所属するカテゴリ(category)、設定画面に表示する際に利用されるソート番号(index)を指定してください。
  • 継承した LogicFlowPropagationTrigger クラスで受信データのマッピングおよびトリガ設定で設定されたフローの実行が行われますので、データ処理クラスでフロー実行の処理を実装する必要はありません。

8.5. マッピング設定の作成

次に、ここまで作成した「データ変換クラス」「データ処理クラス」を紐付けるためのマッピング設定を作成します。
詳しくは「IM-Propagationプログラミングガイド」 - 「マッピング設定を作成する」を参照してください。
<?xml version="1.0" encoding="UTF-8"?>
<propagation-receivers-config xmlns="http://www.intra-mart.jp/propagation/receivers-config"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.intra-mart.jp/propagation/receivers-config propagation-receivers-config.xsd">
  <receiver source="jp.co.intra_mart.module_name.function_name.propagation.SenderModuleData" operationType="DATA_CREATED">
    <decoder class="org.example.logicdesigner.trigger.MyTriggerDecoder"/>
    <procedure class="org.example.logicdesigner.trigger.MyTrigger"/>
  </receiver>
</propagation-receivers-config>