Publié par

Il y a 11 ans -

Temps de lecture 8 minutes

Exadel Flamingo – Applications Flex, AMF, Spring

L’article du Touilleur Express (aka Nicolas Martignole) intitulé Exadel Flamingo : JBoss Seam et Adobe Flex ensembles m’a donné envie de tester les capacité de flamingo d’Exadel.

Exadel Flamingo fournit un ensemble de scripts, basés sur Maven, visant à simplifier le démarrage de projets RIA. Ces scripts permettent de générer le code initial et redondant d’un projet.
La promesse est donc d’offrir la capacité de créer une application CRUD dotée d’une interface riche très rapidement et sans effort de développement.
(Nous ne discuterons pas ici de l’intérêt ou non de doter une application de type CRUD d’une interface riche …)

Les technologies couvertes aujourd’hui sont :

  • Flex et JavaFX pour partie cliente,
  • AMF et Hessian pour la communication,
  • JBoss Seam et Spring pour la partie serveur.

Question de contexte et de goût, j’ai pour ma part porté mon attention sur le triplet Flex / AMF / Spring.

Même si certains aspects méritent des améliorations, la promesse est tenue. Bien que n’ayant jamais pratiqué Flex (ou presque), il ne m’a pas fallu longtemps pour monter mon CRUD Flex / Spring / Hibernate.
Ce billet présente le déroulé de mes premiers essais.

Installation de Flamingo et pré-requis

L’utilisation de flamingo requiert un poste de travail sur lequel sont installés et configurés :

  • Maven 2
  • Un JDK 1.5 ou supérieur
  • Un SDK Flex

L’installation de flamingo est on ne peut plus simple :

  • Décompression de l’archive flamingo-1.x.x.zip.
  • Exécution du script flamingoinstall (ce script installe les librairies flamingo dans le repository maven local du poste de travail).
  • Ajout du répertoire bin de flamingo dans le {{PATH}}

Création du projet

La création d’un projet à partir de flamingo en mode ligne de commande se fait tout bonnement par exécution de flamingo create project :

X:\XFR_Code\trunk\flex>flamingo create project
[INFO] Scanning for projects...
[INFO] ----------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [com.exadel.flamingo.maven.plugin:flamingoapp:1.6.0:create-project] (aggregator-style)
[INFO] ----------------------------------------------------------------------------
[INFO] [flamingoapp:create-project]
discovered andromdapp type --> 'flamingo-spring'
discovered andromdapp type --> 'flamingo-seam'

Il suffit ensuite de répondre à une douzaine de questions afin de paramétrer le projet :

  • Choix de la technologie serveur :
	Please choose the type of application to generate (flamingo-spring, flamingo-seam):[flamingo-spring]
	flamingo-spring
	
  • Caractéristiques du projet :
	Please enter the location in which your new application will be created (i.e. c:/java/development):
	X:\XFR_Code\trunk\flex
	Enter the project name (e.g. myproject):
	flamingo-demo
	Please enter the root package name for your project (e.g. com.mydomain.myproject): [fr.xebia.demo.flamingo]
	fr.xebia.demo.flamingo
	
  • Choix de la technologie cliente :
	Will this project have Flex or JavaFX user interface? (flex, javafx): [flex]
	flex
	
  • Choix du protocole de communication :
	Will this project use Hessian or AMF protocol? (amf, hessian): [amf]
	amf
	
  • Configuration de la base de données :
	What kind of database are you using? (hsql, mysql, oracle, postgres, mssql, db2, sybase, none): [hsql]
	hsql
	Enter the JDBC URL for your database (e.g. jdbc:hsqldb:.): [jdbc:hsqldb:.]
	jdbc:hsqldb:.
	Enter database username: [sa]
	sa
	Enter database password: []
	Do you want to update the database schema each time you deploy? (y, n): [y]
	y
	
  • Nom de la première entité du projet :
	Enter the entity class name (Flex source files to view and modify entities will be generated as well): [Product]
	Product
	

Le projet est ensuite généré au format Maven :

-------------------------------------------------------------------------------------
    G e n e r a t i n g   A n d r o M D A   P o w e r e d   A p p l i c a t i o n
