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 :
+----------------------------------+ | «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.
public class DocumentImpl extends DocumentAbstract implements Document {
public String getNameAndDescription() {
return getName() + " " + getDescription();
}
}
Maintenant la compilation (mvn compile) doit ne plus produire d'erreur.
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,...
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>
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"/>
Il faut créer les pages JSP de visualisation du module. Quelques règles sont à respecter :
<%@ 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>
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.
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);
}
}
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);
}
}
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);
}
}
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();