intra-mart Accel Platform IMBox プログラミングガイド 第4版 2014-05-01

5. 送信側 IM-Propagation 追加プログラム

IMBoxでは受信側の IM-Propagation を用意しています。
送信側の実装を行うことで、IM-Propagation を利用して「 受信側 IM-Propagation 一覧 」に記載している処理が実行可能となります。
IM-Propagation についての詳細は、以下のドキュメントを参照してください。

5.1. 受信側 IM-Propagation 一覧

IMBoxで利用可能な受信側の IM-Propagation は以下となります。
IMBox受信側 IM-Propagation 一覧表
データの操作種別 概要
WATCH アプリケーションのウォッチを行います。
UNWATCH アプリケーションのウォッチ解除を行います。
SEND_NOTICE_MESSAGE ApplicationBoxへ通知メッセージを投稿します。(メッセージ形式で表示)
SEND_NOTICE_THREAD ApplicationBoxへ通知メッセージを投稿します。(スレッド形式で表示)
SEND_WATCH_MESSAGE ApplicationBoxへwatchユーザ宛てのメッセージを投稿します。(メッセージ形式で表示)
SEND_WATCH_THREAD ApplicationBoxへwatchユーザ宛てのメッセージを投稿します。(スレッド形式で表示)

5.2. サンプル実装

ここではサンプルとして、「ApplicationBoxへのwatchユーザ宛てのメッセージ投稿(メッセージ形式で表示)」の送信側の実装方法について説明します。
作成する資材は以下となります。

コラム

注意

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

送信するデータを格納するためのクラス(以下、「独自モデル」)を作成します。
送信するデータを格納するためのクラス
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package jp.co.intra_mart.sample.model;

import java.io.Serializable;
import java.util.Map;

/**
 * ApplicationBoxへのwatchユーザ宛てのメッセージ投稿(メッセージ形式で表示) 用の
 * 送信するデータを格納するための独自モデルクラス
 */
public class SampleOriginalModel implements Serializable {

    /** バージョン番号(新しく採番してください) */
    private static final long serialVersionUID = 1234567890123456789L;

    /** アプリケーションCD */
    private String applicationCd;

    /** 通知元ユーザのユーザCD */
    private String sendUserCd;

    /** 通知内容 */
    private String messageText;

    /** 投稿uri */
    private String uri;

    /** 投稿uriタイトル */
    private String uriTitle;

    /** URI添付ID */
    private String uriAttachId;

    /** 投稿uri内容 */
    private String uriText;

    /** 投稿URI添付パス */
    private String uriAttachPath;

    /** メッセージ種別コード */
    private String messageTypeCd;

    /** その他の属性 */
    private Map<String, String> attributes;

    /** ウォッチ対象の識別CD(複数指定可能) */
    private String[] targetIds;

    public String getApplicationCd() {
        return applicationCd;
    }

    public Map<String, String> getAttributes() {
        return attributes;
    }

    public String getMessageText() {
        return messageText;
    }

    public String getMessageTypeCd() {
        return messageTypeCd;
    }

    public String getSendUserCd() {
        return sendUserCd;
    }

    public String[] getTargetIds() {
        return targetIds;
    }

    public String getUri() {
        return uri;
    }

    public String getUriAttachId() {
        return uriAttachId;
    }

    public String getUriAttachPath() {
        return uriAttachPath;
    }

    public String getUriText() {
        return uriText;
    }

    public String getUriTitle() {
        return uriTitle;
    }

    public void setApplicationCd(final String applicationCd) {
        this.applicationCd = applicationCd;
    }

    public void setAttributes(final Map<String, String> attributes) {
        this.attributes = attributes;
    }

    public void setMessageText(final String messageText) {
        this.messageText = messageText;
    }

    public void setMessageTypeCd(final String messageTypeCd) {
        this.messageTypeCd = messageTypeCd;
    }

    public void setSendUserCd(final String sendUserCd) {
        this.sendUserCd = sendUserCd;
    }

    public void setTargetIds(String[] targetIds) {
        this.targetIds = targetIds;
    }

    public void setUri(final String uri) {
        this.uri = uri;
    }

    public void setUriAttachId(final String uriAttachId) {
        this.uriAttachId = uriAttachId;
    }

    public void setUriAttachPath(final String uriAttachPath) {
        this.uriAttachPath = uriAttachPath;
    }

    public void setUriText(final String uriText) {
        this.uriText = uriText;
    }

    public void setUriTitle(final String uriTitle) {
        this.uriTitle = uriTitle;
    }
}

5.2.2. 送信側のデータ変換クラス(Encoder)の作成

「独自モデル」を「送受信モデル(Generic)」に変換する機能を提供するクラス(以下、「データ変換クラス」)を作成します。
送信側のデータ変換クラス
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package jp.co.intra_mart.sample.encoder;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

