IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Chargement d'un fichier de paramétrage [SAX]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Chargement d'un fichier de paramétrage
    Bonjour,

    Je cherche en vain à charger le fichier XML qui contient le paramétrage de ma base de données depuis le répertoire d'exécution de mon programme. Je n'ai évidemment aucun problème lorsque j'utilise un getClass().getRessource("...") depuis un script ant étant donné que le script contient le répertoire d'exécution.

    En revanche, ces classes doivent être portées dans une appli web, je ne souhaite donc pas modifier le paramétrage pour chaque déploiement de l'application mais je cherche au contraire à charger mon fichier XML depuis le répertoire d'éxécution en cours. Lors du premier déploiement, tout se passe bien, le fichier est trouvé. Tout se complique après une recompilation : l'instruction getClass().getRessource("...") me retourne null alors que les fichiers sont toujours présents. Ca serait peut-être un problème d'accès en mémoire ...

    Voici mon code :

    String dBFilePath = getClass().getRessource("../config/Database.xml");
    SAXBuilder sxb = new SAXBuilder();
    Document doc = sxb.build(dBFilePath);
    Element root = doc.getRootElement();
    String driver = root.getChildText("driver");
    String url = root.getChildText("url");
    String username = root.getChildText("username");
    String password = root.getChildText("password");


    Connaissez-vous une instruction qui contourne ce problème ?

    Par avance merci.

    Philippe

  2. #2
    Membre habitué
    Inscrit en
    Octobre 2002
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 164
    Points : 190
    Points
    190
    Par défaut
    Le getResource ne marche que si ta ressource est dans le classpath.

    Donc déja tu dois te poser la question si ton fichier de config BD doit être dans le classpath. Si ce dernier doit pouvoir être modifié tu ne peux le mettre dans le classpath. En fait tu prends de risque de devoir modifier ton soft si tu package ton application Web sous forme de War.
    D'ailleurs pour info quand tu fais getResource("../config/XXXX") cela signifie que tu remontes d'un package par rapport au package courant.

    A mon avis ton erreur se situe dans la responsabilité de ta classe qui lit et interprète le fichier XML. En aucun cas cette classe n'est responsable de localiser le fichier XML. Ton code devrait donc être comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class DatabaseConfig {
     
      public static void configure(URL databaseURL) {
        SAXBuilder sxb = new SAXBuilder(); 
        Document doc = sxb.build(databaseURL); 
        ...
      }
    }
    Ainsi c'est bien la partie spécifique Ant, ou appli web qui connait la localisation de ton fichier de configuration. Tu sépares ainsi bien les responsabilités.

    PS: J'ai utilisé la classe URL car elle permet de faire beaucoup plus de chose que File (notamment la lecture de fichier dans un jar)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse mais ne déplace-t-on pas le problème ?

    Comment passer à un objet URL un chemin dépendant de la localisation de ma classe ? Par ailleurs, l'objet URL semble nécessiter un protocole et il n'y en a pas si j'exécute le modèle directement à partir d'une commande java.

    Je souhaite être complètement indépendant vis-à-vis de mon framework web afin de respecter le modèle MVC mais j'ai bien mal au crane depuis quelques jours à cause de ce problème.

    Si ta solution répond à mon problème, je veux bien un exemple un peu plus détaillé. Sinon, je suis preneur de nouvelles idées.

    Merci à toi et à tous ceux qui voudront bien me venir en aide.

    Philippe

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2002
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 164
    Points : 190
    Points
    190
    Par défaut
    Ce que je veux dire (oublions URL pour l'instant) c'est que ton framework (DB je pense) est juste responsable de lire et d'interpréter un flux XML, puis de ....

    Ne demande pas à ton framework de savoir comment ouvrir ce flux tout seul. Donc passe ce flux à ton framework et effectivement déplace ce problème ailleurs.
    Mais il est plus que concevable que ton application qui elle utilise le framework, sache comment ouvrir ce fameux flux et c'est même certainement dépendant de cette application (fonction si J2EE, Swing, console, ...)

    Ensuite pour savoir ou et comment ouvrir ce flux depuis ton application web pose toi la question du déploiement (type de packaging souhaité ou imposé, modification lors de l'installation, etc...).

    Après suivant ou tu souhaites que ce fichier soit il existe de multitudes de solutions.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    OK !

    Voici ce que je voulais faire plus exactement :

    Disons que j'ai développé une classe générale d'accès aux données (que j'ai nommé Database) qui comprend une méthode de connexion ainsi que quelques méthodes simplistes pour encapsuler l'exécution de requetes. Cette classe initialise une connexion avec la base en fonction des paramètres d'un fichier XML. Fichier XML que la classe doit charger elle même.

    J'ai également développé pour chacune des tables de ma base une classe java assurant le mapping avec la base. Par exemple, j'ai une classe Utilisateur qui mappe la table Utilisateur et qui contient des méthodes save(), update(), delete(), find()... Chacune des méthodes que je viens de citer utilisent elles-même un objet de type Database dont je parlais plus haut et réalisent tout le traitement.

    Je cherche alors à faire la chose suivante :
    Mettons que je sois dans une classe Action du framework Struts ou que je sois dans une méthode qui intercepte le clic d'un bouton dans une interface swing. Quand je récupère le login et le mot de passe saisis par un utilisateur, je voudrais seulement instantier un objet de type Utilisateur et appeler sur cet objet une mtéhode isRegistered() qui s'occupe elle même de récupérer une connexion avec la base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    class Database {
     
         ...
     
         public Database(){
     
             try{
                String executionDirectory = ... //  La méthode que je cherche en vain !!
                //getClass().getResource("../config"); ne fonctionne pas :-/
                dBFilePath = executionDirectory + "Database.xml"; 
                //Instantiation du parser et chargement du fichier
                SAXBuilder sxb = new SAXBuilder();
                Document doc = sxb.build(dBFilePath);
                Element root = doc.getRootElement();
                this.driver = root.getChildText("driver");
                this.url = root.getChildText("url");
                this.username = root.getChildText("username");
                this.password = root.getChildText("password");
                Class.forName(this.driver);   
            }catch(ClassNotFoundException cnfe) {
                System.out.println("Driver SQL non trouve");
            }catch(Exception e){
                System.out.println(e.getMessage());
            }
        }
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
        class Utilisateur{
     
            ....
     
            public boolean isRegistered()throws SQLException{
               String query = "SELECT * FROM UTILISATEUR WHERE";
               query += " login = '" + this.getLogin() + "'";
               query += " AND pass = '" + this.getPass() + "'";
               boolean isRegistered = false;
               try {
                  Database mySqlDB = new MySqlDB();
                  ResultSet rst = mySqlDB.executeQuery(query);
                  if(rst.next()){
                     isRegistered = true;
                  }
               } catch (SQLException sqle) {
                   throw sqle;
               }
               return ( isRegistered);
            }
     
        }
    Si j'initialise ma connexion directement dans Struts ou dans mon client swing, je vais devoir rajouter du code très rapidement redondant : Création d'une connexion, traitement du résultat...

    N'existe-t-il pas un moyen de réaliser une indépendance totale entre le modèle et le contrôleur par le biais d'un fichier de paramétrage qui pourrait être lu quels que soient les conditions d'exécution de ma classe Database ? Ou alors, est-il possible de passer ce fichier de paramétrage à ma classe java par le biais du fichier web.xml ?

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2002
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 164
    Points : 190
    Points
    190
    Par défaut
    Passe par exemple par une variable d'environnement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java -Ddatabase.config=XXXXX -Xmx128m .... <main_class>
    Ainsi ce sera la même technique que cela soit dans une application Swing ou dans une application Web.

    Mais je persiste : tu ne peux pas forcément utiliser le même emplacement pour le fichier de configuration. Donc ta classe Database ne doit pas savoir comment aller chercher ce fichier (même si tu peux imaginer un algo qui recherche d'abord dans le classpath par exemple, puis qui regarde une variable d'environnement, puis....)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai résolu le problème.

    Il suffisait tout simplement d'ajouter un slash dans le chemin du fichier.
    Il fallait donc utiliser getClass().getResource("/monChemin/monFichier"); et non pas getClass().getResource("monChemin/monFichier");

    Philippe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH MX2004] [AS2] Attendre la fin de chargement d'un fichier avant de continuer.
    Par Demco dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 01/03/2007, 15h13
  2. Fichier .ini/paramétrage d'application java par l'user
    Par devjav dans le forum Général Java
    Réponses: 14
    Dernier message: 30/03/2006, 16h31
  3. télécharger des fichiers de paramétrage
    Par yas2006 dans le forum JWS
    Réponses: 7
    Dernier message: 27/03/2006, 14h17
  4. [Debutant][D7]Pb au chargement d'un fichier *.3ds
    Par [Silk] dans le forum OpenGL
    Réponses: 1
    Dernier message: 26/06/2005, 11h10
  5. chargement d'un fichier externe en base de données
    Par samsbike dans le forum Administration
    Réponses: 3
    Dernier message: 24/08/2004, 17h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo