Author: aadamchik
Date: Sat Mar 10 20:12:49 2012
New Revision: 1299264

URL: http://svn.apache.org/viewvc?rev=1299264&view=rev
Log:
docbook - cdbimport

also cleaning up the Mojo and the Ant task to avoid deprecated API and map file 
creation redundancy

Modified:
    
cayenne/main/trunk/docs/docbook/cayenne-guide/src/docbkx/including-cayenne-in-project.xml
    
cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
    
cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java

Modified: 
cayenne/main/trunk/docs/docbook/cayenne-guide/src/docbkx/including-cayenne-in-project.xml
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/docs/docbook/cayenne-guide/src/docbkx/including-cayenne-in-project.xml?rev=1299264&r1=1299263&r2=1299264&view=diff
==============================================================================
--- 
cayenne/main/trunk/docs/docbook/cayenne-guide/src/docbkx/including-cayenne-in-project.xml
 (original)
+++ 
cayenne/main/trunk/docs/docbook/cayenne-guide/src/docbkx/including-cayenne-in-project.xml
 Sat Mar 10 20:12:49 2012
@@ -239,9 +239,9 @@
                </section>
                <section xml:id="mvn-cdbgen">
                        <title>cdbgen</title>
-                       <para><code>cdbgen</code> is a 
<code>maven-cayenne-plugin</code> goal that that drops
-                               and/or generates tables in a database on 
Cayenne DataMap. By default, it is bound to
-                               the pre-integration-test phase.<table 
frame="void">
+                       <para><code>cdbgen</code> is a 
<code>maven-cayenne-plugin</code> goal that drops and/or generates
+                               tables in a database on Cayenne DataMap. By 
default, it is bound to the
+                               pre-integration-test phase.<table frame="void">
                                        <caption>cdbgen required 
parameters</caption>
                                        <col width="14%"/>
                                        <col width="6%"/>
@@ -364,6 +364,110 @@
                </section>
                <section xml:id="mvn-cdbimport">
                        <title>cdbimport</title>