import jp.co.intra_mart.foundation.propagation.exception.ConvertException;
import jp.co.intra_mart.foundation.propagation.model.generic.imbox.GenericSendWatchMessage;
import jp.co.intra_mart.foundation.propagation.sender.AbstractEncoder;
import jp.co.intra_mart.sample.model.SampleOriginalModel;

/**
 * ApplicationBoxへのwatchユーザ宛てのメッセージ投稿(メッセージ形式で表示) 用の
 * 送信側のデータ変換クラス(Encoder)です。
 */
public class SampleEncoder extends AbstractEncoder<SampleOriginalModel, GenericSendWatchMessage> {

    /**
     * @param model 変換前クラス
     * @return 変換後クラス
     * @throws ConvertException 
     */
    @Override
    public GenericSendNoticeThread encode(final SampleOriginalModel model) throws ConvertException {
        
        final GenericSendWatchMessage generic = new GenericSendWatchMessage();
        generic.setApplicationCd(model.getApplicationCd());
        generic.setSendUserCd(model.getSendUserCd());
        generic.setMessageText(model.getMessageText());
        generic.setUri(model.getUri());
        generic.setUriTitle(model.getUriTitle());
        generic.setUriAttachId(model.getUriAttachId());
        generic.setUriText(model.getUriText());
        generic.setUriAttachPath(model.getUriAttachPath());
        generic.setMessageTypeCd(model.getMessageTypeCd());
        generic.setTargetIds(model.getTargetIds());
        if (null != model.getAttributes()) {
            final Map<String, String> map = new LinkedHashMap<String, String>();
            for (final Entry<String, String> attribute : model.getAttributes().entrySet()) {
                map.put(attribute.getKey(), attribute.getValue());
            }
            generic.setAttributes(map);
        }
        return generic;
    }

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

コラム

IMBoxの「送受信モデル(Generic)」についての詳細は、「 APIドキュメント 」 を参照してください。

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

「独自モデル」「送受信モデル(Generic)」「データ変換クラス」を紐付けるためのマッピング設定を作成します。
マッピング設定は、以下の形式で記述します。
  • WEB-INF/conf/propagation-senders-config/{任意のファイル名}.xml
マッピング設定
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<propagation-senders-config xmlns="http://www.intra-mart.jp/propagation/senders-config" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.intra-mart.jp/propagation/senders-config propagation-senders-config.xsd">
  <sender source="jp.co.intra_mart.sample.model.SampleOriginalModel" operationType="SEND_WATCH_MESSAGE">
    <encoder class="jp.co.intra_mart.sample.encoder.SampleEncoder" />
  </sender>
</propagation-senders-config>
<sender> タグに以下の属性の設定を行います。
属性 内容 備考
source 「独自モデル」のパッケージ名を含むクラス名(完全修飾子) 送信するデータを格納するためのクラスの作成 で作成した独自モデルを設定します。
operationType データ変換対象の「データの操作種別」 ApplicationBoxへのwatchユーザ宛てのメッセージ投稿(メッセージ形式で表示)のデータの操作種別を設定します。
<encoder> タグに以下の属性の設定を行います。
属性 内容 備考
class 「データ変換クラス」のパッケージ名を含むクラス名(完全修飾子) 送信側のデータ変換クラス(Encoder)の作成 で作成したデータ変換クラスを設定します。

コラム

データの操作種別についての詳細は、「 IM-Propagation 送受信設定一覧 」-「 IM-Propagation 受信側一覧 」を参照してください。

5.2.4. データ送信処理を作成

データの送信処理を作成します。
作成したデータ送信処理(以下)を、アプリケーションから通知をしたいタイミングでコールしてください。
データ送信処理
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package jp.co.intra_mart.sample.sender;

import jp.co.intra_mart.sample.model.SampleOriginalModel;

/**
 * データ送信処理のサンプル実装です
 */
public class SampleSender {


    /**
     * データ送信処理です。
     * アプリケーションから通知をしたいタイミングでコールしてください。
     * 
     * @param sampleOriginalModel 独自モデル
     */
    public static void send(final SampleOriginalModel sampleOriginalModel) {
        final PropagationManager manager = PropagationManagerFactory.getInstance().getPropagationManager();
        try {
            // セッションを開始
            manager.begin();
            // データを送信
            manager.send("SEND_WATCH_MESSAGE", SampleOriginalModel.class, sampleOriginalModel, EmptyObject.class);
           // セッションを確定
            manager.decide();
        } catch (final BeginException e) {
            // manager.begin() に失敗した場合
        } catch (final SendException e) {
            // manager.send() に失敗した場合
        } catch (final DecideException e) {
            // manager.decide() に失敗した場合
        } catch (final Exception e) {
            // その他例外が発生した場合
        } finally {
         // セッションを中断。 manager.decide() が成功した場合は何もしない
            manager.abort();
        }
    }
}
上記の処理がコールされた場合に、ウォッチを行ったユーザのApplicationBoxにwatchユーザ宛てのメッセージが表示されます。