Problema

Busque un ejemplo de implementación de un paso de proceso del flujo de trabajo.

Resolución

La implementación de los pasos de proceso del flujo de trabajo en Java es una clase que implementa la interfaz JavaProcessExt (o JavaProcess si no se utilizan atributos externos).

Esta clase debe ser un servicio OSGi y debe implementar el método execute(WorkItem item, WorkflowSession session, String[] args). En este método, el elemento de objetos proporcionados (WorkItem) y sesión (WorkflowSession) se pueden utilizar para implementar la lógica empresarial del paso de proceso.

Tan pronto como este servicio esté disponible en el sistema (por ejemplo, al incluirlo en un paquete e instalarlo), puede seleccionarlo en la interfaz gráfica de usuario del flujo de trabajo (modelo del flujo de trabajo-paso de proceso-implementación)...

Ejemplos

Nota: Los siguientes ejemplos son muy simples y no se deben utilizar en la producción tal como están.
Debe incluir el ejemplo Clase en uno de sus paquetes y marcar el paquete com.day.cq.cq.examples.wf externo para que el servicio esté disponible en el sistema.

Ejemplo sencillo del paso de proceso del flujo de trabajo:

El siguiente paso de proceso del flujo de trabajo solo verifica las rutas disponibles para los siguientes pasos y procesa la ruta marcada como predeterminada o la primera ruta, si no hay ninguna marcada como predeterminada, y escribe el registro.

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

Ejemplo de traducción del paso de proceso del flujo de trabajo:

Gracias a esto, es posible definir pasos XOR paralelos para la tarea de traducción para cada idioma. Cada paso puede pertenecer a otro usuario o grupo.
Como Argumentos de proceso puede establecer el idioma predeterminado (por ejemplo de) y el nivel de jerarquía del idioma (el predeterminado es 3).

Nota: Puesto que la interfaz gráfica de usuario de Workflow no puede mostrar más de dos pasos XOR (o AND), tiene que gestionar los flujos de trabajo con más pasos XOR paralelos (es decir, más de dos idiomas) directamente en CRX, consulte Añadir más de dos pasos AND a un flujo de trabajo.
Adjunto encontrará un ejemplo del flujo de trabajo de traducción (ExampleTranslationWorkflow-1.1-2.zip) con siete pasos XOR paralelos para en, de, fr, es, it, ja y zh. Tenga en cuenta que el usuario para todos los pasos es administrador, por lo que debe ser adaptado con los usuarios o grupos correspondientes y las traducciones deben ejecutarse para el idioma correspondiente.

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

}

Se aplica a

CQ5.2+

Descargar

Esta obra está autorizada con arreglo a la licencia de Reconocimiento-NoComercial-CompartirIgual 3.0 Unported de Creative Commons.  Los términos de Creative Commons no cubren las publicaciones en Twitter™ y Facebook.

Avisos legales   |   Política de privacidad en línea