blob: 64395ff7058506732d5869b5ca94a68a21ee3f0c [file] [log] [blame]
package org.apache.airavata.common.utils;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* JPAUtils
*/
public class JPAUtils {
private final static Logger logger = LoggerFactory.getLogger(JPAUtils.class);
private final static Map<String, String> DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES;
static {
Map<String, String> properties = new HashMap<String, String>();
properties.put("openjpa.ConnectionDriverName", "org.apache.commons.dbcp.BasicDataSource");
properties.put("openjpa.DynamicEnhancementAgent", "true");
properties.put("openjpa.RuntimeUnenhancedClasses", "unsupported");
properties.put("openjpa.RemoteCommitProvider", "sjvm");
properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, Tool=INFO, SQL=INFO");
// use the following to enable logging of all SQL statements
// properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, Tool=INFO, SQL=TRACE");
properties.put("openjpa.jdbc.SynchronizeMappings", "validate");
properties.put("openjpa.jdbc.QuerySQLCache", "false");
properties.put("openjpa.DetachState", "all");
properties.put("openjpa.ConnectionFactoryProperties", "PrettyPrint=true, PrettyPrintLineLength=72,"
+ " PrintParameters=true, MaxActive=10, MaxIdle=5, MinIdle=2, MaxWait=31536000, autoReconnect=true");
DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES = properties;
}
/**
* Create an {@link EntityManagerFactory} with the default settings.
* @param persistenceUnitName
* @param jdbcConfig
* @return {@link EntityManagerFactory}
*/
public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig){
return getEntityManagerFactory(persistenceUnitName, jdbcConfig, Collections.emptyMap());
}
/**
* Create an {@link EntityManagerFactory}. The given properties will override the default properties.
* @param persistenceUnitName
* @param jdbcConfig
* @param properties
* @return {@link EntityManagerFactory}
*/
public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig, Map<String, String> properties) {
Map<String, String> finalProperties = new HashMap<>(DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES);
finalProperties.putAll(createConnectionProperties(jdbcConfig));
finalProperties.putAll(properties);
return Persistence.createEntityManagerFactory(persistenceUnitName, finalProperties);
}
public static JDBCConfiguration getJDBCConfiguration(JDBCConfig jdbcConfig) {
Map<String, String> finalProperties = new HashMap<>(DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES);
finalProperties.putAll(createConnectionProperties(jdbcConfig));
JDBCConfiguration jdbcConfiguration = new JDBCConfigurationImpl();
jdbcConfiguration.fromProperties(finalProperties);
return jdbcConfiguration;
}
private static Map<String, String> createConnectionProperties(JDBCConfig jdbcConfig) {
String connectionProperties = "DriverClassName=" + jdbcConfig.getDriver() + "," + "Url=" + jdbcConfig.getURL()
+ "?autoReconnect=true," + "Username=" + jdbcConfig.getUser() + "," + "Password="
+ jdbcConfig.getPassword() + ",validationQuery=" + jdbcConfig.getValidationQuery();
logger.debug("Connection properties={}", connectionProperties);
return Collections.singletonMap("openjpa.ConnectionProperties", connectionProperties);
}
}