-------------------------------------------------------------------------------------
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/flamingoproject.properties'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/flex/pom.xml'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/flex/src/main/flex/fr/xebia/demo/flamingo/view/ProductManager.mxml'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/flex/src/main/flex/fr/xebia/demo/flamingo/vo/Product.as'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/flex/src/main/flex/main.mxml'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/flex/src/main/resources/services-config.xml'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/pom.xml'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/readme.txt'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/pom.xml'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/java/fr/xebia/demo/flamingo/Product.java'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/java/fr/xebia/demo/flamingo/ProductDAO.java'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/java/fr/xebia/demo/flamingo/ProductDAOImpl.java'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/java/fr/xebia/demo/flamingo/service/ProductService.java'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/java/fr/xebia/demo/flamingo/service/ILoginService.java'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/java/fr/xebia/demo/flamingo/service/LoginService.java'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/resources/applicationContext-test.xml'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/resources/applicationContext.xml'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/resources/hibernate.cfg.xml'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/webapp/index.html'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/main/webapp/WEB-INF/web.xml'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/test/java/fr/xebia/demo/flamingo/dao/ProductDAOTest.java'
    Output: 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/web/src/test/java/fr/xebia/demo/flamingo/DataSourceTestCase.java'
-------------------------------------------------------------------------------------
    New application generated to --> 'file:/X:/XFR_Code/trunk/flex/flamingo-demo/'
-------------------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 42 seconds
[INFO] Finished at: Fri Aug 01 11:17:54 CEST 2008
[INFO] Final Memory: 9M/19M
[INFO] ------------------------------------------------------------------------

Compilation, Tests Unitaires et Packaging

Le projet étant généré au format Maven, un simple mvn clean package -Denv.FLEX_HOME=C:toolsflex_sdk_3 permet de compiler, lancer les tests unitaires et packager un war :

X:\XFR_Code\trunk\flex\flamingo-demo>mvn clean package -Denv.FLEX_HOME=C:\tools\flex_sdk_3

Première exécution

Souhaitant exécuter mes essais sous jetty depuis Maven, il m’a fallu :

  • Ajouter le plugin jetty au projet web ({{flamingo-demo/web/pom.xml}}) :

    org.mortbay.jetty
    maven-jetty-plugin
    
        
            commons-logging
            commons-logging
            1.1.1
        
        
            org.slf4j
            slf4j-jcl
            1.4.3
        
        
            log4j
            log4j
            1.2.15
        
    
    
        9181
        STOP
        
            
                log4j.configuration
                file:./target/classes/log4j.xml
            
        
    

  • Ajouter un fichier log4j.xml dans flamingo-demowebsrcmainresources
  • Supprimer le scope test sur la dépendance à hsqldb ({{flamingo-demo/web/pom.xml}}) :
	
        hsqldb
        hsqldb
        1.8.0.7
    

J’ai également modifié le fichier flamingo-demo/flex/src/main/resources/services-config.xml afin que le canal AMF pointe au bon endroit (dans le cadre d’un projet, on veillera à templatiser).


    
        
    

Après installation du projet avec la commande mvn clean install -Denv.FLEX_HOME=C:toolsflex_sdk_3 (à la racine du projet parent), la commande mvn jetty:run-war -Djetty.port=9081 (dans le projet web) lance l’exécution du war packagé sous jetty :

	X:\XFR_Code\trunk\flex\flamingo-demo\web>mvn -Dmaven.test.skip=true jetty:run-war -Djetty.port=9081

L’application est alors accessible à l’url http://localhost:9081/flamingo-demo-web/. Elle démarre sur un écran de login assez inattendu avec le mot de passe en clair :

Une fois « authentifié », on accède à un écran présentant la liste des entités sous forme de tableau triable et aux fonctions de création modification suppression :

Modification de l’entité et regénération des écrans

Modifions maintenant notre entité Product pour y ajouter les attributs suivants (avec leurs accesseurs) :

private String description;
private Float price;
private Date avaibility;