+                       <para><code>cdbimport</code> is a 
<code>maven-cayenne-plugin</code> goal that generates
+                               a DataMap based on an existing database schema. 
By default, it is bound to the
+                               generate-sources phase. This allows you to 
generate your DataMap prior to building
+                               your project, which may be necessary if you are 
also using the cgen task.<table
+                                       frame="void">
+                                       <caption>cdbimport required 
parameters</caption>
+                                       <col width="14%"/>
+                                       <col width="6%"/>
+                                       <col width="80%"/>
+                                       <thead>
+                                               <tr>
+                                                       <th>Name</th>
+                                                       <th>Type</th>
+                                                       <th>Description</th>
+                                               </tr>
+                                       </thead>
+                                       <tbody>
+                                               <tr>
+                                                       <td><code>map</code>
+                                                       </td>
+                                                       <td>File</td>
+                                                       <td>DataMap XML file 
which is the destination of the schema import.
+                                                               Maybe an 
existing file. If this file does not exist, it is created
+                                                               when cdbimport 
is executed. E.g.
+                                                                       
<code>${project.basedir}/src/main/resources/my.map.xml</code></td>
+                                               </tr>
+                                               <tr>
+                                                       
<td><code>driver</code></td>
+                                                       <td>String</td>
+                                                       <td>A class of JDBC 
driver to use for the target database.</td>
+                                               </tr>
+                                               <tr>
+                                                       
<td><code>url</code></td>
+                                                       <td>String</td>
+                                                       <td>JDBC connection URL 
of a target database.</td>
+                                               </tr>
+                                       </tbody>
+                               </table></para>
+                       <para>
+                               <table frame="void" width="792">
+                                       <caption>cdbimport optional 
parameters</caption>
+                                       <col width="18%"/>
+                                       <col width="7%"/>
+                                       <col width="79%"/>
+                                       <thead>
+                                               <tr>
+                                                       <th>Name</th>
+                                                       <th>Type</th>
+                                                       <th>Description</th>
+                                               </tr>
+                                       </thead>
+                                       <tbody>
+                                               <tr>
+                                                       <td><code>adapter</code>
+                                                       </td>
+                                                       <td>String</td>
+                                                       <td>Java class name 
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.</td>
+                                               </tr>
+                                               <tr>
+                                                       
<td><code>createFK</code></td>
+                                                       <td>boolean</td>
+                                                       <td>Defines whether 
cdbgen should create foreign key constraints.
+                                                               Default is 
"true".</td>
+                                               </tr>
+                                               <tr>
+                                                       
<td><code>createPK</code></td>
+                                                       <td>boolean</td>
+                                                       <td>Defines whether 
cdbgen should create Cayenne-specific auto PK
+                                                               objects. 
Default is "true".</td>
+                                               </tr>
+                                               <tr>
+                                                       
<td><code>createTables</code></td>
+                                                       <td>boolean</td>
+                                                       <td>Defines whether 
cdbgen should create new tables. Default is
+                                                               "true".</td>
+                                               </tr>
+                                               <tr>
+                                                       
<td><code>dropPK</code></td>
+                                                       <td>boolean</td>
+                                                       <td>Defines whether 
cdbgen should drop Cayenne primary key support
+                                                               objects. 
Default is "false".</td>
+                                               </tr>
+                                               <tr>
+                                                       
<td><code>dropTables</code></td>
+                                                       <td>boolean</td>
+                                                       <td>Defines whether 
cdbgen should drop the tables before attempting to
+                                                               create new 
ones. Default is "false".</td>
+                                               </tr>
+                                               <tr>
+                                                       
<td><code>password</code></td>
+                                                       <td>String</td>
+                                                       <td>Database user 
password.</td>
+                                               </tr>
+                                               <tr>
+                                                       
<td><code>username</code></td>
+                                                       <td>String</td>
+                                                       <td>Database user 
name.</td>
+                                               </tr>
+                                       </tbody>
+                               </table>
+                       </para>
                </section>
        </section>
        <section xml:id="ant-projects">

Modified: 
cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java?rev=1299264&r1=1299263&r2=1299264&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
 Sat Mar 10 20:12:49 2012
@@ -28,6 +28,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.util.DeleteRuleUpdater;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.util.XMLEncoder;
 import org.apache.cayenne.CayenneException;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
@@ -49,25 +50,47 @@ public class DbImporterTask extends Caye
     @Override
     public void execute() {
 
-        log(String.format("connection settings - [driver: %s, url: %s, 
username: %s, password: %s]", driver, url, userName, password), 
Project.MSG_VERBOSE);
-
-        log(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), 
Project.MSG_VERBOSE);
+        log(
+                String.format(
+                        "connection settings - [driver: %s, url: %s, username: 
%s, password: %s]",
+                        driver,
+                        url,
+                        userName,
+                        password),
+                Project.MSG_VERBOSE);
+
+        log(
+                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),
+                Project.MSG_VERBOSE);
 
         validateAttributes();
 
         try {
 
             // load driver taking custom CLASSPATH into account...
-            DriverDataSource dataSource = new DriverDataSource((Driver) 
Class.forName(driver).newInstance(), url, userName, password);
+            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(), 
adapter, loaderDelegate);
+            final DbLoader loader = new DbLoader(
+                    dataSource.getConnection(),
+                    adapter,
+                    loaderDelegate);
             loader.setCreatingMeaningfulPK(meaningfulPk);
 
             if (namingStrategy != null) {
-                final NamingStrategy namingStrategyInst = (NamingStrategy) 
Class.forName(namingStrategy).newInstance();
+                final NamingStrategy namingStrategyInst = (NamingStrategy) 
Class.forName(
+                        namingStrategy).newInstance();
                 loader.setNamingStrategy(namingStrategyInst);
             }
 
