CAY-2337 Save reverse engineering configuration with datamap XML

Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/2ead78b6
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/2ead78b6
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/2ead78b6

Branch: refs/heads/master
Commit: 2ead78b63c8ad1701f09b3a8d3b6e5ca39a20d5b
Parents: 2373263
Author: Maxim Petrusevich <[email protected]>
Authored: Mon Mar 26 16:31:04 2018 +0300
Committer: Maxim Petrusevich <[email protected]>
Committed: Mon Mar 26 16:31:05 2018 +0300

----------------------------------------------------------------------
 RELEASE-NOTES.txt                               |  72 ++--
 .../main/resources/assemblies/assembly-mac.xml  |  13 +
 .../apache/cayenne/tools/DbImporterTask.java    |   3 +
 .../cayenne/tools/DbImporterTaskTest.java       |  41 +-
 cayenne-dbsync/pom.xml                          |   5 +
 .../reverse/configuration/ToolsModule.java      |   3 +-
 .../dbsync/reverse/dbimport/Catalog.java        |  24 +-
 .../reverse/dbimport/DbImportConfiguration.java |   9 +
 .../dbsync/reverse/dbimport/DbImportModule.java |   3 +-
 .../reverse/dbimport/DefaultDbImportAction.java |  42 +-
 .../dbsync/reverse/dbimport/ExcludeColumn.java  |  15 +-
 .../reverse/dbimport/ExcludeProcedure.java      |  15 +-
 .../dbsync/reverse/dbimport/ExcludeTable.java   |  15 +-
 .../reverse/dbimport/FilterContainer.java       |  25 ++
 .../dbsync/reverse/dbimport/IncludeColumn.java  |  15 +-
 .../reverse/dbimport/IncludeProcedure.java      |  15 +-
 .../dbsync/reverse/dbimport/IncludeTable.java   |  25 +-
 .../dbsync/reverse/dbimport/PatternParam.java   |  19 +
 .../reverse/dbimport/ReverseEngineering.java    |  85 +++-
 .../cayenne/dbsync/reverse/dbimport/Schema.java |  23 +-
 .../reverse/dbimport/SchemaContainer.java       |  12 +-
 .../cayenne/dbsync/reverse/dbload/DbLoader.java |   8 +-
 .../dbsync/reverse/filters/PatternFilter.java   |   4 +
 .../dbsync/reverse/filters/TableFilter.java     |   4 +
 .../cayenne/dbsync/xml/CatalogHandler.java      | 183 ++++++++
 .../cayenne/dbsync/xml/ConfigHandler.java       | 350 +++++++++++++++
 .../cayenne/dbsync/xml/DbImportExtension.java   |  56 +++
 .../dbsync/xml/DbImportLoaderDelegate.java      |  49 +++
 .../dbsync/xml/DbImportSaverDelegate.java       |  46 ++
 .../cayenne/dbsync/xml/IncludeTableHandler.java | 112 +++++
 .../cayenne/dbsync/xml/SchemaHandler.java       | 186 ++++++++
 .../merge/builders/DbAttributeBuilder.java      |   2 +-
 .../dbimport/DefaultDbImportActionTest.java     |   5 +-
 .../filters/FiltersConfigBuilderTest.java       |  18 +-
 .../org/apache/cayenne/di/BindingBuilder.java   |   3 -
 .../org/apache/cayenne/tools/DbImportTask.java  |  24 +-
 .../org/apache/cayenne/CayenneDataObject.java   |   2 +
 .../apache/cayenne/tools/DbImporterMojo.java    |   3 +
 .../cayenne/tools/CayenneGeneratorMojoTest.java |  28 +-
 .../dbimport/testImportWithoutChanges-pom.xml   |   2 +-
 .../tools/dbimport/testInheritance-pom.xml      |   2 +-
 .../apache/cayenne/tools/dbimporter-pom1.xml    |   2 +-
 .../apache/cayenne/tools/dbimporter-pom3.xml    |   2 +-
 modeler/cayenne-modeler/pom.xml                 |  16 +-
 .../cayenne/modeler/CayenneModelerFrame.java    |   1 -
 .../modeler/action/AddCatalogAction.java        |  91 ++++
 .../modeler/action/AddExcludeColumnAction.java  |  41 ++
 .../action/AddExcludeProcedureAction.java       |  41 ++
 .../modeler/action/AddExcludeTableAction.java   |  41 ++
 .../modeler/action/AddIncludeColumnAction.java  |  41 ++
 .../action/AddIncludeProcedureAction.java       |  41 ++
 .../modeler/action/AddIncludeTableAction.java   |  92 ++++
 .../modeler/action/AddPatternParamAction.java   | 140 ++++++
 .../cayenne/modeler/action/AddSchemaAction.java |  97 +++++
 .../cayenne/modeler/action/DBWizardAction.java  |  21 +-
 .../action/DbEntityCounterpartAction.java       |   3 +
 .../modeler/action/DefaultActionManager.java    |  14 +
 .../modeler/action/DeleteNodeAction.java        | 175 ++++++++
 .../cayenne/modeler/action/EditNodeAction.java  |  93 ++++
 .../modeler/action/GetDbConnectionAction.java   |  75 ++++
 .../modeler/action/LoadDbSchemaAction.java      | 292 +++++++++++++
 .../cayenne/modeler/action/MigrateAction.java   |  11 +-
 .../modeler/action/MoveImportNodeAction.java    | 235 ++++++++++
 .../modeler/action/MoveInvertNodeAction.java    |  35 ++
 .../action/ReverseEngineeringAction.java        |  88 +++-
 .../modeler/action/TreeManipulationAction.java  | 197 +++++++++
 .../modeler/dialog/db/DataSourceWizard.java     |  56 ++-
 .../modeler/dialog/db/DataSourceWizardView.java |   9 +-
 .../dialog/db/DbActionOptionsDialog.java        |   7 +-
 .../dialog/db/load/CatalogPopUpMenu.java        |  33 ++
 .../dialog/db/load/DbImportTreeNode.java        | 194 +++++++++
 .../dialog/db/load/DbLoadResultDialog.java      | 105 +++++
 .../modeler/dialog/db/load/DbLoaderContext.java |  86 ++--
 .../dialog/db/load/DbLoaderOptionsDialog.java   | 139 ------
 .../dialog/db/load/DefaultPopUpMenu.java        |  86 ++++
 .../dialog/db/load/IncludeTablePopUpMenu.java   |  37 ++
 .../dialog/db/load/ModelerDbImportAction.java   |  82 +++-
 .../modeler/dialog/db/load/RootPopUpMenu.java   | 133 ++++++
 .../modeler/dialog/db/load/SchemaPopUpMenu.java |  33 ++
 .../dialog/db/load/TransferableNode.java        |  74 ++++
 .../dialog/pref/DBConnectionInfoEditorView.java |   2 +-
 .../modeler/editor/ColorTreeRenderer.java       | 146 +++++++
 .../modeler/editor/DataMapTabbedView.java       |   3 +-
 .../cayenne/modeler/editor/DataMapView.java     |   6 +-
 .../cayenne/modeler/editor/DbImportModel.java   |  75 ++++
 .../modeler/editor/DbImportNodeHandler.java     | 341 +++++++++++++++
 .../cayenne/modeler/editor/DbImportTree.java    | 207 +++++++++
 .../modeler/editor/DbImportTreeCellEditor.java  | 154 +++++++
 .../editor/DbImportTreeCellRenderer.java        |  96 +++++
 .../cayenne/modeler/editor/DbImportView.java    | 236 ++++++++++
 .../modeler/editor/DraggableTreePanel.java      | 428 +++++++++++++++++++
 .../editor/ReverseEngineeringConfigPanel.java   | 223 ++++++++++
 .../editor/ReverseEngineeringTreePanel.java     | 169 ++++++++
 .../modeler/editor/TreeToolbarPanel.java        | 229 ++++++++++
 .../modeler/graph/extension/GraphHandler.java   |   7 +
 .../modeler/init/CayenneModelerModule.java      |   4 +-
 .../modeler/undo/DbImportTreeUndoableEdit.java  |  76 ++++
 .../components/image/FilteredIconFactory.java   |   1 +
 .../cayenne/modeler/images/icon-dbi-catalog.png | Bin 0 -> 288 bytes
 .../cayenne/modeler/images/icon-dbi-config.png  | Bin 0 -> 635 bytes
 .../modeler/images/icon-dbi-excludeColumn.png   | Bin 0 -> 289 bytes
 .../images/icon-dbi-excludeProcedure.png        | Bin 0 -> 365 bytes
 .../modeler/images/icon-dbi-excludeTable.png    | Bin 0 -> 258 bytes
 .../modeler/images/icon-dbi-includeColumn.png   | Bin 0 -> 307 bytes
 .../images/icon-dbi-includeProcedure.png        | Bin 0 -> 386 bytes
 .../modeler/images/icon-dbi-includeTable.png    | Bin 0 -> 288 bytes
 .../cayenne/modeler/images/icon-dbi-refresh.png | Bin 0 -> 547 bytes
 .../modeler/images/icon-dbi-runImport.png       | Bin 0 -> 577 bytes
 .../cayenne/modeler/images/icon-dbi-schema.png  | Bin 0 -> 316 bytes
 109 files changed, 6587 insertions(+), 341 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 5228c96..57f2ea9 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -14,6 +14,7 @@ Date:
 Changes/New Features:
 
 CAY-2334 cgen: option to force run from maven/gradle
