/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2010, Red Hat, Inc. and/or its affiliates or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat, Inc. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.hibernate.search.util.impl; import java.util.HashSet; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; /** * 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() { } /** * Creates an initial context * * @param properties Configuration properties to check for JNDI specific properties * @param prefix The prefix used to designate JDNI properties. If a property from {@code property} contains * a property which matches the prefix, the prefix gets removed and the property passed to the initial context creation. * * @return the initial context * * @throws NamingException in case an error occurs creating the {@code InitialContext} */ public static InitialContext getInitialContext(Properties properties, String prefix) throws NamingException { Properties jndiProps = getJndiProperties( properties, prefix ); if ( jndiProps.size() == 0 ) { return new InitialContext(); } else { return new InitialContext( jndiProps ); } } 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 ); } } }