220226 - Support for EclipseLink JPA
diff --git a/jpa/plugins/org.eclipse.jpt.eclipselink.core/.classpath b/jpa/plugins/org.eclipse.jpt.eclipselink.core/.classpath
index fb05e00..d7e0396 100644
--- a/jpa/plugins/org.eclipse.jpt.eclipselink.core/.classpath
+++ b/jpa/plugins/org.eclipse.jpt.eclipselink.core/.classpath
@@ -8,5 +8,6 @@
<accessrule kind="accessible" pattern="org/eclipse/jpt/utility/**"/>
</accessrules>
</classpathentry>
+ <classpathentry kind="lib" path="lib/persistence.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/jpa/plugins/org.eclipse.jpt.eclipselink.core/build.properties b/jpa/plugins/org.eclipse.jpt.eclipselink.core/build.properties
index e9bdb6f..2c5d878 100644
--- a/jpa/plugins/org.eclipse.jpt.eclipselink.core/build.properties
+++ b/jpa/plugins/org.eclipse.jpt.eclipselink.core/build.properties
@@ -16,5 +16,6 @@
META-INF/,\
about.html,\
plugin.xml,\
- plugin.properties
+ plugin.properties,\
+ lib/
jars.compile.order = .
diff --git a/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/ddlgen/Main.java b/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/ddlgen/Main.java
new file mode 100644
index 0000000..83571ef
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/ddlgen/Main.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+* Copyright (c) 2007 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+*
+* Contributors:
+* Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.eclipselink.core.internal.ddlgen;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.eclipse.jpt.eclipselink.core.internal.context.schema.generation.SchemaGeneration;
+
+/**
+ * This class creates a EclipseLink <code>EntityManagerFactory</code>,
+ * and executes the DDL generator with the command set in the properties:
+ * <code>eclipselink.ddl-generation.output-mode</code>
+ * <code>eclipselink.application-location</code>
+ *
+ * Current command-line arguments:
+ * [-pu puName] - persistence unit name
+ * [-p propertiesFilePath] - properties for EclipseLink EntityManager
+ *
+ * Example of a properties file:
+ * eclipselink.jdbc.bind-parameters=false
+ * eclipselink.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver
+ * eclipselink.jdbc.url=jdbc\:derby\:c\:/derbydb/testdb;create\=true
+ * eclipselink.jdbc.user=tran
+ * eclipselink.jdbc.password=
+ * eclipselink.logging.level=FINEST
+ * eclipselink.logging.timestamp=false
+ * eclipselink.logging.thread=false
+ * eclipselink.logging.session=false
+ * eclipselink.logging.exceptions=true
+ * eclipselink.orm.throw.exceptions=true
+ * eclipselink.ddl-generation.output-mode=database
+ * eclipselink.ddl-generation=drop-and-create-tables
+ * eclipselink.application-location=c\:/_Projects_/ExampleDDL
+ */
+public class Main
+{
+ protected EntityManagerFactory emf;
+ private Map<String, String> eclipseLinkProperties;
+ private String createDDLFileName;
+ private String dropDDLFileName;
+ private String appLocation;
+ private String eclipseLinkPropertiesPath;
+ private boolean isDebugMode;
+
+ // ********** constructors **********
+
+ public static void main(String[] args) {
+ new Main().execute(args);
+ }
+
+ private Main() {
+ super();
+ }
+
+ // ********** behavior **********
+
+ protected void execute(String[] args) {
+ this.initializeWith(args);
+
+ this.emf = Persistence.createEntityManagerFactory(this.getPUName(args), this.eclipseLinkProperties);
+ this.perform();
+ this.closeEntityManagerFactory();
+
+ this.dispose();
+ return;
+ }
+
+ protected void perform() {
+ // create an EM to generate schema.
+ this.emf.createEntityManager().close();
+ }
+
+ protected void closeEntityManagerFactory() {
+ this.emf.close();
+ }
+
+ private void initializeWith(String[] args) {
+
+ this.eclipseLinkPropertiesPath = this.getEclipseLinkPropertiesPath(args);
+ this.eclipseLinkProperties = this.getProperties(this.eclipseLinkPropertiesPath);
+
+ this.createDDLFileName = this.getConfigPropertyAsString(
+ SchemaGeneration.ECLIPSELINK_CREATE_FILE_NAME,
+ this.eclipseLinkProperties,
+ SchemaGeneration.DEFAULT_SCHEMA_GENERATION_CREATE_FILE_NAME);
+
+ this.dropDDLFileName = this.getConfigPropertyAsString(
+ SchemaGeneration.ECLIPSELINK_DROP_FILE_NAME,
+ this.eclipseLinkProperties,
+ SchemaGeneration.DEFAULT_SCHEMA_GENERATION_DROP_FILE_NAME);
+
+ this.appLocation = this.eclipseLinkProperties.get(SchemaGeneration.ECLIPSELINK_APPLICATION_LOCATION);
+ this.isDebugMode = this.getDebugMode(args);
+ }
+
+ private void dispose() {
+
+ if( ! this.isDebugMode) {
+ new File(this.appLocation + "/" + this.createDDLFileName).delete();
+ new File(this.appLocation + "/" + this.dropDDLFileName).delete();
+ new File(this.eclipseLinkPropertiesPath).delete();
+ }
+ }
+
+ private Map<String, String> getProperties(String eclipseLinkPropertiesPath) {
+
+ Set<Entry<Object, Object>> propertiesSet = null;
+ try {
+ propertiesSet = this.loadEclipseLinkProperties(eclipseLinkPropertiesPath);
+ }
+ catch (IOException e) {
+ throw new RuntimeException("Missing: " + eclipseLinkPropertiesPath, e);
+ }
+
+ Map<String, String> properties = new HashMap<String, String>();
+ for(Entry<Object, Object> property : propertiesSet) {
+ properties.put((String)property.getKey(), (String)property.getValue());
+ }
+ return properties;
+ }
+
+ private Set<Entry<Object, Object>> loadEclipseLinkProperties(String eclipseLinkPropertiesPath) throws IOException {
+
+ FileInputStream stream = new FileInputStream(eclipseLinkPropertiesPath);
+
+ Properties properties = new Properties();
+ properties.load(stream);
+
+ return properties.entrySet();
+ }
+
+ // ********** argument queries **********
+
+ private String getPUName(String[] args) {
+
+ return this.getArgumentValue("-pu", args);
+ }
+
+ private String getEclipseLinkPropertiesPath(String[] args) {
+
+ return this.getArgumentValue("-p", args);
+ }
+
+ private boolean getDebugMode(String[] args) {
+
+ return this.argumentExists("-debug", args);
+ }
+
+ private String getArgumentValue(String argument, String[] args) {
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i];
+ if (arg.toLowerCase().equals(argument)) {
+ int j = i + 1;
+ if (j < args.length) {
+ return args[j];
+ }
+ }
+ }
+ return null;
+ }
+
+ private boolean argumentExists(String argument, String[] args) {
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i];
+ if (arg.toLowerCase().equals(argument)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // ****** utility methods *******
+
+ /**
+ * Check the provided map for an object with the given key. If that object is not available, check the
+ * System properties. If it is not available from either location, return the default value.
+ * @param propertyKey
+ * @param map
+ * @param defaultValue
+ * @return
+ */
+ protected String getConfigPropertyAsString(String propertyKey, Map<String, String> overrides, String defaultValue){
+ String value = this.getConfigPropertyAsString(propertyKey, overrides);
+ if (value == null){
+ value = defaultValue;
+ }
+ return value;
+ }
+
+ protected String getConfigPropertyAsString(String propertyKey, Map<String, String> overrides){
+ String value = null;
+ if (overrides != null){
+ value = (String)overrides.get(propertyKey);
+ }
+ if (value == null){
+ value = System.getProperty(propertyKey);
+ }
+ return value;
+ }
+}
\ No newline at end of file