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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 46
    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 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
    }

  6. #6
    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...

  7. #7
    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 ?

  8. #8
    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 : 46
    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.

  9. #9
    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

+ 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