2017-08-17 4 views
1

Je suis confronté à un problème. J'ai un org.osgi.service.cm.ManagedService impl client pour une configuration osgi. La configuration est une collection de paires clé-valeur. Les clés de ces propriétés, lorsqu'elles sont passées à la méthode mise à jour (ManagedService.updated) du ManagedService en tant qu'objet java.util.Dictionary, ne sont pas sensibles à la casse, c'est-à-dire que props.get("HellO") fonctionne même si la clé de la configuration est "Hello".Osgi Config ManagedService Dictionary touches insensible à la casse

Lorsque je convertis ce dictionnaire en Hashmap en effectuant une itération sur ses entrées, les touches de la carte deviennent sensibles à la casse comme prévu. Est-ce qu'on s'attend à ce que les touches Dictionary ne respectent pas la casse?

Cela a été testé sur une instance AEM 6.2.

Voici ma classe ManagedService impl.

public class ConfigService implements ManagedService { 

public void updated(final Dictionary props) throws ConfigurationException { 
    // props.get("HellO") returns value 
    if (props != null) { 
     String pid = (String) props.get(Constants.SERVICE_PID); 
     // convert to map 
     Map map = map(props); 
     // map.get("HellO") returns null 
     // map.get("Hello") returns value 
    } 
} 

private static Map map(Dictionary dict) { 
    Map map = new ConcurrentHashMap(); 
    for (Enumeration keys = dict.keys(); keys.hasMoreElements();) { 
     Object key = keys.nextElement(); 
     map.put(key, dict.get(key)); 
    } 
    return map; 
} 

Le ManagedService impl est enregistré en tant que service en utilisant le code ci-dessous.

final Dictionary props = new Hashtable(); 
props.put(Constants.SERVICE_PID, "pid.of.the.osgi.configuration"); 
ServiceRegistration configSvc = context.registerService(ManagedService.class.getName(), 
       new ConfigService(), props); 

Répondre

3

Ceci est conforme aux spécifications du service Configuration Admin.

Le nom ou la clé d'une propriété doit toujours être un objet String et n'est pas sensible à la casse lors de regarder, mais il faut préserver le cas d'origine.

Apache code source felix pour référence. https://github.com/apache/felix/blob/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/CaseInsensitiveDictionary.java

/** * Le CaseInsensitiveDictionary est un * java.util.Dictionary qui est conforme aux exigences posées * par le service d'administration Configuration Spécification exigeant la propriété * Les noms de garder le cas, mais pour ignorer la casse lors de l'accès aux propriétés. */

+3

La raison pour laquelle les clés sont insensibles à la casse est que, à l'époque (2000), il semble que les spécifications X.500 allaient être importants. Les certificats X.509, SNMP et LDAP sont, je suppose, le peu de choses qui restent. La sensibilité à la casse est devenue standard et nous avons été pris avec de mauvaises décisions. Un des inconvénients d'une norme qui sort de son chemin pour être rétrocompatible. –