La regénération des beans et des écrans passe par la commande flamingo create screen :

	X:\XFR_Code\trunk\flex\flamingo-demo>flamingo create screen
	X:\XFR_Code\trunk\flex\flamingo-demo>set MAVEN_OPTS=-Xmx1024m
	[INFO] Scanning for projects...
	[INFO] Reactor build order:
	[INFO]   flamingo-demo
	[INFO]   flamingo-demo Flex
	[INFO]   flamingo-demo Web
	[INFO] ----------------------------------------------------------------------------
	[INFO] Building flamingo-demo
	[INFO]    task-segment: [com.exadel.flamingo.maven.plugin:flamingoapp:1.6.0:create-screen] (aggregator-style)
	[INFO] ----------------------------------------------------------------------------
	[INFO] [flamingoapp:create-screen]
	File Product.as already exists. Do you want replace it? (yes, no, all):[all]
	all	
	[INFO] all
	[INFO] Product is a root entity
	File ProductScreens.mxml already exists. Do you want replace it? (yes, no, all):[all]
	all
	[INFO] all
	Check if the services-config.xml file contains the following destinations:
	
	[INFO] ------------------------------------------------------------------------
	[INFO] BUILD SUCCESSFUL
	[INFO] ------------------------------------------------------------------------
	[INFO] Total time: 22 seconds
	[INFO] Finished at: Tue Aug 05 09:16:42 CEST 2008
	[INFO] Final Memory: 8M/15M
	[INFO] ------------------------------------------------------------------------

Après réinstallation de l’application dans notre repository local et redémarrage de jetty, nous obtenons les écrans suivants :

 

L’ajout de nouvelles entités se fait tout aussi simplement. Les différentes entités sont alors présentées au travers d’onglets.

Pour conclure

Exadel Flamingo répond donc bien au besoin de génération du code initial et redondant d’un CRUD RIA. La création d’un CRUD Flex / Spring / Hibernate se fait sans heurt et sans que l’on ait trop à regarder sous le capot.

Quelques points restent cependant à améliorer (gageons qu’ils le seront rapidement), notamment la validation des données saisies : apparemment, aucune validation n’est faite sur le type des données. Si l’on saisit des données erronées pour des attributs de type numérique ou date, la soumission du formulaire est « acceptée » et ses attributs se voient affecter une valeur null.

Le résultat de ces premiers essais est disponible sur le SVN de Xebia France : http://code.google.com/p/xebia-france/source/browse/#svn/trunk/flex/flamingo-demo.

Publié par

Commentaire

5 réponses pour " Exadel Flamingo – Applications Flex, AMF, Spring "

  1. Publié par , Il y a 11 ans

    Interessant!!! J’ai voulu essayer et voici mes problemes:
    1) j’ai installé maven 2 puis dézipé famingo… puis fait flamingoinstall et voici ce qui sort:
    Unable to download the artifact from any repository com.exadel.flamingo.maven.plugin:flamingoapp:pom:1.7.1
    from the specified remote repositories: central
    que dois je faire pour y remédier? Je suis vraiment bloqué.
    2) Mon idee c’est: une fois le projet initial généré, l’importer sous myeclipse sous lequel j’ai le plugin FlexBuilder 3; et travailler de là.
    Pouvez vous me dire concretement comment je dois faire?
    Merci pour une réponse rapide.
    Kwame.

  2. Publié par , Il y a 11 ans

    1/ C’est un problème Maven.
    L’artefact com.exadel.flamingo.maven.plugin:flamingoapp n’existe effectivement pas en version 1.7.1 dans le repository central (Cf. http://repo1.maven.org/maven2/com/exadel/flamingo/maven/plugin/flamingoapp/).
    D’un autre côté, le script flamingoinstall.bat n’a aucune raison de chercher à récupérer cet artefact dans le repository central. Je viens de faire le test sur un poste « propre », l’exécution de flamigoinstall n’a pas posé de problème.
    Difficile d’aller plus sans plus d’information …

    2/ Pour importer un projet maven dans eclipse, il suffit d’exécuter la commande mvn eclipse:eclipse (elle génère les fichiers projets Eclipse) à la racine du projet puis d’importer les projets générés dans Eclipse.

  3. Publié par , Il y a 11 ans

    Merci beaucoup christophe.
    Je vais l’essayer et je te rendrai compte du résultat.
    Bonne journée,
    Kwame.

  4. Publié par , Il y a 11 ans

    Excusez moi: maven, je ne le connait pas beaucoup.
    Mais comment dois-je utiliser le link http://repo1.maven.org/maven2/com/exadel/flamingo/maven/plugin/flamingoapp/
    que vous m’avez envoyé pour faire fonctionner la chose.
    Voulez vous etre plus explicite s’il vous plait?
    ou bien me dire les informations supplementaires que vous désirez avoir pour mieux m’aider?
    Merci.
    Kwame.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Xebian, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.