Problème

Vous cherchez un exemple d’application d’étape du processus.

Résolution

Dans Java, une application d’étape du processus est une classe qui applique l’interface JavaProcessExt (ou JavaProcess, si aucun attribut externe n’est utilisé).

Cette classe doit être un service OSGi et appliquer la méthode execute(item WorkItem, session WorkflowSession, String[] args). Dans cette méthode, les objets fournis élément (WorkItem) et session (WorkflowSession) peuvent être utilisés pour mettre en œuvre la logique commerciale de l’étape de processus.

Dès que ce service est disponible dans le système (par exemple, lorsque vous l’incluez dans un lot et vous l’installez), vous pouvez le sélectionner dans l’interface graphique du processus (modèle de workflow - étape de processus - application).

Exemples

Remarque : les cas suivants sont juste des exemples très simples à ne pas utiliser en production tels qu’ils sont.
Vous devez inclure la classe d’exemple dans l’un des lots et marquer le module externe com.day.cq.ex amples.wf pour rendre le service disponible dans le système.

Exemple d’étape du processus de flux simple :

L’étape du processus de flux suivante vérifie uniquement les itinéraires disponibles pour l’étape ou les étapes suivantes. De plus, il traite l’itinéraire désigné par défaut ou bien le premier itinéraire si aucun itinéraire n’a été marqué comme valeur par défaut et écrit une journalisation.

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

Exemple d’étape du processus de flux de traduction :

Il est possible de définir des étapes XOR parallèles pour la tâche de traduction et ce, pour chaque langue. Chaque étape peut appartenir à un autre utilisateur ou à un autre groupe.
Comme avec les Arguments du processus, vous pouvez définir la langue par défaut (par exemple, de) et le niveau hiérarchique de la langue (la valeur par défaut est 3).

Remarque : comme l’interface graphique du processus ne peut pas afficher plus de deux étapes XOR (ou AND), vous devez gérer des processus avec plus d’étapes ZOR (c’est-à-dire, plus de deux langues) directement sur CRX. Consultez Comment ajouter plus de deux étapes « AND » à un processus.
Vous trouverez ci-joint un exemple du processus de traduction (ExampleTranslationWorkflow-1.1-2.zip) avec sept étapes parallèles XOR pour en, de, fr, es, it, ja et zh. Veuillez noter que l’utilisateur final pour toutes les étapes est l’administrateur. Par conséquent, il doit être personnalisé avec les traductions que utilisateurs ou les groupes correspondants doivent exécuter pour leur langue correspondante.

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

}

S’applique à

CQ5.2+

Telechargement

Ce produit est distribué sous licence Creative Commons Attribution - Pas d’utilisation commerciale - Partage à l’identique 3.0 non transposé  Les publications Twitter™ et Facebook ne sont pas couvertes par les dispositions Creative Commons.

Mentions légales   |   Politique de confidentialité en ligne