Archives par mot-clé : Maven

Maven settings.xml

J’avais déjà parlé de m2settings quand j’en avais eu l’idée, mais du prosélytisme occasionnel ne fait pas de mal… J’ai avancé mon petit utilitaire qui permet de configurer le fichier de configuration (settings.xml) de Maven 2.

Alors pourquoi cette simple interface graphique pour manipuler un fichier XML n’est-elle pas déjà finie?

  • Eh bien déjà parce que j’ai manqué de temps, et ce n’est pas en passant 4h tous les 4 mois qu’on avance.
  • s’ajoute à cela un manque de motivation, visiblement m2settings ne suscite pas un grand intérêt
  • ensuite parce que le Visual Editor d’Eclipse manquait de stabilité chez moi. Et l’idée que l’éditeur fasse de l’introspection trouve ses limites quand on commence à faire de l’héritage de classes graphiques. Très rapidement, le Visual Editor s’est mis à afficher des fenêtres entièrement grises et je devais faire du Swing à la main — non je ne suis pas fan. Bref, j’ai changé du tout au tout au profit de Netbeans (et forcément il faut refaire toute l’interface, et prendre en main NetBeans, aussi)
  • et puis, le modèle objet de projet (le POM) n’est pas non plus si simple
  • enfin, je me rends compte que mon AMD 64 n’est pas non plus un foudre de guerre — j’ose à peine imaginer ce que ça donne sur une machine moins performante

Maven est formidable

Maven, le gentoo-portage pour Java

J’ai découvert Maven il y a (trop) peu longtemps.

C’est assez génial, ça offre des archetypes de projet pour aller plus vite, un peu comme les scaffolds de Ruby on rails. Et ensuite ça gère la dépendence des jars, un peu comme une bonne distribution linux.

m2settings

Maven stocke les paramètres d’un utilisateur dans un fichier de configuration XML. Aujourd’hui, j’ai décidé de m’amuser à écrire une petite interface graphique pour modifier ce fichier… Mon projet va s’appeler m2settings

Quel outil de mapping Java<->XML ?

Je ne me pose pas trop de questions, je vais faire ça en Java. Je commence par le lien JavaBean<->XML. Comme toujours en Java, il y a une pléthore de possibilité:

  • Apache Xerces ne répond pas vraiment, il fait le parsing de XML. Mais moi, j’aurais aussi besoin d’écrire la configuration modifiée
  • Justement Apache betwixt fait le contraire: il transforme un Bean en XML.
  • Jato semble répondre, mais manque de documentation et le projet est visiblement mort en hibernation
  • castor répond parfaitement à mon besoin (et en plus je l’ai déjà un peu utilisé au boulot)
  • Xstream fait aussi tout à fait ce que je veux faire, et semble vraiment très simple à utiliser.

Je décide donc de commencer avec Xstream.

On démarre avec XStream

Je crée donc un projet Java, compatible avec eclipse

mvn create
mvn eclipse:eclipse

En pratique, voilà ce que je veux faire:

  1. package org.sourceforge.m2settings.beans;
  2.  
  3. import org.sourceforge.m2settings.XMLBinder;
  4.  
  5. import junit.framework.TestCase;
  6.  
  7. public class XMLBinderTest extends TestCase {
  8.     private XMLBinder xmlbind;
  9.  
  10.     private static final String XML_PROXY =
  11.          "<proxy>\n  <active>true</active>\n  <protocol>http</protocol>\n  <username>user</username>\n  <password>secretpwd</password>\n  <port>8080</port>\n  <host>proxy.intra</host>\n  <nonProxyHosts>*.intra</nonProxyHosts>\n  <id>myproxy-id</id>\n</proxy>";
  12.  
  13.     private static final Proxy proxy =
  14.             new Proxy(true, "http", "user",
  15.             "secretpwd", "8080", "proxy.intra", "*.intra", "myproxy-id");;
  16.  
  17.     @Override
  18.     protected void setUp() throws Exception {
  19.         xmlbind = new XMLBinder();
  20.     }
  21.  
  22.     /**
  23.      * Test transformation of Proxy bean into XML:
  24.      */
  25.     public void testMarshallProxy() {
  26.         assertEquals(XML_PROXY, xmlbind.toXML(proxy));
  27.     }
  28.  
  29.     /**
  30.      * Test transform XML section of &lt;proxy&gt; into Proxy bean
  31.      *
  32.      */
  33.     public void testUnmarshallProxy() {
  34.         Proxy p=(Proxy) xmlbind.fromXML(XML_MIRROR);
  35.         assertEquals(proxy, p);
  36.     }
  37. }

Pour résoudre mes erreurs de compilation, il me fau vite écrire mon xmlbind qui étant Xstream:

  1. package org.sourceforge.m2settings;
  2.  
  3. import org.sourceforge.m2settings.beans.Mirror;
  4.  
  5. public class XMLBinder extends XStream {
  6.     public XMLBinder() {
  7.         // does not require XPP3 library
  8.         // uses standard DOM library instead
  9.         super(new DomDriver());
  10.         this.alias("proxy", Proxy.class);
  11.     }
  12. }

Ce qui m’oblige enfin à écrire le bean en question:

  1. package org.sourceforge.m2settings.beans;
  2.  
  3. /**
  4.  * <proxy> <active/> <protocol/> <username/> <password/> <port/> <host/>
  5.  * <nonProxyHosts/> <id/> </proxy>
  6.  *
  7.  * @author regis
  8.  *
  9.  */
  10. public class Proxy {
  11.     /**
  12.      * Whether this proxy configuration is the active one.
  13.      */
  14.     private boolean active;
  15.  
  16.     private String protocol; // TODO enumeration
  17.  
  18.     private String username;
  19.  
  20.     private String password;
  21.  
  22.     private String port;
  23.  
  24.     private String host;
  25.  
  26.     /**
  27.      * The list of non-proxied hosts (usually comma-delimited).
  28.      */
  29.     private String nonProxyHosts;
  30.  
  31.     private String id;
  32.  
  33.     public Proxy(Boolean active, String protocol, String username,
  34.             String password, String port, String host, String nonProxyHosts,
  35.             String id) {
  36.         setActive(active);
  37.         setProtocol(protocol);
  38.         setUsername(username);
  39.         setPassword(password);
  40.         setPort(port);
  41.         setHost(host);
  42.         setNonProxyHosts(nonProxyHosts);
  43.         setId(id);
  44.     }
  45.  
  46.     @Override
  47.     public boolean equals(Object obj) {
  48.         if (obj.getClass() != Proxy.class)
  49.             return false;
  50.  
  51.         Proxy p = (Proxy) obj;
  52.         return (active == p.isActive() && protocol == p.getProtocol()
  53.                 && username == p.getUsername() && password == p.getPassword()
  54.                 && port == p.getPort() && host == p.getHost()
  55.                 && nonProxyHosts == p.getNonProxyHosts() && id == p.getId());
  56.     }
  57. }

Il faut écrite tous ses beans à la main?

Tout cela marche très bien, mais il faut écrire tous les beans…

Alors je passe à Castor, qui sait faire cela à partir de schéma XML. Et justement, j’ai le XSD de settings.

La suite au prochain épisode!