package org.deephacks.confit.internal.jpa;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import com.google.common.io.Closeables;
public class JpaUtils {
/**
* JPA providers
*/
public static final String HIBERNATE = "hibernate";
public static final String ECLIPSELINK = "eclipselink";
// TO BE IMPLEMENTED LATER
public static final String OPENJPA = "openjpa";
public static final String DATANUCLEUS = "datanucleus";
public static final String OBJECTDB = "objectdb";
/**
* Generates a property file for initalizing the EntityManagerFactory.
*/
public static abstract class Jpaprovider {
private static final String PROVIDER = "javax.persistence.provider";
private static final String URL = "javax.persistence.jdbc.url";
private static final String DRIVER = "javax.persistence.jdbc.driver";
private static final String USER = "javax.persistence.jdbc.user";
private static final String PASSWORD = "javax.persistence.jdbc.password";
private static final String TRANSACTION_TYPE = "javax.persistence.transactionType";
protected String provider;
protected String url;
protected String driver;
protected String username;
protected String password;
protected String transactionType = "RESOURCE_LOCAL";
protected HashMap<String, String> providerSpecific = new HashMap<String, String>();
public Jpaprovider(Database database) {
url = database.getUrl();
username = database.getUsername();
password = database.getPassword();
}
public static Jpaprovider create(String jpaProvider, Database database) {
if (HIBERNATE.equals(jpaProvider)) {
return new Hibernate(database);
} else if (ECLIPSELINK.equals(jpaProvider)) {
return new EclipseLink(database);
} else {
throw new UnsupportedOperationException("JPA provider not supported ["
+ jpaProvider + "]");
}
}
public void write(File file) {
List<String> contents = new ArrayList<String>();
contents.add(PROVIDER + "=" + provider);
contents.add(URL + "=" + url);
contents.add(DRIVER + "=" + driver);
contents.add(USER + "=" + username);
contents.add(PASSWORD + "=" + password);
contents.add(TRANSACTION_TYPE + "=" + transactionType);
for (String key : providerSpecific.keySet()) {
contents.add(key + "=" + providerSpecific.get(key));
}
writeFile(contents, file);
}
}
public static class Hibernate extends Jpaprovider {
private static final String DERBY_DIALECT = "org.hibernate.dialect.DerbyDialect";
private static final String MYSQL_DIALECT = "org.hibernate.dialect.MySQLDialect";
private static final String POSTGRESQL_DIALECT = "org.hibernate.dialect.PostgreSQLDialect";
public Hibernate(Database database) {
super(database);
provider = "org.hibernate.ejb.HibernatePersistence";
if (Database.DERBY.equals(database.getDatabaseProvider())) {
driver = Database.DERBY_DRIVER;
providerSpecific.put("hibernate.dialect", DERBY_DIALECT);
} else if (Database.MYSQL.equals(database.getDatabaseProvider())) {
driver = Database.MYSQL_DRIVER;
providerSpecific.put("hibernate.dialect", MYSQL_DIALECT);
} else if (Database.POSTGRESQL.equals(database.getDatabaseProvider())) {
driver = Database.POSTGRESQL_DRIVER;
providerSpecific.put("hibernate.dialect", POSTGRESQL_DIALECT);
} else {
throw new UnsupportedOperationException("DB provider not supported ["
+ database.getDatabaseProvider() + "]");
}
providerSpecific.put("hibernate.show_sql", "false");
providerSpecific.put("hibernate.hbm2ddl.auto", "validate");
}
}
public static class EclipseLink extends Jpaprovider {
public EclipseLink(Database database) {
super(database);
provider = "org.eclipse.persistence.jpa.PersistenceProvider";
if (Database.DERBY.equals(database.getDatabaseProvider())) {
driver = Database.DERBY_DRIVER;
} else if (Database.MYSQL.equals(database.getDatabaseProvider())) {
driver = Database.MYSQL_DRIVER;
} else if (Database.POSTGRESQL.equals(database.getDatabaseProvider())) {
driver = Database.POSTGRESQL_DRIVER;
} else {
throw new UnsupportedOperationException("DB provider not supported ["
+ database.getDatabaseProvider() + "]");
}
providerSpecific.put("eclipselink.persistence-context.flush-mode", "COMMIT");
}
}
public static void writeFile(String[] lines, File file) {
writeFile(Arrays.asList(lines), file);
}
public static void writeFile(List<String> lines, File file) {
try {
File parent = file.getParentFile();
if ((parent != null) && !parent.exists()) {
parent.mkdirs();
}
} catch (Exception e) {
throw new RuntimeException(
"Unxpected exception when trying to create parent folders for file ["
+ file.getAbsolutePath() + "].");
}
try {
writeFile(lines, new FileOutputStream(file));
} catch (IOException e) {
throw new IllegalArgumentException("File [" + file.getAbsolutePath()
+ "] cant write to file.", e);
}
}
public static void writeFile(List<String> lines, OutputStream stream) {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(stream));
for (String line : lines) {
bw.write(line + "\n");
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
Closeables.closeQuietly(bw);
}
}
}