You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2012/11/09 14:48:05 UTC

svn commit: r1407449 - /cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java

Author: aadamchik
Date: Fri Nov  9 13:48:05 2012
New Revision: 1407449

URL: http://svn.apache.org/viewvc?rev=1407449&view=rev
Log:
CAY-1759 cdbimport improvements: add 'catalog', rename 'schemaName' to 'schema'

* refactoring logger use
* reformatting code
* adding 'catalog' parameter (yet unused)
* renaming schemaName to schema

Modified:
    cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java

Modified: cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java?rev=1407449&r1=1407448&r2=1407449&view=diff
==============================================================================
--- cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java (original)
+++ cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java Fri Nov  9 13:48:05 2012
@@ -41,7 +41,6 @@ import org.apache.cayenne.map.naming.Nam
 import org.apache.cayenne.util.DeleteRuleUpdater;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.util.XMLEncoder;
-import org.apache.commons.logging.Log;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -57,237 +56,262 @@ import org.xml.sax.InputSource;
  */
 public class DbImporterMojo extends AbstractMojo {
 
-	/**
-	 * DataMap XML file to use as a base for DB importing.
-	 * 
-	 * @parameter expression="${cdbimport.map}"
-	 * @required
-	 */
-	private File map;
-
-	/**
-	 * Indicates whether existing DB and object entities should be overwritten.
-	 * This is an all-or-nothing setting. If you need finer granularity, please
-	 * use the Cayenne Modeler.
-	 * 
-	 * Default is <code>true</code>.
-	 * 
-	 * @parameter expression="${cdbimport.overwriteExisting}"
-	 *            default-value="true"
-	 */
-	private boolean overwriteExisting;
-
-	/**
-	 * DB schema to use for DB importing.
-	 * 
-	 * @parameter expression="${cdbimport.schemaName}"
-	 */
-	private String schemaName;
-
-	/**
-	 * Pattern for tables to import from DB.
-	 * 
-	 * The default is to match against all tables.
-	 * 
-	 * @parameter expression="${cdbimport.tablePattern}"
-	 */
-	private String tablePattern;
-
-	/**
-	 * Indicates whether stored procedures should be imported.
-	 * 
-	 * Default is <code>false</code>.
-	 * 
-	 * @parameter expression="${cdbimport.importProcedures}"
-	 *            default-value="false"
-	 */
-	private boolean importProcedures;
-
-	/**
-	 * Pattern for stored procedures to import from DB. This is only meaningful
-	 * if <code>importProcedures</code> is set to <code>true</code>.
-	 * 
-	 * The default is to match against all stored procedures.
-	 * 
-	 * @parameter expression="${cdbimport.procedurePattern}"
-	 */
-	private String procedurePattern;
-
-	/**
-	 * Indicates whether primary keys should be mapped as meaningful attributes
-	 * in the object entities.
-	 * 
-	 * Default is <code>false</code>.
-	 * 
-	 * @parameter expression="${cdbimport.meaningfulPk}" default-value="false"
-	 */
-	private boolean meaningfulPk;
-
-	/**
-	 * Java class implementing org.apache.cayenne.map.naming.NamingStrategy.
-	 * This is used to specify how ObjEntities will be mapped from the imported
-	 * DB schema.
-	 * 
-	 * The default is a basic naming strategy.
-	 * 
-	 * @parameter expression="${cdbimport.namingStrategy}"
-	 *            default-value="org.apache.cayenne.map.naming.SmartNamingStrategy"
-	 */
-	private String namingStrategy;
-
-	/**
-	 * Java class implementing org.apache.cayenne.dba.DbAdapter. While this
-	 * attribute is optional (a generic JdbcAdapter is used if not set), it is
-	 * highly recommended to specify correct target adapter.
-	 * 
-	 * @parameter expression="${cdbimport.adapter}"
-	 */
-	private String adapter;
-
-	/**
-	 * A class of JDBC driver to use for the target database.
-	 * 
-	 * @parameter expression="${cdbimport.driver}"
-	 * @required
-	 */
-	private String driver;
-
-	/**
-	 * JDBC connection URL of a target database.
-	 * 
-	 * @parameter expression="${cdbimport.url}"
-	 * @required
-	 */
-	private String url;
-
-	/**
-	 * Database user name.
-	 * 
-	 * @parameter expression="${cdbimport.username}"
-	 */
-	private String username;
-
-	/**
-	 * Database user password.
-	 * 
-	 * @parameter expression="${cdbimport.password}"
-	 */
-	private String password;
-
-	/**
-	 * Maven logger.
-	 */
-	private Log logger;
-
-	public void execute() throws MojoExecutionException, MojoFailureException {
-
-		Injector injector = DIBootstrap.createInjector(new ToolModule());
-		AdhocObjectFactory objectFactory = injector
-				.getInstance(AdhocObjectFactory.class);
-
-		logger = new MavenLogger(this);
-
-		logger.debug(String
-				.format("connection settings - [driver: %s, url: %s, username: %s, password: %s]",
-						driver, url, username, password));
-
-		logger.info(String
-				.format("importer options - [map: %s, overwriteExisting: %s, schemaName: %s, tablePattern: %s, importProcedures: %s, procedurePattern: %s, meaningfulPk: %s, namingStrategy: %s]",
-						map, overwriteExisting, schemaName, tablePattern,
-						importProcedures, procedurePattern, meaningfulPk,
-						namingStrategy));
-
-		try {
-			final DbAdapter adapterInst = (adapter == null) ? (DbAdapter) objectFactory
-					.newInstance(DbAdapter.class, JdbcAdapter.class.getName())
-					: (DbAdapter) objectFactory.newInstance(DbAdapter.class,
-							adapter);
-
-			// load driver taking custom CLASSPATH into account...
-			DriverDataSource dataSource = new DriverDataSource((Driver) Class
-					.forName(driver).newInstance(), url, username, password);
-
-			// Load the data map and run the db importer.
-			final LoaderDelegate loaderDelegate = new LoaderDelegate();
-			final DbLoader loader = new DbLoader(dataSource.getConnection(),
-					adapterInst, loaderDelegate);
-			loader.setCreatingMeaningfulPK(meaningfulPk);
-
-			if (namingStrategy != null) {
-				final NamingStrategy namingStrategyInst = (NamingStrategy) Class
-						.forName(namingStrategy).newInstance();
-				loader.setNamingStrategy(namingStrategyInst);
-			}
-
-			final DataMap dataMap = map.exists() ? loadDataMap()
-					: new DataMap();
-			loader.loadDataMapFromDB(schemaName, tablePattern, dataMap);
-
-			for (ObjEntity addedObjEntity : loaderDelegate
-					.getAddedObjEntities()) {
-				DeleteRuleUpdater.updateObjEntity(addedObjEntity);
-			}
-
-			if (importProcedures) {
-				loader.loadProceduresFromDB(schemaName, procedurePattern,
-						dataMap);
-			}
-
-			// Write the new DataMap out to disk.
-			map.delete();
-
-			PrintWriter pw = new PrintWriter(map);
-			XMLEncoder encoder = new XMLEncoder(pw, "\t");
-
-			encoder.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
-			dataMap.encodeAsXML(encoder);
-
-			pw.close();
-		} catch (Exception ex) {
-			Throwable th = Util.unwindException(ex);
-
-			String message = "Error importing database schema";
-
-			if (th.getLocalizedMessage() != null) {
-				message += ": " + th.getLocalizedMessage();
-			}
-
-			logger.error(message);
-			throw new MojoExecutionException(message, th);
-		}
-	}
-
-	final class LoaderDelegate extends AbstractDbLoaderDelegate {
-
-		public boolean overwriteDbEntity(final DbEntity ent)
-				throws CayenneException {
-			return overwriteExisting;
-		}
-
-		public void dbEntityAdded(final DbEntity ent) {
-			super.dbEntityAdded(ent);
-			logger.info("Added DB entity: " + ent.getName());
-		}
-
-		public void dbEntityRemoved(final DbEntity ent) {
-			super.dbEntityRemoved(ent);
-			logger.info("Removed DB entity: " + ent.getName());
-		}
-
-		public void objEntityAdded(final ObjEntity ent) {
-			super.objEntityAdded(ent);
-			logger.info("Added obj entity: " + ent.getName());
-		}
-
-		public void objEntityRemoved(final ObjEntity ent) {
-			super.objEntityRemoved(ent);
-			logger.info("Removed obj entity: " + ent.getName());
-		}
-	}
-
-	/** Loads and returns DataMap based on <code>map</code> attribute. */
-	protected DataMap loadDataMap() throws Exception {
-		final InputSource in = new InputSource(map.getCanonicalPath());
-		return new MapLoader().loadDataMap(in);
-	}
+    /**
+     * DataMap XML file to use as a base for DB importing.
+     * 
+     * @parameter expression="${cdbimport.map}"
+     * @required
+     */
+    private File map;
+
+    /**
+     * Indicates whether existing DB and object entities should be overwritten.
+     * This is an all-or-nothing setting. If you need finer granularity, please
+     * use the Cayenne Modeler.
+     * 
+     * Default is <code>true</code>.
+     * 
+     * @parameter expression="${cdbimport.overwriteExisting}"
+     *            default-value="true"
+     */
+    private boolean overwriteExisting;
+
+    /**
+     * DB schema to use for DB importing.
+     * 
+     * @parameter expression="${cdbimport.schemaName}"
+     * @deprecated since 3.2 renamed to "schema"
+     */
+    private String schemaName;
+
+    /**
+     * DB schema to use for DB importing.
+     * 
+     * @parameter expression="${cdbimport.catalog}"
+     * @since 3.2
+     */
+    private String catalog;
+
+    /**
+     * DB schema to use for DB importing.
+     * 
+     * @parameter expression="${cdbimport.schema}"
+     * @since 3.2
+     */
+    private String schema;
+
+    /**
+     * Pattern for tables to import from DB.
+     * 
+     * The default is to match against all tables.
+     * 
+     * @parameter expression="${cdbimport.tablePattern}"
+     */
+    private String tablePattern;
+
+    /**
+     * Indicates whether stored procedures should be imported.
+     * 
+     * Default is <code>false</code>.
+     * 
+     * @parameter expression="${cdbimport.importProcedures}"
+     *            default-value="false"
+     */
+    private boolean importProcedures;
+
+    /**
+     * Pattern for stored procedures to import from DB. This is only meaningful
+     * if <code>importProcedures</code> is set to <code>true</code>.
+     * 
+     * The default is to match against all stored procedures.
+     * 
+     * @parameter expression="${cdbimport.procedurePattern}"
+     */
+    private String procedurePattern;
+
+    /**
+     * Indicates whether primary keys should be mapped as meaningful attributes
+     * in the object entities.
+     * 
+     * Default is <code>false</code>.
+     * 
+     * @parameter expression="${cdbimport.meaningfulPk}" default-value="false"
+     */
+    private boolean meaningfulPk;
+
+    /**
+     * Java class implementing org.apache.cayenne.map.naming.NamingStrategy.
+     * This is used to specify how ObjEntities will be mapped from the imported
+     * DB schema.
+     * 
+     * The default is a basic naming strategy.
+     * 
+     * @parameter expression="${cdbimport.namingStrategy}"
+     *            default-value="org.apache.cayenne.map.naming.SmartNamingStrategy"
+     */
+    private String namingStrategy;
+
+    /**
+     * Java class implementing org.apache.cayenne.dba.DbAdapter. While this
+     * attribute is optional (a generic JdbcAdapter is used if not set), it is
+     * highly recommended to specify correct target adapter.
+     * 
+     * @parameter expression="${cdbimport.adapter}"
+     */
+    private String adapter;
+
+    /**
+     * A class of JDBC driver to use for the target database.
+     * 
+     * @parameter expression="${cdbimport.driver}"
+     * @required
+     */
+    private String driver;
+
+    /**
+     * JDBC connection URL of a target database.
+     * 
+     * @parameter expression="${cdbimport.url}"
+     * @required
+     */
+    private String url;
+
+    /**
+     * Database user name.
+     * 
+     * @parameter expression="${cdbimport.username}"
+     */
+    private String username;
+
+    /**
+     * Database user password.
+     * 
+     * @parameter expression="${cdbimport.password}"
+     */
+    private String password;
+
+    public void execute() throws MojoExecutionException, MojoFailureException {
+
+        getLog().debug(
+                String.format(
+                        "connection settings - [driver: %s, url: %s, username: %s, password: %s]",
+                        driver, url, username, password));
+
+        getLog().info(
+                String.format(
+                        "importer options - [map: %s, overwriteExisting: %s, schema: %s, tablePattern: %s, importProcedures: %s, procedurePattern: %s, meaningfulPk: %s, namingStrategy: %s]",
+                        map, overwriteExisting, schema, tablePattern,
+                        importProcedures, procedurePattern, meaningfulPk,
+                        namingStrategy));
+
+        try {
+            doExecute();
+        } catch (Exception ex) {
+            Throwable th = Util.unwindException(ex);
+
+            String message = "Error importing database schema";
+
+            if (th.getLocalizedMessage() != null) {
+                message += ": " + th.getLocalizedMessage();
+            }
+
+            getLog().error(message);
+            throw new MojoExecutionException(message, th);
+        }
+    }
+
+    private void doExecute() throws Exception {
+
+        String schema = getSchema();
+
+        Injector injector = DIBootstrap.createInjector(new ToolModule());
+        AdhocObjectFactory objectFactory = injector
+                .getInstance(AdhocObjectFactory.class);
+
+        DbAdapter adapterInst = (adapter == null) ? (DbAdapter) objectFactory
+                .newInstance(DbAdapter.class, JdbcAdapter.class.getName())
+                : (DbAdapter) objectFactory.newInstance(DbAdapter.class,
+                        adapter);
+
+        // load driver taking custom CLASSPATH into account...
+        DriverDataSource dataSource = new DriverDataSource((Driver) Class
+                .forName(driver).newInstance(), url, username, password);
+
+        // Load the data map and run the db importer.
+        final LoaderDelegate loaderDelegate = new LoaderDelegate();
+        final DbLoader loader = new DbLoader(dataSource.getConnection(),
+                adapterInst, loaderDelegate);
+        loader.setCreatingMeaningfulPK(meaningfulPk);
+
+        if (namingStrategy != null) {
+            NamingStrategy namingStrategyInst = (NamingStrategy) Class.forName(
+                    namingStrategy).newInstance();
+            loader.setNamingStrategy(namingStrategyInst);
+        }
+
+        final DataMap dataMap = map.exists() ? loadDataMap() : new DataMap();
+        loader.loadDataMapFromDB(schema, tablePattern, dataMap);
+
+        for (ObjEntity addedObjEntity : loaderDelegate.getAddedObjEntities()) {
+            DeleteRuleUpdater.updateObjEntity(addedObjEntity);
+        }
+
+        if (importProcedures) {
+            loader.loadProceduresFromDB(schema, procedurePattern, dataMap);
+        }
+
+        // Write the new DataMap out to disk.
+        map.delete();
+
+        PrintWriter pw = new PrintWriter(map);
+        XMLEncoder encoder = new XMLEncoder(pw, "\t");
+
+        encoder.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        dataMap.encodeAsXML(encoder);
+
+        pw.close();
+    }
+
+    private String getSchema() {
+        if (schemaName != null) {
+            getLog().warn(
+                    "'schemaName' property is deprecated. Use 'schema' instead");
+        }
+
+        return schema != null ? schema : schemaName;
+    }
+
+    final class LoaderDelegate extends AbstractDbLoaderDelegate {
+
+        public boolean overwriteDbEntity(final DbEntity ent)
+                throws CayenneException {
+            return overwriteExisting;
+        }
+
+        public void dbEntityAdded(final DbEntity ent) {
+            super.dbEntityAdded(ent);
+            getLog().info("Added DB entity: " + ent.getName());
+        }
+
+        public void dbEntityRemoved(final DbEntity ent) {
+            super.dbEntityRemoved(ent);
+            getLog().info("Removed DB entity: " + ent.getName());
+        }
+
+        public void objEntityAdded(final ObjEntity ent) {
+            super.objEntityAdded(ent);
+            getLog().info("Added obj entity: " + ent.getName());
+        }
+
+        public void objEntityRemoved(final ObjEntity ent) {
+            super.objEntityRemoved(ent);
+            getLog().info("Removed obj entity: " + ent.getName());
+        }
+    }
+
+    /** Loads and returns DataMap based on <code>map</code> attribute. */
+    protected DataMap loadDataMap() throws Exception {
+        final InputSource in = new InputSource(map.getCanonicalPath());
+        return new MapLoader().loadDataMap(in);
+    }
 }