+CAY-2337 Save reverse engineering configuration with datamap XML
 CAY-2372 Extract new modules from cayenne-server
 CAY-2377 Cleanup deprecated code.
 CAY-2391 cdbimport: add option to skip user-defined relationships
@@ -96,7 +97,7 @@ CAY-1873 Move DataDomain cache configuration from the Modeler 
and into DI
 CAY-1891 Modeler: Add To-Many Warning
 CAY-1892 Modeler: Add Relationship Data Type Warning
 CAY-2057 Modeler: Clean up OS X version
-CAY-2109 cayenne-crypto: add value authentication (HMAC) 
+CAY-2109 cayenne-crypto: add value authentication (HMAC)
 CAY-2210 Query cache: incorrect cache key for queries with custom value objects
 CAY-2255 ObjectSelect improvement: columns as full entities
 CAY-2258 DI: type-safe binding of List and Map
@@ -318,16 +319,16 @@ CAY-1267 Some changes to LogDialog
 CAY-1826 Merge Entity Attributes and Relationships tabs together with one 
toolbar.
 CAY-1839 Allow to link DataMaps to DataNodes from DataNode editor.
 CAY-1841 Filters for Left-hand project navigator
-CAY-1842 Remove Listeners support from the Modeler 
+CAY-1842 Remove Listeners support from the Modeler
 CAY-1843 DataMap v7: Stop saving listeners in DataMap, add upgrade handler
-CAY-1845 Upgrade javadoc plugin to 2.9.1 
+CAY-1845 Upgrade javadoc plugin to 2.9.1
 CAY-1846 Reworking of callback mapping
 CAY-1847 Make ConverterFactory extensible
-CAY-1848 New method: ObjectContext.selectOne(Select query) 
+CAY-1848 New method: ObjectContext.selectOne(Select query)
 CAY-1851 Generate default serialVersionUID for generated java classes to avoid 
eclipse warnings
-CAY-1852 Straighten thread model and synchronization in the Modeler 
-CAY-1855 Iterated and paginated queries must print result counts 
-CAY-1856 Expression.expWithParameters does not work when parameters are placed 
in the inline collection 
+CAY-1852 Straighten thread model and synchronization in the Modeler
+CAY-1855 Iterated and paginated queries must print result counts
+CAY-1856 Expression.expWithParameters does not work when parameters are placed 
in the inline collection
 CAY-1860 In-memory matching of DataObjects against ObjectId or int
 CAY-1861 Remove runtime relationships
 CAY-1870 cgen - smarter default for 'superPkg' and 'destDir'
@@ -377,7 +378,7 @@ CAY-1966 SQLTemplate/SQLSelect positional parameter binding
 CAY-1967 Deprecate SQLTemplate parameter batches
 CAY-1968 SQLSelect cleanup and omissions
 CAY-1971 Variants of Property.like(..) : contains(..), startsWith(..), 
endsWith(..)
-CAY-1972 A property to override DataSources of multi-module projects 
+CAY-1972 A property to override DataSources of multi-module projects
 CAY-1981 Add support of JDBC 4.0 N-types (nchar, nvarchar, longnvarchar, nclob)
 CAY-1984 cdbimport doesn't flatten many to many relationships
 
@@ -385,7 +386,7 @@ Bug Fixes:
 
 CAy-1988 ServerRuntimeBuilder: synthetic DataNode does not have domain's 
DataMaps linked
 CAY-1480 Implement cross-db functional expressions
-CAY-1695 Unexpected null value in bidirectional one-to-one prefetch 
+CAY-1695 Unexpected null value in bidirectional one-to-one prefetch
 CAY-1736 IllegalArgumentException when synchronizing entities in the Modeler
 CAY-1795 "Invisible" ObjAttribute in subclass
 CAY-1796 ROP: All entity's to-many relationships getting faulted from database 
when using it as a parameter in qualifier expression
@@ -393,13 +394,13 @@ CAY-1797 NPE importing DataMap
 CAY-1798 ROP: Reverse relationships of prefetched entity objects are not 
filled during server to client objects conversion
 CAY-1799 ROP: Server can't deserialize LIKE expression with pattern already 
compiled
 CAY-1818 Fix copyright year in the Modeler "about" panel
-CAY-1834 Exception: ToManyList cannot be cast to DataObject 
-CAY-1857 Problem with hotkeys 
-CAY-1859 NullPointerException when importing EOModel 
+CAY-1834 Exception: ToManyList cannot be cast to DataObject
+CAY-1857 Problem with hotkeys
+CAY-1859 NullPointerException when importing EOModel
 CAY-1863 Make determining whether a particular database type supports length 
adapter-specific not universal
 CAY-1866 Change in General Modeler Preferences reverts old settings to default 
value
-CAY-1868 Select contention with multiple contexts 
-CAY-1869 ResultIterator from cayenne-client dependency is subclassed from 
org.apache.cayenne.access.ResultIterator which is present only in 
cayenne-server dependency 
+CAY-1868 Select contention with multiple contexts
+CAY-1869 ResultIterator from cayenne-client dependency is subclassed from 
org.apache.cayenne.access.ResultIterator which is present only in 
cayenne-server dependency
 CAY-1874 DB2 Procedure action ignores the first result set
 CAY-1877 In-memory evaluation of expression may fail with 
UnsupportedOpeartionException depending on order of nodes
 CAY-1880 objectStore snapshots never cleared from RefreshQuery when "use 
shared cache" unchecked
@@ -434,10 +435,10 @@ CAY-1753 remove light-superclass.vm class template
 CAY-1754 Modeler suggested URL for SQLServer should start with 
'jdbc:sqlserver:' instead of 'jdbc:microsoft:sqlserver:'
 CAY-1758 cdbimport improvements
 CAY-1759 cdbimport improvements: add 'catalog', rename 'schemaName' to 'schema'
-CAY-1760 cdbimport improvements: Default adapter (if none specified) must be 
AutoAdapter, not JdbcAdapter 
-CAY-1761 cdbimport improvements: DbLoader must reverse engineer PK 
auto-increment state. 
-CAY-1762 cdbimport improvements: Support for "defaultPackage" parameter, as 
the new DataMaps ends up placing entities in the root package 
-CAY-1763 cdbimport improvements: specified "schema" should become the default 
schema of the generated DataMap 
+CAY-1760 cdbimport improvements: Default adapter (if none specified) must be 
AutoAdapter, not JdbcAdapter
+CAY-1761 cdbimport improvements: DbLoader must reverse engineer PK 
auto-increment state.
+CAY-1762 cdbimport improvements: Support for "defaultPackage" parameter, as 
the new DataMaps ends up placing entities in the root package
+CAY-1763 cdbimport improvements: specified "schema" should become the default 
schema of the generated DataMap
 CAY-1764 cdbimport improvements: "overwrite" flag
 CAY-1765 cdbimport improvements: add excludeTables/includeTables parameters
 CAY-1766 Deprecating DataPort ant task
@@ -445,25 +446,25 @@ CAY-1768 cdbimport improvements: DataMap 
"project-version" attribute is skipped
 CAY-1769 cdbimport improvements: meaningfulPk flag must be turned into a 
pattern
 CAY-1771 cdbimport improvements: "usePrimitives" flag
 CAY-1772 Real support for DbEntity catalogs
-CAY-1778 TransactionManager to simplify user-managed transactions 
-CAY-1779 Flatten object entities for many to many relationships on reverse 
engineering 
+CAY-1778 TransactionManager to simplify user-managed transactions
+CAY-1779 Flatten object entities for many to many relationships on reverse 
engineering
 CAY-1781 Add StatelessContextRequestHandler as an alternative to the 
Session-based one
 CAY-1785 SelectQuery<T> for DataRows
