/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * 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.boot.internal;

import java.net.URL;

import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
import org.hibernate.boot.spi.ClassLoaderAccess;
import org.hibernate.service.ServiceRegistry;

import org.jboss.logging.Logger;

Standard implementation of ClassLoaderAccess
Author:Steve Ebersole
/** * Standard implementation of ClassLoaderAccess * * @author Steve Ebersole */
public class ClassLoaderAccessImpl implements ClassLoaderAccess { private static final Logger log = Logger.getLogger( ClassLoaderAccessImpl.class ); private final ClassLoaderService classLoaderService; private ClassLoader jpaTempClassLoader; public ClassLoaderAccessImpl( ClassLoader jpaTempClassLoader, ClassLoaderService classLoaderService) { this.jpaTempClassLoader = jpaTempClassLoader; this.classLoaderService = classLoaderService; } public ClassLoaderAccessImpl(ClassLoader tempClassLoader, ServiceRegistry serviceRegistry) { this( tempClassLoader, serviceRegistry.getService( ClassLoaderService.class ) ); } public ClassLoaderAccessImpl(ClassLoaderService classLoaderService) { this( null, classLoaderService ); } public void injectTempClassLoader(ClassLoader jpaTempClassLoader) { log.debugf( "ClassLoaderAccessImpl#injectTempClassLoader(%s) [was %s]", jpaTempClassLoader, this.jpaTempClassLoader ); this.jpaTempClassLoader = jpaTempClassLoader; } @Override @SuppressWarnings("unchecked") public Class<?> classForName(String name) { if ( name == null ) { throw new IllegalArgumentException( "Name of class to load cannot be null" ); } if ( isSafeClass( name ) ) { return classLoaderService.classForName( name ); } else { log.debugf( "Not known whether passed class name [%s] is safe", name ); if ( jpaTempClassLoader == null ) { log.debugf( "No temp ClassLoader provided; using live ClassLoader " + "for loading potentially unsafe class : %s", name ); return classLoaderService.classForName( name ); } else { log.debugf( "Temp ClassLoader was provided, so we will use that : %s", name ); try { return jpaTempClassLoader.loadClass( name ); } catch (ClassNotFoundException e) { throw new ClassLoadingException( name ); } } } } private boolean isSafeClass(String name) { // classes in any of these packages are safe to load through the "live" ClassLoader return name.startsWith( "java." ) || name.startsWith( "javax." ) || name.startsWith( "org.hibernate." ); } public ClassLoader getJpaTempClassLoader() { return jpaTempClassLoader; } @Override public URL locateResource(String resourceName) { return classLoaderService.locateResource( resourceName ); } public void release() { } }