Problem

Sie suchen nach einem Beispiel für eine Workflow-Prozessschritt-Implementierung.

Lösung

Eine Workflow-Prozessschritt-Implementierung in Java ist eine Klasse, die die Oberfläche JavaProcessExt implementiert (oder JavaProcess, wenn keine externen Attribute verwendet werden).

Diese Klasse muss ein OSGi-Dienst sein und die Methode execute(WorkItem item, WorkflowSession session, String[] args) implementieren. Bei dieser Methode können die bereitgestellten Objekte Element (Arbeitselement) und Sitzung (WorkflowSitzung) verwendet werden, um die Geschäftslogik des Prozessschrittes zu implementieren.

Sobald dieser Dienst im System verfügbar ist (zum Beispiel, wenn Sie ihn in ein Bundle aufnehmen und dieses installieren), können Sie ihn in der Workflow-GUI auswählen ("Workflow-Modell" > "Prozessschritt" > "Implementierung") ...

Beispiele

Hinweis: Die folgenden Beispiele sind nur sehr einfache Beispiele und sollten in dieser Form nicht in der Produktion verwendet werden.
Sie müssen die Beispielklasse in eines Ihrer Pakete aufnehmen und das Paket com.day.cq.examples.wf extern markieren, damit der Dienst im System verfügbar ist...

Beispiel für einen einfachen Workflow-Prozessschritt:

Der folgende Workflow-Prozessschritt überprüft nur die verfügbaren Routen zum nächsten Schritt/zu den nächsten Schritten und verarbeitet die markierte Route als Standard und schreibt eine Protokolldatei. Wenn keine Route markiert war, wird die erste Route als Standard gespeichert.

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);
    }
}

Beispiel für einen Übersetzungs-Workflow-Prozessschritt:

So ist es möglich, parallele XOR-Schritte für die Übersetzungsaufgabe für jede Sprache zu definieren. Jeder Schritt kann zu einem anderen Benutzer oder einer anderen Gruppe gehören.
Unter "Prozess-Argumente" können Sie die Standard-Sprache (z. B. "de") sowie den Sprachhierarchielevel (Standardeinstellung: 3) einstellen.

Hinweis: Da der Workflow-GUI nicht mehr als zwei XOR (oder "AND")-Schritte anzeigen kann, müssen Sie Workflows mit mehreren parallelen XOR-Schritten (also mehr als zwei Sprachen) direkt in CRX verwalten, siehe "Mehr als zwei "AND"-Schritte zu einem Workflow hinzufügen".
Angehängt finden Sie einen Beispiel-Übersetzungs-Workflow (ExampleTranslationWorkflow-1.1-2.zip) mit sieben parallelen XOR-Schritten für en, de, fr, es, it, ja und zh. Bitte beachten Sie, dass der Benutzer für alle Schritte "Admin" ist. Dies muss für die entsprechenden Benutzer oder Gruppen für die entsprechende Sprache, in der die Übersetzungen ausgeführt werden sollen, angepasst werden.

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);
    }

}

Gilt für

CQ5.2+

Herunterladen

Dieses Werk unterliegt den Bedingungen der Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.  Twitter™- und Facebook-Beiträge fallen nicht unter die Bedingungen der Creative Commons-Lizenz.

Rechtliche Hinweise   |   Online-Datenschutzrichtlinie