-CAY-1789 Lock-free EntityResolver 
-CAY-1792 [PATCH] Supply additional factory methods for generic SelectQueries 
-CAY-1803 Optimize Expression conversion to String and EJBQL 
+CAY-1789 Lock-free EntityResolver
+CAY-1792 [PATCH] Supply additional factory methods for generic SelectQueries
+CAY-1803 Optimize Expression conversion to String and EJBQL
 CAY-1809 Remove 'final' modifier from Cayenne, HessianUtil, 
PropertyComparator, ConversionUtil, and LinkedDeque
 CAY-1813 Missing ObjEntity Attribute Validation with Duplicate DbEntity Columns
-CAY-1814 Support Property.nin 
-CAY-1819 When adding a filter, auto-register it as a listener 
-CAY-1820 DataDomain.addListener(Object) - a shortcut for adding annotated 
listeners 
+CAY-1814 Support Property.nin
+CAY-1819 When adding a filter, auto-register it as a listener
+CAY-1820 DataDomain.addListener(Object) - a shortcut for adding annotated 
listeners
 CAY-1821 AuditableFilter and friends should explicitly work with Persistent 
instead of Object
-CAY-1822 Make DataMap editor fields wider 
-CAY-1823 remove ":sync w/DbEntity" button from ObjEntity - it is redundant and 
already present on the entity toolbar. 
+CAY-1822 Make DataMap editor fields wider
+CAY-1823 remove ":sync w/DbEntity" button from ObjEntity - it is redundant and 
already present on the entity toolbar.
 CAY-1825 Simplify API for setting up query caching
 CAY-1828 SQLSelect - generics friendly fluent selecting sql query
 CAY-1829 Make ResultIterator implement Iterable<T>, create 
ObjectContext.iterate method
-CAY-1836 Firebird Adapter 
+CAY-1836 Firebird Adapter
 CAY-1838 Deprecate EntityResolver.indexedByClassProperty
 CAY-1840 Conditionally log slow / long-running queries
 CAY-1844 Configuration for maximum time to wait for an available DB connection
@@ -476,7 +477,7 @@ CAY-1522 EJBQL query don't support quotes
 CAY-1677 Modeler: text fields discard input unless you press enter
 CAY-1701 Modeler cannot undo pasting of obj (db) entity
 CAY-1708 Modeler error when pasting datamap with EJBQL query
-CAY-1714 ROP: Cayenne tries to build a query for non committed object when 
using more than 2 nested contexts 
+CAY-1714 ROP: Cayenne tries to build a query for non committed object when 
using more than 2 nested contexts
 CAY-1721 Writing blobs fails (Oracle)
 CAY-1725 NullPointerException from call to removeToManyTarget
 CAY-1719 Modeler - Obj Attribute Java Type editor won't focus sometimes
@@ -488,15 +489,14 @@ CAY-1742 ObjRelationship inspector says "ObjAttribute 
Inspector"
 CAY-1744 Unexpected read-only relationships in vertical inheritance mapping
 CAY-1749 NPE on simple nested context commit
 CAY-1755 FaultFailureException resolving relationships to UNIQUE non-PK columns
-CAY-1757 ROP: Faulting entity relationship resets uncommitted modifications 
made to its reverse relationship 
+CAY-1757 ROP: Faulting entity relationship resets uncommitted modifications 
made to its reverse relationship
 CAY-1774 EhCacheQueryCache.get(QueryMetadata, QueryCacheEntryFactory) returns 
null if EhCache instance for group is not present
 CAY-1780 cdbimport do not create xml file in resource folder
 CAY-1782 Deadlock when performing many concurrent inserts
 CAY-1783 JdbcPkGenerator.longPkFromDatabase would throw an exception if the PK 
value exceeds a range of Java int
 CAY-1794 Duplicate attributes in discriminator columns of PersistentDescriptor
-CAY-1804 Serialisation of long[] type was not working correctly. 
-CAY-1806 Error importing eomodel 
-CAY-1817 NPE during Validate Project 
+CAY-1804 Serialisation of long[] type was not working correctly.
+CAY-1806 Error importing eomodel
+CAY-1817 NPE during Validate Project
 CAY-1827 EhCache region corresponding to a cache group loses its settings 
after 'removeGroup'
-CAY-1832 Exception when modifying objects in postLoad callback
-
+CAY-1832 Exception when modifying objects in postLoad callback
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/assembly/src/main/resources/assemblies/assembly-mac.xml
----------------------------------------------------------------------
diff --git a/assembly/src/main/resources/assemblies/assembly-mac.xml 
b/assembly/src/main/resources/assemblies/assembly-mac.xml
index 6ff90db..a6bd5a9 100644
--- a/assembly/src/main/resources/assemblies/assembly-mac.xml
+++ b/assembly/src/main/resources/assemblies/assembly-mac.xml
@@ -61,6 +61,19 @@
                                <include>KEYS</include>
                        </includes>
                </fileSet>
+               <fileSet>
+                       <directory>target/doc-staging</directory>
+                       
<outputDirectory>cayenne-${project.version}-macosx/doc</outputDirectory>
+               </fileSet>
+               <fileSet>
+                       <directory>../</directory>
+                       
<outputDirectory>cayenne-${project.version}-macosx/</outputDirectory>
+                       <includes>
+                               <include>RELEASE-NOTES.txt</include>
+                               <include>UPGRADE.txt</include>
+                               <include>KEYS</include>
+                       </includes>
+               </fileSet>
        </fileSets>
 
        <dependencySets>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
