Why make donate

Tutoriel pour la création d'un module

author Ruchaud Julien < ruchaud@codelutin.com>
1.0
date 2006/08/07 16:20:55

Exemple

Ce tutoriel montre le développement d'un module en reprenant les différentes parties de la documentation développeur. L'exemple traité est la gestion de document. Le module GED est limité à un modèle super simple.

Les fonctionnalités du module GED sont les suivantes :

  • Ajout/Suppression de documents
  • Visualisation de la liste des documents
Voici les répertoires de travail où se trouve les différents fichiers :
  • pour le modèle : /src/xmi
  • pour la vue : /src/webapp/WEB-INF/ged
  • pour le contrôler : /src/java/web/mentawai/ged

Modèle

Étape 1 : Création du modèle sur ArgoUML

Le modèle est le plus simple possible, il ne comporte qu'une seule classe, Document. Elle permet de stocker l'ensemble des documents.
+----------------------------------+
|             «entity»             |
|             Document             |
+----------------------------------+
| name : String                    |
| description : String             |
+----------------------------------+
| getNameAndDescription() : String |
+----------------------------------+
Le modèle est à créer dans le fichier /src/xmi/chorem.zargo dans le paquetage org.codelutin.chorem.entities.ged. Toutes classes devant être gérées par ToPIA doit porter le stéréotype Entity.

Étape 2 : Génération du code avec ToPIA

Le plugin Maven 2 Generator se charge de lancer la génération de ToPIA. Par la commande «mvn compile», nous lançons la compilation du projet ainsi que la génération ToPIA. Nous obtenons les classes Java et les fichiers de mapping Hibernate dans le répertoire /src/gen/java/org/codelutin/chorem/entities/ged. Il risque de ne pas pouvoir compiler, il doit lui manquer l'inplémentation des méthodes du modèle.

Étape 3 : Implémentation des méthodes

Les méthodes contenues dans le modèle n'étant pas implémentées, il est maintenant nécessaire de les complèter. Elles sont a compléter dans le répertoire /src/java/org/codelutin/chorem/entities/ged et porte comme nom, le nom de classe avec le suffixe «Impl». Elle doivent hériter de sa classe abstraite et implémenter son interface.
public class DocumentImpl extends DocumentAbstract implements Document {
  public String getNameAndDescription() {
    return getName() + " " + getDescription();
  }
}

Maintenant la compilation (mvn compile) doit ne plus produire d'erreur.

Étape 4 : Modification des classes de persistances

La propriété topia.persistence.classes dans le fichier /src/ressources/TopiaContextImpl.properties doit contenir la classe Document.

topia.persistence.classes=...,org.codelutin.chorem.entities.ged.DocumentImpl,...

Vue

Étape 5 : Déclaration du module au niveau du Layout

Il faut déclarer le nom du module dans les fichiers de langue dans le répertoire /src/webapp/common/lang.

ged = GED

Après, il faut ajouter le module dans l'entête, fichier /src/webapp/common/layout/layout.jsp, pour pouvoir donner accès à celui-ci.

| <a class="Link" href="${path}/ged.mtw"><fmt:message key="ged" bundle="${commonBundle}"/></a>

Étape 6 : Création du menu

Chaque module a son propre menu. Il faut créer le fichier /src/webapp/ged/common/menu.jsp pour ajouter un menu au module GED.

<%@ include file="/WEB-INF/common/taglibs.jsp"%>

<h1 class="tab" onclick="tabHideShow('tabMenu');"><fmt:message key="tabMenu.title"/></h1> <div id="tabMenu" class="${cookie.tabMenu.value}">

<h2 class="Title"><fmt:message key="tabMenu.shortcuts"/></h2> <menu class="Menu">

<li><a class="Link" href="${pathModule}/ged.mtw"><fmt:message key="tabMenu.shortcuts.ged"/></a></li>

</menu>

</div>

<jsp:include page="${common}/layout/tabSpace.jsp"/>

Étape 7 : Création des pages

Il faut créer les pages JSP de visualisation du module. Quelques règles sont à respecter :

  1. Il faut toujours regarder et recopier ce qui a été fait.
  2. Tous les formulaires doivent être créés avec le tag chorem:action.
  3. Aucun texte doit être fixe dans la page, il faut utiliser fmt:message.
