Problema

Cerchi un esempio di implementazione di un passaggio del processo di Workflow.

Risoluzione

L'implementazione di un passaggio del processo di Workflow in Java è una classe che implementa l'Interfaccia JavaProcessExt (o JavaProcess se non vengono utilizzati attributi esterni).

Questa classe deve essere un servizio OSGI e deve implementare il metodo execute(WorkItem item, WorkflowSession session, String[] args). In questo metodo, gli oggetti forniti elemento (WorkItem) e sessione (WorkflowSession) si possono utilizzare per implementare la logica di business della fase di processo.

Non appena questo servizio è disponibile nel sistema (ad esempio quando lo includi in un bundle e lo installi) puoi selezionarlo nell'interfaccia grafica del flusso di lavoro (modello di flusso di lavoro - passaggio del processo - Implementazione)...

Esempi

Nota: Gli esempi che seguono sono solo esempi molto semplici da non utilizzare in produzione così come sono.
Devi includere la classe di esempio in uno dei tuoi bundle e contrassegnare il pacchetto com.day.cq.examples.wf come esterno per rendere il servizio disponibile nel sistema...

Esempio di un semplice passaggio del processo di Workflow:

La seguente fase del processo di Workflow controlla semplicemente le rotte disponibili alle fasi successive ed elabora la rotta contrassegnata come predefinita o la prima rotta se nessuna rotta è stata contrassegnata come predefinita e scrive il logging.

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

Esempio di passaggio del processo di Workflow di traduzione:

In questo modo è possibile definire passaggi XOR paralleli per il lavoro di traduzione per ogni lingua. Ogni passaggio può appartenere ad un altro utente o gruppo.
Come argomenti del processo puoi impostare la lingua predefinita (ad esempio de) e il livello di gerarchia delle lingue (il valore predefinito è 3)

Nota: poiché l'interfaccia grafica del workfow non è in grado di visualizzare più di due passaggi XOR (o AND), devi gestire flussi di lavoro con più passaggi XOR paralleli (quindi più di due lingue) direttamente in CRX, vedi Come aggiungere più di due passaggi "AND" a un flusso di lavoro.
In allegato trovi un esempio di flusso di lavoro di traduzione (ExampleTranslationWorkflow-1.1-2.zip) con sette passaggi XOR paralleli per inglese, tedesco, francese, spagnolo, italiano, giapponese e cinese. Nota che l'utente per tutti i passaggi è l'amministratore, quindi devi adattarlo con i corrispondenti utenti o gruppi per cui le traduzioni dovrebbero essere eseguite per la lingua corrispondente...

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

}

Si applica a

CQ5.2+

Scarica

Questo prodotto è concesso in licenza in base alla licenza di Attribuzione-Non commerciale-Condividi allo stesso modo 3.0 Unported di Creative Commons.  I post su Twitter™ e Facebook non sono coperti dai termini di Creative Commons.

Note legali   |   Informativa sulla privacy online