Il y a 14 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.
Commentaire
5 réponses pour " Exadel Flamingo – Applications Flex, AMF, Spring "
Published by kwame , Il y a 14 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.
Published by Christophe Heubès , Il y a 14 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 deflamigoinstall
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.Published by kwame , Il y a 14 ans
Merci beaucoup christophe.
Je vais l’essayer et je te rendrai compte du résultat.
Bonne journée,
Kwame.
Published by kwame , Il y a 14 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.