Groupe 1C (normes)

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" ?>
<servers>
<cas
hostname="domaine.fr"
port="443"
baseUri="/cas"
version="2.0"
/>
<cas
hostname="domaine.fr"
port="444"
baseUri="/casDeTest"
version="2.5"
/>
</servers>

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 authenticate URL
*/
public String getAuthenticateURL() {
return authenticateURL;
}

/**
* @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.