/* * Copyright 2002-2008 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.orm.jpa.persistenceunit; import javax.persistence.spi.ClassTransformer; import org.springframework.core.DecoratingClassLoader; import org.springframework.instrument.classloading.LoadTimeWeaver; import org.springframework.instrument.classloading.SimpleThrowawayClassLoader; import org.springframework.util.Assert; /** * Subclass of {@link MutablePersistenceUnitInfo} that adds instrumentation hooks based on * Spring's {@link org.springframework.instrument.classloading.LoadTimeWeaver} abstraction. * * <p>This class is restricted to package visibility, in contrast to its superclass. * * @author Rod Johnson * @author Juergen Hoeller * @author Costin Leau * @since 2.0 * @see PersistenceUnitManager */ class SpringPersistenceUnitInfo extends MutablePersistenceUnitInfo { private LoadTimeWeaver loadTimeWeaver; private ClassLoader classLoader; /** * Initialize this PersistenceUnitInfo with the LoadTimeWeaver SPI interface * used by Spring to add instrumentation to the current class loader. */ public void init(LoadTimeWeaver loadTimeWeaver) { Assert.notNull(loadTimeWeaver, "LoadTimeWeaver must not be null"); this.loadTimeWeaver = loadTimeWeaver; this.classLoader = loadTimeWeaver.getInstrumentableClassLoader(); } /** * Initialize this PersistenceUnitInfo with the current class loader * (instead of with a LoadTimeWeaver). */ public void init(ClassLoader classLoader) { Assert.notNull(classLoader, "ClassLoader must not be null"); this.classLoader = classLoader; } /** * This implementation returns the LoadTimeWeaver's instrumentable ClassLoader, * if specified. */ public ClassLoader getClassLoader() { return this.classLoader; } /** * This implementation delegates to the LoadTimeWeaver, if specified. */ public void addTransformer(ClassTransformer classTransformer) { if (this.loadTimeWeaver == null) { throw new IllegalStateException("Cannot apply class transformer without LoadTimeWeaver specified"); } this.loadTimeWeaver.addTransformer(new ClassFileTransformerAdapter(classTransformer)); } /** * This implementation delegates to the LoadTimeWeaver, if specified. */ public ClassLoader getNewTempClassLoader() { ClassLoader tcl = (this.loadTimeWeaver != null ? this.loadTimeWeaver.getThrowawayClassLoader() : new SimpleThrowawayClassLoader(this.classLoader)); String packageToExclude = getPersistenceProviderPackageName(); if (packageToExclude != null && tcl instanceof DecoratingClassLoader) { ((DecoratingClassLoader) tcl).excludePackage(packageToExclude); } return tcl; } }