Author: chatellier Date: 2009-01-12 13:54:45 +0000 (Mon, 12 Jan 2009) New Revision: 1294 Added: topia/trunk/topia-persistence/src/main/resources/log4j.properties topia/trunk/topia-persistence/src/site/fr/ topia/trunk/topia-persistence/src/site/fr/rst/ topia/trunk/topia-persistence/src/site/resources/ topia/trunk/topia-persistence/src/site/resources/ContactUseCases.png topia/trunk/topia-persistence/src/site/resources/ServiceCall.png topia/trunk/topia-persistence/src/site/resources/topia.zargo topia/trunk/topia-soa/src/site/fr/ topia/trunk/topia-soa/src/site/fr/rst/ topia/trunk/topia-soa/src/site/fr/rst/ApplicationServiceGeneration.rst topia/trunk/topia-soa/src/site/fr/rst/ApplicationServiceUsing.rst topia/trunk/topia-soa/src/site/fr/rst/index.rst topia/trunk/topia-soa/src/site/site.xml topia/trunk/topia-ui/src/site/fr/ topia/trunk/topia-ui/src/site/fr/rst/ topia/trunk/topia-ui/src/site/fr/rst/UseCase.rst topia/trunk/topia-ui/src/site/fr/rst/index.rst topia/trunk/topia-ui/src/site/site.xml Removed: topia/trunk/topia-persistence/src/site/fr/rst/ContactUseCases.png topia/trunk/topia-persistence/src/site/fr/rst/ServiceCall.png topia/trunk/topia-persistence/src/site/fr/rst/UseCase.rst topia/trunk/topia-persistence/src/site/fr/rst/topia.zargo topia/trunk/topia-persistence/src/site/rst/ Modified: topia/trunk/src/site/fr/rst/index.rst topia/trunk/src/site/site.xml topia/trunk/topia-persistence/src/site/site.xml topia/trunk/topia-soa/src/main/java/org/codelutin/topia/service/TopiaApplicationServiceFactory.java Log: Ajout d'une doc sur ToPIA SOA Mise ?\195?\160 jour du site Modified: topia/trunk/src/site/fr/rst/index.rst =================================================================== --- topia/trunk/src/site/fr/rst/index.rst 2009-01-12 10:40:22 UTC (rev 1293) +++ topia/trunk/src/site/fr/rst/index.rst 2009-01-12 13:54:45 UTC (rev 1294) @@ -1,5 +1,5 @@ -ToPIA -===== +Accueil +======= Présentation ------------ @@ -12,6 +12,10 @@ Il est actuellement composé de 3 modules : - * topia-persistence : pour la gestion de la persistance sur hibernate - * topia-soa : pour le développement orienté service - * topia-ui : pour la génération des interfaces \ No newline at end of file + * `ToPIA-persistence`_ : pour la gestion de la persistance sur hibernate + * `ToPIA-soa`_ : pour le développement orienté service + * `ToPIA-ui`_ : pour la génération des interfaces + +.. _ToPIA-persistence: topia-persistence +.. _ToPIA-soa: topia-soa +.. _ToPIA-ui: topia-ui \ No newline at end of file Modified: topia/trunk/src/site/site.xml =================================================================== --- topia/trunk/src/site/site.xml 2009-01-12 10:40:22 UTC (rev 1293) +++ topia/trunk/src/site/site.xml 2009-01-12 13:54:45 UTC (rev 1294) @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<project name="${project.name}"> +<project name="ToPIA"> <publishDate format="dd/MM/yyyy"/> @@ -33,7 +33,11 @@ <item name="Code Lutin" href="http://www.codelutin.com/"/> </links> - <menu ref="parent"/> + <menu name="Modules"> + <item name="ToPIA-persistence" href="topia-persistence"/> + <item name="ToPIA-soa" href="topia-soa"/> + <item name="ToPIA-ui" href="topia-ui"/> + </menu> </body> </project> Added: topia/trunk/topia-persistence/src/main/resources/log4j.properties =================================================================== --- topia/trunk/topia-persistence/src/main/resources/log4j.properties (rev 0) +++ topia/trunk/topia-persistence/src/main/resources/log4j.properties 2009-01-12 13:54:45 UTC (rev 1294) @@ -0,0 +1,11 @@ +#�This log is used to display trace in generation + +# Global logging configuration +log4j.rootLogger=WARN, stdout +# Console output... +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) %M - %m%n +# package level +log4j.logger.org.codelutin.generator=INFO +log4j.logger.org.codelutin.topia.generator=INFO Copied: topia/trunk/topia-persistence/src/site/fr/rst (from rev 1290, topia/trunk/topia-persistence/src/site/rst) Deleted: topia/trunk/topia-persistence/src/site/fr/rst/ContactUseCases.png =================================================================== (Binary files differ) Deleted: topia/trunk/topia-persistence/src/site/fr/rst/ServiceCall.png =================================================================== (Binary files differ) Deleted: topia/trunk/topia-persistence/src/site/fr/rst/UseCase.rst =================================================================== --- topia/trunk/topia-persistence/src/site/rst/UseCase.rst 2009-01-09 09:01:36 UTC (rev 1290) +++ topia/trunk/topia-persistence/src/site/fr/rst/UseCase.rst 2009-01-12 13:54:45 UTC (rev 1294) @@ -1,207 +0,0 @@ -Topia Use Case -============== - -ToPIA permet la génération de navigation à partir du modèle UML sous forme de -diagrammes états/transitions. -Le framework fournit de plus une implémentation de cette génération basée -sur le framework MVC `Tapestry <http://tapestry.apache.org/tapestry5/>`_. - -Besoin ------- -Le besoin initial était d'utiliser au maximum les différents état du système. -Dans le cas d'un site internet par exemple, une même page peut être utilisée -pour créer un contact, et plus tard pour modifier un contact. - -Cependant, un état à un utilisation différente suivant le cas d'utilisation -utilisé. - -Ce framework permet donc de générer la navigation sous une forme quelconque, et -de baser cette navigation sur un moteur gérant les cas d'utilisation. - - -Générateur ----------- -Les générateurs de code utilisés font partie de LutinGenerator. Celui-ci permet -de charger le modèle en mémoire, mais ne fournit aucune implémentation -spécifique. -ToPIA fournit les templates de génération (notemment celui basé sur Tapestry). - - -Modèle UML ----------- -Le modèle UML de base doit respecter quelques conventions pour que la génération -se passe bien. - -En voici un exemple (ArgoUML) : - -.. image:: ContactUseCases.png - -Voici les différents points à respecter : - - * Toutes les parties réutilisables doivent appartenir à sous cas d'utilisation - spécifique. - * Tout sous cas d'utilisation doit disposer d'un état initial et d'un moins un - état final. - * Les états étant des références à des sous-cas d'utilisation doivent être - stéréotypés "UseCase" - -Comme on peut le voir sur l'image, le cas d'utilisation en bas utilise d'autre -sous use case. Mais il ne dispose pas lui même d'état final. Il n'est donc pas -réutilisable. - - -Chargement du modele --------------------- -LutinGenerator charge le modèle en mémoire sous la forme d'un modèle d'objets -java et appelle le template de génération spécifié dans la configuration. -Le template peut ensuite parcourir ce modèle aisément et générer les données -dont il a besoin. - -Configuration -+++++++++++++ -Voici la configuration maven de déclaration des templates: - -:: - - <plugin> - <groupId>lutinplugin</groupId> - <artifactId>maven-generator-plugin</artifactId> - <version>0.xx</version> - <executions> - <execution> - <id>Generator</id> - <phase>generate-sources</phase> - <configuration> - <!-- repertoire des modeles ArgoUML --> - <srcDirZuml>src/xmi</srcDirZuml> - <!-- destination des fichiers XMI --> - <srcXmiDest>target/gen/xmi/</srcXmiDest> - <!-- destination des fichiers XML StateModel --> - <srcGenDest>target/gen/models/</srcGenDest> - <!-- Fichiers XML StateModel utilises pour la generation --> - <includes>**/*.*model</includes> - <!-- templates a utiliser --> - <templates>org.codelutin.topia.generator.TapestryWebGenerator</templates> - <!-- destination du code genere --> - <destDirGen>target/gen/java</destDirGen> - </configuration> - <goals> - <!-- ArgoUML -> XMI --> - <goal>zargo2xmi</goal> - <!-- XMI -> StateModel --> - <goal>xmi2statemodel</goal> - <!-- StateModel -> Java (selon le template) --> - <goal>generate</goal> - </goals> - </execution> - </executions> - <dependencies> - <dependency> - <groupId>lutinlib</groupId> - <artifactId>topia</artifactId> - <version>2.0.xx</version> - <scope>compile</scope> - </dependency> - </dependencies> - </plugin> - - -Nom de package --------------- - -Une convention est utilisée dans le nom de package pour déterminer quel est la -racine de la structure (utilisée pour la génération basée sur tapestry par -exemple). - -Le motif utilisé est "web". Il désigne la racine. - -Exemple: - org.codelutin.chorem.web.projectManagement - -Ainsi, via tapestry l'url "/projectManagement" pourra être utilisée. - - -Génération Tapestry -------------------- -La génération sur Tapestry produit une classe abstraite par état déclaré dans le -modèle. -Ces classes abstraites : - - * déclare les autres pages(états) vers lesquelles elle peuvent naviguer. - Ces sont des références traitées par tapestry (annotations). - Chaque référence à pour type la classe concrête implémentée par le - développeur. - * gère l'entrée et la sortie des Use Case. - -Le developpeur doit donc developper l'implémentation tapestry en faisant -référence aux méthodes fournies dans les classes abstraites à hériter pour -naviguer. - -Exemple issue de la génération du modèle à l'image 1, voici la classe abstraite -SocietyView générée à partir du modèle : - -:: - - public abstract class AbstractSocietyView extends UseCasePage { - - public Object onActionFromOk() { - return leaveUseCase(); - } - - @InjectPage - private SocietyForm societyForm; - - protected SocietyForm getSocietyForm() { - return societyForm; - } - - public Object onActionFromEdit() { - enterUseCase(); - return societyForm; - } - - protected final String getUseCaseName() { - return "sv"; - } - } - -Conformément à la spécification : - * cet état est lié à l'état SocietyForm (état initial du sous cas d'utilisation - utilisé) - * dispose d'une action "ok" quittant le use case courant - * dispose d'une action "edit" entrant dans un nouveau use case - -Pour la partie développeur, voici un exemple consitant à appeler une action -avant d'effectuer la réelle navigation : - -:: - - public class SocietyView extends AbstractSocietyView { - - [...] - - @Override - public Object onActionFromEdit() { - - // action - getSocietyForm.setSociety(s); - - // appele de la super methode - return super.onActionFromEdit(); - } - - [...] - } - -Hiérarchie d'héritage ---------------------- -Comme on peut le voir, les classes implémentées par le développeur héritent des -des classes abstraites générées, l'empêchant ainsi d'utiliser son propre -héritage. - -Il est possible de spécifier une classe que toutes les classes abstraites -devront hériter via le fichier de propriété associé au modèle. - -Le propriété : - model.tagvalue.usecaseengineextendedclass=BasePage -spécifie que toutes les classes générées hériteront de la classe BasePage. \ No newline at end of file Deleted: topia/trunk/topia-persistence/src/site/fr/rst/topia.zargo =================================================================== (Binary files differ) Copied: topia/trunk/topia-persistence/src/site/resources/ContactUseCases.png (from rev 1290, topia/trunk/topia-persistence/src/site/rst/ContactUseCases.png) =================================================================== (Binary files differ) Property changes on: topia/trunk/topia-persistence/src/site/resources/ContactUseCases.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Name: svn:mergeinfo + Copied: topia/trunk/topia-persistence/src/site/resources/ServiceCall.png (from rev 1290, topia/trunk/topia-persistence/src/site/rst/ServiceCall.png) =================================================================== (Binary files differ) Property changes on: topia/trunk/topia-persistence/src/site/resources/ServiceCall.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Name: svn:mergeinfo + Copied: topia/trunk/topia-persistence/src/site/resources/topia.zargo (from rev 1290, topia/trunk/topia-persistence/src/site/rst/topia.zargo) =================================================================== (Binary files differ) Property changes on: topia/trunk/topia-persistence/src/site/resources/topia.zargo ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Name: svn:mergeinfo + Modified: topia/trunk/topia-persistence/src/site/site.xml =================================================================== --- topia/trunk/topia-persistence/src/site/site.xml 2009-01-12 10:40:22 UTC (rev 1293) +++ topia/trunk/topia-persistence/src/site/site.xml 2009-01-12 13:54:45 UTC (rev 1294) @@ -11,7 +11,6 @@ <bannerLeft> <name>${project.name}</name> - <!--src>http://buix.labs.libre-entreprise.org/lutinjaxx/jaxx.png</src--> <href>index.html</href> </bannerLeft> @@ -38,8 +37,6 @@ <menu name="Utilisateur"> <item href="/index.html" name="Accueil"/> - <!--item href="http://lutinbuilder.labs.libre-entreprise.org/maven2/org/codelutin/topia/" - name="Téléchargement"/--> </menu> <menu name="Téléchargement"> Modified: topia/trunk/topia-soa/src/main/java/org/codelutin/topia/service/TopiaApplicationServiceFactory.java =================================================================== --- topia/trunk/topia-soa/src/main/java/org/codelutin/topia/service/TopiaApplicationServiceFactory.java 2009-01-12 10:40:22 UTC (rev 1293) +++ topia/trunk/topia-soa/src/main/java/org/codelutin/topia/service/TopiaApplicationServiceFactory.java 2009-01-12 13:54:45 UTC (rev 1294) @@ -58,16 +58,16 @@ public class TopiaApplicationServiceFactory { /** Fichier de configuration par defaut */ - static final String DEFAULT_CONFIG_PROPERTIES = "TopiaContextImpl.properties"; + public static final String DEFAULT_CONFIG_PROPERTIES = "TopiaContextImpl.properties"; /** Nom de la propriete de definition des services utilises */ - static final String TOPIA_APPLICATION_SERVICE_BEGIN = "topia.application.service."; + public static final String TOPIA_APPLICATION_SERVICE_BEGIN = "topia.application.service."; /** Nom de la propriete de definition des services fournit */ - static final String TOPIA_APPLICATION_PROVIDE_BEGIN = "topia.application.provide."; + public static final String TOPIA_APPLICATION_PROVIDE_BEGIN = "topia.application.provide."; /** Nom de la propriete de definition des ports suivant les protocoles */ - static final String TOPIA_APPLICATION_SERVER_PORT_BEGIN = "topia.application.server.port."; + public static final String TOPIA_APPLICATION_SERVER_PORT_BEGIN = "topia.application.server.port."; /** * Nom du dossier ou sont generer certains fichiers (doit etre dans le @@ -76,10 +76,10 @@ public static String TOPIA_GENERATION_DIRECTORY = "topiagen"; /** Fichier de configuration */ - private static Properties config; + protected static Properties config; /** Dispatcher (servers) */ - private static final TopiaServiceProvider mainDispatcher = new TopiaServiceProvider(); + protected static final TopiaServiceProvider mainDispatcher = new TopiaServiceProvider(); /** * Stockage des services deja instancies @@ -90,7 +90,7 @@ private static final Log log = LogFactory .getLog(TopiaApplicationServiceFactory.class); - private static TopiaContext defaultServiceContext; + protected static TopiaContext defaultServiceContext; /** * Retourne la configuration. Charge le fichier s'il n'a pas deja ete @@ -116,12 +116,14 @@ * le contexte pere des contextes fournis aux services * @throws TopiaException */ - @SuppressWarnings("unchecked") public static void loadServices(Properties config, TopiaContext context) throws TopiaException { - if (context == null) + + if (context == null) { throw new NullPointerException( "I need a valid TopiaContext to initialise application services"); + } + defaultServiceContext = context; // lecture du fichier de configuration if (config == null) { @@ -166,11 +168,9 @@ mainDispatcher.setProtocolPort(protocol, port); } - Class serviceInterface = null; - Class serviceImplement = null; try { - serviceInterface = Class.forName(serviceClassName); - serviceImplement = Class.forName(serviceClassName + Class serviceInterface = Class.forName(serviceClassName); + Class serviceImplement = Class.forName(serviceClassName + "Impl"); try { @@ -221,7 +221,6 @@ * @throws TopiaException * si le service ne peut pas etre charge */ - @SuppressWarnings("unchecked") public static <E extends TopiaApplicationService> E getService( Class<E> serviceclazz) throws TopiaNotFoundException, TopiaException { @@ -316,9 +315,10 @@ } } } catch (URISyntaxException e) { - log.warn("URI for service '" + serviceclazz.getCanonicalName() + if(log.isWarnEnabled()) { + log.warn("URI for service '" + serviceclazz.getCanonicalName() + "' is invalid !", e); - return null; + } } } @@ -330,9 +330,9 @@ * l'URI * * @param uriService - * @return l'implementation ou null si le protocol n'est pas g�r� + * @return l'implementation ou null si le protocol n'est pas géré */ - private static TopiaProxy getProxyForURI(URI uriService) { + protected static TopiaProxy getProxyForURI(URI uriService) { // result TopiaProxy tProxy = null; Added: topia/trunk/topia-soa/src/site/fr/rst/ApplicationServiceGeneration.rst =================================================================== --- topia/trunk/topia-soa/src/site/fr/rst/ApplicationServiceGeneration.rst (rev 0) +++ topia/trunk/topia-soa/src/site/fr/rst/ApplicationServiceGeneration.rst 2009-01-12 13:54:45 UTC (rev 1294) @@ -0,0 +1,92 @@ +Génération des services +======================= + +Modèle +------ + +Stéréotype +~~~~~~~~~~ + +Topia founit des générateurs pour utiliser sa couche de +services applicatifs. + +Pour cela, il faut ajouter le stéréotype ''<<service>>'' sur +les interfaces qui seront utilisée pour fournir des services ou +acceder à des services distants. + + +Implémentation +~~~~~~~~~~~~~~ + +Vous pouvez choisir de nes générez que les interfaces des services +et de développer vous meme les implémentations. + +Le générateur est aussi capable de générer une implémentation avec +toutes les méthodes des DAO (voir topia-persistence) qui lui +sont lié. + +Configuration Maven +------------------- + +Les templates disponibles sont: +``org.codelutin.topia.generator.ServiceInterfaceGenerator`` + Meta générateur qui génere les interfaces. +``org.codelutin.topia.generator.ServiceAbstractGenerator`` + Meta générateur qui génere implémentation abstract. +``org.codelutin.topia.generator.ServiceImplGenerator`` + Meta générateur qui génere implémentation concrète. +``org.codelutin.topia.generator.TopiaApplicationServiceMetaGenerator`` + Meta générateur qui génere toutes les interfaces, abstract et Impl. + +Plugin de Génération +~~~~~~~~~~~~~~~~~~~~ + +:: + + <plugins> + <plugin> + <groupId>org.codelutin</groupId> + <artifactId>maven-generator-plugin</artifactId> + <version>0.63</version> + <executions> + <execution> + <phase>generate-sources</phase> + <configuration> + <addCompileDirectory>true</addCompileDirectory> + <srcDirZuml>${maven.src.dir}/main/xmi</srcDirZuml> + <srcXmiDest>${maven.gen.dir}/xmi/</srcXmiDest> + <srcGenDest>${maven.gen.dir}/objectmodel/</srcGenDest> + <includes>**/*.objectmodel</includes> + <templates>org.codelutin.topia.generator.TopiaApplicationServiceMetaGenerator</templates> + <destDirGen>${maven.gen.dir}/java</destDirGen> + <defaultPackage>org.codelutin.chorem</defaultPackage> + </configuration> + <goals> + <goal>zargo2xmi</goal> + <goal>xmi2objectmodel</goal> + <goal>generate</goal> + </goals> + </execution> + </executions> + <dependencies> + <dependency> + <groupId>org.codelutin.topia</groupId> + <artifactId>topia-soa</artifactId> + <version>2.1.3-SNAPSHOT</version> + <scope>runtime</scope> + </dependency> + </dependencies> + </plugin> + </plugins> + +Compilation +~~~~~~~~~~~ + +:: + + <dependency> + <groupId>org.codelutin.topia</groupId> + <artifactId>topia-soa</artifactId> + <version>2.1.3-SNAPSHOT</version> + <scope>compile</scope> + </dependency> \ No newline at end of file Added: topia/trunk/topia-soa/src/site/fr/rst/ApplicationServiceUsing.rst =================================================================== --- topia/trunk/topia-soa/src/site/fr/rst/ApplicationServiceUsing.rst (rev 0) +++ topia/trunk/topia-soa/src/site/fr/rst/ApplicationServiceUsing.rst 2009-01-12 13:54:45 UTC (rev 1294) @@ -0,0 +1,89 @@ +Utilisation des services +======================== + +En mode client +-------------- + +En mode client, vous n'avez besoin que des interfaces générées. + +Prenons l'exemple, d'une interface de service +''org.codelutin.service.TestService'' comportant une méthode ''getHelloWorld()''. + +Configuration +~~~~~~~~~~~~~ + +Dans le fichier de configuration de ToPIA, il faudra ajouter la configuration suivante : + +:: + + topia.application.service.org.codelutin.service.TestService=xml-rpc://localhost:8888 + +Cette configuration indique à ToPIA, que le service est accessible à l'adresse ''localhost:8888'' +sur le protocole xml-rpc. + +Les protocoles disponibles actuellement sont : + * ''soap'' : SOAP + * ''xml-rpc : XML-RPC + * ''rmi'' : Java RMI + * ''local'' : Utilisation directe d'une implémentation sans passer par un servceur distant + Utilise pour les tests. + Exemple : ''topia.application.service.org.codelutin.service.TestService=local://org.codelutin.service.TestServiceImpl/#new'' + (Le #new ici signifie qu'une instance est contruite a chaque requete) + + +Utilisation +~~~~~~~~~~~ + +Pour acceder au service distant ensuite, rien de plus simple, il suffit d'utiliser +le code suivant : + +:: + + TestService service = TopiaApplicationServiceFactory.getService(TestService.class); + service.getHelloWorld(); + +La methode getService() de ToPIA renvoie un ''proxy'' implémentant TestService +sur le service distant. + + +En mode serveur +--------------- + +En mode serveur, nous allons utiliser le même service ''org.codelutin.service.TestService'' +comportant une méthode ''getHelloWorld()''. + +Nous supposons que nous disposons également du implementation ''org.codelutin.service.TestServiceImpl'' +de ce service, soit implementée à la main, soit générée par ToPIA avec les méthodes des DAO. + +Configuration +~~~~~~~~~~~~~ + +ToPIA doit savoir comment il doit fournir les services. + +:: + + topia.application.provide.org.codelutin.service.TestService=xml-rpc + topia.application.server.port.xml-rpc=9090 + +ToPIA va ici fournir le service ''org.codelutin.service.TestService'' en utilisant automatiquement +l'implémentation ''org.codelutin.service.TestServiceImpl'' via ''xml-rpc''. +On a ici aussi surchargée la configuration, pour pouvoir choisir sur quel +port démarrer les serveurs. + + +Utilisation +~~~~~~~~~~~ + +Une fois dans votre application, il suffira de dire à ToPIA de démarrer les +serveur en utilisant la configuration. + +:: + + TopiaApplicationServiceFactory.loadServices(conf, context); + +On peut aussi ajouter manuellement les services que l'on souhaite démarrer: + +:: + + TopiaApplicationServiceFactory.addService(TestService.class, + TestServiceImpl.class, Protocol.SOAP); \ No newline at end of file Added: topia/trunk/topia-soa/src/site/fr/rst/index.rst =================================================================== --- topia/trunk/topia-soa/src/site/fr/rst/index.rst (rev 0) +++ topia/trunk/topia-soa/src/site/fr/rst/index.rst 2009-01-12 13:54:45 UTC (rev 1294) @@ -0,0 +1,10 @@ +Topia-SOA +========= + +Couche d'abtraction des services applicatifs. + + * `Generation des services`_ + * `Utilisation des services`_ + +.. _Generation des services: ApplicationServiceGeneration.html +.. _Utilisation des services: ApplicationServiceUsing.html \ No newline at end of file Added: topia/trunk/topia-soa/src/site/site.xml =================================================================== --- topia/trunk/topia-soa/src/site/site.xml (rev 0) +++ topia/trunk/topia-soa/src/site/site.xml 2009-01-12 13:54:45 UTC (rev 1294) @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="${project.name}"> + + <publishDate format="dd/MM/yyyy"/> + + <skin> + <groupId>org.codelutin</groupId> + <artifactId>maven-lutin-skin</artifactId> + <version>0.2.1</version> + </skin> + + <bannerLeft> + <name>${project.name}</name> + <href>index.html</href> + </bannerLeft> + + <bannerRight> + <src>http://www.codelutin.com/images/lutinorange-codelutin.png</src> + <href>${project.organization.url}</href> + </bannerRight> + + <poweredBy> + <logo href="http://maven.apache.org" name="Maven" img="images/logos/maven-feather.png"/> + <logo href="http://jrst.labs.libre-entreprise.org" name="JRst" img="images/jrst-logo.png"/> + <logo href="http://docutils.sourceforge.net/rst.html" name="ReStructuredText" + img="images/restructuredtext-logo.png"/> + </poweredBy> + + <body> + <links> + <item name="ToPIA Service" href="http://topia.labs.libre-entreprise.org/topia-service"/> + <item name="Labs" href="http://labs.libre-entreprise.org/"/> + <item name="Code Lutin" href="http://www.codelutin.com/"/> + </links> + + <menu ref="parent"/> + + <menu name="Utilisateur"> + <item href="/index.html" name="Accueil"/> + </menu> + + <menu name="Téléchargement"> + <item href="${labs.builder.url}/org/codelutin/${project.artifactId}/${project.version}" + name="Télécharger la dernière version"/> + <item href="${labs.builder.url}/org/codelutin/${project.artifactId}" + name="Voir toutes les versions"/> + </menu> + + <menu name="Developpeur"> + <item name="Generation" href="ApplicationServiceGeneration.html"/> + <item name="Utilisation" href="ApplicationServiceUsing.html"/> + </menu> + + <menu ref="reports"/> + + </body> +</project> Copied: topia/trunk/topia-ui/src/site/fr/rst/UseCase.rst (from rev 1290, topia/trunk/topia-persistence/src/site/rst/UseCase.rst) =================================================================== --- topia/trunk/topia-ui/src/site/fr/rst/UseCase.rst (rev 0) +++ topia/trunk/topia-ui/src/site/fr/rst/UseCase.rst 2009-01-12 13:54:45 UTC (rev 1294) @@ -0,0 +1,207 @@ +Topia Use Case +============== + +ToPIA permet la génération de navigation à partir du modèle UML sous forme de +diagrammes états/transitions. +Le framework fournit de plus une implémentation de cette génération basée +sur le framework MVC `Tapestry <http://tapestry.apache.org/tapestry5/>`_. + +Besoin +------ +Le besoin initial était d'utiliser au maximum les différents état du système. +Dans le cas d'un site internet par exemple, une même page peut être utilisée +pour créer un contact, et plus tard pour modifier un contact. + +Cependant, un état à un utilisation différente suivant le cas d'utilisation +utilisé. + +Ce framework permet donc de générer la navigation sous une forme quelconque, et +de baser cette navigation sur un moteur gérant les cas d'utilisation. + + +Générateur +---------- +Les générateurs de code utilisés font partie de LutinGenerator. Celui-ci permet +de charger le modèle en mémoire, mais ne fournit aucune implémentation +spécifique. +ToPIA fournit les templates de génération (notemment celui basé sur Tapestry). + + +Modèle UML +---------- +Le modèle UML de base doit respecter quelques conventions pour que la génération +se passe bien. + +En voici un exemple (ArgoUML) : + +.. image:: ContactUseCases.png + +Voici les différents points à respecter : + + * Toutes les parties réutilisables doivent appartenir à sous cas d'utilisation + spécifique. + * Tout sous cas d'utilisation doit disposer d'un état initial et d'un moins un + état final. + * Les états étant des références à des sous-cas d'utilisation doivent être + stéréotypés "UseCase" + +Comme on peut le voir sur l'image, le cas d'utilisation en bas utilise d'autre +sous use case. Mais il ne dispose pas lui même d'état final. Il n'est donc pas +réutilisable. + + +Chargement du modele +-------------------- +LutinGenerator charge le modèle en mémoire sous la forme d'un modèle d'objets +java et appelle le template de génération spécifié dans la configuration. +Le template peut ensuite parcourir ce modèle aisément et générer les données +dont il a besoin. + +Configuration ++++++++++++++ +Voici la configuration maven de déclaration des templates: + +:: + + <plugin> + <groupId>lutinplugin</groupId> + <artifactId>maven-generator-plugin</artifactId> + <version>0.xx</version> + <executions> + <execution> + <id>Generator</id> + <phase>generate-sources</phase> + <configuration> + <!-- repertoire des modeles ArgoUML --> + <srcDirZuml>src/xmi</srcDirZuml> + <!-- destination des fichiers XMI --> + <srcXmiDest>target/gen/xmi/</srcXmiDest> + <!-- destination des fichiers XML StateModel --> + <srcGenDest>target/gen/models/</srcGenDest> + <!-- Fichiers XML StateModel utilises pour la generation --> + <includes>**/*.*model</includes> + <!-- templates a utiliser --> + <templates>org.codelutin.topia.generator.TapestryWebGenerator</templates> + <!-- destination du code genere --> + <destDirGen>target/gen/java</destDirGen> + </configuration> + <goals> + <!-- ArgoUML -> XMI --> + <goal>zargo2xmi</goal> + <!-- XMI -> StateModel --> + <goal>xmi2statemodel</goal> + <!-- StateModel -> Java (selon le template) --> + <goal>generate</goal> + </goals> + </execution> + </executions> + <dependencies> + <dependency> + <groupId>lutinlib</groupId> + <artifactId>topia</artifactId> + <version>2.0.xx</version> + <scope>compile</scope> + </dependency> + </dependencies> + </plugin> + + +Nom de package +-------------- + +Une convention est utilisée dans le nom de package pour déterminer quel est la +racine de la structure (utilisée pour la génération basée sur tapestry par +exemple). + +Le motif utilisé est "web". Il désigne la racine. + +Exemple: + org.codelutin.chorem.web.projectManagement + +Ainsi, via tapestry l'url "/projectManagement" pourra être utilisée. + + +Génération Tapestry +------------------- +La génération sur Tapestry produit une classe abstraite par état déclaré dans le +modèle. +Ces classes abstraites : + + * déclare les autres pages(états) vers lesquelles elle peuvent naviguer. + Ces sont des références traitées par tapestry (annotations). + Chaque référence à pour type la classe concrête implémentée par le + développeur. + * gère l'entrée et la sortie des Use Case. + +Le developpeur doit donc developper l'implémentation tapestry en faisant +référence aux méthodes fournies dans les classes abstraites à hériter pour +naviguer. + +Exemple issue de la génération du modèle à l'image 1, voici la classe abstraite +SocietyView générée à partir du modèle : + +:: + + public abstract class AbstractSocietyView extends UseCasePage { + + public Object onActionFromOk() { + return leaveUseCase(); + } + + @InjectPage + private SocietyForm societyForm; + + protected SocietyForm getSocietyForm() { + return societyForm; + } + + public Object onActionFromEdit() { + enterUseCase(); + return societyForm; + } + + protected final String getUseCaseName() { + return "sv"; + } + } + +Conformément à la spécification : + * cet état est lié à l'état SocietyForm (état initial du sous cas d'utilisation + utilisé) + * dispose d'une action "ok" quittant le use case courant + * dispose d'une action "edit" entrant dans un nouveau use case + +Pour la partie développeur, voici un exemple consitant à appeler une action +avant d'effectuer la réelle navigation : + +:: + + public class SocietyView extends AbstractSocietyView { + + [...] + + @Override + public Object onActionFromEdit() { + + // action + getSocietyForm.setSociety(s); + + // appele de la super methode + return super.onActionFromEdit(); + } + + [...] + } + +Hiérarchie d'héritage +--------------------- +Comme on peut le voir, les classes implémentées par le développeur héritent des +des classes abstraites générées, l'empêchant ainsi d'utiliser son propre +héritage. + +Il est possible de spécifier une classe que toutes les classes abstraites +devront hériter via le fichier de propriété associé au modèle. + +Le propriété : + model.tagvalue.usecaseengineextendedclass=BasePage +spécifie que toutes les classes générées hériteront de la classe BasePage. \ No newline at end of file Property changes on: topia/trunk/topia-ui/src/site/fr/rst/UseCase.rst ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:mergeinfo + Name: svn:eol-style + native Added: topia/trunk/topia-ui/src/site/fr/rst/index.rst =================================================================== --- topia/trunk/topia-ui/src/site/fr/rst/index.rst (rev 0) +++ topia/trunk/topia-ui/src/site/fr/rst/index.rst 2009-01-12 13:54:45 UTC (rev 1294) @@ -0,0 +1,4 @@ +Topia-UI +======== + +Aucune documentation n'est disponible. \ No newline at end of file Added: topia/trunk/topia-ui/src/site/site.xml =================================================================== --- topia/trunk/topia-ui/src/site/site.xml (rev 0) +++ topia/trunk/topia-ui/src/site/site.xml 2009-01-12 13:54:45 UTC (rev 1294) @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="${project.name}"> + + <publishDate format="dd/MM/yyyy"/> + + <skin> + <groupId>org.codelutin</groupId> + <artifactId>maven-lutin-skin</artifactId> + <version>0.2.1</version> + </skin> + + <bannerLeft> + <name>${project.name}</name> + <href>index.html</href> + </bannerLeft> + + <bannerRight> + <src>http://www.codelutin.com/images/lutinorange-codelutin.png</src> + <href>${project.organization.url}</href> + </bannerRight> + + <poweredBy> + <logo href="http://maven.apache.org" name="Maven" img="images/logos/maven-feather.png"/> + <logo href="http://jrst.labs.libre-entreprise.org" name="JRst" img="images/jrst-logo.png"/> + <logo href="http://docutils.sourceforge.net/rst.html" name="ReStructuredText" + img="images/restructuredtext-logo.png"/> + </poweredBy> + + <body> + <links> + <item name="ToPIA Service" href="http://topia.labs.libre-entreprise.org/topia-service"/> + <item name="Labs" href="http://labs.libre-entreprise.org/"/> + <item name="Code Lutin" href="http://www.codelutin.com/"/> + </links> + + <menu ref="parent"/> + + <menu name="Utilisateur"> + <item href="/index.html" name="Accueil"/> + </menu> + + <menu name="Téléchargement"> + <item href="${labs.builder.url}/org/codelutin/${project.artifactId}/${project.version}" + name="Télécharger la dernière version"/> + <item href="${labs.builder.url}/org/codelutin/${project.artifactId}" + name="Voir toutes les versions"/> + </menu> + + <menu ref="reports"/> + + </body> +</project>