HHH-5632 - Import initial services work

This commit is contained in:
Steve Ebersole 2010-10-07 12:46:51 -05:00
parent 1a522bb968
commit 03c004bd13
14 changed files with 399 additions and 263 deletions

View File

@ -29,7 +29,7 @@ import javax.naming.NamingException;
import org.hibernate.cache.CacheException;
import org.hibernate.cache.RegionFactory;
import org.hibernate.util.NamingHelper;
import org.hibernate.internal.util.jndi.JndiHelper;
import org.hibernate.internal.util.config.ConfigurationHelper;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.util.logging.Log;
@ -65,7 +65,7 @@ public class JndiInfinispanRegionFactory extends InfinispanRegionFactory {
String name = ConfigurationHelper.getString(CACHE_MANAGER_RESOURCE_PROP, properties, null);
if (name == null)
throw new CacheException("Configuration property " + CACHE_MANAGER_RESOURCE_PROP + " not set");
return locateCacheManager(name, NamingHelper.getJndiProperties(properties));
return locateCacheManager(name, JndiHelper.extractJndiProperties(properties));
}
private EmbeddedCacheManager locateCacheManager(String jndiNamespace, Properties jndiProperties) {

View File

@ -31,7 +31,7 @@ import javax.naming.NamingException;
import org.hibernate.cache.CacheException;
import org.hibernate.cfg.Settings;
import org.hibernate.util.NamingHelper;
import org.hibernate.internal.util.jndi.JndiHelper;
import org.hibernate.internal.util.config.ConfigurationHelper;
import org.jboss.cache.CacheManager;
import org.slf4j.Logger;
@ -69,7 +69,7 @@ public class JndiMultiplexingCacheInstanceManager extends MultiplexingCacheInsta
if (name == null)
throw new CacheException("Configuration property " + CACHE_FACTORY_RESOURCE_PROP + " not set");
CacheManager cf = locateCacheFactory( name, NamingHelper.getJndiProperties( properties ) );
CacheManager cf = locateCacheFactory( name, JndiHelper.extractJndiProperties( properties ) );
setCacheFactory( cf );
super.start(settings, properties);

View File

@ -31,7 +31,7 @@ import javax.naming.NamingException;
import org.hibernate.cache.CacheException;
import org.hibernate.cfg.Settings;
import org.hibernate.util.NamingHelper;
import org.hibernate.internal.util.jndi.JndiHelper;
import org.hibernate.internal.util.config.ConfigurationHelper;
import org.jboss.cache.Cache;
import org.slf4j.Logger;
@ -74,7 +74,7 @@ public class JndiSharedCacheInstanceManager extends SharedCacheInstanceManager {
if (name == null)
throw new CacheException("Configuration property " + CACHE_RESOURCE_PROP + " not set");
return locateCache( name, NamingHelper.getJndiProperties( properties ) );
return locateCache( name, JndiHelper.extractJndiProperties( properties ) );
}
/**

View File

@ -33,7 +33,7 @@ import javax.naming.NamingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.hibernate.cfg.Environment;
import org.hibernate.util.NamingHelper;
import org.hibernate.internal.util.jndi.JndiHelper;
import org.hibernate.util.StringHelper;
/**
@ -66,7 +66,7 @@ public abstract class AbstractJndiBoundCacheProvider implements CacheProvider {
if ( StringHelper.isEmpty( jndiNamespace ) ) {
throw new CacheException( "No JNDI namespace specified for cache" );
}
cache = locateCache( jndiNamespace, NamingHelper.getJndiProperties( properties ) );
cache = locateCache( jndiNamespace, JndiHelper.extractJndiProperties( properties ) );
prepare( properties );
}

View File

@ -32,7 +32,7 @@ import javax.sql.DataSource;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Environment;
import org.hibernate.util.NamingHelper;
import org.hibernate.internal.util.jndi.JndiHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -72,7 +72,7 @@ public class DatasourceConnectionProvider implements ConnectionProvider {
pass = props.getProperty( Environment.PASS );
try {
ds = ( DataSource ) NamingHelper.getInitialContext( props ).lookup( jndiName );
ds = ( DataSource ) JndiHelper.getInitialContext( props ).lookup( jndiName );
}
catch ( Exception e ) {
log.error( "Could not find datasource: " + jndiName, e );

View File

@ -43,7 +43,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.hibernate.SessionFactory;
import org.hibernate.util.NamingHelper;
import org.hibernate.internal.util.jndi.JndiHelper;
/**
* Resolves {@link SessionFactory} instances during <tt>JNDI<tt> look-ups as well as during deserialization
@ -109,8 +109,8 @@ public class SessionFactoryObjectFactory implements ObjectFactory {
log.info("Factory name: " + name);
try {
Context ctx = NamingHelper.getInitialContext(properties);
NamingHelper.bind(ctx, name, instance);
Context ctx = JndiHelper.getInitialContext(properties);
JndiHelper.bind(ctx, name, instance);
log.info("Bound factory to JNDI name: " + name);
( (EventContext) ctx ).addNamingListener(name, EventContext.OBJECT_SCOPE, LISTENER);
}
@ -135,7 +135,7 @@ public class SessionFactoryObjectFactory implements ObjectFactory {
log.info("Unbinding factory from JNDI name: " + name);
try {
Context ctx = NamingHelper.getInitialContext(properties);
Context ctx = JndiHelper.getInitialContext(properties);
ctx.unbind(name);
log.info("Unbound factory from JNDI name: " + name);
}

View File

@ -0,0 +1,37 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010, Red Hat Inc. 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.internal.util.jndi;
import org.hibernate.HibernateException;
/**
* An exception indicating trouble accessing JNDI
*
* @author Steve Ebersole
*/
public class JndiException extends HibernateException {
public JndiException(String string, Throwable root) {
super( string, root );
}
}

View File

@ -0,0 +1,242 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010, Red Hat Inc. 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.internal.util.jndi;
import java.util.Hashtable;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.hibernate.cfg.Environment;
public final class JndiHelper {
private static final Logger log = LoggerFactory.getLogger( JndiHelper.class );
private JndiHelper() {
}
/**
* Given a hodge-podge of properties, extract out the ones relevant for JNDI interaction.
*
* @param properties
* @return
*/
@SuppressWarnings({ "unchecked" })
public static Properties extractJndiProperties(Map configurationValues) {
final Properties jndiProperties = new Properties();
for ( Map.Entry entry : (Set<Map.Entry>) configurationValues.entrySet() ) {
if ( !String.class.isInstance( entry.getKey() ) ) {
continue;
}
final String propertyName = (String) entry.getKey();
final Object propertyValue = entry.getValue();
if ( propertyName.startsWith( Environment.JNDI_PREFIX ) ) {
// write the IntialContextFactory class and provider url to the result only if they are
// non-null; this allows the environmental defaults (if any) to remain in effect
if ( Environment.JNDI_CLASS.equals( propertyName ) ) {
if ( propertyValue != null ) {
jndiProperties.put( Context.INITIAL_CONTEXT_FACTORY, propertyValue );
}
}
else if ( Environment.JNDI_URL.equals( propertyName ) ) {
if ( propertyValue != null ) {
jndiProperties.put( Context.PROVIDER_URL, propertyValue );
}
}
else {
final String passThruPropertyname = propertyName.substring( Environment.JNDI_PREFIX.length() + 1 );
jndiProperties.put( passThruPropertyname, propertyValue );
}
}
}
return jndiProperties;
}
/**
* Do a JNDI lookup. Mainly we are handling {@link NamingException}
*
* @param jndiName The namespace of the object to locate
* @param context The context in which to resolve the namespace.
*
* @return The located object; may be null.
*
* @throws JndiException if a {@link NamingException} occurs
*/
public static Object locate(String jndiName, Context context) {
try {
return context.lookup( jndiName );
}
catch ( NamingException e ) {
throw new JndiException( "Unable to lookup JNDI name [" + jndiName + "]", e );
}
}
/**
* Bind val to name in ctx, and make sure that all intermediate contexts exist.
*
* @param ctx the root context
* @param name the name as a string
* @param val the object to be bound
*
* @throws JndiException if a {@link NamingException} occurs
*/
public static void bind(String jndiName, Object value, Context context) {
try {
log.trace( "binding : " + jndiName );
context.rebind( jndiName, value );
}
catch ( Exception initialException ) {
// We had problems doing a simple bind operation. This could very well be caused by missing intermediate
// contexts, so we attempt to create those intermmediate contexts and bind again
Name n = tokenizeName( jndiName, context );
Context intermediateContextBase = context;
while ( n.size() > 1 ) {
final String intermediateContextName = n.get( 0 );
Context intermediateContext = null;
try {
log.trace( "intermediate lookup: " + intermediateContextName );
intermediateContext = (Context) intermediateContextBase.lookup( intermediateContextName );
}
catch ( NameNotFoundException handledBelow ) {
// ok as we will create it below if not found
}
catch ( NamingException e ) {
throw new JndiException( "Unaniticipated error doing intermediate lookup", e );
}
if ( intermediateContext != null ) {
log.trace( "Found interediate context: " + intermediateContextName );
}
else {
log.trace( "Creating subcontext: " + intermediateContextName );
try {
intermediateContext = intermediateContextBase.createSubcontext( intermediateContextName );
}
catch ( NamingException e ) {
throw new JndiException( "Error creating intermediate context [" + intermediateContextName + "]", e );
}
}
intermediateContextBase = intermediateContext;
n = n.getSuffix( 1 );
}
log.trace( "binding: " + n );
try {
intermediateContextBase.rebind( n, value );
}
catch ( NamingException e ) {
throw new JndiException( "Error performing intermediate bind [" + n + "]", e );
}
}
log.debug( "Bound name: " + jndiName );
}
private static Name tokenizeName(String jndiName, Context context) {
try {
return context.getNameParser( "" ).parse( jndiName );
}
catch ( NamingException e ) {
throw new JndiException( "Unable to tokenize JNDI name [" + jndiName + "]", e );
}
}
// todo : remove these once we get the services in place and integrated into the SessionFactory
public static InitialContext getInitialContext(Properties props) throws NamingException {
Hashtable hash = extractJndiProperties(props);
log.info("JNDI InitialContext properties:" + hash);
try {
return hash.size()==0 ?
new InitialContext() :
new InitialContext(hash);
}
catch (NamingException e) {
log.error("Could not obtain initial context", e);
throw e;
}
}
/**
* Bind val to name in ctx, and make sure that all intermediate contexts exist.
*
* @param ctx the root context
* @param name the name as a string
* @param val the object to be bound
* @throws NamingException
*/
public static void bind(Context ctx, String name, Object val) throws NamingException {
try {
log.trace("binding: " + name);
ctx.rebind(name, val);
}
catch (Exception e) {
Name n = ctx.getNameParser("").parse(name);
while ( n.size() > 1 ) {
String ctxName = n.get(0);
Context subctx=null;
try {
log.trace("lookup: " + ctxName);
subctx = (Context) ctx.lookup(ctxName);
}
catch (NameNotFoundException nfe) {}
if (subctx!=null) {
log.debug("Found subcontext: " + ctxName);
ctx = subctx;
}
else {
log.info("Creating subcontext: " + ctxName);
ctx = ctx.createSubcontext(ctxName);
}
n = n.getSuffix(1);
}
log.trace("binding: " + n);
ctx.rebind(n, val);
}
log.debug("Bound name: " + name);
}
}

View File

@ -13,7 +13,7 @@ import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Environment;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.util.NamingHelper;
import org.hibernate.internal.util.jndi.JndiHelper;
import org.hibernate.util.ExternalSessionFactoryConfig;
@ -49,7 +49,7 @@ public class HibernateService extends ExternalSessionFactoryConfig implements Hi
public void stop() {
log.info("stopping service");
try {
InitialContext context = NamingHelper.getInitialContext( buildProperties() );
InitialContext context = JndiHelper.getInitialContext( buildProperties() );
( (SessionFactory) context.lookup(boundName) ).close();
//context.unbind(boundName);
}

View File

@ -31,7 +31,7 @@ import javax.transaction.TransactionManager;
import javax.transaction.Transaction;
import org.hibernate.HibernateException;
import org.hibernate.util.NamingHelper;
import org.hibernate.internal.util.jndi.JndiHelper;
/**
* Template implementation of {@link TransactionManagerLookup} where the
@ -54,7 +54,7 @@ public abstract class JNDITransactionManagerLookup implements TransactionManager
*/
public TransactionManager getTransactionManager(Properties props) throws HibernateException {
try {
return (TransactionManager) NamingHelper.getInitialContext(props).lookup( getName() );
return (TransactionManager) JndiHelper.getInitialContext(props).lookup( getName() );
}
catch (NamingException ne) {
throw new HibernateException( "Could not locate TransactionManager", ne );

View File

@ -38,9 +38,9 @@ import org.hibernate.ConnectionReleaseMode;
import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import org.hibernate.TransactionException;
import org.hibernate.internal.util.jndi.JndiHelper;
import org.hibernate.jdbc.JDBCContext;
import org.hibernate.cfg.Environment;
import org.hibernate.util.NamingHelper;
import org.hibernate.util.JTAHelper;
/**
@ -109,7 +109,7 @@ public class JTATransactionFactory implements TransactionFactory {
*/
protected final InitialContext resolveInitialContext(Properties properties) {
try {
return NamingHelper.getInitialContext( properties );
return JndiHelper.getInitialContext( properties );
}
catch ( NamingException ne ) {
throw new HibernateException( "Could not obtain initial context", ne );

View File

@ -40,7 +40,7 @@ import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;
import org.hibernate.HibernateException;
import org.hibernate.util.NamingHelper;
import org.hibernate.internal.util.jndi.JndiHelper;
/**
* TransactionManagerLookup implementation intended for use with WebSphere
@ -180,7 +180,7 @@ public class WebSphereExtendedJTATransactionLookup implements TransactionManager
private TransactionAdapter(Properties props) {
try {
if ( extendedJTATransaction == null ) {
extendedJTATransaction = NamingHelper.getInitialContext( props )
extendedJTATransaction = JndiHelper.getInitialContext( props )
.lookup( "java:comp/websphere/ExtendedJTATransaction" );
}
}

View File

@ -1,144 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
*
* 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.util;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.hibernate.cfg.Environment;
public final class NamingHelper {
private static final Logger log = LoggerFactory.getLogger(NamingHelper.class);
public static InitialContext getInitialContext(Properties props) throws NamingException {
Hashtable hash = getJndiProperties(props);
log.info("JNDI InitialContext properties:" + hash);
try {
return hash.size()==0 ?
new InitialContext() :
new InitialContext(hash);
}
catch (NamingException e) {
log.error("Could not obtain initial context", e);
throw e;
}
}
/**
* Bind val to name in ctx, and make sure that all intermediate contexts exist.
*
* @param ctx the root context
* @param name the name as a string
* @param val the object to be bound
* @throws NamingException
*/
public static void bind(Context ctx, String name, Object val) throws NamingException {
try {
log.trace("binding: " + name);
ctx.rebind(name, val);
}
catch (Exception e) {
Name n = ctx.getNameParser("").parse(name);
while ( n.size() > 1 ) {
String ctxName = n.get(0);
Context subctx=null;
try {
log.trace("lookup: " + ctxName);
subctx = (Context) ctx.lookup(ctxName);
}
catch (NameNotFoundException nfe) {}
if (subctx!=null) {
log.debug("Found subcontext: " + ctxName);
ctx = subctx;
}
else {
log.info("Creating subcontext: " + ctxName);
ctx = ctx.createSubcontext(ctxName);
}
n = n.getSuffix(1);
}
log.trace("binding: " + n);
ctx.rebind(n, val);
}
log.debug("Bound name: " + name);
}
/**
* Transform JNDI properties passed in the form <tt>hibernate.jndi.*</tt> to the
* format accepted by <tt>InitialContext</tt> by triming the leading "<tt>hibernate.jndi</tt>".
*/
public static Properties getJndiProperties(Properties properties) {
HashSet specialProps = new HashSet();
specialProps.add(Environment.JNDI_CLASS);
specialProps.add(Environment.JNDI_URL);
Iterator iter = properties.keySet().iterator();
Properties result = new Properties();
while ( iter.hasNext() ) {
String prop = (String) iter.next();
if ( prop.indexOf(Environment.JNDI_PREFIX) > -1 && !specialProps.contains(prop) ) {
result.setProperty(
prop.substring( Environment.JNDI_PREFIX.length()+1 ),
properties.getProperty(prop)
);
}
}
String jndiClass = properties.getProperty(Environment.JNDI_CLASS);
String jndiURL = properties.getProperty(Environment.JNDI_URL);
// 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 (jndiClass != null) result.put(Context.INITIAL_CONTEXT_FACTORY, jndiClass);
if (jndiURL != null) result.put(Context.PROVIDER_URL, jndiURL);
return result;
}
private NamingHelper() {}
}

View File

@ -34,6 +34,7 @@ import javax.naming.event.NamingListener;
import org.hibernate.ejb.AvailableSettings;
import org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.internal.util.jndi.JndiHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -56,8 +57,8 @@ public class NamingHelper {
log.info( "Ejb3Configuration name: {}", name );
try {
Context ctx = org.hibernate.util.NamingHelper.getInitialContext( cfg.getProperties() );
org.hibernate.util.NamingHelper.bind( ctx, name, cfg );
Context ctx = JndiHelper.getInitialContext( cfg.getProperties() );
JndiHelper.bind( ctx, name, cfg );
log.info( "Bound Ejb3Configuration to JNDI name: {}", name );
( (EventContext) ctx ).addNamingListener( name, EventContext.OBJECT_SCOPE, LISTENER );
}