Date de création : | 04 Décembre 2003 | |
Dernière modification : | 04 Décembre 2003 | |
Diffusion : | internet |
3ème Cas de fichier de configuration XML : |
<?xml version="1.0" ?> |
Tout d'abord, quelques modifications. Voici la classe config que nous allons utiliser:
import java.io.IOException;
import java.net.URL;
import javax.servlet.jsp.JspException;
import org.apache.commons.digester.*;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class Config
{
//déclaration des variables de la classe
private static Config singleton = null;
private HashMap listeServeur;
/**
*
* @throws IOException
* @throws JspException
*/
private config() throws IOException, JspException {
//détaillée ci dessous
}
/**
*
* @param Server S : serveur à ajouter à la liste
*/
private void addserver(Server s) {
listeServeur.put(s.getHostname(), s);
}
/**
*
* @return Config Instance
* @throws IOException
* @throws JspException
*/
public static Config getInstance() throws IOException, JspException
{
if(singleton == null) {
singleton = new Config();
}
return singleton;
}
}
Nous avons aussi besoin d'une classe Serveur :
import java.net.URL;
public class Server
{
//déclaration des variables de la classe
private String authenticateURL = null;
private String validateURL = null;
private String logoutURL = null;
private String hostname= null;
private String port= null;
private String baseURI= null;
private String version= null;
public Server (){
}
/**
* @return server CAS Logout URL
*/
public String getLogoutURL() {
return logoutURL;
}
/**
* @return server CAS validate URL
*/
public String getValidateURL() {
return validateURL;
}
public String getHostname() {
return hostname;
}
public String setHostname(String _hostname) {
hostname = _hostname;
}
public String getPort() {
return port;
}
public String setPort(String _port) {
port = _port;
}
public String getBaseUri() {
return baseUri;
}
public String setBaseUri(String _baseUri) {
baseUri = _baseUri;
}
public String getVersion() {
return version;
}
public String setVersion(String _version) {
version = _version;
}
}
Dans cet exemple, nous allons créer un objet Serveur à chaque
occurrence du tag "cas".
Pour se faire, modifions la méthode config() de notre classe Config.
Nous utiliserons la méthode addObjectCreate(), qui va s'occuper de créer
un objet pour un tag donné, et addSetProperties() qui va associer les
valeurs décrites dans le fichier de configuration à des méthodes
de l'objet Serveur.
/**
*
* @throws IOException
* @throws JspException
*/
private config() throws IOException, JspException {
try {
Class requestingClass = this.getClass();
//Emplacement du fichier de config à parser
à partir du répertoire classes
URL resourceURL = requestingClass.getResource("/properties/fr_univ_rennes1/cas.xml");
if (resourceURL == null){
throw new JspException ("cas.xml does
not exist ");
}
//Création d'une instance Digester
Digester dig = new Digester();
//On rend l'objet disponible à la
manipulation en le mettant en haut de la pile
dig.push(this);
//Chaque fois que "servers/cas" sera
lu dans le fichier de config on lui associera un objet décrit dans la
classe Serveur.class
dig.addObjectCreate("servers/cas",Serveur.class);
Comme dans les exemples précendents, il faut passer les paramètres
lus en config.
Si l'attribut "hostname" est présent sur le tag "serveur/cas",
alors la méthode "setHostname()" de l'objet en cours s'exécute.
Là nous pouvons remarquer que le dernier paramètre est hostname
et non setHostname comme on aurait pu le croire. En fait le 3ème paramètre
est en quelque sorte le nom de la propriété de l'objet à
modifier. Or en java, pour modifier des variables privées, on utilise
la méthode "set...()". Donc par association, le 3ème
paramètre donnera le nom de la méthode à utiliser.
Attention, la première lettre du paramètre doit être en
minuscule alors que dans le nom de la méthode elle est en majuscule (hostname=>setHostname).
dig.addSetProperties( "servers/cas","hostname","hostname");
Il est possible d'ommettre le troisième paramètre s'il
est identique au deuxième. Dans le cas du port, l'éttribut en
config est "port" et la variable de l'objet est "port" donc
la méthode addProperties accepte seulement 2 paramètres
dig.addSetProperties("servers/cas","port");
//
dig.addSetProperties("servers/cas","baseUri");
//
dig.addSetProperties("servers/cas","version");
Maintenant nous avons créer l'objet, mais il faut le valider et le stocker
quelque part. C'est pourquoi nous faisons appelle à la méthode
addserver de la classe Config.
dig.addSetNext("servers/cas",
"addserver");
//On parse le fichier dont le chemin est passé
en paramètre
dig.parse(new InputSource(resourceURL.toExternalForm()));
}
catch (IOException e) {
throw new JspException("Impossible to load file cas.xml
: "+e);
}
catch (SAXException e) {
throw new JspException(e);
}
}
Variante :
Si toutes les propriétés d'un objets se trouvent, ou peuvent
se trouver, comme attribut un même tag et s'ils ont le même nom
dans le fichier de configuration que dans la classe, alors le passage de paramètre
se fait en une ligne :
dig.addSetProperties( "servers/cas");
Là, les attributs du tag "server/cas" seront passés
en paramètre aux méthodes qui leur correspondent.
Création : 04 Déc.2003 - Sébastien Gaudin (Université de Nancy 2) | |
Modifications : |