Les deux fichiers sont stockés dans le répertoire /src/webapp/ged/document. Le fichier list.jsp permet de visualiser la liste des documents :
<%@ include file="/WEB-INF/common/taglibs.jsp"%>
<jsp:include page="${headerPage}"/>
<h1 class="Title"><fmt:message key="document.list.title"/></h1><hr class="Ligne"/>
<div class="FormActions">
  <chorem:action mtw="${pathModule}/document/new.mtw">
    <input type="submit" value="<fmt:message key="button.new" bundle="${commonBundle}"/>">
  </chorem:action>
</div>
<div class="Container">
  <table class="Large">
    <tr class="First">
      <td><fmt:message key="document.list.name"/></td>
      <td><fmt:message key="document.list.description"/></td>
    </tr>
    <mtw:list value="documents">
      <mtw:isEmpty><td colspan="2" align="center"><fmt:message key="document.list.empty"/></td></mtw:isEmpty>
      <mtw:loop var="eltDocument">
        <tr>
          <td>${eltDocument.name}</td>
          <td>${eltDocument.description}</td>
          <td class="Actions">
            <chorem:action mtw="${pathModule}/document/del.mtw">
              <input type="hidden" name="documentId" value ="${eltDocument.topiaId}">
              <input type="submit" value="<fmt:message key="button.delete" bundle="${commonBundle}"/>">
            </chorem:action>
          </td>
        </tr>
      </mtw:loop>
    </mtw:list>
  </table>
</div>
Le fichier form.jsp permet de modifier ou creer un nouveau document :
<%@ include file="/WEB-INF/common/taglibs.jsp"%>
<jsp:include page="${headerPage}"/>
<h1 class="Title"><fmt:message key="document.form.title"/></h1><hr class="Ligne"/>
<!-- Partie enregistrement -->
<chorem:action name="store" mtw="${pathModule}/document/store.mtw">
  <div class="Container">
    <div class="FormLeft">
      <div class="Text"><fmt:message key="document.form.name"/></div>
      <div class="Text"><fmt:message key="document.form.description"/></div>
    </div>
    <div class="FormRight">
      <div class="Normal">
        <input type="text" name="name" value="${document.name}"/>
      </div>
      <div class="Normal">
        <input type="text" name="description" value="${document.description}"/>
      </div>
    </div>
  </div>
</chorem:action>
<!-- Partie annulation -->
<chorem:action name="cancel" mtw="${pathModule}/document/cancel.mtw"/>
<!-- Partie actions -->
<div class="FormActions">
  <button onclick="document.cancel.submit();"><fmt:message key="button.cancel" bundle="${commonBundle}"/></button>
  <button onclick="document.store.submit();"><fmt:message key="button.store" bundle="${commonBundle}"/></button>
</div>

Étape 8 : Internationalisation

Pour finir les pages jsp, il faut créer les fichiers de langue dans le répertoire /src/webapp/WEB-INF/ged/common/lang. De plus, il faut rajouter ce répertoire comme ressource dans le pom.xml de Maven.

Fichier de langue pour le français est ged_fr.properties, il contient :

## Menu ##
tabMenu.title = Menu
tabMenu.shortcuts = Raccourcis
tabMenu.shortcuts.ged = Documents

## Document ##
document.list.title = Liste des documents
document.list.empty = Vide
document.list.name = Nom
document.list.description = Description
document.form.title = Liste des documents
document.form.name = Nom :
document.form.description = Description :

Généralement les clés sont de la forme suivante : «nom de l'entité».«nom de la page».«nom de l'élément» = ...

Le bundle commun (${commonBundle}) contient l'ensemble des traductions transversales à tous les modules.

Contrôleur

Étape 9 : Création des actions

Quatres actions sont toujours créer pour chaque entités du modèle, elles permettent les manipulations de base. Elles sont stockées dans le package actions du module.

Ces actions vont être nécessaire pour notre exemple les voici, elle doit être dans src/java/org/codelutin/chorem/web/mentawai/ged/action/document :

DocumentFindId.java, permet de rechercher un document par rapport à son identifiant :

public class CompanyFindId extends ElementaryAction {
  @TopiaBean
  private Document document;
  
  public void action() throws Exception {
  }
}

DocumentFindAll.java, permet de récupérer l'ensemble des documents :

