/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.engine.service.classloading.impl; import java.io.InputStream; import java.net.URL; import java.util.LinkedHashSet; import java.util.ServiceLoader; import org.hibernate.search.engine.service.classloading.spi.ClassLoaderService; import org.hibernate.search.engine.service.classloading.spi.ClassLoadingException; import org.hibernate.search.util.impl.AggregatedClassLoader; /** * Default implementation of {@code ClassLoaderService} using the old pre class loader service apporach of * attempting to load from the current and thread context class loaders. * * @author Hardy Ferentschik */ public class DefaultClassLoaderService implements ClassLoaderService { private AggregatedClassLoader aggregatedClassLoader; /** * Constructs a ClassLoaderServiceImpl with standard set-up */ public DefaultClassLoaderService() { final LinkedHashSet<ClassLoader> orderedClassLoaderSet = new LinkedHashSet<ClassLoader>(); // adding known class-loaders... orderedClassLoaderSet.add( DefaultClassLoaderService.class.getClassLoader() ); // then the TCCL, if one... final ClassLoader tccl = locateTCCL(); if ( tccl != null ) { orderedClassLoaderSet.add( tccl ); } // finally the system classloader final ClassLoader sysClassLoader = locateSystemClassLoader(); if ( sysClassLoader != null ) { orderedClassLoaderSet.add( sysClassLoader ); } // now build the aggregated class loader... this.aggregatedClassLoader = new AggregatedClassLoader( orderedClassLoaderSet.toArray( new ClassLoader[orderedClassLoaderSet.size()] ) ); } @Override @SuppressWarnings({ "unchecked" }) public <T> Class<T> classForName(String className) { try { return (Class<T>) Class.forName( className, true, aggregatedClassLoader ); } catch (Exception e) { throw new ClassLoadingException( "Unable to load class [" + className + "]", e ); } } @Override public URL locateResource(String name) { try { return aggregatedClassLoader.getResource( name ); } catch (Exception ignore) { } return null; } @Override public InputStream locateResourceStream(String name) { try { final InputStream stream = aggregatedClassLoader.getResourceAsStream( name ); if ( stream != null ) { return stream; } } catch (Exception ignore) { } final String stripped = name.startsWith( "/" ) ? name.substring( 1 ) : null; if ( stripped != null ) { try { return new URL( stripped ).openStream(); } catch (Exception ignore) { } try { final InputStream stream = aggregatedClassLoader.getResourceAsStream( stripped ); if ( stream != null ) { return stream; } } catch (Exception ignore) { } } return null; } @Override @SuppressWarnings("unchecked") public <S> LinkedHashSet<S> loadJavaServices(Class<S> serviceContract) { ServiceLoader<S> serviceLoader = ServiceLoader.load( serviceContract, aggregatedClassLoader ); final LinkedHashSet<S> services = new LinkedHashSet<S>(); for ( S service : serviceLoader ) { services.add( service ); } return services; } private static ClassLoader locateSystemClassLoader() { try { return ClassLoader.getSystemClassLoader(); } catch (Exception e) { return null; } } private static ClassLoader locateTCCL() { try { return Thread.currentThread().getContextClassLoader(); } catch (Exception e) { return null; } } }