/*************************************************************************
* Copyright 2009-2015 Eucalyptus Systems, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
* Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta
* CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need
* additional information or have any questions.
************************************************************************/
package com.eucalyptus.entities.impl;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.persistence.PersistenceException;
import javax.persistence.SharedCacheMode;
import javax.persistence.ValidationMode;
import javax.persistence.spi.ClassTransformer;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.PersistenceUnitTransactionType;
import javax.sql.DataSource;
import org.hibernate.cfg.Configuration;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor;
import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder;
import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor;
import com.eucalyptus.entities.PersistenceContextConfiguration;
import com.eucalyptus.entities.PersistenceContexts;
import com.eucalyptus.util.Classes;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
/**
*
*/
public class EucalyptusPersistenceProvider extends HibernatePersistenceProvider {
/**
* Build a Hibernate configuration for the given persistence unit.
*
* This assumes that the persistence unit metadata is available from
* PersistenceContexts.
*/
public Configuration getConfiguration(
final String persistenceUnitName,
final Map<String,String> properties) {
try {
final EucalyptusEntityManagerFactoryBuilderImpl e = (EucalyptusEntityManagerFactoryBuilderImpl)
this.getEntityManagerFactoryBuilderOrNull( persistenceUnitName, properties );
if( e == null ) {
return null;
} else {
return e.buildHibernateConfiguration( e.buildServiceRegistry( ) );
}
} catch (PersistenceException var4) {
throw var4;
} catch (Exception var5) {
throw new PersistenceException("Unable to build entity manager factory", var5);
}
}
@Override
protected EntityManagerFactoryBuilder getEntityManagerFactoryBuilderOrNull(
final String persistenceUnitName,
final Map properties,
final ClassLoader providedClassLoader
) {
final PersistenceContextConfiguration persistenceContextConfiguration =
PersistenceContexts.getConfiguration( persistenceUnitName );
if ( persistenceContextConfiguration != null ) {
final Map integration = wrap( properties );
final PersistenceUnitInfoDescriptor persistenceUnit =
new PersistenceUnitInfoDescriptor( info( persistenceContextConfiguration ) );
return this.getEntityManagerFactoryBuilder( persistenceUnit, integration, providedClassLoader );
}
return null;
}
@Override
protected EntityManagerFactoryBuilder getEntityManagerFactoryBuilder(
final PersistenceUnitDescriptor persistenceUnitDescriptor,
final Map integration,
final ClassLoader providedClassLoader
) {
return new EucalyptusEntityManagerFactoryBuilderImpl( persistenceUnitDescriptor, integration, providedClassLoader );
}
private PersistenceUnitInfo info( final PersistenceContextConfiguration configuration ) {
final Properties properties = new Properties( );
properties.putAll( configuration.getProperties( ) );
return new PersistenceUnitInfo( ) {
@Override
public String getPersistenceUnitName( ) {
return configuration.getName( );
}
@Override
public String getPersistenceProviderClassName( ) {
return null;
}
@Override
public PersistenceUnitTransactionType getTransactionType( ) {
return PersistenceUnitTransactionType.RESOURCE_LOCAL;
}
@Override
public DataSource getJtaDataSource( ) {
return null;
}
@Override
public DataSource getNonJtaDataSource( ) {
return null;
}
@Override
public List<String> getMappingFileNames( ) {
return Collections.emptyList( );
}
@Override
public List<URL> getJarFileUrls( ) {
return Collections.emptyList( );
}
@Override
public URL getPersistenceUnitRootUrl( ) {
return null;
}
@Override
public List<String> getManagedClassNames( ) {
return ImmutableList.copyOf( Iterables.transform(
configuration.getEntityClasses( ),
Classes.nameFunction( )
) );
}
@Override
public boolean excludeUnlistedClasses( ) {
return true;
}
@Override
public SharedCacheMode getSharedCacheMode( ) {
return SharedCacheMode.NONE;
}
@Override
public ValidationMode getValidationMode( ) {
return ValidationMode.NONE;
}
@Override
public Properties getProperties( ) {
return properties;
}
@Override
public String getPersistenceXMLSchemaVersion( ) {
return null;
}
@Override
public ClassLoader getClassLoader( ) {
return EucalyptusPersistenceProvider.class.getClassLoader( );
}
@Override
public void addTransformer( final ClassTransformer classTransformer ) {
}
@Override
public ClassLoader getNewTempClassLoader( ) {
return EucalyptusPersistenceProvider.class.getClassLoader( );
}
};
}
}