AEM開発者ブログ by YAMATO

アドビ社のデリバリーパートナー大和株式会社のAEM開発者ブログです。

前のWFプロセスで定義した値を後のプロセスで取得する方法

AEM Developerの皆様お疲れさまです。大和株式会社の狩野です。

Qiitaのアドベントカレンダーに便乗して始めた記事投稿イベント4日目です。 今日4日目の内容は、前のWF(Workflow)プロセスで定義した値を後のプロセスで取得する方法についてです。

3日目の記事→【豆知識】コアコンポーネントの "trackingFeature" プロパティとは

WFプロセスをJavaで自作することはあると思うんですけど、そこで「このJavaコード内で定義した値を後で取り出したいな」なんてこともあると思います。 そういう時にどうするかを解説したいと思います。

定義した値の保存

例として、前のプロセスで一時ユーザを作成して、後のプロセスでそのユーザを削除するという動作の実装を行います。 前のプロセスで作成したユーザIDを保管しておいて、後のプロセスでユーザ削除のために取り出せるようにします。

なお、「ユーザを作成する」という部分のコードは今回関係ないので省かせていただきますがご了承ください。

import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowData;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;

import org.apache.commons.lang3.RandomStringUtils;

import org.osgi.service.component.annotations.Component;
import org.osgi.framework.Constants;

@Component(service = WorkflowProcess.class, property = { "process.label" + "=一時ユーザ作成",
        Constants.SERVICE_DESCRIPTION + "=一時的なユーザを作成します。このユーザはあとから削除されます" })
public class CreateTempUserProcess implements WorkflowProcess {
    @Override
    public final void execute(WorkItem workItem, WorkflowSession wfSession, MetaDataMap metaDataMap) throws WorkflowException {
        WorkflowData workflowData = workItem.getWorkflowData();
        final String userId = "temp-user-" + RandomStringUtils.randomAlphanumeric(8);
        final String password = RandomStringUtils.randomAlphanumeric(8);

        // ユーザID,パスワードをWorkflowDataに格納する
        workflowData.getMetaDataMap().put("userID", userId);
        workflowData.getMetaDataMap().put("password", password);
        wfSession.updateWorkflowData(workItem.getWorkflow(), workflowData);
        // ユーザを作成する処理...
    }
}

この wfSession.updateWorkflowData(workItem.getWorkflow(), workflowData); が大事です。 これを忘れるとそのJavaコードの実行が終わると値が消えてしまい保存できません。

保存した値の取り出し

例によって、保存した値の取り出し部分だけのコードを書きます。 「ユーザを削除する」という部分のコードは省きます。

import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowData;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;

import org.osgi.service.component.annotations.Component;
import org.osgi.framework.Constants;

@Component(service = WorkflowProcess.class, property = { "process.label" + "=一時ユーザ削除",
        Constants.SERVICE_DESCRIPTION + "=一時ユーザを削除するプロセスです" })
public class DeleteTempUserProcess implements WorkflowProcess {
    @Override
    public final void execute(WorkItem workItem, WorkflowSession wfSession, MetaDataMap metaDataMap) throws WorkflowException {
        WorkflowData workflowData = workItem.getWorkflowData();

        // ユーザ作成時に格納したユーザIDを取り出す
        String userID = workflowData.getMetaDataMap().get("userID", "");
        // ユーザを削除する処理
    }
}

put()したのをget()するだけですね。

最後に

以上となります。明日は青葉さんが執筆してくれます。内容は「AACS:ページプロパティのバルク編集」です。 お楽しみに。僕も楽しみにしてます。