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
morten 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
<br />
mvn create<br />
mvn eclipse:eclipse<br />
En pratique, voilà ce que je veux faire:
[java]
package org.sourceforge.m2settings.beans;
import org.sourceforge.m2settings.XMLBinder;
import junit.framework.TestCase;
public class XMLBinderTest extends TestCase {
private XMLBinder xmlbind;
private static final String XML_PROXY =
«
private static final Proxy proxy =
new Proxy(true, « http », « user »,
« secretpwd », « 8080 », « proxy.intra », « *.intra », « myproxy-id »);;
@Override
protected void setUp() throws Exception {
xmlbind = new XMLBinder();
}
/**
- Test transformation of Proxy bean into XML:
*/
public void testMarshallProxy() {
assertEquals(XML_PROXY, xmlbind.toXML(proxy));
}
/**
- Test transform XML section of
into Proxy bean
*
*/
public void testUnmarshallProxy() {
Proxy p=(Proxy) xmlbind.fromXML(XML_MIRROR);
assertEquals(proxy, p);
}
}
[/java]
Pour résoudre mes erreurs de compilation, il me fau vite écrire mon xmlbind qui étant Xstream:
[java]
package org.sourceforge.m2settings;
import org.sourceforge.m2settings.beans.Mirror;
public class XMLBinder extends XStream {
public XMLBinder() {
// does not require XPP3 library
// uses standard DOM library instead
super(new DomDriver());
this.alias(« proxy », Proxy.class);
}
}
[/java]
Ce qui m’oblige enfin à écrire le bean en question:
[java]
package org.sourceforge.m2settings.beans;
/**
-
-
</proxy> *
- @author regis
*
*/
public class Proxy {
/**
- Whether this proxy configuration is the active one.
*/
private boolean active;
private String protocol; // TODO enumeration
private String username;
private String password;
private String port;
private String host;
/**
- The list of non-proxied hosts (usually comma-delimited).
*/
private String nonProxyHosts;
private String id;
public Proxy(Boolean active, String protocol, String username,
String password, String port, String host, String nonProxyHosts,
String id) {
setActive(active);
setProtocol(protocol);
setUsername(username);
setPassword(password);
setPort(port);
setHost(host);
setNonProxyHosts(nonProxyHosts);
setId(id);
}
@Override
public boolean equals(Object obj) {
if (obj.getClass() != Proxy.class)
return false;
Proxy p = (Proxy) obj;
return (active == p.isActive() && protocol == p.getProtocol()
&& username == p.getUsername() && password == p.getPassword()
&& port == p.getPort() && host == p.getHost()
&& nonProxyHosts == p.getNonProxyHosts() && id == p.getId());
}
}
[/java]
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!