クラウド型 ワークフロー

Questetra と Cacoo の連携プレー (その1)

Questetra BPM Suite から Cacoo の図を新規作成し、その URL を取り込みます。

見返してみると Twilio ネタが3回続いていました。

そこで今回は Twilio から離れて、Cacoo と連携することに取り組みます。 Cacoo はWeb上で簡単に、サイトマップやワイヤーフレーム、フローチャート、マインドマップ、UML、ネットワーク図などの図を作成できるドローツールです。複数人で1つの図を同時に編集することができる、という特徴も持っています。

Questetra BPM Suite には、複数人でタスクを処理することを意図した、チームタスクという機能を持っています。今回はビジネスプロセス上の特定のチームタスクを Cacoo 上で行う、タスクの成果物として Cacoo 上で作成した図を Questetra BPM Suite に取り込むということを考えたいと思います。


特定のタスクを Cacoo 上で行うといっても、Questetra BPM Suite 上で特定のタスクを処理しようとしたら、いきなり Cacoo の図を編集する画面が開くということを実現することはできません。 そこで今回は、Questetra BPM Suite のタスク処理画面には、Cacoo の図のページへのリンクを置き、タスクの担当ユーザはそのリンクをクリックして Cacoo に遷移し、Cacoo で図を編集するという形にします。

タスク処理画面のイメージは、以下のようなものです。「以下のリンクをクリックし、Cacoo 上で作業を行なってください。」というメッセージで、Cacoo への遷移を促します。

このようなタスク処理画面を表示できるように、まず Cacoo の API を使って作業場所となる空の図を作成し、その URL を Questetra BPM Suite に取り込むようにします。

以下は全体の流れです。URL を Questetra BPM Suite に取り込むまでの流れは1~4です。本当は Questetra BPM Suite から直接 Cacoo の API を呼び出せれば良いのですが、Questetra BPM Suite の HTTP リクエストを行う機能、メッセージ送信中間イベント(HTTP) の機能が足りないので、ややこしくなっています。メッセージ送信中間イベント (HTTP) で Cacoo の API を呼び出すことはできるのですが、応答内容を解析して、URL をデータとして保持するようにできないのです。(愚痴)
qbpms-cacoo

1. Questetra BPM Suite から Google App Engine に HTTP リクエスト

メッセージ送信中間イベント (HTTP) から Google App Engine に HTTP リクエストを送ります。Google App Engine の Servlet プログラムを添付します。主要な部分を抜き出しています。

//パラメータの解析
ServletFileUpload upload = new ServletFileUpload();
String processInstanceId = null, title = null, apiKey = null;
try {
  FileItemIterator iterator = upload.getItemIterator(req);
  while (iterator.hasNext()) {
    FileItemStream item = iterator.next();
    if (!item.isFormField()) {
      continue;
    }
    switch (item.getFieldName()) {
      case "processInstanceId" :
        processInstanceId = IOUtils.toString(item.openStream(), "UTF-8");
        break;
      case "title" :
        title = IOUtils.toString(item.openStream(), "UTF-8");
        break;
      case "apiKey" :
        apiKey = IOUtils.toString(item.openStream(), "UTF-8");
        break;
    }
  }
} catch (FileUploadException e) {
  throw new IOException(e);
}

まず Questetra BPM Suite より送られてきた必要なパラメータを解析しています。メッセージ送信中間イベント (HTTP) から送られてくるデータは、multipart/form-data 形式ですので、ちょっと通常の方法ではパラメータの値を取得することができません。ここでは Apache Commons の Commons-Fileupload を使用してパラメータの値を取得しています。ちょっと、いや、かなり面倒ですね。(愚痴) 取得したパラメータは以下の3つで、1つを除いて、次のステップ2で使用するためのものです。

  • processInstanceId: Questetra BPM Suite において、呼び出し元業務プロセスを示す ID。これが無いと、値の戻し先が解らない。ステップ3で使用。
  • title: 作成する図のタイトル。ステップ2で使用。
  • apiKey: Cacoo の API にアクセスする際に使用する API キー。ステップ2で使用。

逆に言うと、Questetra BPM Suite のメッセージ送信中間イベント(HTTP) では、これらのパラメータを送る設定にする必要があります。title の値については、プロセスの件名を使用するということが考えられます。apiKey については、固定値として送信パラメータにセットします。詳細はステップ2で説明します。

2. Google App Engine から Cacoo に HTTP リクエスト

Google App Engine から Cacoo の API にアクセスし、空の図を作成します。その API については、ここに記載されています。API にアクセスする部分のプログラムは、ステップ1の Servlet プログラムの一部です。以下に抜粋します。

URL url = new URL(URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
try {
  conn.setDoOutput(true);
  conn.setRequestMethod("POST");

  OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
  writer.write("security=public");
  writer.write("&title=" + URLEncoder.encode(title, "UTF-8"));
  writer.write("&apiKey=" + URLEncoder.encode(apiKey, "UTF-8"));
  writer.close();

  if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
    //応答は JSON
    InputStreamReader reader = new InputStreamReader(conn.getInputStream(), "UTF-8");
    JSONObject obj = (JSONObject) JSONValue.parse(reader);
    reader.close();
    return (String) obj.get("url");
  } else {
    throw new IOException(conn.getResponseCode() + ":" + conn.getResponseMessage());
  }
} finally {
   conn.disconnect();
}

Java 標準クラスの java.net.HttpURLConnection で API にアクセスしています。メソッドは GET でも POST でもいずれでも構わないのですが、POST にしています。API アクセス時に指定しているパラメータは以下の3つです。

  • apiKey: APIにアクセスする際の認証方式の1つ。Cacoo の [設定] > [APIキー] より取得できます。caoo-api-key
  • title: 図のタイトル
  • security: 図の公開種別。今回は複数のユーザで図を編集できるようにしたいので、public (URL を知っている人は誰でも編集可能)を選択しています。

API の実行に成功すると、応答が JSON 形式で返ってきます。以下が応答サンプルです。

{
 "url" : "https://cacoo.com/diagrams/00e77f4dc9973517",
 "imageUrl" : "https://cacoo.com/diagrams/00e77f4dc9973517.png",
 "imageUrlForApi" : "https://cacoo.com/api/v1/diagrams/00e77f4dc9973517.png",
 "diagramId" : "00e77f4dc9973517",
 "title" : "shape1",
 "description" : null,
 "security" : "url",
 "ownerName" : "1MUJPfNEEeVUox15",
 "ownerNickname" : "Yoko",
 "owner" : {
   "name" : "1MUJPfNEEeVUox15",
   "nickname" : "Yoko",
   "type" : "cacoo",
   "imageUrl" : "https://cacoo.com/account/1MUJPfNEEeVUox15/image/32x32",
 },
 ...
}

欲しい URL は 図の URL ですが、サンプルの先頭にある url プロパティで指定されている値がそれにあたります。サンプルプログラムではJSON.simple を利用して、応答の JSON を解析し、この URL を取得しています。

 

長くなってきましたので、ここで一旦、一息入れたいと思います。次回はCacoo で新規作成した図の URL を、Questetra BPM Suite のデータとして取り込む部分、ステップ3~4について説明します。

あわせて読みたい
15.野望・展望・志 の前の記事 超交流会とは何なのか?
15.野望・展望・志 の次の記事 今週5日『BPMフォーラム』で講演シマス!
Hatanaka Akihiro の他の記事 Twilio で電話の無いコールセンター!? (日本語で「お待ちください」編)

アーカイブ

 RSS