Problema

Você procura um exemplo de uma implementação da etapa do processo do fluxo de trabalho.

Solução

Uma implementação da Etapa de Processamento do fluxo de trabalho em Java é uma Classe que implementa a Interface JavaProcessExt (ou JavaProcess se nenhum atributo externo for usado).

Essa Classe deve ser um Serviço OSGi e deve implementar o método execute(item WorkItem, sessão WorkflowSession, String[] args). Neste método, os objetos item fornecidos (WorkItem) e sessão (WorkflowSession) podem ser usados para implementar a lógica de negócios da etapa do processo.

Assim que este Serviço estiver disponível no sistema (por exemplo, ao incluí-lo em um pacote e instalá-lo), é possível selecioná-lo na GUI do fluxo de trabalho (modelo de fluxo de trabalho - etapa do processo - implementação)...

Exemplos

Nota: os exemplos a seguir são muito simples, e não devem ser usados na produção como estão.
É preciso incluir a Classe de exemplo em um de seus pacotes e marcar o pacote com.day.cq.examples.wf como externo para disponibilizar o serviço no sistema...

Exemplo simples de etapa do processo de fluxo de trabalho:

A seguinte etapa do processo de fluxo de trabalho apenas verifica as rotas disponíveis para a(s) próxima(s) etapa(s) e processa a rota marcada como padrão ou a primeira rota se nenhuma rota foi marcada como padrão e grava alguns registros.

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

Exemplo de etapa do processo de fluxo de trabalho de tradução:

Com isso, é possível definir etapas XOR paralelas para o trabalho de tradução para todos os idiomas. Cada etapa pode pertencer a outro usuário ou grupo.
Como Argumentos do processo você pode definir o idioma padrão (por exemplo de) e o nível de hierarquia de idiomas (o padrão é 3)

Observação: Como a GUI do Workfow não é capaz de exibir mais de duas etapas XOR (ou AND), você precisa gerenciar fluxos de trabalho com mais etapas XOR paralelas (mais de dois idiomas) diretamente no CRX, consulte Como adicionar mais de duas etapas "AND" a um fluxo de trabalho.
Em anexo, você encontrará um exemplo de fluxo de trabalho de tradução (ExampleTranslationWorkflow-1.1-2.zip) com sete etapas XOR paralelas para en, de, fr, es, it, ja e zh. Por favor, note que o usuário para todas as etapas é admin, portanto, isso deve ser adaptado com os usuários ou grupos correspondentes as traduções devem ser executadas para o idioma correspondente...

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

}

Aplica-se a

CQ5.2+

Download