public class DocumentFindAll extends ElementaryAction {
  public void action() throws Exception {
    DocumentDAO documentPS = ChoremDAOHelper.getDocumentDAO(transaction);
    output.setValue("documents", documentPS.findAll());
  }
}

DocumentUpdate.java, permet de créer et de modifier un document :

public class CompanyUpdate extends ElementaryAction implements Validatable {
  @TopiaBean(recuperation = true)
  private Document document;
  public void action() throws Exception {
    document.update();
    addMessage(MESSAGE_STORE);
  }
  public void initValidator(Validator validator, String innerAction) {
    addRule(validator, "name", TypeValidator.REQUIRED);
  }
}

DocumentDelete.java, permet la suppression d'un document :

public class CompanyDelete extends ElementaryAction {
  @TopiaBean
  private Company company;
  public void action() throws Exception {
    company.delete();
    addMessage(MESSAGE_DELETE);
  }
}

Étape 10 : Création du Manageur

Le manageur centralise l'ensemble des urls, des pages et des cas d'utilisation avec les actions associées. Pour la GED la classe à créer est src/java/org/codelutin/chorem/web/mentawai/ged/Manager.java :

public class Manager extends org.codelutin.chorem.web.mentawai.Manager {
  public static String DOCUMENT_LIST_JSP     = "/WEB-INF/ged/document/list.jsp";
  public static String DOCUMENT_FORM_JSP     = "/WEB-INF/ged/document/form.jsp";
  
  public static String DOCUMENT_DEL      = "ged/document/del";
  public static String DOCUMENT_NEW      = "ged/document/new";
  public static String DOCUMENT_MODIFY   = "ged/document/modify";
  public static String DOCUMENT_STORE    = "ged/document/store";
  public static String DOCUMENT_CANCEL   = "ged/document/cancel";

  public void loadModules() {
    createFirstLine(DOCUMENT_DEL,      DocumentDelete.class);
    createFirstLine(DOCUMENT_NEW,      SuccessAction.class);
    createFirstLine(DOCUMENT_MODIFY,   SuccessAction.class);
    createFirstLine(DOCUMENT_STORE,    DocumentUpdate.class);
    createFirstLine(DOCUMENT_CANCEL,   SuccessAction.class);
      
    createLastLine(DOCUMENT_LIST_JSP,     DocumentFindAll.class);
    createLastLine(DOCUMENT_FORM_JSP,     DocumentFindId.class);
  }
}

Étape 11 : Création des cas d'utilisation

Il faut maintenant créer les cas d'utilisation. Pour GED, il suffit d'avoir un seul cas d'utilisation, aucune page ne présente des comportements différents. La classe à créer est src/java/org/codelutin/chorem/web/mentawai/ged/usecase/DocumentUseCase.java :

public class DocumentUseCase extends UseCase {
  public String general() throws Exception {
    accessPoint(DOCUMENT_LIST_JSP)
      .move(DOCUMENT_DEL, DOCUMENT_LIST_JSP)
      .move(DOCUMENT_NEW, DOCUMENT_FORM_JSP);
      
    access(DOCUMENT_LIST_JSP, "documentId")
      .move(PROJECT_CANCEL, DOCUMENT_LIST_JSP)
      .move(PROJECT_STORE, DOCUMENT_LIST_JSP);
      
    return super.execute();
  }
}

Après il faut rajouter le cas d'utilisation dans le manageur du module :

public class Manager extends org.codelutin.chorem.web.mentawai.Manager {

  public static String DOCUMENT_USE_CASE   = "ged/general"; // Doit correspondre à un nom de méthode dans la classe du cas d'utilisation

  public void loadModules() {
    createUseCase(DOCUMENT_USE_CASE, DocumentUseCase.class);
    createAccessModule("ged", DOCUMENT_USE_CASE);
  }
}

Étape 12 : Déclaration du module

Il est nécessaire d'ajouter le chargement du manageur du module dans le manageur global de Chorem (src/java/org/codelutin/chorem/web/mentawai/Manager.java) :

new org.codelutin.chorem.web.mentawai.ged.Manager().loadActions();        

Test

Étape 13 : Démarrer Chorem

Étape 14 : Tester le nouveau module

Maven JRst ReStructuredText
google analytics