Attach sub-document

Rattacher un document fils à un document père

Soit deux processus, un processus père et un processus fils, liés par un champ tableau de sous-processus dans le père.

Un utilisateur peut créer un document du sous-processus via un document du processus père ou simplement directement.

Si cet utilisateur créer un document du sous-processus directement puis se rend compte finalement qu’il devrait être rattaché à un document père, comment faire ?

Cette section se propose de régler ce blocage.

Seront expliquées ici les méthodes SDK à utiliser qui pourront ensuite être adaptées pour positionner le code soit dans un agent, soit dans l’interface pour permettre à l’utilisateur, dans son document fils, de sélectionner le document père et de le rattacher.

Principe

Il est possible via SDK de récupérer les documents Process concernés, le document fils et le document père, en récupérant les objets IWorkflowInstance.

Info

La récupération de ces objets peut se faire de différentes manières : par leur référence, par la valeur d’un champ particulier d’un processus (Usage d’un IViewController pour récupérer les documents), …

Ensuite un addLinkedWorkflowInstance peut être exécuté sur le document père pour le nom système du champ de sous-processus, puis un save sur cette propriété et les deux documents seront bien reliés.

Exemple

Cet exemple repose sur un agent dans lequel les objets de définition (ICatalog, IWorkflow, …) sont récupérés, ainsi que les deux documents Process IWorkflowInstance.

Il est ensuite possible d’ajouter le lien via le champ tableau de sous-processus nommé ChampSubProcess.

import java.util.Collection;

import com.axemble.vdoc.sdk.agent.base.BaseAgent;
import com.axemble.vdoc.sdk.interfaces.ICatalog;
import com.axemble.vdoc.sdk.interfaces.IContext;
import com.axemble.vdoc.sdk.interfaces.IWorkflow;
import com.axemble.vdoc.sdk.interfaces.IWorkflowInstance;
import com.axemble.vdoc.sdk.modules.IWorkflowModule;

public class LinkProcessesAgent extends BaseAgent {

    /**
     * @see com.axemble.vdoc.sdk.agent.base.BaseAgent#execute()
     */
    protected void execute() {
        IWorkflowModule iWorkflowModule = getWorkflowModule();
        try {
            iWorkflowModule.beginTransaction(this);

            IContext iContext = iWorkflowModule.getContextByLogin("sysadmin");
            ICatalog iCatalog = iWorkflowModule.getCatalog(iContext, "testsubprocesses");
            IWorkflow iParentWorkflow = iWorkflowModule.getWorkflow(iContext, iCatalog, "parentprocess_1.0");
            IWorkflow iSubWorkflow = iWorkflowModule.getWorkflow(iContext, iCatalog, "subprocess_1.0");

            Collection cParentWorkflowInstance = iWorkflowModule.getWorkflowInstances(iContext, iParentWorkflow, "0001");
            Collection cSubWorkflowInstance = iWorkflowModule.getWorkflowInstances(iContext, iSubWorkflow, "0001");

            IWorkflowInstance iParentWorkflowInstance = (IWorkflowInstance) cParentWorkflowInstance.iterator().next();
            IWorkflowInstance iSubWorkflowInstance = (IWorkflowInstance) cSubWorkflowInstance.iterator().next();

            iParentWorkflowInstance.addLinkedWorkflowInstance("ChampSubProcess", iSubWorkflowInstance);
            iParentWorkflowInstance.save("ChampSubProcess");

            iWorkflowModule.commitTransaction(this);
        } catch (Exception e) {
            String message = e.getMessage();
            if (message == null) {
                message = "";
            }
            log.error("Error in LinkProcessesAgent execute method : " + e.getClass() + " - " + message);

            iWorkflowModule.rollbackTransaction(this);
        }
    }
}

Source : https://wiki.myvdoc.net/xwiki/bin/view/Dev+Floor/HowToLinkParentDocumentToChildOne