----------------------------------------------------------------------
diff --git 
a/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java 
b/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index 0d97213..a241e8c 100644
--- a/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -115,6 +115,9 @@ public class DbImporterTask extends Task {
 
     @Override
     public void execute() {
+        if (reverseEngineering.getCatalogs().size() == 0 && 
reverseEngineering.isEmptyContainer()) {
+            config.setUseDataMapReverseEngineering(true);
+        }
         config.setFiltersConfig(new 
FiltersConfigBuilder(reverseEngineering).build());
         validateAttributes();
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-ant/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-ant/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java 
b/cayenne-ant/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
index 43745e7..7e88a1b 100644
--- a/cayenne-ant/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
+++ b/cayenne-ant/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
@@ -39,11 +39,16 @@ import java.io.IOException;
 import java.net.URL;
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.List;
 
 import static 
org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineeringUtils.*;
-import static org.junit.Assert.*;
+import static org.apache.cayenne.util.Util.isBlank;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 // TODO: we are only testing on Derby. We may need to dynamically switch 
between DBs 
 // based on "cayenneTestConnection", like we do in cayenne-server, etc.
@@ -104,11 +109,6 @@ public class DbImporterTaskTest {
         test("build-include-table.xml");
     }
 
-    @Test
-    public void testExcludeRelationshipFirst() throws Exception {
-        test("testExcludeRelationshipFirst.xml");
-    }
-
     private DbImporterTask getCdbImport(String buildFile) {
         Project project = new Project();
 
@@ -149,9 +149,32 @@ public class DbImporterTaskTest {
         try {
             cdbImport.execute();
             verifyResult(mapFile, mapFileCopy);
+        } finally {
+            cleanDb(cdbImport.toParameters());
         }
-        catch (Exception ex){
-            fail();
+    }
+
+    private void cleanDb(DbImportConfiguration dbImportConfiguration) throws 
ClassNotFoundException,
+            IllegalAccessException, InstantiationException, SQLException {
+        Class.forName(dbImportConfiguration.getDriver()).newInstance();
+        // Get a connection
+        Connection connection = 
DriverManager.getConnection(dbImportConfiguration.getUrl());
+        Statement stmt = connection.createStatement();
+
+        ResultSet tables = connection.getMetaData().getTables(null, null, 
null, new String[]{"TABLE"});
+        while (tables.next()) {
+            String schema = tables.getString("TABLE_SCHEM");
+            System.out.println("DROP TABLE " + (isBlank(schema) ? "" : schema 
+ ".") + tables.getString("TABLE_NAME"));
+            stmt.execute("DROP TABLE " + (isBlank(schema) ? "" : schema + ".") 
+ tables.getString("TABLE_NAME"));
+        }
+
+        ResultSet schemas = connection.getMetaData().getSchemas();
+        while (schemas.next()) {
+            String schem = schemas.getString("TABLE_SCHEM");
+            if (schem.startsWith("SCHEMA")) {
+                System.out.println("DROP SCHEMA " + schem);
+                stmt.execute("DROP SCHEMA " + schem + " RESTRICT");
+            }
         }
     }
 
@@ -208,4 +231,6 @@ public class DbImporterTaskTest {
         }
     }
 
+
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/pom.xml b/cayenne-dbsync/pom.xml
index 5c68b4d..fa5809e 100644
--- a/cayenne-dbsync/pom.xml
+++ b/cayenne-dbsync/pom.xml
@@ -86,6 +86,11 @@
                        <version>${project.version}</version>
                        <scope>test</scope>
                </dependency>
+               <dependency>
+                       <groupId>org.apache.cayenne</groupId>
+                       <artifactId>cayenne-di</artifactId>
+                       <version>4.1.M2-SNAPSHOT</version>
+               </dependency>
        </dependencies>
 
        <build>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
index ceb1e11..0ca291d 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
@@ -65,6 +65,7 @@ import org.apache.cayenne.log.Slf4jJdbcEventLogger;
 import org.apache.cayenne.log.JdbcEventLogger;
 import org.apache.cayenne.project.ProjectModule;
 import org.apache.cayenne.project.extension.ExtensionAwareHandlerFactory;
+import org.apache.cayenne.project.extension.info.InfoExtension;
 import org.apache.cayenne.resource.ClassLoaderResourceLocator;
 import org.apache.cayenne.resource.ResourceLocator;
 import org.slf4j.Logger;
@@ -121,7 +122,7 @@ public class ToolsModule implements Module {
         
binder.bind(DataChannelMetaData.class).to(DefaultDataChannelMetaData.class);
         binder.bind(XMLReader.class).toProviderInstance(new 
XMLReaderProvider(true)).withoutScope();
 
-        ProjectModule.contributeExtensions(binder);
+        ProjectModule.contributeExtensions(binder).add(InfoExtension.class);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Catalog.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Catalog.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Catalog.java
index 3ed8755..5fbb659 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Catalog.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Catalog.java
@@ -19,10 +19,14 @@
 
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
 /**
  * @since 4.0.
  */
-public class Catalog extends SchemaContainer {
+public class Catalog extends SchemaContainer implements XMLSerializable {
 
     public Catalog() {
     }
@@ -31,9 +35,27 @@ public class Catalog extends SchemaContainer {
         setName(name);
     }
 
+    public Catalog(Catalog original) {
+        super(original);
+    }
+
     @Override
     public StringBuilder toString(StringBuilder res, String prefix) {
         res.append(prefix).append("Catalog: ").append(getName()).append("\n");
         return super.toString(res, prefix + "  ");
     }
+
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor 
delegate) {
+        encoder.start("catalog")
+            .nested(this.getIncludeTables(), delegate)
+            .nested(this.getExcludeTables(), delegate)
+            .nested(this.getIncludeColumns(), delegate)
+            .nested(this.getExcludeColumns(), delegate)
+            .nested(this.getIncludeProcedures(), delegate)
+            .nested(this.getExcludeProcedures(), delegate)
+            .simpleTag("name", this.getName())
+            .nested(this.getSchemas(), delegate)
+        .end();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
index 06b04f0..87d249f 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
@@ -61,6 +61,7 @@ public class DbImportConfiguration {
     private String stripFromTableNames;
     private boolean forceDataMapCatalog;
     private boolean forceDataMapSchema;
+    private boolean useDataMapReverseEngineering;
     private File cayenneProject;
 
     public DbImportConfiguration() {
@@ -317,4 +318,12 @@ public class DbImportConfiguration {
     public boolean isForceDataMapSchema() {
         return forceDataMapSchema;
     }
+
+    public boolean isUseDataMapReverseEngineering() {
+        return useDataMapReverseEngineering;
+    }
+
+    public void setUseDataMapReverseEngineering(boolean 
useDataMapReverseEngineering) {
+        this.useDataMapReverseEngineering = useDataMapReverseEngineering;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportModule.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportModule.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportModule.java
index 7cb227c..02d4fc3 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportModule.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportModule.java
@@ -27,6 +27,7 @@ import 
org.apache.cayenne.configuration.xml.DefaultDataChannelMetaData;
 import org.apache.cayenne.configuration.xml.DefaultHandlerFactory;
 import org.apache.cayenne.configuration.xml.HandlerFactory;
 import org.apache.cayenne.configuration.xml.XMLDataMapLoader;
+import org.apache.cayenne.dbsync.xml.DbImportExtension;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.project.FileProjectSaver;
@@ -51,7 +52,7 @@ public class DbImportModule implements Module {
         binder.bind(HandlerFactory.class).to(DefaultHandlerFactory.class);
         
binder.bind(DataChannelMetaData.class).to(DefaultDataChannelMetaData.class);
         
binder.bind(HandlerFactory.class).to(ExtensionAwareHandlerFactory.class);
-        ProjectModule.contributeExtensions(binder);
+        
ProjectModule.contributeExtensions(binder).add(DbImportExtension.class);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
index 37d895e..2c8f6b2 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
@@ -16,6 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
+
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
 import org.apache.cayenne.CayenneRuntimeException;
@@ -27,6 +28,7 @@ import org.apache.cayenne.configuration.DataMapLoader;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.server.DataSourceFactory;
 import org.apache.cayenne.configuration.server.DbAdapterFactory;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.token.model.AbstractToModelToken;
 import org.apache.cayenne.dbsync.merge.DataMapMerger;
@@ -41,6 +43,7 @@ import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderConfiguration;
 import org.apache.cayenne.dbsync.reverse.filters.CatalogFilter;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
 import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DataMap;
@@ -78,12 +81,13 @@ import static org.apache.cayenne.util.Util.isBlank;
 public class DefaultDbImportAction implements DbImportAction {
 
     private final ProjectSaver projectSaver;
-    private final Logger logger;
+    protected final Logger logger;
     private final DataSourceFactory dataSourceFactory;
     private final DbAdapterFactory adapterFactory;
     private final DataMapLoader mapLoader;
     private final MergerTokenFactoryProvider mergerTokenFactoryProvider;
     private final DataChannelDescriptorLoader dataChannelDescriptorLoader;
+    private final DataChannelMetaData metaData;
 
     public DefaultDbImportAction(@Inject Logger logger,
                                  @Inject ProjectSaver projectSaver,
@@ -91,13 +95,15 @@ public class DefaultDbImportAction implements 
DbImportAction {
                                  @Inject DbAdapterFactory adapterFactory,
                                  @Inject DataMapLoader mapLoader,
                                  @Inject MergerTokenFactoryProvider 
mergerTokenFactoryProvider,
-                                 @Inject DataChannelDescriptorLoader 
dataChannelDescriptorLoader) {
+                                 @Inject DataChannelDescriptorLoader 
dataChannelDescriptorLoader,
+                                 @Inject DataChannelMetaData metaData) {
         this.logger = logger;
         this.projectSaver = projectSaver;
         this.dataSourceFactory = dataSourceFactory;
         this.adapterFactory = adapterFactory;
         this.mapLoader = mapLoader;
         this.mergerTokenFactoryProvider = mergerTokenFactoryProvider;
+        this.metaData = metaData;
         this.dataChannelDescriptorLoader = dataChannelDescriptorLoader;
     }
 
@@ -146,11 +152,23 @@ public class DefaultDbImportAction implements 
DbImportAction {
         DbAdapter adapter = adapterFactory.createAdapter(dataNodeDescriptor, 
dataSource);
 
         DataMap sourceDataMap;
+        DataMap targetDataMap = existingTargetMap(config);
+
+        ReverseEngineering dataMapReverseEngineering = 
metaData.get(targetDataMap, ReverseEngineering.class);
+        if ((config.isUseDataMapReverseEngineering()) && 
(dataMapReverseEngineering != null)) {
+            putReverseEngineeringToConfig(dataMapReverseEngineering, config);
+        }
+        if ((dataMapReverseEngineering != null) && 
(!config.isUseDataMapReverseEngineering())) {
+            logger.warn("Found several dbimport configs. Configuration 
selected from 'build.gradle' file.");
+        }
+        if ((dataMapReverseEngineering == null) && 
(config.isUseDataMapReverseEngineering())) {
+            logger.warn("Missing dbimport config. Database is imported 
completely.");
+        }
+
         try (Connection connection = dataSource.getConnection()) {
             sourceDataMap = load(config, adapter, connection);
         }
 
-        DataMap targetDataMap = existingTargetMap(config);
         if (targetDataMap == null) {
 
             String path = config.getTargetDataMap() == null ? "null" : 
config.getTargetDataMap().getAbsolutePath() + "'";
@@ -184,6 +202,20 @@ public class DefaultDbImportAction implements 
DbImportAction {
             saveLoaded(targetDataMap, config);
         }
     }
+    private void putReverseEngineeringToConfig(ReverseEngineering 
reverseEngineering, DbImportConfiguration config) {
+        
config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading());
+        
config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
+        
config.setStripFromTableNames(reverseEngineering.getStripFromTableNames());
+        config.setTableTypes(reverseEngineering.getTableTypes());
+        
config.setMeaningfulPkTables(reverseEngineering.getMeaningfulPkTables());
+        config.setNamingStrategy(reverseEngineering.getNamingStrategy());
+        config.setFiltersConfig(new 
FiltersConfigBuilder(reverseEngineering).build());
+        
config.setForceDataMapCatalog(reverseEngineering.isForceDataMapCatalog());
+        
config.setForceDataMapSchema(reverseEngineering.isForceDataMapSchema());
+        config.setDefaultPackage(reverseEngineering.getDefaultPackage());
+        config.setUsePrimitives(reverseEngineering.isUsePrimitives());
+        config.setUseJava7Types(reverseEngineering.isUseJava7Types());
+    }
 
     protected void transformSourceBeforeMerge(DataMap sourceDataMap, DataMap 
targetDataMap, DbImportConfiguration configuration) {
         if (configuration.isForceDataMapCatalog()) {
@@ -228,7 +260,7 @@ public class DefaultDbImportAction implements 
DbImportAction {
         }
     }
 
-    private Collection<MergerToken> log(List<MergerToken> tokens) {
+    protected Collection<MergerToken> log(List<MergerToken> tokens) {
         logger.info("");
         if (tokens.isEmpty()) {
             logger.info("Detected changes: No changes to import.");
@@ -365,7 +397,7 @@ public class DefaultDbImportAction implements 
DbImportAction {
         return true;
     }
 
-    private boolean syncProcedures(DataMap targetDataMap, DataMap 
loadedDataMap, FiltersConfig filters) {
+    protected boolean syncProcedures(DataMap targetDataMap, DataMap 
loadedDataMap, FiltersConfig filters) {
         Collection<Procedure> procedures = loadedDataMap.getProcedures();
         if (procedures.isEmpty()) {
             return false;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeColumn.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeColumn.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeColumn.java
index a57400a..58fd551 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeColumn.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeColumn.java
@@ -19,14 +19,27 @@
 
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
 /**
  * @since 4.0.
  */
-public class ExcludeColumn extends PatternParam {
+public class ExcludeColumn extends PatternParam implements XMLSerializable {
     public ExcludeColumn() {
     }
 
     public ExcludeColumn(String pattern) {
         super(pattern);
     }
+
+    public ExcludeColumn(ExcludeColumn original) {
+        super(original);
+    }
+
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor 
delegate) {
+        encoder.simpleTag("excludeColumn", this.getPattern());
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeProcedure.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeProcedure.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeProcedure.java
index a42aa23..c629468 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeProcedure.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeProcedure.java
@@ -19,14 +19,27 @@
 
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
 /**
  * @since 4.0.
  */
-public class ExcludeProcedure extends PatternParam {
+public class ExcludeProcedure extends PatternParam implements XMLSerializable {
     public ExcludeProcedure() {
     }
 
     public ExcludeProcedure(String pattern) {
         super(pattern);
     }
+
+    public ExcludeProcedure(ExcludeProcedure original) {
+        super(original);
+    }
+
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor 
delegate) {
+        encoder.simpleTag("excludeProcedure", this.getPattern());
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeTable.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeTable.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeTable.java
index c55a5c4..61a4e9f 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeTable.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeTable.java
@@ -19,14 +19,27 @@
 
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
 /**
  * @since 4.0.
  */
-public class ExcludeTable extends PatternParam {
+public class ExcludeTable extends PatternParam implements XMLSerializable {
     public ExcludeTable() {
     }
 
     public ExcludeTable(String pattern) {
         super(pattern);
     }
+
+    public ExcludeTable(ExcludeTable original) {
+        super(original);
+    }
+
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor 
delegate) {
+        encoder.simpleTag("excludeTable", this.getPattern());
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/FilterContainer.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/FilterContainer.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/FilterContainer.java
index 7090522..3914439 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/FilterContainer.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/FilterContainer.java
@@ -46,6 +46,31 @@ public abstract class FilterContainer {
 
     private final Collection<ExcludeRelationship> 
excludeRelationshipCollection = new LinkedList<>();
 
+    public FilterContainer() {
+    }
+
+    public FilterContainer(FilterContainer original) {
+        this.setName(original.getName());
+        for (IncludeTable includeTable : original.getIncludeTables()) {
+            this.addIncludeTable(new IncludeTable(includeTable));
+        }
+        for (ExcludeTable excludeTable : original.getExcludeTables()) {
+            this.addExcludeTable(new ExcludeTable(excludeTable));
+        }
+        for (IncludeColumn includeColumn : original.getIncludeColumns()) {
+            this.addIncludeColumn(new IncludeColumn(includeColumn));
+        }
+        for (ExcludeColumn excludeColumn : original.getExcludeColumns()) {
+            this.addExcludeColumn(new ExcludeColumn(excludeColumn));
+        }
+        for (IncludeProcedure includeProcedure : 
original.getIncludeProcedures()) {
+            this.addIncludeProcedure(new IncludeProcedure(includeProcedure));
+        }
+        for (ExcludeProcedure excludeProcedure : 
original.getExcludeProcedures()) {
+            this.addExcludeProcedure(new ExcludeProcedure(excludeProcedure));
+        }
+    }
+
     public Collection<IncludeTable> getIncludeTables() {
         return includeTableCollection;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeColumn.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeColumn.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeColumn.java
index 780eb86..db54b07 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeColumn.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeColumn.java
@@ -19,14 +19,27 @@
 
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
 /**
  * @since 4.0.
  */
-public class IncludeColumn extends PatternParam {
+public class IncludeColumn extends PatternParam implements XMLSerializable {
     public IncludeColumn() {
     }
 
     public IncludeColumn(String pattern) {
         super(pattern);
     }
+
+    public IncludeColumn(IncludeColumn original) {
+        super(original);
+    }
+
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor 
delegate) {
+        encoder.simpleTag("includeColumn", this.getPattern());
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeProcedure.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeProcedure.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeProcedure.java
index f3b9040..d6140ea 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeProcedure.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeProcedure.java
@@ -19,14 +19,27 @@
 
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
 /**
  * @since 4.0.
  */
-public class IncludeProcedure extends PatternParam {
+public class IncludeProcedure extends PatternParam implements XMLSerializable {
     public IncludeProcedure() {
     }
 
     public IncludeProcedure(String pattern) {
         super(pattern);
     }
+
+    public IncludeProcedure(IncludeProcedure original) {
+        super(original);
+    }
+
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor 
delegate) {
+        encoder.simpleTag("includeProcedure", this.getPattern());
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeTable.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeTable.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeTable.java
index defa595..ff2ed59 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeTable.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeTable.java
@@ -19,13 +19,17 @@
 
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
 import java.util.Collection;
 import java.util.LinkedList;
 
 /**
  * @since 4.0.
  */
-public class IncludeTable extends PatternParam {
+public class IncludeTable extends PatternParam implements XMLSerializable {
 
     private final Collection<IncludeColumn> includeColumns = new 
LinkedList<>();
 
@@ -40,6 +44,16 @@ public class IncludeTable extends PatternParam {
         super(pattern);
     }
 
+    public IncludeTable(IncludeTable original) {
+        super(original);
+        for (IncludeColumn includeColumn : original.getIncludeColumns()) {
+            this.addIncludeColumn(new IncludeColumn(includeColumn));
+        }
+        for (ExcludeColumn excludeColumn : original.getExcludeColumns()) {
+            this.addExcludeColumn(new ExcludeColumn(excludeColumn));
+        }
+    }
+
     public Collection<IncludeColumn> getIncludeColumns() {
         return includeColumns;
     }
@@ -86,6 +100,15 @@ public class IncludeTable extends PatternParam {
     }
 
     @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor 
delegate) {
+        encoder.start("includeTable")
+            .simpleTag("name", this.getPattern())
+            .nested(this.getIncludeColumns(), delegate)
+            .nested(this.getExcludeColumns(), delegate)
+        .end();
+    }
+
+    @Override
     public StringBuilder toString(StringBuilder res, String s) {
         super.toString(res, s);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/PatternParam.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/PatternParam.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/PatternParam.java
index bef2d5e..b875234 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/PatternParam.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/PatternParam.java
@@ -35,6 +35,10 @@ public class PatternParam {
         this.pattern = pattern;
     }
 
+    public PatternParam(PatternParam original) {
+        this.setPattern(original.getPattern());
+    }
+
     public String getPattern() {
         return pattern;
     }
@@ -82,4 +86,19 @@ public class PatternParam {
         res.append(s).append(getClass().getSimpleName()).append(": 
").append(pattern).append("\n");
         return res;
     }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (obj.getClass() != this.getClass()) {
+            return false;
+        }
+        PatternParam patternParam = (PatternParam) obj;
+        return patternParam.getPattern().equals(pattern);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ReverseEngineering.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ReverseEngineering.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ReverseEngineering.java
index 082f65a..4e0321d 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ReverseEngineering.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ReverseEngineering.java
@@ -16,20 +16,28 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
+
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.dbsync.xml.DbImportExtension;
+import org.apache.cayenne.util.Util;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
 import java.io.Serializable;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedList;
 
 /**
  * @since 4.0
  */
-public class ReverseEngineering extends SchemaContainer implements 
Serializable {
+public class ReverseEngineering extends SchemaContainer implements 
Serializable, XMLSerializable {
 
-    private Boolean skipRelationshipsLoading;
+    private boolean skipRelationshipsLoading;
 
-    private Boolean skipPrimaryKeyLoading;
+    private boolean skipPrimaryKeyLoading;
 
     /*
      * <p>
@@ -118,6 +126,25 @@ public class ReverseEngineering extends SchemaContainer 
implements Serializable
     public ReverseEngineering() {
     }
 
+    public ReverseEngineering(ReverseEngineering original) {
+        super(original);
+        this.setDefaultPackage(original.getDefaultPackage());
+        this.setStripFromTableNames(original.getStripFromTableNames());
+        this.setNamingStrategy(original.getNamingStrategy());
+        this.setMeaningfulPkTables(original.getMeaningfulPkTables());
+        this.setSkipPrimaryKeyLoading(original.getSkipPrimaryKeyLoading());
+        
this.setSkipRelationshipsLoading(original.getSkipRelationshipsLoading());
+        this.setForceDataMapSchema(original.isForceDataMapSchema());
+        this.setForceDataMapCatalog(original.isForceDataMapCatalog());
+        this.setUseJava7Types(original.isUseJava7Types());
+        this.setUsePrimitives(original.isUsePrimitives());
+        this.setTableTypes(Arrays.asList(original.getTableTypes()));
+        this.setName(original.getName());
+        for (Catalog catalog : original.getCatalogs()) {
+            this.addCatalog(new Catalog(catalog));
+        }
+    }
+
     public Boolean getSkipRelationshipsLoading() {
         return skipRelationshipsLoading;
     }
@@ -175,14 +202,27 @@ public class ReverseEngineering extends SchemaContainer 
implements Serializable
             }
         }
 
-        if (skipRelationshipsLoading != null && skipRelationshipsLoading) {
-            res.append("\n        Skip Relationships Loading");
+        super.toString(res, "  ");
+
+        if (skipRelationshipsLoading) {
+            res.append("\n  Skip Relationships Loading");
         }
-        if (skipPrimaryKeyLoading != null && skipPrimaryKeyLoading) {
-            res.append("\n        Skip PrimaryKey Loading");
+        if (skipPrimaryKeyLoading) {
+            res.append("\n  Skip PrimaryKey Loading");
         }
-
-        return super.toString(res, "  ").toString();
+        if (forceDataMapCatalog) {
+            res.append("\n  Force DataMap catalog");
+        }
+        if (forceDataMapSchema) {
+            res.append("\n  Force DataMap schema");
+        }
+        if (usePrimitives) {
+            res.append("\n  Use primitives");
+        }
+        if (useJava7Types) {
+            res.append("\n  Use Java 7 types");
+        }
+        return res.toString();
     }
 
     public String getDefaultPackage() {
@@ -248,4 +288,31 @@ public class ReverseEngineering extends SchemaContainer 
implements Serializable
     public void setUseJava7Types(boolean useJava7Types) {
         this.useJava7Types = useJava7Types;
     }
+
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor 
delegate) {
+        encoder.start("config")
+                .attribute("xmlns", DbImportExtension.NAMESPACE)
+                .nested(this.getIncludeTables(), delegate)
+                .nested(this.getExcludeTables(), delegate)
+                .nested(this.getIncludeColumns(), delegate)
+                .nested(this.getExcludeColumns(), delegate)
+                .nested(this.getIncludeProcedures(), delegate)
+                .nested(this.getExcludeProcedures(), delegate)
+                .nested(this.getCatalogs(), delegate)
+                .nested(this.getSchemas(), delegate)
+                .simpleTag("db-type", 
Util.join(Arrays.asList(this.getTableTypes()), ","))
+                .simpleTag("defaultPackage", this.getDefaultPackage())
+                .simpleTag("forceDataMapCatalog", 
Boolean.toString(this.isForceDataMapCatalog()))
+                .simpleTag("forceDataMapSchema", 
Boolean.toString(this.isForceDataMapSchema()))
+                .simpleTag("meaningfulPkTables", this.getMeaningfulPkTables())
+                .simpleTag("namingStrategy", this.getNamingStrategy())
+                .simpleTag("skipPrimaryKeyLoading", 
this.getSkipPrimaryKeyLoading().toString())
+                .simpleTag("skipRelationshipsLoading", 
this.getSkipRelationshipsLoading().toString())
+                .simpleTag("stripFromTableNames", 
this.getStripFromTableNames())
+                .simpleTag("useJava7Types", 
Boolean.toString(this.isUseJava7Types()))
+                .simpleTag("usePrimitives", 
Boolean.toString(this.isUsePrimitives()))
+                .end();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Schema.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Schema.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Schema.java
index 7e7d273..6e6033f 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Schema.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Schema.java
@@ -19,10 +19,14 @@
 
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
 /**
  * @since 4.0.
  */
-public class Schema extends FilterContainer {
+public class Schema extends FilterContainer implements XMLSerializable {
 
     public Schema() {
     }
@@ -31,9 +35,26 @@ public class Schema extends FilterContainer {
         setName(name);
     }
 
+    public Schema(Schema original) {
+        super(original);
+    }
+
     @Override
     public StringBuilder toString(StringBuilder res, String prefix) {
         res.append(prefix).append("Schema: ").append(getName()).append("\n");
         return super.toString(res, prefix + "  ");
     }
+
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor 
delegate) {
+        encoder.start("schema")
+            .nested(this.getIncludeTables(), delegate)
+            .nested(this.getExcludeTables(), delegate)
+            .nested(this.getIncludeColumns(), delegate)
+            .nested(this.getExcludeColumns(), delegate)
+            .nested(this.getIncludeProcedures(), delegate)
+            .nested(this.getExcludeProcedures(), delegate)
+            .simpleTag("name", this.getName())
+        .end();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/SchemaContainer.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/SchemaContainer.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/SchemaContainer.java
index 7b4a849..e7a9391 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/SchemaContainer.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/SchemaContainer.java
@@ -25,7 +25,7 @@ import java.util.LinkedList;
 /**
  * @since 4.0
  */
-abstract class SchemaContainer extends FilterContainer {
+public abstract class SchemaContainer extends FilterContainer implements 
Cloneable {
 
     private final Collection<Schema> schemaCollection = new LinkedList<>();
 
@@ -37,6 +37,16 @@ abstract class SchemaContainer extends FilterContainer {
         this.schemaCollection.add(schema);
     }
 
+    public SchemaContainer(){
+    }
+
+    public SchemaContainer(SchemaContainer original) {
+        super(original);
+        for (Schema schema : original.getSchemas()) {
+            this.addSchema(new Schema(schema));
+        }
+    }
+
     @Override
     public boolean isEmptyContainer() {
         if (!super.isEmptyContainer()) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
index f0da783..dd0851a 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
@@ -93,7 +93,7 @@ public class DbLoader {
      */
     public static List<String> loadCatalogs(Connection connection) throws 
SQLException {
         try (ResultSet rs = connection.getMetaData().getCatalogs()) {
-            return getStrings(rs);
+            return getStrings(rs, 1);
         }
     }
 
@@ -104,14 +104,14 @@ public class DbLoader {
      */
     public static List<String> loadSchemas(Connection connection) throws 
SQLException {
         try (ResultSet rs = connection.getMetaData().getSchemas()) {
-            return getStrings(rs);
+            return getStrings(rs, 1);
         }
     }
 
-    private static List<String> getStrings(ResultSet rs) throws SQLException {
+    private static List<String> getStrings(ResultSet rs, int columnIndex) 
throws SQLException {
         List<String> strings = new ArrayList<>();
         while (rs.next()) {
-            strings.add(rs.getString(1));
+            strings.add(rs.getString(columnIndex));
         }
         return strings;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/PatternFilter.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/PatternFilter.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/PatternFilter.java
index feb90de..54eb641 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/PatternFilter.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/PatternFilter.java
@@ -75,6 +75,10 @@ public class PatternFilter {
         this.excludes = new TreeSet<>(PATTERN_COMPARATOR);
     }
 
+    public SortedSet<Pattern> getIncludes() {
+        return includes;
+    }
+
     public PatternFilter include(Pattern p) {
         includes.add(p);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/TableFilter.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/TableFilter.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/TableFilter.java
index ebc2358..ecf6dc3 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/TableFilter.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/TableFilter.java
@@ -84,6 +84,10 @@ public class TableFilter {
         return include.columnsFilter;
     }
 
+    public SortedSet<IncludeTableFilter> getIncludes() {
+        return includes;
+    }
+
     public static TableFilter include(String tablePattern) {
         TreeSet<IncludeTableFilter> includes = new 
TreeSet<IncludeTableFilter>();
         includes.add(new IncludeTableFilter(tablePattern == null ? null : 
tablePattern.replaceAll("%", ".*")));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/CatalogHandler.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/CatalogHandler.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/CatalogHandler.java
new file mode 100644
index 0000000..dd71840
--- /dev/null
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/CatalogHandler.java
@@ -0,0 +1,183 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dbsync.xml;
+
+import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
+import org.apache.cayenne.dbsync.reverse.dbimport.*;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * @since 4.1
+ */
+class CatalogHandler extends NamespaceAwareNestedTagHandler {
+
+    private static final String CATALOG_TAG = "catalog";
+    private static final String CATALOG_NAME_TAG = "name";
+    private static final String SCHEMA_TAG = "schema";
+    private static final String INCLUDE_TABLE_TAG = "includeTable";
+    private static final String EXCLUDE_TABLE_TAG = "excludeTable";
+    private static final String INCLUDE_COLUMN_TAG = "includeColumn";
+    private static final String EXCLUDE_COLUMN_TAG = "excludeColumn";
+    private static final String INCLUDE_PROCEDURE_TAG = "includeProcedure";
+    private static final String EXCLUDE_PROCEDURE_TAG = "excludeProcedure";
+
+    private ReverseEngineering configuration;
+
+    private Catalog catalog;
+
+    CatalogHandler(NamespaceAwareNestedTagHandler parentHandler, 
ReverseEngineering configuration) {
+        super(parentHandler);
+        this.configuration = configuration;
+    }
+
+    @Override
+    protected ContentHandler createChildTagHandler(String namespaceURI, String 
localName,
+                                                   String qName, Attributes 
attributes) {
+
+        if (namespaceURI.equals(targetNamespace)) {
+            switch (localName) {
+                case SCHEMA_TAG:
+                    return new SchemaHandler(this, catalog);
+                case INCLUDE_TABLE_TAG:
+                    return new IncludeTableHandler(this, catalog);
+            }
+        }
+
+        return super.createChildTagHandler(namespaceURI, localName, qName, 
attributes);
+    }
+
+    @Override
+    protected boolean processElement(String namespaceURI, String localName, 
Attributes attributes) throws SAXException {
+        switch (localName) {
+            case CATALOG_TAG:
+                createCatalog();
+                return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    protected void processCharData(String localName, String data) {
+        switch (localName) {
+            case INCLUDE_TABLE_TAG:
+                createIncludeTable(data);
+                break;
+            case CATALOG_NAME_TAG:
+                createCatalogName(data);
+                break;
+            case EXCLUDE_TABLE_TAG:
+                createExcludeTable(data);
+                break;
+            case INCLUDE_COLUMN_TAG:
+                createIncludeColumn(data);
+                break;
+            case EXCLUDE_COLUMN_TAG:
+                createExcludeColumn(data);
+                break;
+            case INCLUDE_PROCEDURE_TAG:
+                createIncludeProcedure(data);
+                break;
+            case EXCLUDE_PROCEDURE_TAG:
+                createExcludeProcedure(data);
+                break;
+        }
+    }
+
+    private void createIncludeTable(String includeTableData) {
+        if (includeTableData.trim().length() == 0) {
+            return;
+        }
+
+        if (catalog != null) {
+            IncludeTable includeTable = new IncludeTable();
+            includeTable.setName(includeTableData);
+            catalog.addIncludeTable(includeTable);
+        }
+    }
+
+    private void createCatalogName(String catalogName) {
+        if (catalogName.trim().length() == 0) {
+            return;
+        }
+
+        if (catalog != null) {
+            catalog.setName(catalogName);
+        }
+    }
+
+    private void createExcludeProcedure(String excludeProcedure) {
+        if (excludeProcedure.trim().length() == 0) {
+            return;
+        }
+
+        if (catalog != null) {
+            catalog.addExcludeProcedure(new 
ExcludeProcedure(excludeProcedure));
+        }
+    }
+
+    private void createIncludeProcedure(String includeProcedure) {
+        if (includeProcedure.trim().length() == 0) {
+            return;
+        }
+
+        if (catalog != null) {
+            catalog.addIncludeProcedure(new 
IncludeProcedure(includeProcedure));
+        }
+    }
+
+    private void createExcludeColumn(String excludeColumn) {
+        if (excludeColumn.trim().length() == 0) {
+            return;
+        }
+
+        if (catalog != null) {
+            catalog.addExcludeColumn(new ExcludeColumn(excludeColumn));
+        }
+    }
+
+    private void createIncludeColumn(String includeColumn) {
+        if (includeColumn.trim().length() == 0) {
+            return;
+        }
+
+        if (catalog != null) {
+            catalog.addIncludeColumn(new IncludeColumn(includeColumn));
+        }
+    }
+
+    private void createExcludeTable(String excludeTable) {
+        if (excludeTable.trim().length() == 0) {
+            return;
+        }
+
+        if (catalog != null) {
+            catalog.addExcludeTable(new ExcludeTable(excludeTable));
+        }
+    }
+
+    private void createCatalog() {
+        catalog = new Catalog();
+        configuration.addCatalog(catalog);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/ConfigHandler.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/ConfigHandler.java 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/ConfigHandler.java
new file mode 100644
index 0000000..e522d89
--- /dev/null
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/ConfigHandler.java
@@ -0,0 +1,350 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dbsync.xml;
+
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.configuration.xml.DataMapLoaderListener;
+import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
+import org.apache.cayenne.map.DataMap;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * @since 4.1
+ */
+class ConfigHandler extends NamespaceAwareNestedTagHandler {
+
+    public static final String CONFIG_TAG = "config";
+
+    private static final String CATALOG_TAG = "catalog";
+    private static final String SCHEMA_TAG = "schema";
+    private static final String TABLE_TYPE_TAG = "tableType";
+    private static final String DEFAULT_PACKAGE_TAG = "defaultPackage";
+    private static final String FORCE_DATAMAP_CATALOG_TAG = 
"forceDataMapCatalog";
+    private static final String FORCE_DATAMAP_SCHEMA_TAG = 
"forceDataMapSchema";
+    private static final String MEANINGFUL_PK_TABLES_TAG = 
"meaningfulPkTables";
+    private static final String NAMING_STRATEGY_TAG = "namingStrategy";
+    private static final String SKIP_PK_LOADING_TAG = "skipPrimaryKeyLoading";
+    private static final String SKIP_RELATIONSHIPS_LOADING_TAG = 
"skipRelationshipsLoading";
+    private static final String STRIP_FROM_TABLE_NAMES_TAG = 
"stripFromTableNames";
+    private static final String USE_JAVA7_TYPES_TAG = "useJava7Types";
+    private static final String USE_PRIMITIVES_TAG = "usePrimitives";
+    private static final String INCLUDE_TABLE_TAG = "includeTable";
+    private static final String EXCLUDE_TABLE_TAG = "excludeTable";
+    private static final String INCLUDE_COLUMN_TAG = "includeColumn";
+    private static final String EXCLUDE_COLUMN_TAG = "excludeColumn";
+    private static final String INCLUDE_PROCEDURE_TAG = "includeProcedure";
+    private static final String EXCLUDE_PROCEDURE_TAG = "excludeProcedure";
+
+    private static final String TRUE = "true";
+
+    private ReverseEngineering configuration;
+    private DataChannelMetaData metaData;
+
+    ConfigHandler(NamespaceAwareNestedTagHandler parentHandler, 
DataChannelMetaData metaData) {
+        super(parentHandler);
+        this.metaData = metaData;
+        this.targetNamespace = DbImportExtension.NAMESPACE;
+    }
+
+    @Override
+    protected boolean processElement(String namespaceURI, String localName, 
Attributes attributes) throws SAXException {
+        switch (localName) {
+            case CONFIG_TAG:
+                createConfig();
+                return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    protected ContentHandler createChildTagHandler(String namespaceURI, String 
localName,
+                                                   String qName, Attributes 
attributes) {
+
+        if (namespaceURI.equals(targetNamespace)) {
+            switch (localName) {
+                case CATALOG_TAG:
+                    return new CatalogHandler(this, configuration);
+                case SCHEMA_TAG:
+                    return new SchemaHandler(this, configuration);
+                case INCLUDE_TABLE_TAG:
+                    return new IncludeTableHandler(this , configuration);
+            }
+        }
+
+        return super.createChildTagHandler(namespaceURI, localName, qName, 
attributes);
+    }
+
+    @Override
+    protected void processCharData(String localName, String data) {
+        switch (localName) {
+            case TABLE_TYPE_TAG:
+                createTableType(data);
+                break;
+            case DEFAULT_PACKAGE_TAG:
+                createDefaultPackage(data);
+                break;
+            case FORCE_DATAMAP_CATALOG_TAG:
+                createForceDatamapCatalog(data);
+                break;
+            case FORCE_DATAMAP_SCHEMA_TAG:
+                createForceDatamapSchema(data);
+                break;
+            case MEANINGFUL_PK_TABLES_TAG:
+                createMeaningfulPkTables(data);
+                break;
+            case NAMING_STRATEGY_TAG:
+                createNamingStrategy(data);
+                break;
+            case SKIP_PK_LOADING_TAG:
+                createSkipPkLoading(data);
+                break;
+            case SKIP_RELATIONSHIPS_LOADING_TAG:
+                createSkipRelationshipsLoading(data);
+                break;
+            case STRIP_FROM_TABLE_NAMES_TAG:
+                createStripFromTableNames(data);
+                break;
+            case USE_JAVA7_TYPES_TAG:
+                createUseJava7Types(data);
+                break;
+            case USE_PRIMITIVES_TAG:
+                createUsePrimitives(data);
+                break;
+            case EXCLUDE_TABLE_TAG:
+                createExcludeTable(data);
+                break;
+            case INCLUDE_COLUMN_TAG:
+                createIncludeColumn(data);
+                break;
+            case EXCLUDE_COLUMN_TAG:
+                createExcludeColumn(data);
+                break;
+            case INCLUDE_PROCEDURE_TAG:
+                createIncludeProcedure(data);
+                break;
+            case EXCLUDE_PROCEDURE_TAG:
+                createExcludeProcedure(data);
+                break;
+        }
+    }
+
+    private void createExcludeProcedure(String excludeProcedure) {
+        if (excludeProcedure.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            configuration.addExcludeProcedure(new 
ExcludeProcedure(excludeProcedure));
+        }
+    }
+
+    private void createIncludeProcedure(String includeProcedure) {
+        if (includeProcedure.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            configuration.addIncludeProcedure(new 
IncludeProcedure(includeProcedure));
+        }
+    }
+
+    private void createExcludeColumn(String excludeColumn) {
+        if (excludeColumn.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            configuration.addExcludeColumn(new ExcludeColumn(excludeColumn));
+        }
+    }
+
+    private void createIncludeColumn(String includeColumn) {
+        if (includeColumn.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            configuration.addIncludeColumn(new IncludeColumn(includeColumn));
+        }
+    }
+
+    private void createExcludeTable(String excludeTable) {
+        if (excludeTable.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            configuration.addExcludeTable(new ExcludeTable(excludeTable));
+        }
+    }
+
+    private void createUsePrimitives(String usePrimitives) {
+        if (usePrimitives.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            if (usePrimitives.equals(TRUE)) {
+                configuration.setUsePrimitives(true);
+            } else {
+                configuration.setUsePrimitives(false);
+            }
+        }
+    }
+
+    private void createUseJava7Types(String useJava7Types) {
+        if (useJava7Types.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            if (useJava7Types.equals(TRUE)) {
+                configuration.setUseJava7Types(true);
+            } else {
+                configuration.setUseJava7Types(false);
+            }
+        }
+    }
+
+    private void createStripFromTableNames(String stripFromTableNames) {
+        if (stripFromTableNames.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            configuration.setStripFromTableNames(stripFromTableNames);
+        }
+    }
+
+    private void createSkipRelationshipsLoading(String 
skipRelationshipsLoading) {
+        if (skipRelationshipsLoading.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            if (skipRelationshipsLoading.equals(TRUE)) {
+                configuration.setSkipRelationshipsLoading(true);
+            } else {
+                configuration.setSkipRelationshipsLoading(false);
+            }
+        }
+    }
+
+    private void createSkipPkLoading(String skipPkLoading) {
+        if (skipPkLoading.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            if (skipPkLoading.equals(TRUE)) {
+                configuration.setSkipPrimaryKeyLoading(true);
+            } else {
+                configuration.setSkipPrimaryKeyLoading(false);
+            }
+        }
+    }
+
+    private void createNamingStrategy(String namingStrategy) {
+        if (namingStrategy.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            configuration.setNamingStrategy(namingStrategy);
+        }
+    }
+
+    private void createMeaningfulPkTables(String meaningfulPkTables) {
+        if (meaningfulPkTables.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            configuration.setMeaningfulPkTables(meaningfulPkTables);
+        }
+    }
+
+    private void createForceDatamapSchema(String forceDatamapSchema) {
+        if (forceDatamapSchema.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            if (forceDatamapSchema.equals(TRUE)) {
+                configuration.setForceDataMapSchema(true);
+            } else {
+                configuration.setForceDataMapSchema(false);
+            }
+        }
+    }
+
+    private void createForceDatamapCatalog(String forceDatamapCatalog) {
+        if (forceDatamapCatalog.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            if (forceDatamapCatalog.equals(TRUE)) {
+                configuration.setForceDataMapCatalog(true);
+            } else {
+                configuration.setForceDataMapCatalog(false);
+            }
+        }
+    }
+
+    private void createDefaultPackage(String defaultPackage) {
+        if (defaultPackage.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            configuration.setDefaultPackage(defaultPackage);
+        }
+    }
+
+    private void createTableType(String tableType) {
+        if (tableType.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            configuration.addTableType(tableType);
+        }
+    }
+
+    private void createConfig() {
+        configuration = new ReverseEngineering();
+        loaderContext.addDataMapListener(new DataMapLoaderListener() {
+            @Override
+            public void onDataMapLoaded(DataMap dataMap) {
+                ConfigHandler.this.metaData.add(dataMap, configuration);
+            }
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java
new file mode 100644
index 0000000..120826d
--- /dev/null
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java
@@ -0,0 +1,56 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dbsync.xml;
+
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.extension.BaseNamingDelegate;
+import org.apache.cayenne.project.extension.LoaderDelegate;
+import org.apache.cayenne.project.extension.ProjectExtension;
+import org.apache.cayenne.project.extension.SaverDelegate;
+
+/**
+ * @since 4.1
+ */
+public class DbImportExtension implements ProjectExtension {
+
+    public static final String NAMESPACE = "http://cayenne.apache.org/schema/"; 
+ Project.VERSION + "/dbimport";
+
+    @Inject
+    private DataChannelMetaData metaData;
+
+    @Override
+    public LoaderDelegate createLoaderDelegate() {
+        return new DbImportLoaderDelegate(metaData);
+    }
+
+    @Override
+    public SaverDelegate createSaverDelegate() {
+        return new DbImportSaverDelegate(metaData);
+    }
+
+    @Override
+    public ConfigurationNodeVisitor<String> createNamingDelegate() {
+        return new BaseNamingDelegate();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportLoaderDelegate.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportLoaderDelegate.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportLoaderDelegate.java
new file mode 100644
index 0000000..e777665
--- /dev/null
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportLoaderDelegate.java
@@ -0,0 +1,49 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dbsync.xml;
+
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
+import org.apache.cayenne.project.extension.LoaderDelegate;
+
+/**
+ * @since 4.1
+ */
+class DbImportLoaderDelegate implements LoaderDelegate {
+
+    private DataChannelMetaData metaData;
+
+    DbImportLoaderDelegate(DataChannelMetaData metaData) {
+        this.metaData = metaData;
+    }
+
+    @Override
+    public String getTargetNamespace() {
+        return DbImportExtension.NAMESPACE;
+    }
+
+    @Override
+    public NamespaceAwareNestedTagHandler 
createHandler(NamespaceAwareNestedTagHandler parent, String tag) {
+        if(ConfigHandler.CONFIG_TAG.equals(tag)) {
+            return new ConfigHandler(parent, metaData);
+        }
+        return null;
+    }
+}
\ No newline at end of file

Reply via email to