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

Collection et Stream Java Discussion :

java.utils.Properties avec Expression Language


Sujet :

Collection et Stream Java

  1. #1
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Par défaut java.utils.Properties avec Expression Language
    Bonjour,
    J'utilise la classe java.utils.Properties et je me rends compte que les EL ne sont pas traduites. Cela signifie-t-il que cette classe n'est pas compatible avec un fichier de propriétés comportant des EL ?

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu pourrais expliquer ce que tu veux faire? Les Expression language est les fichiers properties n'ont rien à voir entre eux.

  3. #3
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    si ce que tu entends par EL c'est ca :

    maProp=maValue
    maProp2=${maProp}

    effectivement java.util.properties ne le gère pas. Mais par contre commons-configuration le fait très bien.

  4. #4
    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
    Citation Envoyé par hugo123 Voir le message
    effectivement java.util.properties ne le gère pas. Mais par contre commons-configuration le fait très bien.
    En même temps ce n'est pas très dur à gérer non plus ! Un petit coup de regexp et c'est dans la poche :
    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
    class ExtendedProperties extends Properties {
     
    	/** L'expression régulière qui défini nos éléments : */
    	private final Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}");
     
    	@Override
    	public String getProperty(String key) {
    		String property = super.getProperty(key);
    		if (property!=null) {
    			// On recherche le pattern de l'expression :
    			Matcher matcher = pattern.matcher(property);
    			// Si on trouve au moins un élément :
    			if (matcher.find()) {
    				// On crée un StringBuffer pour générer la nouvelle chaine :
    				StringBuffer sb = new StringBuffer(property.length());
    				// Puis on traite toutes les éléments trouvés :
    				do {
    					// On récupère la nouvelle clef :
    					String subKey = matcher.group(1);
    					// On récupère la valeur de cette clef :
    					String replacement = getProperty(subKey);
    					// Si la valeur est nulle, on laisse l'expression tel quel :
    					if (replacement==null) {
    						replacement = matcher.group();
    					}
    					// On effectue le remplacement en ajoutant le tout dans le StringBuffer :
    					matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement));
    				} while (matcher.find());
    				// On concatène la fin de la chaine :
    				matcher.appendTail(sb);
    				// Et on affecte la nouvelle propriété :
    				property = sb.toString();
    			}
    		}
    		return property;
    	}
    }
    a++

  5. #5
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Par défaut
    Merci pour vos réponses. Commons-configuration peut-il s'utiliser dans un environnement serveur, stand-alone ou les deux ?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    En même temps ce n'est pas très dur à gérer non plus ! Un petit coup de regexp et c'est dans la poche :
    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
    class ExtendedProperties extends Properties {
     
    	/** L'expression régulière qui défini nos éléments : */
    	private final Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}");
     
    	@Override
    	public String getProperty(String key) {
    		String property = super.getProperty(key);
    		if (property!=null) {
    			// On recherche le pattern de l'expression :
    			Matcher matcher = pattern.matcher(property);
    			// Si on trouve au moins un élément :
    			if (matcher.find()) {
    				// On crée un StringBuffer pour générer la nouvelle chaine :
    				StringBuffer sb = new StringBuffer(property.length());
    				// Puis on traite toutes les éléments trouvés :
    				do {
    					// On récupère la nouvelle clef :
    					String subKey = matcher.group(1);
    					// On récupère la valeur de cette clef :
    					String replacement = getProperty(subKey);
    					// Si la valeur est nulle, on laisse l'expression tel quel :
    					if (replacement==null) {
    						replacement = matcher.group();
    					}
    					// On effectue le remplacement en ajoutant le tout dans le StringBuffer :
    					matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement));
    				} while (matcher.find());
    				// On concatène la fin de la chaine :
    				matcher.appendTail(sb);
    				// Et on affecte la nouvelle propriété :
    				property = sb.toString();
    			}
    		}
    		return property;
    	}
    }
    a++
    On peut rajouter une petite optimisation à la fin pour empécher le même travail la prochaine fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	// On concatène la fin de la chaine :
    	matcher.appendTail(sb);
    	// Et on affecte la nouvelle propriété :
    	property = sb.toString();
            //Optimisation pour la prochaine recherche
            put(key, property); //for next fetch
    }

  7. #7
    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
    Ca dépend de ce que tu veux faire avec ta classe properties, car cela pourrait te fausser le fichier si tu le réenregistres (tu perdrais alors les expressions).

    a++

    PS : A noter également que mon code ne gère pas du tout les références circulaires, ce qui aboutira à une exception...

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ca dépend de ce que tu veux faire avec ta classe properties, car cela pourrait te fausser le fichier si tu le réenregistres (tu perdrais alors les expressions).

    a++

    PS : A noter également que mon code ne gère pas du tout les références circulaires, ce qui aboutira à une exception...
    De toute façon même sans cette optimisation le résultat sera toujours faux s'il ya modifications car les informations du fichier sont mis dans une Map dès la construction de l'instance

  9. #9
    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
    Ce que je veux dire, c'est qu'il n'est pas rare de sauvegarder un Properties à la fin de l'application avec la méthode store(), afin de conserver les éventuelles modifications qu'on y a apporté (par exemple pour la configuration d'une application).


    Maintenant c'est sûr que cela dépend de l'utilisation qu'on fait de Properties

    a++

  10. #10
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Par défaut
    OK merci, je crois qu'il de quoi faire maintenant. J'y avais pensé à la regex (+-) mais c'est que s'il y a d'autres méthodes à gérer ça alourdi vachement (je sais pas si j'ai tout bien compris ). On me dit toujours de ne pas réinventer la roue, mais bon !
    Merci les gars

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ce que je veux dire, c'est qu'il n'est pas rare de sauvegarder un Properties à la fin de l'application avec la méthode store(), afin de conserver les éventuelles modifications qu'on y a apporté (par exemple pour la configuration d'une application).


    Maintenant c'est sûr que cela dépend de l'utilisation qu'on fait de Properties

    a++
    Dans le cas d'une sauvegarde on perdra les lignes dont la valeur contient une EL.. mais ça m'étonnerai (rare) qu'on change un fichier properties à la volée dans une application web ou autres
    En tout cas tu peux quand même reconnaitre que c'est une petite optimisation
    Pilate : tant qu'une solution réutilisable satisfait au besoin ce n'est pas la peine de la réécrire.

  12. #12
    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
    Citation Envoyé par pilate Voir le message
    On me dit toujours de ne pas réinventer la roue, mais bon !
    Ben tu as le choix : tu peux très bien utiliser Commons-configuration

    Citation Envoyé par hibour Voir le message
    mais ça m'étonnerai (rare) qu'on change un fichier properties à la volée dans une application web ou autres
    En tout cas tu peux quand même reconnaitre que c'est une petite optimisation
    Je n'ai jamais dit que ce n'était pas une optimisation
    J'ai simplement dit que la modification des données pouvaient gêner dans le cas où l'on sauvegarde les données par la suite

    a++

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par pilate Voir le message
    Merci pour vos réponses. Commons-configuration peut-il s'utiliser dans un environnement serveur, stand-alone ou les deux ?
    Ce n'est qu'une libirairie de lecture de fichiers, tant qu'il y a une jvm complète, ca fonctionne.

  14. #14
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Par défaut
    OK j'ai essaye la methode de adiGuba mais il y a un bug (duplication d'une partie de la propriété). Je ne comprends pas ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringBuffer sb = new StringBuffer(property.length());
    Normalement, la property finale n'est pas sensé avoir la même longueur que celle contenant les EL !
    Et pis le quoteReplacement, rin compris moi... Mais l'idée étant bonne, je l'ai reprise et ça marche maintenant merci beaucoup. Mon code pour ceux que ça intéresse.
    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
    package com...;
     
    import java.util.Properties;
     
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
     
    public class ELParserProperties extends Properties {
     
    	private static final long serialVersionUID = 1L;
    	private static final Log LOG = LogFactory.getLog(ELParserProperties.class);
    	private static final String EL_START = "${";
    	private static final String EL_END = "}";
     
    	@Override
    	public String getProperty(String key) {
    		String property = super.getProperty(key);
    		LOG.trace("property avant traitement : " + property);
    		if (property != null) {
    			while (property.contains(EL_START)) {
    				String beforeSubKey = property.substring(0, property.indexOf(EL_START));
    				String subKey = property.substring(
    						property.indexOf(EL_START) + EL_START.length(), property
    								.indexOf(EL_END));
    				String afterSubKey = property.substring(property.indexOf(EL_END) + EL_END.length(), property.length());
    				LOG.trace(beforeSubKey + "--" + subKey + "--" + afterSubKey);
    				property = beforeSubKey + getProperty(subKey) + afterSubKey;
    				LOG.trace("property apres traitement : " + property);
    			}
    			put(key, property);
    		}
    		return property;
    	}
     
    }
    J'ai essayé avec plusieurs EL à la suite et RAS pour l'instant

  15. #15
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par pilate Voir le message
    Je ne comprends pas ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringBuffer sb = new StringBuffer(property.length());
    Ca crée un stringbuffer avec une taille initiale pour le buffer égale à la longueur de la propriété. Avoir une taille suffisament grande mais pas trop est préférable à la taille par défaut qui est de 13. Le stringbuffer s'agrandira de toutes facons automatiquement si la taille est pas suffisante.

  16. #16
    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
    Citation Envoyé par pilate Voir le message
    OK j'ai essaye la methode de adiGuba mais il y a un bug (duplication d'une partie de la propriété).
    Tu as un exemple des données qui provoque cela ?

    Citation Envoyé par pilate Voir le message
    Je ne comprends pas ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringBuffer sb = new StringBuffer(property.length());
    Normalement, la property finale n'est pas sensé avoir la même longueur que celle contenant les EL !
    Il ne s'agit pas de la taille finale mais de la taille initiale du buffer. Ce dernier est agrandi si besoin

    Citation Envoyé par pilate Voir le message
    Et pis le quoteReplacement, rin compris moi...
    C'est une particularité des regexp. Le chaine de remplacement peut utiliser des caractères spéciaux et quoteReplacement() permet de les ignorer.


    a++

  17. #17
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Par défaut
    Merci pour votre aide et votre éloquence vitales je penses pour ce forum...

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/11/2014, 11h23
  2. Réponses: 4
    Dernier message: 24/09/2014, 17h27
  3. [XSLT] Parcours d'un objet java.util.List avec XSL
    Par Vangerddast dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 04/08/2010, 17h15
  4. [PROPERTIES] Bug dans java.util.Properties ?
    Par mathieu dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 28/04/2004, 15h11

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