We apologize for untranslated text, you can use the Google Translation button to get an automatic translation of the web page in the language of your choice.

DataController et StoreListener pour duplication de contenus sur création d'un espace collaboratif

Dimitry Thebault · on 2/16/16 at 11:14 AM

Bonjour,

Un client a le besoin suivant : À la création d'un espace collaboratif depuis un espace modèle spécifique (déjà existant et dont l'identifiant est renseigné dans une propriété d'un plugin, ou du custom.prop) il faudrait que les contenus présents dans cet espace modèle soient dupliqués dans le nouvel espace créé (dans la suite de ce message je ferai référence à ce procédé de duplication comme "mes actions").

 

J'ai d'abord pensé qu'avec un DataController ou un StoreListener je pourrai effectuer mes actions, mais j'ai 2 problèmatiques qui se posent à moi. (Probablement par manque de connaissance, malgré avoir relu la documentation)

D'abord je ne sais pas comment faire pour déclencher mes actions uniquement lors de la création d'un espace collaboratif. Si je lance mes actions lors de la création du workspace dans le store le portlet CollaborativeSpace n'existe pas encore dans le store, je ne peux donc pas vérifier si l'espace est un espace collaboratif.

Ensuite si je lance mes actions sur la création d'un espace collaboratif (donc sur le type de portlet CollaborativeSpace) cela veut dire que si plus tard un portlet CollaborativeSpace est créé dans un espace déjà existant, les contenus seront dupliqués. Ce qui amène donc à ma deuxième question. Est-ce possible de déclencher mes actions uniquement lorsqu'un modèle d'espace collaboratif est utilisé ?

 

Pour résumer :

À la création d'un espace est-ce possible de savoir s'il s'agit d'un espace collaboratif qui a été généré depuis un modèle bien spécifique ? Afin de déclencher des actions de duplication de contenu uniquement si ces 2 conditions ont été réunies.

Bien cordialement

5 pts
Sylvain DEVAUX · on 3/21/16 at 11:27 AM

Bonjour,

 

pour réaliser des actions programmatiquement après la création d'un EC, vous pouvez créer un DataController sur le type de portlet CollaborativeSpace.

Vous devrez vérifier la présence du flag suivant dans le context reçu: CSManager.CTX_CREATE_CS_FINISH. Ce flag est positionné lors de la dernière mise à jour de la portlet EC lors du process de création. (Le flag CSManager.CTX_CREATE_CS est utilisé quant à lui durant les opérations de mise à jour intermédiaires).

 

Dans l'état cependant, il n'est pas possible de connaître l'identifiant du modèle qui a été utilisé.

Pour ce faire, vous pouvez créer un composant WizardPolicyFilter, et vous branchez sur afterWizard(...). Le but sera de garder une trace de l'id du modèle, afin d'en disposer dans le DataController ci dessus.

Le code ressemblerait à ceci : 

public class CustomWizardPolicyFilter extends BasicWizardPolicyFilter {
@Override
public void afterWizard(WizardContext ctx) {
    // Skip other context
    if (!(ctx instanceof WorkspaceWizardContext)) {
      return;
    }
    WorkspaceWizardContext ctxt = (WorkspaceWizardContext) ctx;
    Workspace wsModel = ctxt.getWSModel();
    Workspace workspace = ctxt.getWorkspace();
    if (wsModel != null) {
      workspace.setExtraInfo("wsModelId", wsModel.getId()); // Ici, vous "stockez" l'id du modèle sur le nouveau WS
    }
  }
}

 

Puis le DataController : 

public void afterWrite(Data data, int op, Member mbr, Map context) {
if (op != OP_UPDATE){
return;
}
if (context == null || !context.containsKey(CSManager.CTX_CREATE_CS_FINISH)) {
return;
}
CollaborativeSpace cs = (CollaborativeSpace)data;
Workspace workspace = cs.getWorkspace();
String wsModelId = (String) workspace.getExtraInfo("wsModelId");
if ("c_1234".equals(wsModelId)) { // check du modèle utilisé
// ... some stuff here
}
}

 

De plus, j'ai crée les issues suivantes suite à votre besoin : CSP-403CSP-404 

0 pts