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);
+ }
}