/*
* Copyright 2002-2010 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;
import org.springframework.util.StringUtils;
/**
* 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 static final String DEFAULT_SHARED_CACHE_MODE_NAME = "UNSPECIFIED";
private static final String DEFAULT_VALIDATION_MODE_NAME = "AUTO";
private String sharedCacheModeName = DEFAULT_SHARED_CACHE_MODE_NAME;
private String validationModeName = DEFAULT_VALIDATION_MODE_NAME;
private LoadTimeWeaver loadTimeWeaver;
private ClassLoader classLoader;
public void setSharedCacheModeName(String sharedCacheModeName) {
this.sharedCacheModeName =
(StringUtils.hasLength(sharedCacheModeName) ? sharedCacheModeName : DEFAULT_SHARED_CACHE_MODE_NAME);
}
public String getSharedCacheModeName() {
return this.sharedCacheModeName;
}
public void setValidationModeName(String validationModeName) {
this.validationModeName =
(StringUtils.hasLength(validationModeName) ? validationModeName : DEFAULT_VALIDATION_MODE_NAME);
}
public String getValidationModeName() {
return this.validationModeName;
}
/**
* 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.
*/
@Override
public ClassLoader getClassLoader() {
return this.classLoader;
}
/**
* This implementation delegates to the LoadTimeWeaver, if specified.
*/
@Override
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.
*/
@Override
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;
}
}
|