| /******************************************************************************* |
| * Copyright (c) 2007, 2011 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.jpa.eclipselink.core.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.jpa.eclipselink.core.context.persistence.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(); //$NON-NLS-1$ |
| new File(this.appLocation + "/" + this.dropDDLFileName).delete(); //$NON-NLS-1$ |
| 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); //$NON-NLS-1$ |
| } |
| |
| 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); //$NON-NLS-1$ |
| } |
| |
| private String getEclipseLinkPropertiesPath(String[] args) { |
| |
| return this.getArgumentValue("-p", args); //$NON-NLS-1$ |
| } |
| |
| private boolean getDebugMode(String[] args) { |
| |
| return this.argumentExists("-debug", args); //$NON-NLS-1$ |
| } |
| |
| 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 = overrides.get(propertyKey); |
| } |
| if(value == null) { |
| value = System.getProperty(propertyKey); |
| } |
| return value; |
| } |
| } |