HHH-8010 Moved OsgiClassLoader handling into

BootstrapServiceRegistryBuilder
This commit is contained in:
Brett Meyer 2013-02-28 10:57:28 -05:00
parent 394458f6a6
commit 7f52b476c9
2 changed files with 20 additions and 14 deletions

View File

@ -24,17 +24,20 @@
package org.hibernate.boot.registry;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.internal.BootstrapServiceRegistryImpl;
import org.hibernate.boot.registry.selector.Availability;
import org.hibernate.boot.registry.selector.AvailabilityAnnouncer;
import org.hibernate.boot.registry.selector.internal.StrategySelectorBuilder;
import org.hibernate.integrator.internal.IntegratorServiceImpl;
import org.hibernate.integrator.spi.Integrator;
import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.selector.internal.StrategySelectorBuilder;
import org.hibernate.internal.util.ClassLoaderHelper;
/**
* Builder for bootstrap {@link org.hibernate.service.ServiceRegistry} instances.
@ -189,7 +192,18 @@ public class BootstrapServiceRegistryBuilder {
public BootstrapServiceRegistry build() {
final ClassLoaderService classLoaderService;
if ( providedClassLoaderService == null ) {
classLoaderService = new ClassLoaderServiceImpl( providedClassLoaders );
// Use a set. As an example, in JPA, OsgiClassLoader may be in both
// the providedClassLoaders and the overridenClassLoader.
final Set<ClassLoader> classLoaders = new HashSet<ClassLoader>();
if ( providedClassLoaders != null ) {
classLoaders.addAll( providedClassLoaders );
}
if ( ClassLoaderHelper.overridenClassLoader != null ) {
classLoaders.add( ClassLoaderHelper.overridenClassLoader );
}
classLoaderService = new ClassLoaderServiceImpl( classLoaders );
} else {
classLoaderService = providedClassLoaderService;
}

View File

@ -40,7 +40,6 @@ import java.util.ServiceLoader;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.internal.util.ClassLoaderHelper;
import org.jboss.logging.Logger;
/**
@ -61,7 +60,7 @@ public class ClassLoaderServiceImpl implements ClassLoaderService {
this( Collections.singletonList( classLoader ) );
}
public ClassLoaderServiceImpl(List<ClassLoader> providedClassLoaders) {
public ClassLoaderServiceImpl(Collection<ClassLoader> providedClassLoaders) {
final LinkedHashSet<ClassLoader> orderedClassLoaderSet = new LinkedHashSet<ClassLoader>();
// first add all provided class loaders, if any
@ -74,14 +73,7 @@ public class ClassLoaderServiceImpl implements ClassLoaderService {
}
// normalize adding known class-loaders...
// first, the "overridden" classloader provided by an environment (OSGi, etc.)
// TODO: This should probably be wired into BootstrapServiceRegistryBuilder
// instead, however that wasn't available in 4.2. Once JPA 2.1 is testable
// in an OSGi container, move this and re-work.
if ( ClassLoaderHelper.overridenClassLoader != null ) {
orderedClassLoaderSet.add( ClassLoaderHelper.overridenClassLoader );
}
// then the Hibernate class loader
// first, the Hibernate class loader
orderedClassLoaderSet.add( ClassLoaderServiceImpl.class.getClassLoader() );
// then the TCCL, if one...
final ClassLoader tccl = locateTCCL();