問題

ワークフロープロセスステップの実装例を検索します。

解決策

Java のワークフロープロセスステップの実装は、JavaProcessExt インターフェイス(または外部属性を使用していない場合は JavaProcess)を実装するクラスです。

このクラスは、OSGi Service でなければならず、(WorkItem item, WorkflowSession session, String[] args)を実行するメソッドを実装する必要があります。このメソッドでは、指定されたオブジェクトである項目 (WorkItem) 及びセッション (WorkflowSession)をプロセスステップのビジネスロジックを実装するために使用できます。

このサービスをシステムで使用できるようになったら(例えば、バンドルに追加してインストールする場合)、Workflow GUI(ワークフローモデループロセスステップー実装)で選択できます。

注意:次の例は、実稼働版ではそのまま使用されない非常に単純な例です。
サービスをシステムで使用できるようにするには、バンドルの一つにのクラスの例を含め、が含まれていて、com.day.cq.examples.wf 外部のパッケージをマークする必要があります。

簡単なワークフロープロセスステップの例:

次のワークフロープロセスステップでは、次のステップへの使用可能なルートのみをチェックし、デフォルトとしてマークされているルートを処理し、またはルートがデフォルトとして設定されていない場合は、最初のルートとマークしてルートを処理し、ログを書き込みます。

package com.day.cq.examples.wf;

import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.exec.JavaProcessExt;
import com.day.cq.workflow.exec.Route;
import com.day.cq.workflow.exec.WorkItem;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.Arrays;

/**
 * <code>WorkflowProcessStep</code> simply shows how to advance to the next step
 *
 * @scr.component metatype="false"
 * @scr.service
 */
public class WorkflowProcessStep implements JavaProcessExt {

    /** Default log. */
    protected final Logger log = LoggerFactory.getLogger(WorkflowProcessStep.class);

    public void execute(WorkItem item, WorkflowSession session)
            throws Exception {
        try {
            log.info("executing: " + session.toString());
            boolean advanced = false;
            List<Route> routes = session.getRoutes(item);
            for (Route route : routes) {
                if (route.hasDefault()) {
                    String fromTitle = item.getNode().getTitle();
                    String toTitle = route.getDestinations().get(0).getTo().getTitle();
                    session.complete(item, route);
                    log.info(item.getId() + " advanced from " + fromTitle + " to " + toTitle);
                    advanced = true;
                }
            }
            // fallback if no route was marked as default
            if (!advanced) {
                session.complete(item, routes.get(0));
                String fromTitle = item.getNode().getTitle();
                String toTitle = routes.get(0).getDestinations().get(0).getTo().getTitle();
                log.info(item.getId() + " advanced from " + fromTitle + " to " + toTitle);
            }
        } catch (WorkflowException e) {
            log.error("Could not advance workflow.", e);
        }
    }

    public void execute(WorkItem item, WorkflowSession session, String args[]) throws Exception {
        log.info("Process Arguments" + Arrays.toString(args));
        execute(item, session);
    }
}

翻訳ワークフロープロセスステップの例:

これを使用すると、各言語の翻訳ジョブに対して平行な XOR ステップを定義できます。各ステップは、別のユーザーまたはグループに属することができます。
プロセスの引数として、デフォルト言語(例えば、de)及び階層レベル(デフォルトは3)を設定できます。

注意:Workflow GUI では三つ以上の XOR(または AND)を表示できないため、直接 CRX で平行 XOR のステップ(つまり三つ以上の言語)でのワークフローを管理する必要があります。How to add more than two "AND" Steps to a Workflow を参照ください。
七つの平行 XOR ステップ、en、de、es、fr、it、ja、zh、を含む、翻訳ワークフローの例(ExampleTranslationWorkflow-1.1-2.zip)があります。すべてのステップのユーザーは管理者であることに注意してください。対応するユーザーまたはグループに合わせて、対応する言語に対して翻訳を実行する必要があります。

package com.day.cq.examples.wf;

import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.exec.Route;
import com.day.cq.workflow.exec.WorkItem;
import com.day.cq.workflow.exec.JavaProcessExt;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * <code>TranslationProcessStep</code> checks the language label the current page is related to
 * and selects the corresponding route to select the correct translation step
 *
 * @scr.component metatype="false"
 * @scr.service
 */
public class TranslationProcessStep implements JavaProcessExt {

    /**
     * Default log.
     */
    protected final Logger log = LoggerFactory.getLogger(TranslationProcessStep.class);

    private String defaultLanguageLabel = "en";
    private static int languageHierarchyLevel = 3;

    public void execute(WorkItem item, WorkflowSession session)
            throws Exception {
        try {
            // get language label of current page
            String handle = item.getWorkflowData().getPayload().toString();
            String languageLabel = (handle != null &&
                    handle.split("/").length > languageHierarchyLevel) ?
                    handle.split("/")[languageHierarchyLevel] : defaultLanguageLabel;
            log.info("executing for handle '" + handle + 
                    "' and actual language '" + languageLabel + "'");
            boolean advanced = false;
            List<Route> routes = session.getRoutes(item);
            Route defaultRoute = null;
            for (Route route : routes) {
                if (route.hasDefault()) defaultRoute = route;
                String toTitle = route.getDestinations().get(0).getTo().getTitle();
                if (languageLabel.equals(toTitle)) {
                    session.complete(item, route);
                    log.info("found matching wf route: " + languageLabel);
                    advanced = true;
                }
            }
            // fallback if no matching route was found
            if (!advanced) {
                if (defaultRoute != null) {
                    session.complete(item, defaultRoute);
                    log.info("no matching wf route found -> take default route!");
                } else {
                    session.complete(item, routes.get(0));
                    log.info("no matching wf route found and no route set " +
                            "as default -> take first route!");
                }
            }
        } catch (WorkflowException e) {
            log.error("Could not advance workflow.", e);
        }
    }

    public void execute(WorkItem item, WorkflowSession session, String args[]) 
            throws Exception {
        // default language label to be used if actual page language label
        // isn't available (i.e. pages above language page)
        if (args != null && args.length > 0) defaultLanguageLabel = args[0];
        // the language page's hierarchy level
        if (args != null && args.length > 1)
            languageHierarchyLevel = Integer.getInteger(args[1]);
        log.info("default language label: " + defaultLanguageLabel +
                ", language hierarchy level: " + languageHierarchyLevel);
        execute(item, session);
    }

}

適用対象

CQ5.2+

ダウンロード

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー