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

Java Discussion :

Variable dans un .properties


Sujet :

Java

  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 50
    Billets dans le blog
    1
    Par défaut Variable dans un .properties
    Bonjour !

    J'ai un fichier de configuration conf.properties, et je souhaiterais pouvoir utiliser une variable afin de réutiliser une constante défini plus haut dans le properties.

    Par exemple, qqch du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dist_home=C:\\dist
    lib_dist=${dist_home}/lib
    On réutilise "dist_home".

    Est-ce possible ?

    Merci d'avance !

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Ce n'est pas géré par la classe Properties, mais c'est assez simple à réaliser avec une regexp, que ce soit dans une méthode static ou en héritant de Properties...

    Un exemple commenté :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    class MyProperties extends Properties {
     
    	/** Le pattern de recherche des substitutions */
    	private final Pattern pattern = Pattern.compile(
    			"\\$" + // le caractère "$"
    			"\\{" + // le caractère "{"
    			"(.*?)" + // n'importe quoi
    			"\\}"	// le caractère "}"
    	);
     
    	@Override
    	public String getProperty(String key) {
    		// On récupère la valeur "standard" du ficier properties :
    		String result = super.getProperty(key);
     
    		if (result!=null) {
    			// On recherche la présence d'une substitutions :
    			Matcher matcher = this.pattern.matcher(result);
    			// Si on en trouve au moins une :
    			if (matcher.find()) {
    				// On crée une StringBuffer qui contiendra la nouvelle chaine :
    				StringBuffer sb = new StringBuffer(result.length());
    				// Puis pour chaque éléments à substituer qu'on trouve :
    				do {
    					// On récupère le nom de la clef
    					String name = matcher.group(1).trim();
    					// On récupère la valeur :
    					String val = getProperty(name);
    					// Si elle n'existe pas, on laisse la chaine tel quel :
    					// (on pourrait éventuellement remplacé cela par un blanc)
    					if (val==null)
    						val = matcher.group();
     
    					// On effecute le remplacement (dans le StringBuilder) :
    					matcher.appendReplacement(sb, Matcher.quoteReplacement(val));
    				} while (matcher.find());
    				// On copie la fin de la chaine :
    				matcher.appendTail(sb);
    				// Et on affecte notre nouveau résultat
    				result = sb.toString();
    			}
    		}
    		return result;
    	}
    }

    Bien sûr des références croisées provoqueront un StackOverFlow...


    a++

  3. #3
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Bonjour,

    Nativement, non, cela n'est pas géré, à ce que je sache.

    Mais rien ne t'empêche de faire une classe fille de Properties qui gère cela.
    Je vois d'emblée deux problématiques:
    - bien gérer la syntaxe
    - gérer les boucles du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toto=${tata}
    tata=${toto}/lib
    Après, il est possible que cela existe déjà (avec ce format ou un autre) dans des librairies tierces. Je connais peu les lib commons d'apache, mais je sais qu'elles contiennent pas mal de choses utiles.

    Bon courage

    Edit: grillé (et moins complet )

  4. #4
    Membre confirmé

    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 50
    Billets dans le blog
    1
    Par défaut
    Merci beaucoup !

    Par contre, les références croisées, ça peut vite devenir compliqué, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto=${titi}
    titi=${tata}/src
    tata=${toto}/lib
    Voire plus loin! (on peut imaginer autant de profondeur qu'on veut, complexifier violemment). Pour résoudre ça, il faudrait faire un graphe de dépendance et vérifier qu'il n'y a pas de cycles…

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    S'il n'y a pas de cycles cela devrait marcher...

    Maintenant s'il y a des cycles tu vas te prendre un StackOverFlow. On pourrait éventuellement compter le nombre d'itération pour stopper les cycles...


    a++

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

Discussions similaires

  1. Initilaliser une variable dans une jsp avec <s: property>
    Par saloua2200 dans le forum Struts 2
    Réponses: 1
    Dernier message: 06/06/2011, 21h12
  2. Introduction de nouvelles variables dans les fichiers properties
    Par MyGoul dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 31/01/2011, 18h27
  3. une variable type long qui recupère une valeur dans un .properties
    Par zouuc dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 27/02/2009, 17h08
  4. [syntaxe] Gerer les variables dans une requete
    Par rastapopulos dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 15/04/2003, 12h53

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