@@ -85,9 +108,14 @@ public class DbImporterTask extends Caye
             // Write the new DataMap out to disk.
             map.delete();
             PrintWriter pw = new PrintWriter(map);
-            dataMap.encodeAsXML(pw);
+            
+            XMLEncoder encoder = new XMLEncoder(pw, "\t");
+            encoder.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+            dataMap.encodeAsXML(encoder);
+
             pw.close();
-        } catch (final Exception ex) {
+        }
+        catch (final Exception ex) {
             final Throwable th = Util.unwindException(ex);
 
             String message = "Error importing database schema";
@@ -155,25 +183,30 @@ public class DbImporterTask extends Caye
 
     final class LoaderDelegate extends AbstractDbLoaderDelegate {
 
+        @Override
         public boolean overwriteDbEntity(final DbEntity ent) throws 
CayenneException {
             return overwriteExisting;
         }
 
+        @Override
         public void dbEntityAdded(final DbEntity ent) {
             super.dbEntityAdded(ent);
             log("Added DB entity: " + ent.getName());
         }
 
+        @Override
         public void dbEntityRemoved(final DbEntity ent) {
             super.dbEntityRemoved(ent);
             log("Removed DB entity: " + ent.getName());
         }
 
+        @Override
         public void objEntityAdded(final ObjEntity ent) {
             super.objEntityAdded(ent);
             log("Added obj entity: " + ent.getName());
         }
 
+        @Override
         public void objEntityRemoved(final ObjEntity ent) {
             super.objEntityRemoved(ent);
             log("Removed obj entity: " + ent.getName());

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=1299264&r1=1299263&r2=1299264&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
 Sat Mar 10 20:12:49 2012
@@ -19,256 +19,275 @@
 
 package org.apache.cayenne.tools;
 
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.cayenne.configuration.ToolModule;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.MapLoader;
-import org.apache.cayenne.map.naming.NamingStrategy;
-import org.apache.cayenne.access.DbLoader;
+import java.io.File;
+import java.io.PrintWriter;
+import java.sql.Driver;
+
+import org.apache.cayenne.CayenneException;
 import org.apache.cayenne.access.AbstractDbLoaderDelegate;
+import org.apache.cayenne.access.DbLoader;
+import org.apache.cayenne.configuration.ToolModule;
+import org.apache.cayenne.conn.DriverDataSource;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.JdbcAdapter;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.util.Util;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.MapLoader;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.naming.NamingStrategy;
 import org.apache.cayenne.util.DeleteRuleUpdater;
-import org.apache.cayenne.conn.DriverDataSource;
-import org.apache.cayenne.CayenneException;
+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;
 import org.xml.sax.InputSource;
 
-import java.io.File;
-import java.io.PrintWriter;
-import java.sql.Driver;
-
 /**
  * Maven mojo to reverse engineer datamap from DB.
- *
+ * 
  * @since 3.0
- *
+ * 
  * @phase generate-sources
  * @goal cdbimport
  */
 public class DbImporterMojo extends AbstractMojo {
 
-    /**
+       /**
         * DataMap XML file to use as a base for DB importing.
-        *
+        * 
         * @parameter expression="${cdbimport.map}"
         * @required
         */
-       private String map;
+       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 {
 
-    /**
-     * 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;
-
-    /**
-     * The DataMap file to use for importing.
-     */
-    private File mapFile;
-
-    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);
-            }
-
-            mapFile = new File(map);
-            final DataMap dataMap = mapFile.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.
-            mapFile.delete();
-            PrintWriter pw = new PrintWriter(mapFile);
-            dataMap.encodeAsXML(pw);
-            pw.close();
-        } catch (final Exception ex) {
-            final 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(mapFile.getCanonicalPath());
-        return new MapLoader().loadDataMap(in);
-    }
+               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);
+       }
 }


Reply via email to