package org.infinispan.hibernate.search.util.impl; import java.util.HashSet; import java.util.Properties; import javax.naming.Context; /** * Helper class for creating an JNDI {@code InitialContext}. * * @author Hardy Ferentschik */ public class JNDIHelper { public static final String HIBERNATE_JNDI_PREFIX = "hibernate.jndi."; private JNDIHelper() { } public static Properties getJndiProperties(Properties properties, String prefix) { HashSet<String> specialProps = new HashSet<String>(); specialProps.add(prefix + "class"); specialProps.add(prefix + "url"); Properties result = addJNDIProperties(properties, prefix, specialProps); handleSpecialPropertyTranslation(properties, prefix + "class", result, Context.INITIAL_CONTEXT_FACTORY); handleSpecialPropertyTranslation(properties, prefix + "url", result, Context.PROVIDER_URL); return result; } /** * Creates a new {@code Properties} instance with all properties from {@code properties} which start with the given * * @param properties the original properties * @param prefix the prefix indicating JNDI specific properties * @param specialProps a set of property names to ignore * @return Creates a new {@code Properties} instance with JNDI specific properties * @{code prefix}. In the new instance the prefix is removed. If a property matches a value in {@code specialProps} * it gets ignored. */ private static Properties addJNDIProperties(Properties properties, String prefix, HashSet<String> specialProps) { Properties result = new Properties(); for (Object property : properties.keySet()) { if (property instanceof String) { String s = (String) property; if (s.indexOf(prefix) > -1 && !specialProps.contains(s)) { result.setProperty(s.substring(prefix.length()), properties.getProperty(s)); } } } return result; } private static void handleSpecialPropertyTranslation(Properties originalProperties, String oldKey, Properties newProperties, String newKey) { String value = originalProperties.getProperty(oldKey); // we want to be able to just use the defaults, // if JNDI environment properties are not supplied // so don't put null in anywhere if (value != null) { newProperties.put(newKey, value); } } }