/**
*
*/
package org.minnal.jpa;
import java.net.URL;
import java.security.CodeSource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import javax.persistence.SharedCacheMode;
import javax.persistence.ValidationMode;
import javax.persistence.spi.ClassTransformer;
import javax.persistence.spi.PersistenceProvider;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.PersistenceUnitTransactionType;
import javax.sql.DataSource;
import org.minnal.core.config.DatabaseConfiguration;
import org.minnal.jpa.entity.ConverterScanner;
import org.minnal.jpa.entity.EntityScanner;
import org.minnal.utils.scanner.Scanner;
import org.minnal.utils.scanner.Scanner.Listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author ganeshs
*
*/
public class MinnalPersistenceUnitInfo implements PersistenceUnitInfo {
private DatabaseConfiguration configuration;
private String unitName;
private PersistenceProvider provider;
private Properties properties = new Properties();
private DataSource dataSource;
private List<String> managedClasses = new ArrayList<String>();
private static final Logger logger = LoggerFactory.getLogger(MinnalPersistenceUnitInfo.class);
public MinnalPersistenceUnitInfo(String unitName, DatabaseConfiguration configuration, PersistenceProvider provider) {
this.unitName = unitName;
this.configuration = configuration;
this.provider = provider;
init();
}
private void init() {
properties.putAll(configuration.getProviderProperties());
dataSource = configuration.getDataSourceProvider().getDataSource();
String[] packagesToScan = configuration.getPackagesToScan().toArray(new String[0]);
scanForManagedClasses(new ConverterScanner(packagesToScan));
scanForManagedClasses(new EntityScanner(packagesToScan));
}
private void scanForManagedClasses(Scanner<Class<?>> scanner) {
scanner.scan(new Listener<Class<?>>() {
public void handle(Class<?> entity) {
managedClasses.add(entity.getName());
}
});
}
public String getPersistenceUnitName() {
return unitName;
}
public String getPersistenceProviderClassName() {
return provider.getClass().getName();
}
public PersistenceUnitTransactionType getTransactionType() {
return PersistenceUnitTransactionType.RESOURCE_LOCAL;
}
public DataSource getJtaDataSource() {
return null;
}
public DataSource getNonJtaDataSource() {
return dataSource;
}
public List<String> getMappingFileNames() {
return Collections.emptyList();
}
public List<URL> getJarFileUrls() {
return Collections.emptyList();
}
public URL getPersistenceUnitRootUrl() {
// No need to specify the persistence unit root url as we do it programmatically. But eclipselink expects it,
// although it doesn't load the file, returning null causes a NPE with eclipselink. So returning a dummy url from here.
CodeSource codeSource = getClass().getProtectionDomain().getCodeSource();
return codeSource.getLocation();
}
public List<String> getManagedClassNames() {
return managedClasses;
}
public boolean excludeUnlistedClasses() {
return false;
}
public SharedCacheMode getSharedCacheMode() {
return SharedCacheMode.ALL;
}
public ValidationMode getValidationMode() {
return ValidationMode.AUTO;
}
public Properties getProperties() {
return properties;
}
public String getPersistenceXMLSchemaVersion() {
return "2.0"; // Why is this required?
}
public ClassLoader getClassLoader() {
return Thread.currentThread().getContextClassLoader();
}
public void addTransformer(ClassTransformer transformer) {
logger.info("Add transformer called on the persistent unit info. Ignoring");
// TODO Support adding transformers.
// Ignore this for now
}
public ClassLoader getNewTempClassLoader() {
return null;
}
}