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

[1/9] cayenne git commit: CAY-2118 cdbimport: drop support for the old style of table filtering

Repository: cayenne
Updated Branches:
  refs/heads/master 7296d1fef -> ec0d6b2ca


CAY-2118 cdbimport: drop support for the old style of table filtering


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

Branch: refs/heads/master
Commit: a98f0a083395c6d17fef06d1c74dad74c2671c16
Parents: cf172fc
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 13:51:20 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 14:05:59 2016 +0300

----------------------------------------------------------------------
 .../dbsync/reverse/FiltersConfigBuilder.java    |  47 +---
 .../filters/LegacyFilterConfigBridge.java       | 150 -----------
 .../cayenne-relationship-optimisation.xml       |   4 -
 .../db/cayenne-relationship-optimisation.xml    |   4 +
 .../db/relationship-optimisation.map.xml        |  43 ++++
 .../reverse/relationship-optimisation.map.xml   |  43 ----
 .../cayenne/dbimport/ReverseEngineering.java    |  15 +-
 .../apache/cayenne/tools/DbImporterTask.java    | 141 +----------
 .../apache/cayenne/tools/DbImporterMojo.java    | 251 ++++---------------
 9 files changed, 111 insertions(+), 587 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/a98f0a08/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilder.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilder.java
index 2035f44..4f72f6d 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilder.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilder.java
@@ -28,19 +28,19 @@ import org.apache.cayenne.dbimport.IncludeTable;
 import org.apache.cayenne.dbimport.PatternParam;
 import org.apache.cayenne.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbimport.Schema;
-import org.apache.cayenne.dbsync.reverse.filters.LegacyFilterConfigBridge;
 import org.apache.cayenne.dbsync.reverse.filters.CatalogFilter;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.dbsync.reverse.filters.IncludeTableFilter;
+import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.SchemaFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
-import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 
-import java.util.*;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.SortedSet;
+import java.util.TreeSet;
 import java.util.regex.Pattern;
 
-import static org.apache.commons.lang.StringUtils.isBlank;
-
 /**
  * @since 4.0
  */
@@ -356,39 +356,4 @@ public final class FiltersConfigBuilder {
             }
         }
     }
-
-    public FiltersConfigBuilder add(LegacyFilterConfigBridge build) {
-        if (!isBlank(build.catalog())) {
-            engineering.addCatalog(new Catalog(build.catalog()));
-        }
-
-        if (!isBlank(build.schema())) {
-            engineering.addSchema(new Schema(build.schema()));
-        }
-
-        if (!isBlank(build.getIncludeTableFilters())) {
-            engineering.addIncludeTable(new IncludeTable(build.getIncludeTableFilters()));
-        }
-        if (!isBlank(build.getExcludeTableFilters())) {
-            engineering.addExcludeTable(new ExcludeTable(build.getExcludeTableFilters()));
-        }
-
-        if (!isBlank(build.getIncludeColumnFilters())) {
-            engineering.addIncludeColumn(new IncludeColumn(build.getIncludeColumnFilters()));
-        }
-        if (!isBlank(build.getExcludeColumnFilters())) {
-            engineering.addExcludeColumn(new ExcludeColumn(build.getExcludeColumnFilters()));
-        }
-
-        if (build.isLoadProcedures()) {
-            if (!isBlank(build.getIncludeProceduresFilters())) {
-                engineering.addIncludeProcedure(new IncludeProcedure(build.getIncludeProceduresFilters()));
-            }
-            if (!isBlank(build.getExcludeProceduresFilters())) {
-                engineering.addExcludeProcedure(new ExcludeProcedure(build.getExcludeProceduresFilters()));
-            }
-        }
-
-        return this;
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/a98f0a08/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/LegacyFilterConfigBridge.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/LegacyFilterConfigBridge.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/LegacyFilterConfigBridge.java
deleted file mode 100644
index b7e66fc..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/LegacyFilterConfigBridge.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*****************************************************************
- *   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.reverse.filters;
-
-import static org.apache.commons.lang.StringUtils.isBlank;
-
-/**
- * @since 4.0
- */
-public class LegacyFilterConfigBridge {
-
-    private String catalog;
-    private String schema;
-
-    private String includeTableFilters;
-    private String includeColumnFilters;
-    private String includeProceduresFilters;
-    private String excludeTableFilters;
-    private String excludeColumnFilters;
-    private String excludeProceduresFilters;
-
-    private boolean loadProcedures;
-
-    public LegacyFilterConfigBridge() {
-    }
-
-    public LegacyFilterConfigBridge catalog(String catalog) {
-        this.catalog = catalog;
-        return this;
-    }
-
-    public String catalog() {
-        return catalog;
-    }
-
-    public LegacyFilterConfigBridge schema(String schema) {
-        this.schema = schema;
-        return this;
-    }
-
-    public String schema() {
-        return schema;
-    }
-
-    public LegacyFilterConfigBridge includeTables(String tableFilters) {
-        if (isBlank(tableFilters)) {
-            return this;
-        }
-
-        this.includeTableFilters = transform(tableFilters);
-        return this;
-    }
-
-    public LegacyFilterConfigBridge includeColumns(String columnFilters) {
-        if (isBlank(columnFilters)) {
-            return this;
-        }
-
-        this.includeColumnFilters = transform(columnFilters);
-        return this;
-    }
-
-    public LegacyFilterConfigBridge includeProcedures(String proceduresFilters) {
-        if (isBlank(proceduresFilters)) {
-            return this;
-        }
-
-        this.includeProceduresFilters = transform(proceduresFilters);
-        return this;
-    }
-
-    public LegacyFilterConfigBridge excludeTables(String tableFilters) {
-        if (isBlank(tableFilters)) {
-            return this;
-        }
-
-        this.excludeTableFilters = transform(tableFilters);
-        return this;
-    }
-
-    public LegacyFilterConfigBridge excludeColumns(String columnFilters) {
-        if (isBlank(columnFilters)) {
-            return this;
-        }
-
-        this.excludeColumnFilters = transform(columnFilters);
-        return this;
-    }
-
-    public LegacyFilterConfigBridge excludeProcedures(String proceduresFilters) {
-        if (isBlank(proceduresFilters)) {
-            return this;
-        }
-
-        this.excludeProceduresFilters = transform(proceduresFilters);
-        return this;
-    }
-
-    private static String transform(String pattern) {
-        return "^" + pattern.replaceAll("[*?]", ".$0") + "$";
-    }
-
-    public void setProceduresFilters(boolean loadProcedures) {
-        this.loadProcedures = loadProcedures;
-    }
-
-    public String getIncludeTableFilters() {
-        return includeTableFilters;
-    }
-
-    public String getIncludeColumnFilters() {
-        return includeColumnFilters;
-    }
-
-    public String getIncludeProceduresFilters() {
-        return includeProceduresFilters;
-    }
-
-    public String getExcludeTableFilters() {
-        return excludeTableFilters;
-    }
-
-    public String getExcludeColumnFilters() {
-        return excludeColumnFilters;
-    }
-
-    public String getExcludeProceduresFilters() {
-        return excludeProceduresFilters;
-    }
-
-    public boolean isLoadProcedures() {
-        return loadProcedures;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/a98f0a08/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/cayenne-relationship-optimisation.xml
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/cayenne-relationship-optimisation.xml b/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/cayenne-relationship-optimisation.xml
deleted file mode 100644
index d4fea49..0000000
--- a/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/cayenne-relationship-optimisation.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<domain project-version="6">
-	<map name="relationship-optimisation"/>
-</domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/a98f0a08/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/db/cayenne-relationship-optimisation.xml
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/db/cayenne-relationship-optimisation.xml b/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/db/cayenne-relationship-optimisation.xml
new file mode 100644
index 0000000..d4fea49
--- /dev/null
+++ b/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/db/cayenne-relationship-optimisation.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<domain project-version="6">
+	<map name="relationship-optimisation"/>
+</domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/a98f0a08/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/db/relationship-optimisation.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/db/relationship-optimisation.map.xml b/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/db/relationship-optimisation.map.xml
new file mode 100644
index 0000000..e68645f
--- /dev/null
+++ b/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/db/relationship-optimisation.map.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	 project-version="6">
+	<property name="defaultPackage" value="com.objectstyle"/>
+	<db-entity name="table1" catalog="many_to_many_test">
+		<db-attribute name="id1" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+		<db-attribute name="table1col" type="VARCHAR" length="45"/>
+	</db-entity>
+	<db-entity name="table1_table2" catalog="many_to_many_test">
+		<db-attribute name="fk1" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+		<db-attribute name="fk2" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+	</db-entity>
+	<db-entity name="table2" catalog="many_to_many_test">
+		<db-attribute name="id2" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+		<db-attribute name="table2col" type="VARCHAR" length="45"/>
+	</db-entity>
+	<obj-entity name="Table1" className="com.objectstyle.Table1" dbEntityName="table1">
+		<obj-attribute name="table1col" type="java.lang.String" db-attribute-path="table1col"/>
+	</obj-entity>
+	<obj-entity name="Table1Table2" className="com.objectstyle.Table1Table2" dbEntityName="table1_table2">
+	</obj-entity>
+	<obj-entity name="Table2" className="com.objectstyle.Table2" dbEntityName="table2">
+		<obj-attribute name="table2col" type="java.lang.String" db-attribute-path="table2col"/>
+	</obj-entity>
+	<db-relationship name="table1Table2Array" source="table1" target="table1_table2" toDependentPK="true" toMany="true">
+		<db-attribute-pair source="id1" target="fk1"/>
+	</db-relationship>
+	<db-relationship name="toTable1" source="table1_table2" target="table1" toMany="false">
+		<db-attribute-pair source="fk1" target="id1"/>
+	</db-relationship>
+	<db-relationship name="toTable2" source="table1_table2" target="table2" toMany="false">
+		<db-attribute-pair source="fk2" target="id2"/>
+	</db-relationship>
+	<db-relationship name="table1Table2Array" source="table2" target="table1_table2" toDependentPK="true" toMany="true">
+		<db-attribute-pair source="id2" target="fk2"/>
+	</db-relationship>
+	<obj-relationship name="table1Table2Array" source="Table1" target="Table1Table2" deleteRule="Deny" db-relationship-path="table1Table2Array"/>
+	<obj-relationship name="toTable1" source="Table1Table2" target="Table1" deleteRule="Nullify" db-relationship-path="toTable1"/>
+	<obj-relationship name="toTable2" source="Table1Table2" target="Table2" deleteRule="Nullify" db-relationship-path="toTable2"/>
+	<obj-relationship name="table1Table2Array" source="Table2" target="Table1Table2" deleteRule="Deny" db-relationship-path="table1Table2Array"/>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/a98f0a08/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/relationship-optimisation.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/relationship-optimisation.map.xml b/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/relationship-optimisation.map.xml
deleted file mode 100644
index e68645f..0000000
--- a/cayenne-dbsync/src/test/resources/org/apache/cayenne/dbsync/reverse/relationship-optimisation.map.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-	 project-version="6">
-	<property name="defaultPackage" value="com.objectstyle"/>
-	<db-entity name="table1" catalog="many_to_many_test">
-		<db-attribute name="id1" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-		<db-attribute name="table1col" type="VARCHAR" length="45"/>
-	</db-entity>
-	<db-entity name="table1_table2" catalog="many_to_many_test">
-		<db-attribute name="fk1" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-		<db-attribute name="fk2" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-	</db-entity>
-	<db-entity name="table2" catalog="many_to_many_test">
-		<db-attribute name="id2" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-		<db-attribute name="table2col" type="VARCHAR" length="45"/>
-	</db-entity>
-	<obj-entity name="Table1" className="com.objectstyle.Table1" dbEntityName="table1">
-		<obj-attribute name="table1col" type="java.lang.String" db-attribute-path="table1col"/>
-	</obj-entity>
-	<obj-entity name="Table1Table2" className="com.objectstyle.Table1Table2" dbEntityName="table1_table2">
-	</obj-entity>
-	<obj-entity name="Table2" className="com.objectstyle.Table2" dbEntityName="table2">
-		<obj-attribute name="table2col" type="java.lang.String" db-attribute-path="table2col"/>
-	</obj-entity>
-	<db-relationship name="table1Table2Array" source="table1" target="table1_table2" toDependentPK="true" toMany="true">
-		<db-attribute-pair source="id1" target="fk1"/>
-	</db-relationship>
-	<db-relationship name="toTable1" source="table1_table2" target="table1" toMany="false">
-		<db-attribute-pair source="fk1" target="id1"/>
-	</db-relationship>
-	<db-relationship name="toTable2" source="table1_table2" target="table2" toMany="false">
-		<db-attribute-pair source="fk2" target="id2"/>
-	</db-relationship>
-	<db-relationship name="table1Table2Array" source="table2" target="table1_table2" toDependentPK="true" toMany="true">
-		<db-attribute-pair source="id2" target="fk2"/>
-	</db-relationship>
-	<obj-relationship name="table1Table2Array" source="Table1" target="Table1Table2" deleteRule="Deny" db-relationship-path="table1Table2Array"/>
-	<obj-relationship name="toTable1" source="Table1Table2" target="Table1" deleteRule="Nullify" db-relationship-path="toTable1"/>
-	<obj-relationship name="toTable2" source="Table1Table2" target="Table2" deleteRule="Nullify" db-relationship-path="toTable2"/>
-	<obj-relationship name="table1Table2Array" source="Table2" target="Table1Table2" deleteRule="Deny" db-relationship-path="table1Table2Array"/>
-</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/a98f0a08/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineering.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineering.java b/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineering.java
index 7fa0a12..06528bf 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineering.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineering.java
@@ -39,15 +39,12 @@ public class ReverseEngineering extends FilterContainer implements Configuration
 
     private static final Log LOG = LogFactory.getLog(ReverseEngineering.class);
 
-    public ReverseEngineering(String name) {
-        this.name = name;
-    }
-
+    @XmlTransient
+    protected Resource configurationSource;
     @XmlTransient
     private String name;
 
     private Boolean skipRelationshipsLoading;
-
     private Boolean skipPrimaryKeyLoading;
 
     /*
@@ -64,11 +61,9 @@ public class ReverseEngineering extends FilterContainer implements Configuration
     @XmlElement(name = "schema")
     private Collection<Schema> schemas = new LinkedList<Schema>();
 
-    /**
-     * @since 4.0
-     */
-    @XmlTransient
-    protected Resource configurationSource;
+    public ReverseEngineering(String name) {
+        this.name = name;
+    }
 
     public ReverseEngineering() {
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/a98f0a08/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index 8da5038..ea95110 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -25,20 +25,10 @@ import org.apache.cayenne.configuration.server.DataSourceFactory;
 import org.apache.cayenne.configuration.server.DbAdapterFactory;
 import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbimport.AntNestedElement;
-import org.apache.cayenne.dbimport.Catalog;
 import org.apache.cayenne.dbimport.DefaultReverseEngineeringLoader;
-import org.apache.cayenne.dbimport.ExcludeColumn;
-import org.apache.cayenne.dbimport.ExcludeProcedure;
-import org.apache.cayenne.dbimport.ExcludeTable;
-import org.apache.cayenne.dbimport.IncludeColumn;
-import org.apache.cayenne.dbimport.IncludeProcedure;
-import org.apache.cayenne.dbimport.IncludeTable;
 import org.apache.cayenne.dbimport.ReverseEngineering;
-import org.apache.cayenne.dbimport.Schema;
 import org.apache.cayenne.dbsync.CayenneDbSyncModule;
 import org.apache.cayenne.dbsync.reverse.FiltersConfigBuilder;
-import org.apache.cayenne.dbsync.reverse.filters.LegacyFilterConfigBridge;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.map.DataMap;
@@ -63,11 +53,9 @@ import java.net.URL;
 public class DbImporterTask extends Task {
 
     private final DbImportConfiguration config;
-
     private final ReverseEngineering reverseEngineering = new ReverseEngineering();
-    private boolean isReverseEngineeringDefined = false;
 
-    private final LegacyFilterConfigBridge filterBuilder = new LegacyFilterConfigBridge();
+    private boolean isReverseEngineeringDefined;
 
     public DbImporterTask() {
         config = new DbImportConfiguration();
@@ -79,9 +67,7 @@ public class DbImporterTask extends Task {
     @Override
     public void execute() {
         File dataMapFile = config.getDataMapFile();
-        config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering)
-                .add(filterBuilder)
-                .build());
+        config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering).build());
 
         validateAttributes();
 
@@ -91,6 +77,7 @@ public class DbImporterTask extends Task {
         config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
         config.setTableTypes(reverseEngineering.getTableTypes());
 
+        // TODO: get rid of this fork...
         if (isReverseEngineeringDefined) {
             Injector injector = DIBootstrap.createInjector(new CayenneDbSyncModule(), new ToolsModule(logger), new DbImportModule());
 
@@ -214,55 +201,12 @@ public class DbImporterTask extends Task {
     }
 
     /**
-     * @deprecated since 4.0 use {@link #setSchema(String)}
-     */
-    @Deprecated
-    public void setSchemaName(String schemaName) {
-        isReverseEngineeringDefined = true;
-        this.setSchema(schemaName);
-    }
-
-    /**
-     * @since 4.0
-     */
-    public void setSchema(String schema) {
-        isReverseEngineeringDefined = true;
-        filterBuilder.schema(schema);
-    }
-
-    /**
      * @since 4.0
      */
     public void setDefaultPackage(String defaultPackage) {
         config.setDefaultPackage(defaultPackage);
     }
 
-    public void setTablePattern(String tablePattern) {
-        isReverseEngineeringDefined = true;
-        filterBuilder.includeTables(tablePattern);
-    }
-
-    public void setImportProcedures(boolean importProcedures) {
-        isReverseEngineeringDefined = true;
-        filterBuilder.setProceduresFilters(importProcedures);
-    }
-
-    public void setProcedurePattern(String procedurePattern) {
-        isReverseEngineeringDefined = true;
-        filterBuilder.includeProcedures(procedurePattern);
-    }
-
-    /**
-     * @deprecated since 4.0 use {@link #setMeaningfulPkTables(String)}
-     */
-    public void setMeaningfulPk(boolean meaningfulPk) {
-        log("'meaningfulPk' property is deprecated. Use 'meaningfulPkTables' pattern instead", Project.MSG_WARN);
-
-        if (meaningfulPk) {
-            setMeaningfulPkTables("*");
-        }
-    }
-
     /**
      * @since 4.0
      */
@@ -282,10 +226,6 @@ public class DbImporterTask extends Task {
         config.setDriver(driver);
     }
 
-    public void setMap(File map) {
-        config.setDataMapFile(map);
-    }
-
     public void setPassword(String password) {
         config.setPassword(password);
     }
@@ -298,77 +238,6 @@ public class DbImporterTask extends Task {
         config.setUsername(username);
     }
 
-    /**
-     * @since 4.0
-     */
-    public void setIncludeTables(String includeTables) {
-        isReverseEngineeringDefined = true;
-        filterBuilder.includeTables(includeTables);
-    }
-
-    /**
-     * @since 4.0
-     */
-    public void setExcludeTables(String excludeTables) {
-        isReverseEngineeringDefined = true;
-        filterBuilder.excludeTables(excludeTables);
-    }
-
-    /**
-     * @since 4.0
-     */
-    public void setUsePrimitives(boolean usePrimitives) {
-        config.setUsePrimitives(usePrimitives);
-    }
-
-    public void setSkipRelationshipsLoading(Boolean skipRelationshipsLoading) {
-        reverseEngineering.setSkipRelationshipsLoading(skipRelationshipsLoading);
-    }
-
-    public void addConfiguredIncludeColumn(IncludeColumn includeColumn) {
-        isReverseEngineeringDefined = true;
-        reverseEngineering.addIncludeColumn(includeColumn);
-    }
-
-    public void addConfiguredExcludeColumn(ExcludeColumn excludeColumn) {
-        isReverseEngineeringDefined = true;
-        reverseEngineering.addExcludeColumn(excludeColumn);
-    }
-
-    public void addConfiguredIncludeTable(IncludeTable includeTable) {
-        isReverseEngineeringDefined = true;
-        reverseEngineering.addIncludeTable(includeTable);
-    }
-
-    public void addConfiguredExcludeTable(ExcludeTable excludeTable) {
-        isReverseEngineeringDefined = true;
-        reverseEngineering.addExcludeTable(excludeTable);
-    }
-
-    public void addConfiguredIncludeProcedure(IncludeProcedure includeProcedure) {
-        isReverseEngineeringDefined = true;
-        reverseEngineering.addIncludeProcedure(includeProcedure);
-    }
-
-    public void addConfiguredExcludeProcedure(ExcludeProcedure excludeProcedure) {
-        isReverseEngineeringDefined = true;
-        reverseEngineering.addExcludeProcedure(excludeProcedure);
-    }
-
-    public void addConfiguredSchema(Schema schema) {
-        reverseEngineering.addSchema(schema);
-    }
-
-    public void addConfiguredCatalog(Catalog catalog) {
-        isReverseEngineeringDefined = true;
-        reverseEngineering.addCatalog(catalog);
-    }
-
-    public void addConfiguredTableType(AntNestedElement type) {
-        isReverseEngineeringDefined = true;
-        reverseEngineering.addTableType(type.getName());
-    }
-
     public ReverseEngineering getReverseEngineering() {
         return reverseEngineering;
     }
@@ -377,6 +246,10 @@ public class DbImporterTask extends Task {
         return config.getDataMapFile();
     }
 
+    public void setMap(File map) {
+        config.setDataMapFile(map);
+    }
+
     public DbImportConfiguration toParameters() {
         return config;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/a98f0a08/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java b/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
index c96e904..11502b6 100644
--- a/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
+++ b/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
@@ -24,13 +24,10 @@ import org.apache.cayenne.configuration.XMLDataMapLoader;
 import org.apache.cayenne.configuration.server.DataSourceFactory;
 import org.apache.cayenne.configuration.server.DbAdapterFactory;
 import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbimport.Catalog;
 import org.apache.cayenne.dbimport.DefaultReverseEngineeringLoader;
 import org.apache.cayenne.dbimport.ReverseEngineering;
-import org.apache.cayenne.dbimport.Schema;
 import org.apache.cayenne.dbsync.CayenneDbSyncModule;
 import org.apache.cayenne.dbsync.reverse.FiltersConfigBuilder;
-import org.apache.cayenne.dbsync.reverse.filters.LegacyFilterConfigBridge;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.map.DataMap;
@@ -54,19 +51,21 @@ import java.net.URL;
 /**
  * Maven mojo to reverse engineer datamap from DB.
  *
- * @since 3.0
- *
  * @phase generate-sources
  * @goal cdbimport
+ * @since 3.0
  */
 public class DbImporterMojo extends AbstractMojo {
+
     /**
-     * DataMap XML file to use as a base for DB importing.
+     * Java class implementing org.apache.cayenne.dba.DbAdapter. This attribute
+     * is optional, the default is AutoAdapter, i.e. Cayenne would try to guess
+     * the DB type.
      *
-     * @parameter map="map"
-     * @required
+     * @parameter adapter="adapter"
+     * default-value="org.apache.cayenne.dba.AutoAdapter"
      */
-    private File map;
+    private String adapter;
 
     /**
      * A default package for ObjEntity Java classes. If not specified, and the
@@ -79,13 +78,20 @@ public class DbImporterMojo extends AbstractMojo {
     private String defaultPackage;
 
     /**
-     * Indicates that the old mapping should be completely removed and replaced
-     * with the new data based on reverse engineering. Default is
-     * <code>true</code>.
+     * A class of JDBC driver to use for the target database.
+     *
+     * @parameter driver="driver"
+     * @required
+     */
+    private String driver;
+
+    /**
+     * DataMap XML file to use as a base for DB importing.
      *
-     * @parameter overwrite="overwrite" default-value="true"
+     * @parameter map="map"
+     * @required
      */
-    private boolean overwrite;
+    private File map;
 
     /**
      * @parameter meaningfulPkTables="meaningfulPkTables"
@@ -97,46 +103,14 @@ public class DbImporterMojo extends AbstractMojo {
      * Java class implementing org.apache.cayenne.map.naming.NamingStrategy.
      * This is used to specify how ObjEntities will be mapped from the imported
      * DB schema.
-     *
+     * <p>
      * The default is a basic naming strategy.
      *
      * @parameter namingStrategy="namingStrategy"
-     *            default-value="org.apache.cayenne.map.naming.DefaultNameGenerator"
+     * default-value="org.apache.cayenne.map.naming.DefaultNameGenerator"
      */
     private String namingStrategy;
 
-    /**
-     * Java class implementing org.apache.cayenne.dba.DbAdapter. This attribute
-     * is optional, the default is AutoAdapter, i.e. Cayenne would try to guess
-     * the DB type.
-     *
-     * @parameter adapter="adapter"
-     *            default-value="org.apache.cayenne.dba.AutoAdapter"
-     */
-    private String adapter;
-
-    /**
-     * A class of JDBC driver to use for the target database.
-     *
-     * @parameter driver="driver"
-     * @required
-     */
-    private String driver;
-
-    /**
-     * JDBC connection URL of a target database.
-     *
-     * @parameter url="url"
-     * @required
-     */
-    private String url;
-
-    /**
-     * Database user name.
-     *
-     * @parameter username="username"
-     */
-    private String username;
 
     /**
      * Database user password.
@@ -146,130 +120,54 @@ public class DbImporterMojo extends AbstractMojo {
     private String password;
 
     /**
-     * If true, would use primitives instead of numeric and boolean classes.
-     *
-     * @parameter usePrimitives="usePrimitives" default-value="true"
-     */
-    private boolean usePrimitives;
-
-    private final LegacyFilterConfigBridge filterBuilder = new LegacyFilterConfigBridge();
-
-    /**
      * An object that contains reverse engineering rules.
      *
      * @parameter reverseEngineering="reverseEngineering"
      */
     private ReverseEngineering reverseEngineering = new ReverseEngineering();
 
-	/**
-	 * Flag which defines from where to take the configuration of cdbImport. If
-	 * we define the config of cdbImport in pom.xml we should set it to true or
-	 * it will be set to true automatically if we define some configuration
-	 * parameters in pom.xml. Else it remains default(false) and for cdbImport
-	 * we use the configuration defined in signed dataMap
-	 *
-	 * @parameter isReverseEngineeringDefined="isReverseEngineeringDefined"
-	 *            default-value="false"
-	 */
-	private boolean isReverseEngineeringDefined = false;
-
-    public void setIsReverseEngineeringDefined(boolean isReverseEngineeringDefined) {
-        this.isReverseEngineeringDefined = isReverseEngineeringDefined;
-    }
 
     /**
-     * DB schema to use for DB importing.
-     *
-     * @parameter schemaName="schemaName"
-     * @deprecated since 4.0 renamed to "schema"
-     */
-    private String schemaName;
-    private DbImportConfiguration config;
-
-    private void setSchemaName(String schemaName) {
-        isReverseEngineeringDefined = true;
-        getLog().warn("'schemaName' property is deprecated. Use 'schema' instead");
-
-        filterBuilder.schema(schemaName);
-    }
-
-    /**
-     * DB schema to use for DB importing.
-     *
-     * @parameter schema="schema"
-     * @since 4.0
-     */
-    private Schema schema;
-
-    public void setSchema(Schema schema) {
-        isReverseEngineeringDefined = true;
-        if (schema.isEmptyContainer()) {
-            filterBuilder.schema(schema.getName());
-        } else {
-            reverseEngineering.addSchema(schema);
-        }
-    }
-
-    /**
-     * Pattern for tables to import from DB.
-     *
-     * The default is to match against all tables.
+     * JDBC connection URL of a target database.
      *
-     * @parameter tablePattern="tablePattern"
+     * @parameter url="url"
+     * @required
      */
-    private String tablePattern;
-
-    public void setTablePattern(String tablePattern) {
-        isReverseEngineeringDefined = true;
-        filterBuilder.includeTables(tablePattern);
-    }
+    private String url;
 
     /**
-     * Indicates whether stored procedures should be imported.
-     *
-     * Default is <code>false</code>.
+     * If true, would use primitives instead of numeric and boolean classes.
      *
-     * @parameter importProcedures="importProcedures"
-     *            default-value="false"
+     * @parameter usePrimitives="usePrimitives" default-value="true"
      */
-    private String importProcedures;
-
-    public void setImportProcedures(boolean importProcedures) {
-        filterBuilder.setProceduresFilters(importProcedures);
-    }
+    private boolean usePrimitives;
 
     /**
-     * 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.
+     * Database user name.
      *
-     * @parameter procedurePattern="procedurePattern"
+     * @parameter username="username"
      */
-    private String procedurePattern;
+    private String username;
 
-    public void setProcedurePattern(String procedurePattern) {
-        isReverseEngineeringDefined = true;
-        filterBuilder.includeProcedures(procedurePattern);
-    }
 
     /**
-     * Indicates whether primary keys should be mapped as meaningful attributes
-     * in the object entities.
-     *
-     * Default is <code>false</code>.
+     * Flag which defines from where to take the configuration of cdbImport. If
+     * we define the config of cdbImport in pom.xml we should set it to true or
+     * it will be set to true automatically if we define some configuration
+     * parameters in pom.xml. Else it remains default(false) and for cdbImport
+     * we use the configuration defined in signed dataMap
      *
-     * @parameter meaningfulPk="meaningfulPk"
-     * @deprecated since 4.0 use meaningfulPkTables
+     * @parameter isReverseEngineeringDefined="isReverseEngineeringDefined"
+     * default-value="false"
      */
-    private boolean meaningfulPk;
-
-    public void setMeaningfulPk(boolean meaningfulPk) {
-        getLog().warn("'meaningfulPk' property is deprecated. Use 'meaningfulPkTables' pattern instead");
+    // TODO: get rid of this fork...
+    private boolean isReverseEngineeringDefined = false;
 
-        this.meaningfulPkTables = meaningfulPk ? "*" : null;
+    public void setIsReverseEngineeringDefined(boolean isReverseEngineeringDefined) {
+        this.isReverseEngineeringDefined = isReverseEngineeringDefined;
     }
 
+    @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
 
         Log logger = new MavenLogger(this);
@@ -365,24 +263,19 @@ public class DbImporterMojo extends AbstractMojo {
     }
 
     DbImportConfiguration toParameters() {
-        if (config != null) {
-            return config;
-        }
 
-        config = new DbImportConfiguration();
+        DbImportConfiguration config = new DbImportConfiguration();
         config.setAdapter(adapter);
         config.setDefaultPackage(defaultPackage);
         config.setDriver(driver);
         config.setDataMapFile(map);
         config.setMeaningfulPkTables(meaningfulPkTables);
         config.setNamingStrategy(namingStrategy);
-        config.setOverwrite(overwrite);
         config.setPassword(password);
         config.setUrl(url);
         config.setUsername(username);
         config.setUsePrimitives(usePrimitives);
-        config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering)
-                .add(filterBuilder).build());
+        config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering).build());
         config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading());
         config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
         config.setTableTypes(reverseEngineering.getTableTypes());
@@ -414,58 +307,6 @@ public class DbImporterMojo extends AbstractMojo {
         this.url = url;
     }
 
-
-    /**
-     * A comma-separated list of Perl5 regex that defines tables that should be
-     * included in import.
-     *
-     * @parameter includeTables="includeTables"
-     */
-    private String includeTables;
-
-    public void setIncludeTables(String includeTables) {
-        isReverseEngineeringDefined = true;
-        filterBuilder.includeTables(includeTables);
-    }
-
-    /**
-     * A comma-separated list of Perl5 regex that defines tables that should be
-     * skipped from import.
-     *
-     * @parameter excludeTables="excludeTables"
-     */
-    private String excludeTables;
-
-    public void setExcludeTables(String excludeTables) {
-        isReverseEngineeringDefined = true;
-        filterBuilder.excludeTables(excludeTables);
-    }
-
-    public void addSchema(Schema schema) {
-        isReverseEngineeringDefined = true;
-        reverseEngineering.addSchema(schema);
-    }
-
-    /**
-     * DB schema to use for DB importing.
-     *
-     * @parameter catalog="catalog"
-     * @since 4.0
-     */
-    private Catalog catalog[];
-
-    public void addCatalog(Catalog catalog) {
-        isReverseEngineeringDefined = true;
-
-        if (catalog != null) {
-            if (catalog.isEmptyContainer()) {
-                filterBuilder.catalog(catalog.getName());
-            } else {
-                reverseEngineering.addCatalog(catalog);
-            }
-        }
-    }
-
     public ReverseEngineering getReverseEngineering() {
         return reverseEngineering;
     }


[4/9] cayenne git commit: CAY-2115 DbLoader - allow loading DataMap without Obj layer

Posted by aa...@apache.org.
CAY-2115 DbLoader - allow loading DataMap without Obj layer

.. in progress ...

* subpackage for db stage of reverse engineering


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

Branch: refs/heads/master
Commit: cf172fc97156897203aff30698ab98a41b1024e0
Parents: 7296d1f
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 11:42:43 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 14:05:59 2016 +0300

----------------------------------------------------------------------
 .../apache/cayenne/dbsync/merge/DbMerger.java   |   6 +-
 .../dbsync/reverse/DbAttributesBaseLoader.java  | 107 ---
 .../dbsync/reverse/DbAttributesLoader.java      |  43 --
 .../reverse/DbAttributesPerSchemaLoader.java    | 130 ----
 .../apache/cayenne/dbsync/reverse/DbLoader.java | 725 -------------------
 .../dbsync/reverse/DbLoaderConfiguration.java   | 150 ----
 .../dbsync/reverse/DbLoaderDelegate.java        |  58 --
 .../cayenne/dbsync/reverse/DbTableLoader.java   | 195 -----
 .../dbsync/reverse/DefaultDbLoaderDelegate.java |  59 --
 .../dbsync/reverse/FiltersConfigBuilder.java    |  17 +-
 .../dbsync/reverse/LoggingDbLoaderDelegate.java |  76 --
 .../reverse/ManyToManyCandidateEntity.java      | 142 ----
 .../reverse/db/DbAttributesBaseLoader.java      | 107 +++
 .../dbsync/reverse/db/DbAttributesLoader.java   |  43 ++
 .../reverse/db/DbAttributesPerSchemaLoader.java | 130 ++++
 .../cayenne/dbsync/reverse/db/DbLoader.java     | 702 ++++++++++++++++++
 .../reverse/db/DbLoaderConfiguration.java       | 128 ++++
 .../dbsync/reverse/db/DbLoaderDelegate.java     |  58 ++
 .../dbsync/reverse/db/DbTableLoader.java        | 195 +++++
 .../reverse/db/DefaultDbLoaderDelegate.java     |  59 ++
 .../reverse/db/LoggingDbLoaderDelegate.java     |  76 ++
 .../reverse/db/ManyToManyCandidateEntity.java   | 143 ++++
 .../cayenne/dbsync/merge/DbMergerTest.java      |   2 +-
 .../apache/cayenne/dbsync/merge/MergeCase.java  |   2 +-
 .../cayenne/dbsync/reverse/DbLoaderIT.java      | 434 -----------
 .../reverse/FiltersConfigBuilderTest.java       |  14 +-
 .../reverse/ManyToManyCandidateEntityTest.java  | 113 ---
 .../cayenne/dbsync/reverse/db/DbLoaderIT.java   | 418 +++++++++++
 .../db/ManyToManyCandidateEntityTest.java       | 113 +++
 .../apache/cayenne/tools/DbImporterTask.java    |   4 +-
 .../tools/dbimport/DbImportConfiguration.java   |  10 +-
 .../dbimport/DbImportDbLoaderDelegate.java      |   2 +-
 .../tools/dbimport/DefaultDbImportAction.java   |   2 +-
 .../dbimport/DefaultDbImportActionTest.java     |  22 +-
 .../cayenne/modeler/action/MigrateAction.java   |   2 +-
 .../modeler/dialog/db/DbLoaderHelper.java       |   6 +-
 .../modeler/dialog/db/MergerOptions.java        |   2 +-
 .../modeler/dialog/db/ModelerDbLoader.java      |  12 +-
 .../dialog/db/ReverseEngineeringController.java |   6 +-
 .../apache/cayenne/tools/DbImporterMojo.java    |   4 +-
 40 files changed, 2220 insertions(+), 2297 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
index f7d4346..41ff7c8 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
@@ -22,9 +22,9 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.dbsync.reverse.DbLoader;
-import org.apache.cayenne.dbsync.reverse.DbLoaderConfiguration;
-import org.apache.cayenne.dbsync.reverse.LoggingDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DataMap;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesBaseLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesBaseLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesBaseLoader.java
deleted file mode 100644
index 2bb55c0..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesBaseLoader.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.TypesMapping;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Set;
-
-/**
-* @since 4.0.
-*/
-public abstract class DbAttributesBaseLoader implements DbAttributesLoader {
-    private final String catalog;
-    private final String schema;
-
-    private final DatabaseMetaData metaData;
-    private final DbAdapter adapter;
-
-    public DbAttributesBaseLoader(String catalog, String schema, DatabaseMetaData metaData, DbAdapter adapter) {
-        this.catalog = catalog;
-        this.schema = schema;
-        this.metaData = metaData;
-        this.adapter = adapter;
-    }
-
-    protected DbAttribute loadDbAttribute(Set<String> columns, ResultSet rs) throws SQLException {
-
-        // gets attribute's (column's) information
-        int columnType = rs.getInt("DATA_TYPE");
-
-        // ignore precision of non-decimal columns
-        int decimalDigits = -1;
-        if (TypesMapping.isDecimal(columnType)) {
-            decimalDigits = rs.getInt("DECIMAL_DIGITS");
-            if (rs.wasNull()) {
-                decimalDigits = -1;
-            }
-        }
-
-        // create attribute delegating this task to adapter
-        DbAttribute attr = adapter.buildAttribute(
-                rs.getString("COLUMN_NAME"),
-                rs.getString("TYPE_NAME"),
-                columnType,
-                rs.getInt("COLUMN_SIZE"),
-                decimalDigits,
-                rs.getBoolean("NULLABLE"));
-
-        if (columns.contains("IS_AUTOINCREMENT")) {
-            String autoIncrement = rs.getString("IS_AUTOINCREMENT");
-            if ("YES".equals(autoIncrement)) {
-                attr.setGenerated(true);
-            }
-        }
-        return attr;
-    }
-
-    @Override
-    public void loadDbAttributes(DbEntity entity) {
-        for (DbAttribute attr : loadDbAttributes(entity.getName())) {
-            attr.setEntity(entity);
-
-            // override existing attributes if it comes again
-            if (entity.getAttribute(attr.getName()) != null) {
-                entity.removeAttribute(attr.getName());
-            }
-            entity.addAttribute(attr);
-        }
-    }
-
-    protected abstract List<DbAttribute> loadDbAttributes(String tableName);
-
-    protected String getCatalog() {
-        return catalog;
-    }
-
-    protected String getSchema() {
-        return schema;
-    }
-
-    protected DatabaseMetaData getMetaData() {
-        return metaData;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesLoader.java
deleted file mode 100644
index 6658cdc..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesLoader.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import org.apache.cayenne.map.DbEntity;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Interface responsible for attributes loading. Several options possible here
- *  1) load attributes for each table separately
- *  2) load attributes for schema and group it by table names
- *
- *  here is a trade of between count of queries and amount af calculation.
- *
- *
- * @since 4.0
- */
-public interface DbAttributesLoader {
-
-    // TODO use instant field for logging
-    Log LOGGER = LogFactory.getLog(DbTableLoader.class);
-
-    void loadDbAttributes(DbEntity entity);
-
-}
-

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesPerSchemaLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesPerSchemaLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesPerSchemaLoader.java
deleted file mode 100644
index 83ce60b..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbAttributesPerSchemaLoader.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
-import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.map.DbAttribute;
-
-/**
- * Load all attributes for schema and return it for each table
- * */
-public class DbAttributesPerSchemaLoader extends DbAttributesBaseLoader {
-
-	private final TableFilter filter;
-
-	private Map<String, List<DbAttribute>> attributes;
-
-	public DbAttributesPerSchemaLoader(String catalog, String schema, DatabaseMetaData metaData, DbAdapter adapter,
-			TableFilter filter) {
-		super(catalog, schema, metaData, adapter);
-
-		this.filter = filter;
-	}
-
-	private Map<String, List<DbAttribute>> loadDbAttributes() throws SQLException {
-		Map<String, List<DbAttribute>> attributes = new HashMap<>();
-
-		try (ResultSet rs = getMetaData().getColumns(getCatalog(), getSchema(), "%", "%");) {
-			Set<String> columns = new HashSet<String>();
-
-			while (rs.next()) {
-				if (columns.isEmpty()) {
-					ResultSetMetaData rsMetaData = rs.getMetaData();
-					for (int i = 1; i <= rsMetaData.getColumnCount(); i++) {
-						columns.add(rsMetaData.getColumnLabel(i));
-					}
-				}
-
-				// for a reason not quiet apparent to me, Oracle sometimes
-				// returns duplicate record sets for the same table, messing up
-				// table
-				// names. E.g. for the system table "WK$_ATTR_MAPPING" columns
-				// are
-				// returned twice - as "WK$_ATTR_MAPPING" and
-				// "WK$$_ATTR_MAPPING"... Go figure
-				String tableName = rs.getString("TABLE_NAME");
-				String columnName = rs.getString("COLUMN_NAME");
-
-				PatternFilter columnFilter = filter.isIncludeTable(tableName);
-				/*
-				 * Here is possible optimization if filter will contain
-				 * map<tableName, columnFilter> we can replace it after tables
-				 * loading since already done pattern matching once and exactly
-				 * know all tables that we want to process
-				 */
-				if (columnFilter == null || !columnFilter.isInclude(columnName)) {
-					if (LOGGER.isDebugEnabled()) {
-						LOGGER.debug("Skip column '" + tableName + "." + columnName + "' (Path: " + getCatalog() + "/"
-								+ getSchema() + "; Filter: " + columnFilter + ")");
-					}
-					continue;
-				}
-
-				List<DbAttribute> attrs = attributes.get(tableName);
-				if (attrs == null) {
-					attrs = new LinkedList<DbAttribute>();
-
-					attributes.put(tableName, attrs);
-				}
-
-				attrs.add(loadDbAttribute(columns, rs));
-			}
-		}
-
-		return attributes;
-	}
-
-	@Override
-	protected List<DbAttribute> loadDbAttributes(String tableName) {
-		Map<String, List<DbAttribute>> attributes = getAttributes();
-		if (attributes != null) {
-			List<DbAttribute> dbAttributes = attributes.get(tableName);
-			if (dbAttributes != null) {
-				return dbAttributes;
-			}
-		}
-
-		return new LinkedList<DbAttribute>();
-	}
-
-	public Map<String, List<DbAttribute>> getAttributes() {
-		if (attributes == null) {
-			try {
-				attributes = loadDbAttributes();
-			} catch (SQLException e) {
-				LOGGER.error(e);
-				attributes = new HashMap<>();
-			}
-		}
-		return attributes;
-	}
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoader.java
deleted file mode 100644
index 22764ef..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoader.java
+++ /dev/null
@@ -1,725 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.TypesMapping;
-import org.apache.cayenne.dbsync.merge.EntityMergeSupport;
-import org.apache.cayenne.dbsync.reverse.filters.CatalogFilter;
-import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
-import org.apache.cayenne.dbsync.reverse.filters.SchemaFilter;
-import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbJoin;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.DbRelationshipDetected;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.Procedure;
-import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
-import org.apache.cayenne.map.naming.ExportedKey;
-import org.apache.cayenne.map.naming.LegacyNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
-import org.apache.cayenne.map.naming.ObjectNameGenerator;
-import org.apache.cayenne.util.EqualsBuilder;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Performs reverse engineering of the database. It can create
- * DataMaps using database meta data obtained via JDBC driver.
- *
- * @since 4.0
- */
-public class DbLoader {
-
-	private static final Log LOGGER = LogFactory.getLog(DbLoader.class);
-
-	private static final String WILDCARD = "%";
-
-	private final Connection connection;
-	private final DbAdapter adapter;
-	private final DbLoaderDelegate delegate;
-
-	private boolean creatingMeaningfulPK;
-
-	private DatabaseMetaData metaData;
-
-	/**
-	 * Strategy for choosing names for entities, attributes and relationships
-	 */
-	private ObjectNameGenerator nameGenerator;
-
-	/**
-	 * Creates new DbLoader.
-	 */
-	public DbLoader(Connection connection, DbAdapter adapter, DbLoaderDelegate delegate) {
-		this(connection, adapter, delegate, new LegacyNameGenerator());
-	}
-
-	/**
-	 * Creates new DbLoader with specified naming strategy.
-	 *
-	 * @since 3.0
-	 */
-	public DbLoader(Connection connection, DbAdapter adapter, DbLoaderDelegate delegate, ObjectNameGenerator strategy) {
-		this.adapter = adapter;
-		this.connection = connection;
-		this.delegate = delegate == null ? new DefaultDbLoaderDelegate() : delegate;
-
-		setNameGenerator(strategy);
-	}
-
-	/**
-	 * Returns DatabaseMetaData object associated with this DbLoader.
-	 */
-	private DatabaseMetaData getMetaData() throws SQLException {
-		if (metaData == null) {
-			metaData = connection.getMetaData();
-		}
-		return metaData;
-	}
-
-	/**
-	 * Check if database support schemas.
-	 */
-	protected boolean supportSchemas() throws SQLException {
-		if (metaData == null) {
-			metaData = connection.getMetaData();
-		}
-		return metaData.supportsSchemasInTableDefinitions();
-	}
-
-	/**
-	 * Check if database support catalogs.
-	 */
-	protected boolean supportCatalogs() throws SQLException {
-		if (metaData == null) {
-			metaData = connection.getMetaData();
-		}
-		return metaData.supportsCatalogsInTableDefinitions();
-	}
-
-	/**
-	 * @since 3.0
-	 */
-	public void setCreatingMeaningfulPK(boolean creatingMeaningfulPK) {
-		this.creatingMeaningfulPK = creatingMeaningfulPK;
-	}
-	
-	/**
-	 * Retrieves catalogs for the database associated with this DbLoader.
-	 *
-	 * @return List with the catalog names, empty Array if none found.
-	 */
-	public List<String> loadCatalogs() throws SQLException {
-		try (ResultSet rs = getMetaData().getCatalogs()) {
-			return getStrings(rs);
-		}
-	}
-
-	/**
-	 * Retrieves the schemas for the database.
-	 *
-	 * @return List with the schema names, empty Array if none found.
-	 */
-	public List<String> loadSchemas() throws SQLException {
-
-		try (ResultSet rs = getMetaData().getSchemas()) {
-			return getStrings(rs);
-		}
-	}
-
-	private static List<String> getStrings(ResultSet rs) throws SQLException {
-		List<String> strings = new ArrayList<String>();
-
-		while (rs.next()) {
-			strings.add(rs.getString(1));
-		}
-
-		return strings;
-	}
-
-	/**
-	 * Returns all the table types for the given database. Types may be such as
-	 * Typical types are "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY",
-	 * "LOCAL TEMPORARY", "ALIAS", "SYNONYM"., etc.
-	 *
-	 * @return List of Strings, empty array if nothing found.
-	 */
-	public List<String> getTableTypes() throws SQLException {
-		List<String> types = new ArrayList<String>();
-
-		try (ResultSet rs = getMetaData().getTableTypes();) {
-			while (rs.next()) {
-				types.add(rs.getString("TABLE_TYPE").trim());
-			}
-		}
-
-		return types;
-	}
-
-	/**
-	 * Creates an ObjEntity for each DbEntity in the map.
-	 */
-	public Collection<ObjEntity> loadObjEntities(DataMap map, DbLoaderConfiguration config,
-			Collection<DbEntity> entities) {
-		Collection<ObjEntity> loadedEntities = DbLoader.loadObjEntities(map, config, entities, nameGenerator);
-
-		createEntityMerger(map).synchronizeWithDbEntities(loadedEntities);
-
-		return loadedEntities;
-	}
-
-	public static Collection<ObjEntity> loadObjEntities(DataMap map, DbLoaderConfiguration config,
-			Collection<DbEntity> entities, ObjectNameGenerator nameGenerator) {
-		if (entities.isEmpty()) {
-			return Collections.emptyList();
-		}
-
-		Collection<ObjEntity> loadedEntities = new ArrayList<ObjEntity>(entities.size());
-
-		// doLoad empty ObjEntities for all the tables
-		for (DbEntity dbEntity : entities) {
-
-			// check if there are existing entities
-
-			// TODO: performance. This is an O(n^2) search and it shows on
-			// YourKit profiles. Pre-cache mapped entities perhaps (?)
-			Collection<ObjEntity> existing = map.getMappedEntities(dbEntity);
-			if (!existing.isEmpty()) {
-				loadedEntities.addAll(existing);
-				continue;
-			}
-
-			String objEntityName = DefaultUniqueNameGenerator.generate(NameCheckers.objEntity, map,
-					nameGenerator.createObjEntityName(dbEntity));
-
-			ObjEntity objEntity = new ObjEntity(objEntityName);
-			objEntity.setDbEntity(dbEntity);
-			objEntity.setClassName(config.getGenericClassName() != null ? config.getGenericClassName() : map
-					.getNameWithDefaultPackage(objEntity.getName()));
-
-			map.addObjEntity(objEntity);
-			loadedEntities.add(objEntity);
-		}
-
-		return loadedEntities;
-	}
-
-	/**
-	 * @since 4.0
-	 */
-	protected EntityMergeSupport createEntityMerger(DataMap map) {
-		return new EntityMergeSupport(map, nameGenerator, !creatingMeaningfulPK);
-	}
-
-	protected void loadDbRelationships(DbLoaderConfiguration config, String catalog, String schema,
-			List<DbEntity> tables) throws SQLException {
-		if (config.isSkipRelationshipsLoading()) {
-			return;
-		}
-
-		// Get all the foreign keys referencing this table
-		Map<String, DbEntity> tablesMap = new HashMap<>();
-		for (DbEntity table : tables) {
-			tablesMap.put(table.getName(), table);
-		}
-
-		Map<String, Set<ExportedKey>> keys = loadExportedKeys(config, catalog, schema, tablesMap);
-		for (Map.Entry<String, Set<ExportedKey>> entry : keys.entrySet()) {
-			if (LOGGER.isDebugEnabled()) {
-				LOGGER.debug("Process keys for: " + entry.getKey());
-			}
-
-			Set<ExportedKey> exportedKeys = entry.getValue();
-			ExportedKey key = exportedKeys.iterator().next();
-			if (key == null) {
-				throw new IllegalStateException();
-			}
-
-			DbEntity pkEntity = tablesMap.get(key.getPKTableName());
-			if (pkEntity == null) {
-				skipRelationLog(key, key.getPKTableName());
-				continue;
-			}
-
-			DbEntity fkEntity = tablesMap.get(key.getFKTableName());
-			if (fkEntity == null) {
-				skipRelationLog(key, key.getFKTableName());
-				continue;
-			}
-
-			if (!new EqualsBuilder().append(pkEntity.getCatalog(), key.pkCatalog)
-					.append(pkEntity.getSchema(), key.pkSchema).append(fkEntity.getCatalog(), key.fkCatalog)
-					.append(fkEntity.getSchema(), key.fkSchema).isEquals()) {
-
-				LOGGER.info("Skip relation: '" + key + "' because it related to objects from other catalog/schema");
-				LOGGER.info("     relation primary key: '" + key.pkCatalog + "." + key.pkSchema + "'");
-				LOGGER.info("       primary key entity: '" + pkEntity.getCatalog() + "." + pkEntity.getSchema() + "'");
-				LOGGER.info("     relation foreign key: '" + key.fkCatalog + "." + key.fkSchema + "'");
-				LOGGER.info("       foreign key entity: '" + fkEntity.getCatalog() + "." + fkEntity.getSchema() + "'");
-				continue;
-			}
-
-			// forwardRelationship is a reference from table with primary key
-			DbRelationship forwardRelationship = new DbRelationship(generateName(pkEntity, key, true));
-			forwardRelationship.setSourceEntity(pkEntity);
-			forwardRelationship.setTargetEntityName(fkEntity);
-
-			// forwardRelationship is a reference from table with foreign key,
-			// it is what exactly we load from db
-			DbRelationshipDetected reverseRelationship = new DbRelationshipDetected(generateName(fkEntity, key, false));
-			reverseRelationship.setFkName(key.getFKName());
-			reverseRelationship.setSourceEntity(fkEntity);
-			reverseRelationship.setTargetEntityName(pkEntity);
-			reverseRelationship.setToMany(false);
-
-			createAndAppendJoins(exportedKeys, pkEntity, fkEntity, forwardRelationship, reverseRelationship);
-
-			boolean toDependentPK = isToDependentPK(forwardRelationship);
-			forwardRelationship.setToDependentPK(toDependentPK);
-
-			boolean isOneToOne = toDependentPK
-					&& fkEntity.getPrimaryKeys().size() == forwardRelationship.getJoins().size();
-
-			forwardRelationship.setToMany(!isOneToOne);
-			forwardRelationship.setName(generateName(pkEntity, key, !isOneToOne));
-
-			if (delegate.dbRelationshipLoaded(fkEntity, reverseRelationship)) {
-				fkEntity.addRelationship(reverseRelationship);
-			}
-			if (delegate.dbRelationshipLoaded(pkEntity, forwardRelationship)) {
-				pkEntity.addRelationship(forwardRelationship);
-			}
-		}
-	}
-
-	private boolean isToDependentPK(DbRelationship forwardRelationship) {
-		for (DbJoin dbJoin : forwardRelationship.getJoins()) {
-			if (!dbJoin.getTarget().isPrimaryKey()) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	private void createAndAppendJoins(Set<ExportedKey> exportedKeys, DbEntity pkEntity, DbEntity fkEntity,
-			DbRelationship forwardRelationship, DbRelationshipDetected reverseRelationship) {
-		for (ExportedKey exportedKey : exportedKeys) {
-			// Create and append joins
-			String pkName = exportedKey.getPKColumnName();
-			String fkName = exportedKey.getFKColumnName();
-
-			// skip invalid joins...
-			DbAttribute pkAtt = pkEntity.getAttribute(pkName);
-			if (pkAtt == null) {
-				LOGGER.info("no attribute for declared primary key: " + pkName);
-				continue;
-			}
-
-			DbAttribute fkAtt = fkEntity.getAttribute(fkName);
-			if (fkAtt == null) {
-				LOGGER.info("no attribute for declared foreign key: " + fkName);
-				continue;
-			}
-
-			forwardRelationship.addJoin(new DbJoin(forwardRelationship, pkName, fkName));
-			reverseRelationship.addJoin(new DbJoin(reverseRelationship, fkName, pkName));
-		}
-	}
-
-	private Map<String, Set<ExportedKey>> loadExportedKeys(DbLoaderConfiguration config, String catalog, String schema,
-			Map<String, DbEntity> tables) throws SQLException {
-		Map<String, Set<ExportedKey>> keys = new HashMap<>();
-
-		for (DbEntity dbEntity : tables.values()) {
-			if (!delegate.dbRelationship(dbEntity)) {
-				continue;
-			}
-
-			ResultSet rs;
-			try {
-				rs = getMetaData().getExportedKeys(catalog, schema, dbEntity.getName());
-			} catch (SQLException cay182Ex) {
-				// Sybase-specific - the line above blows on VIEWS, see CAY-182.
-				LOGGER.info(
-						"Error getting relationships for '" + catalog + "." + schema + "', ignoring. "
-								+ cay182Ex.getMessage(), cay182Ex);
-				return new HashMap<>();
-			}
-
-			try {
-				while (rs.next()) {
-					ExportedKey key = ExportedKey.extractData(rs);
-
-					DbEntity fkEntity = tables.get(key.getFKTableName());
-					if (fkEntity == null) {
-						skipRelationLog(key, key.getFKTableName());
-						continue;
-					}
-
-					if (config.getFiltersConfig().tableFilter(fkEntity.getCatalog(), fkEntity.getSchema())
-							.isIncludeTable(fkEntity.getName()) == null) {
-						continue;
-					}
-
-					Set<ExportedKey> exportedKeys = keys.get(key.getStrKey());
-					if (exportedKeys == null) {
-						exportedKeys = new TreeSet<ExportedKey>();
-
-						keys.put(key.getStrKey(), exportedKeys);
-					}
-					exportedKeys.add(key);
-				}
-
-			} finally {
-				rs.close();
-			}
-		}
-		return keys;
-	}
-
-	private void skipRelationLog(ExportedKey key, String tableName) {
-		// if (LOGGER.isDebugEnabled()) {
-		LOGGER.info("Skip relation: '" + key + "' because table '" + tableName + "' not found");
-		// }
-	}
-
-	private String generateName(DbEntity entity, ExportedKey key, boolean toMany) {
-		String forwardPreferredName = nameGenerator.createDbRelationshipName(key, toMany);
-		return DefaultUniqueNameGenerator.generate(NameCheckers.dbRelationship, entity, forwardPreferredName);
-	}
-
-	/**
-	 * Flattens many-to-many relationships in the generated model.
-	 */
-	public static void flattenManyToManyRelationships(DataMap map, Collection<ObjEntity> loadedObjEntities,
-			ObjectNameGenerator objectNameGenerator) {
-		if (loadedObjEntities.isEmpty()) {
-			return;
-		}
-		Collection<ObjEntity> entitiesForDelete = new LinkedList<ObjEntity>();
-
-		for (ObjEntity curEntity : loadedObjEntities) {
-			ManyToManyCandidateEntity entity = ManyToManyCandidateEntity.build(curEntity);
-
-			if (entity != null) {
-				entity.optimizeRelationships(objectNameGenerator);
-				entitiesForDelete.add(curEntity);
-			}
-		}
-
-		// remove needed entities
-		for (ObjEntity curDeleteEntity : entitiesForDelete) {
-			map.removeObjEntity(curDeleteEntity.getName(), true);
-		}
-		loadedObjEntities.removeAll(entitiesForDelete);
-	}
-
-	private void fireObjEntitiesAddedEvents(Collection<ObjEntity> loadedObjEntities) {
-		for (ObjEntity curEntity : loadedObjEntities) {
-			// notify delegate
-			if (delegate != null) {
-				delegate.objEntityAdded(curEntity);
-			}
-		}
-	}
-
-	/**
-	 * By default we want to load Tables and Views for mo types
-	 *
-	 * @see DbLoader#getTableTypes()
-	 * @since 4.0
-	 */
-	public String[] getDefaultTableTypes() {
-		List<String> list = new ArrayList<String>(2);
-
-		String viewType = adapter.tableTypeForView();
-		if (viewType != null) {
-			list.add(viewType);
-		}
-
-		String tableType = adapter.tableTypeForTable();
-		if (tableType != null) {
-			list.add(tableType);
-		}
-
-		return list.toArray(new String[list.size()]);
-	}
-
-	/**
-	 * Performs database reverse engineering based on the specified config and
-	 * fills the specified DataMap object with DB and object mapping info.
-	 *
-	 * @since 4.0
-	 */
-	public void load(DataMap dataMap, DbLoaderConfiguration config) throws SQLException {
-		LOGGER.info("Schema loading...");
-
-		String[] types = config.getTableTypes();
-		if (types == null || types.length == 0) {
-			types = getDefaultTableTypes();
-		}
-
-		for (CatalogFilter catalog : config.getFiltersConfig().catalogs) {
-			for (SchemaFilter schema : catalog.schemas) {
-
-				List<DbEntity> entities = createTableLoader(catalog.name, schema.name, schema.tables).loadDbEntities(
-						dataMap, config, types);
-
-				if (entities != null) {
-					loadDbRelationships(config, catalog.name, schema.name, entities);
-
-					prepareObjLayer(dataMap, config, entities);
-				}
-			}
-		}
-	}
-
-	protected DbTableLoader createTableLoader(String catalog, String schema, TableFilter filter) throws SQLException {
-		return new DbTableLoader(catalog, schema, getMetaData(), delegate, new DbAttributesPerSchemaLoader(catalog,
-				schema, getMetaData(), adapter, filter));
-	}
-
-	private void prepareObjLayer(DataMap dataMap, DbLoaderConfiguration config, Collection<DbEntity> entities) {
-		Collection<ObjEntity> loadedObjEntities = loadObjEntities(dataMap, config, entities);
-		flattenManyToManyRelationships(dataMap, loadedObjEntities, nameGenerator);
-		fireObjEntitiesAddedEvents(loadedObjEntities);
-	}
-
-	/**
-	 * Performs database reverse engineering to match the specified catalog,
-	 * schema, table name and table type patterns and fills the specified
-	 * DataMap object with DB and object mapping info.
-	 *
-	 * @since 4.0
-	 */
-	public DataMap load(DbLoaderConfiguration config) throws SQLException {
-
-		DataMap dataMap = new DataMap();
-		load(dataMap, config);
-		loadProcedures(dataMap, config);
-
-		return dataMap;
-	}
-
-	/**
-	 * Loads database stored procedures into the DataMap.
-	 * <p>
-	 * <i>As of 1.1 there is no boolean property or delegate method to make
-	 * procedure loading optional or to implement custom merging logic, so
-	 * currently this method is NOT CALLED from "loadDataMapFromDB" and should
-	 * be invoked explicitly by the user. </i>
-	 * </p>
-	 *
-	 * @since 4.0
-	 */
-	public Map<String, Procedure> loadProcedures(DataMap dataMap, DbLoaderConfiguration config) throws SQLException {
-
-		Map<String, Procedure> procedures = loadProcedures(config);
-		if (procedures.isEmpty()) {
-			return procedures;
-		}
-
-		loadProceduresColumns(config, procedures);
-
-		for (Procedure procedure : procedures.values()) {
-			dataMap.addProcedure(procedure);
-		}
-
-		return procedures;
-	}
-
-	private void loadProceduresColumns(DbLoaderConfiguration config, Map<String, Procedure> procedures)
-			throws SQLException {
-
-		for (CatalogFilter catalog : config.getFiltersConfig().catalogs) {
-			for (SchemaFilter schema : catalog.schemas) {
-				loadProceduresColumns(procedures, catalog.name, schema.name);
-			}
-		}
-	}
-
-	private void loadProceduresColumns(Map<String, Procedure> procedures, String catalog, String schema)
-			throws SQLException {
-
-		try (ResultSet columnsRS = getMetaData().getProcedureColumns(catalog, schema, null, null);) {
-			while (columnsRS.next()) {
-
-				String s = columnsRS.getString("PROCEDURE_SCHEM");
-				String name = columnsRS.getString("PROCEDURE_NAME");
-				String key = (s == null ? "" : s + '.') + name;
-				Procedure procedure = procedures.get(key);
-				if (procedure == null) {
-					continue;
-				}
-
-				ProcedureParameter column = loadProcedureParams(columnsRS, key, procedure);
-				if (column == null) {
-					continue;
-				}
-				procedure.addCallParameter(column);
-			}
-		}
-	}
-
-	private ProcedureParameter loadProcedureParams(ResultSet columnsRS, String key, Procedure procedure)
-			throws SQLException {
-		String columnName = columnsRS.getString("COLUMN_NAME");
-
-		// skip ResultSet columns, as they are not described in Cayenne
-		// procedures yet...
-		short type = columnsRS.getShort("COLUMN_TYPE");
-		if (type == DatabaseMetaData.procedureColumnResult) {
-			LOGGER.debug("skipping ResultSet column: " + key + "." + columnName);
-		}
-
-		if (columnName == null) {
-			if (type == DatabaseMetaData.procedureColumnReturn) {
-				LOGGER.debug("null column name, assuming result column: " + key);
-				columnName = "_return_value";
-				procedure.setReturningValue(true);
-			} else {
-				LOGGER.info("invalid null column name, skipping column : " + key);
-				return null;
-			}
-		}
-
-		int columnType = columnsRS.getInt("DATA_TYPE");
-
-		// ignore precision of non-decimal columns
-		int decimalDigits = -1;
-		if (TypesMapping.isDecimal(columnType)) {
-			decimalDigits = columnsRS.getShort("SCALE");
-			if (columnsRS.wasNull()) {
-				decimalDigits = -1;
-			}
-		}
-
-		ProcedureParameter column = new ProcedureParameter(columnName);
-		int direction = getDirection(type);
-		if (direction != -1) {
-			column.setDirection(direction);
-		}
-
-		column.setType(columnType);
-		column.setMaxLength(columnsRS.getInt("LENGTH"));
-		column.setPrecision(decimalDigits);
-
-		column.setProcedure(procedure);
-		return column;
-	}
-
-	private static int getDirection(short type) {
-		switch (type) {
-		case DatabaseMetaData.procedureColumnIn:
-			return ProcedureParameter.IN_PARAMETER;
-		case DatabaseMetaData.procedureColumnInOut:
-			return ProcedureParameter.IN_OUT_PARAMETER;
-		case DatabaseMetaData.procedureColumnOut:
-			return ProcedureParameter.OUT_PARAMETER;
-		default:
-			return -1;
-		}
-	}
-
-	private Map<String, Procedure> loadProcedures(DbLoaderConfiguration config) throws SQLException {
-		Map<String, Procedure> procedures = new HashMap<>();
-
-		FiltersConfig filters = config.getFiltersConfig();
-		for (CatalogFilter catalog : filters.catalogs) {
-			for (SchemaFilter schema : catalog.schemas) {
-				if (filters.proceduresFilter(catalog.name, schema.name).isEmpty()) {
-					continue;
-				}
-
-				procedures.putAll(loadProcedures(filters, catalog.name, schema.name));
-			}
-		}
-
-		return procedures;
-	}
-
-	private Map<String, Procedure> loadProcedures(FiltersConfig filters, String catalog, String schema)
-			throws SQLException {
-		Map<String, Procedure> procedures = new HashMap<>();
-		// get procedures
-
-		try (ResultSet rs = getMetaData().getProcedures(catalog, schema, WILDCARD);) {
-			while (rs.next()) {
-
-				String name = rs.getString("PROCEDURE_NAME");
-				Procedure procedure = new Procedure(name);
-				procedure.setCatalog(rs.getString("PROCEDURE_CAT"));
-				procedure.setSchema(rs.getString("PROCEDURE_SCHEM"));
-
-				if (!filters.proceduresFilter(procedure.getCatalog(), procedure.getSchema()).isInclude(
-						procedure.getName())) {
-					LOGGER.info("skipping Cayenne PK procedure: " + name);
-					continue;
-				}
-
-				switch (rs.getShort("PROCEDURE_TYPE")) {
-				case DatabaseMetaData.procedureNoResult:
-				case DatabaseMetaData.procedureResultUnknown:
-					procedure.setReturningValue(false);
-					break;
-				case DatabaseMetaData.procedureReturnsResult:
-					procedure.setReturningValue(true);
-					break;
-				}
-
-				procedures.put(procedure.getFullyQualifiedName(), procedure);
-			}
-		}
-		return procedures;
-	}
-
-	/**
-	 * Sets new naming strategy for reverse engineering
-	 *
-	 * @since 3.0
-	 */
-	public void setNameGenerator(ObjectNameGenerator strategy) {
-		if (strategy == null) {
-			LOGGER.warn("Attempt to set null into NameGenerator. LegacyNameGenerator will be used.");
-			this.nameGenerator = new LegacyNameGenerator();
-		} else {
-			this.nameGenerator = strategy;
-		}
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoaderConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoaderConfiguration.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoaderConfiguration.java
deleted file mode 100644
index e5421fe..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoaderConfiguration.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
-import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
-
-/**
- * @since 4.0
- */
-public class DbLoaderConfiguration {
-
-    /**
-     * Returns a name of a generic class that should be used for all
-     * ObjEntities. The most common generic class is
-     * {@link org.apache.cayenne.CayenneDataObject}. If generic class name is
-     * null (which is the default), DbLoader will assign each entity a unique
-     * class name derived from the table name.
-     *
-     */
-    private String genericClassName;
-
-/*
-    // TODO: Andrus, 10/29/2005 - this type of filtering should be delegated to adapter
-       TODO by default should skip name.startsWith("BIN$")
-
-    private NameFilter tableFilter = NamePatternMatcher.build(null, null, "BIN$");
-
-    private NameFilter columnFilter;
-
-    private NameFilter proceduresFilter = new NameFilter() {
-        private final Collection<String> excludedProcedures = Arrays.asList(
-                "auto_pk_for_table",
-                "auto_pk_for_table;1" // the last name is some Mac OS X Sybase artifact
-        );
-
-        @Override
-        public boolean isIncluded(String string) {
-            return !excludedProcedures.contains(string);
-        }
-    };
-*/
-
-
-    /**
-     * Java class implementing org.apache.cayenne.map.naming.NamingStrategy.
-     * This is used to specify how ObjEntities will be mapped from the imported
-     * DB schema.
-     */
-    private String namingStrategy;
-
-    private Boolean skipRelationshipsLoading;
-
-    private Boolean skipPrimaryKeyLoading;
-
-    private String[] tableTypes;
-
-    private FiltersConfig filtersConfig;
-
-    public String getGenericClassName() {
-        return genericClassName;
-    }
-
-    public void setGenericClassName(String genericClassName) {
-        this.genericClassName = genericClassName;
-    }
-
-    public String[] getTableTypes() {
-        return tableTypes;
-    }
-
-    public void setTableTypes(String[] tableTypes) {
-        this.tableTypes = tableTypes;
-    }
-
-    public String getNamingStrategy() {
-        return namingStrategy;
-    }
-
-    public void setNamingStrategy(String namingStrategy) {
-        this.namingStrategy = namingStrategy;
-    }
-
-    public FiltersConfig getFiltersConfig() {
-        if (filtersConfig == null) {
-            // this case is used often in tests where config not initialized properly
-            return FiltersConfig.create(null, null, TableFilter.everything(), PatternFilter.INCLUDE_NOTHING);
-        }
-        return filtersConfig;
-    }
-
-    public void setFiltersConfig(FiltersConfig filtersConfig) {
-        this.filtersConfig = filtersConfig;
-    }
-
-    public boolean isSkipRelationshipsLoading() {
-        return skipRelationshipsLoading != null && skipRelationshipsLoading;
-    }
-
-    public Boolean getSkipRelationshipsLoading() {
-        return skipRelationshipsLoading;
-    }
-
-    public void setSkipRelationshipsLoading(Boolean skipRelationshipsLoading) {
-        this.skipRelationshipsLoading = skipRelationshipsLoading;
-    }
-
-    public void setSkipPrimaryKeyLoading(Boolean skipPrimaryKeyLoading) {
-        this.skipPrimaryKeyLoading = skipPrimaryKeyLoading;
-    }
-
-    public boolean getSkipPrimaryKeyLoading() {
-        return skipPrimaryKeyLoading;
-    }
-
-    public boolean isSkipPrimaryKeyLoading() {
-        return skipPrimaryKeyLoading != null && skipPrimaryKeyLoading;
-    }
-
-    @Override
-    public String toString() {
-        String res = "EntitiesFilters: " + getFiltersConfig();
-        if (isSkipRelationshipsLoading()) {
-            res += "\n Skip Loading Relationships! \n";
-        }
-
-        if (isSkipPrimaryKeyLoading()) {
-            res += "\n Skip Loading PrimaryKeys! \n";
-        }
-
-        return res;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoaderDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoaderDelegate.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoaderDelegate.java
deleted file mode 100644
index 35a61fb..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbLoaderDelegate.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjEntity;
-
-/**
- * DbLoaderDelegate defines API that allows to control the behavior of DbLoader
- * during the database reverse-engineering. Delegate is also notified of the
- * progress of reverse-engineering.
- */
-public interface DbLoaderDelegate {
-
-    void dbEntityAdded(DbEntity entity);
-
-    void dbEntityRemoved(DbEntity entity);
-
-    /**
-     * Called before relationship loading for db-entity
-     * @param entity
-     *
-     * @return true in case you want process relationships for this entity
-     *         false otherwise
-     */
-    boolean dbRelationship(DbEntity entity);
-
-    /**
-     * Called before relationship will be added into db-entity but after it was loaded from db
-     * @param entity
-     *
-     * @return true in case you want add this relationship into entity
-     *         false otherwise
-     */
-    boolean dbRelationshipLoaded(DbEntity entity, DbRelationship relationship);
-
-    void objEntityAdded(ObjEntity entity);
-
-    void objEntityRemoved(ObjEntity entity);
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbTableLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbTableLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbTableLoader.java
deleted file mode 100644
index 0d12e64..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DbTableLoader.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
-import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DetectedDbEntity;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @since 4.0
- */
-public class DbTableLoader {
-
-	private static final Log LOGGER = LogFactory.getLog(DbTableLoader.class);
-
-	private static final String WILDCARD = "%";
-
-	private final String catalog;
-	private final String schema;
-
-	private final DatabaseMetaData metaData;
-	private final DbLoaderDelegate delegate;
-
-	private final DbAttributesLoader attributesLoader;
-
-	public DbTableLoader(String catalog, String schema, DatabaseMetaData metaData, DbLoaderDelegate delegate,
-			DbAttributesLoader attributesLoader) {
-		this.catalog = catalog;
-		this.schema = schema;
-		this.metaData = metaData;
-		this.delegate = delegate;
-
-		this.attributesLoader = attributesLoader;
-	}
-
-	/**
-	 * Returns all tables for given combination of the criteria. Tables returned
-	 * as DbEntities without any attributes or relationships.
-	 *
-	 * @param types
-	 *            The types of table names to retrieve, null returns all types.
-	 * @return
-	 * @since 4.0
-	 */
-	public List<DetectedDbEntity> getDbEntities(TableFilter filters, String[] types) throws SQLException {
-		if (LOGGER.isDebugEnabled()) {
-			LOGGER.debug("Read tables: catalog=" + catalog + ", schema=" + schema + ", types=" + Arrays.toString(types));
-		}
-
-		List<DetectedDbEntity> tables = new LinkedList<DetectedDbEntity>();
-		try (ResultSet rs = metaData.getTables(catalog, schema, WILDCARD, types);) {
-			while (rs.next()) {
-				// Oracle 9i and newer has a nifty recycle bin feature... but we
-				// don't
-				// want dropped tables to be included here; in fact they may
-				// even result
-				// in errors on reverse engineering as their names have special
-				// chars like
-				// "/", etc. So skip them all together
-
-				String name = rs.getString("TABLE_NAME");
-				if (name == null) {
-					continue;
-				}
-
-				DetectedDbEntity table = new DetectedDbEntity(name);
-
-				String catalog = rs.getString("TABLE_CAT");
-				table.setCatalog(catalog);
-
-				String schema = rs.getString("TABLE_SCHEM");
-				table.setSchema(schema);
-				if (!(this.catalog == null || this.catalog.equals(catalog))
-						|| !(this.schema == null || this.schema.equals(schema))) {
-
-					LOGGER.error(catalog + "." + schema + "." + name + " wrongly loaded for catalog/schema : "
-							+ this.catalog + "." + this.schema);
-
-					continue;
-				}
-
-				PatternFilter includeTable = filters.isIncludeTable(table.getName());
-				if (includeTable != null) {
-					tables.add(table);
-				}
-			}
-		}
-		return tables;
-	}
-
-	/**
-	 * Loads dbEntities for the specified tables.
-	 * 
-	 * @param config
-	 * @param types
-	 */
-	public List<DbEntity> loadDbEntities(DataMap map, DbLoaderConfiguration config, String[] types) throws SQLException {
-		/** List of db entities to process. */
-
-		List<DetectedDbEntity> tables = getDbEntities(config.getFiltersConfig().tableFilter(catalog, schema), types);
-
-		List<DbEntity> dbEntities = new ArrayList<DbEntity>();
-		for (DbEntity dbEntity : tables) {
-			DbEntity oldEnt = map.getDbEntity(dbEntity.getName());
-			if (oldEnt != null) {
-				Collection<ObjEntity> oldObjEnt = map.getMappedEntities(oldEnt);
-				if (!oldObjEnt.isEmpty()) {
-					for (ObjEntity objEntity : oldObjEnt) {
-						LOGGER.debug("Delete ObjEntity: " + objEntity.getName());
-						map.removeObjEntity(objEntity.getName(), true);
-						delegate.objEntityRemoved(objEntity);
-					}
-				}
-
-				LOGGER.debug("Overwrite DbEntity: " + oldEnt.getName());
-				map.removeDbEntity(oldEnt.getName(), true);
-				delegate.dbEntityRemoved(oldEnt);
-			}
-
-			map.addDbEntity(dbEntity);
-
-			delegate.dbEntityAdded(dbEntity);
-
-			// delegate might have thrown this entity out... so check if it is
-			// still
-			// around before continuing processing
-			if (map.getDbEntity(dbEntity.getName()) == dbEntity) {
-				dbEntities.add(dbEntity);
-				attributesLoader.loadDbAttributes(dbEntity);
-				if (!config.isSkipPrimaryKeyLoading()) {
-					loadPrimaryKey(dbEntity);
-				}
-			}
-		}
-
-		return dbEntities;
-	}
-
-	private void loadPrimaryKey(DbEntity dbEntity) throws SQLException {
-
-		try (ResultSet rs = metaData.getPrimaryKeys(dbEntity.getCatalog(), dbEntity.getSchema(), dbEntity.getName());) {
-			while (rs.next()) {
-				String columnName = rs.getString("COLUMN_NAME");
-				DbAttribute attribute = dbEntity.getAttribute(columnName);
-
-				if (attribute != null) {
-					attribute.setPrimaryKey(true);
-				} else {
-					// why an attribute might be null is not quiet clear
-					// but there is a bug report 731406 indicating that it is
-					// possible
-					// so just print the warning, and ignore
-					LOGGER.warn("Can't locate attribute for primary key: " + columnName);
-				}
-
-				String pkName = rs.getString("PK_NAME");
-				if (pkName != null && dbEntity instanceof DetectedDbEntity) {
-					((DetectedDbEntity) dbEntity).setPrimaryKeyName(pkName);
-				}
-
-			}
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DefaultDbLoaderDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DefaultDbLoaderDelegate.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DefaultDbLoaderDelegate.java
deleted file mode 100644
index b39fd5f..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/DefaultDbLoaderDelegate.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjEntity;
-
-/**
- * @since 4.0.
- */
-public class DefaultDbLoaderDelegate implements DbLoaderDelegate {
-
-    @Override
-    public void dbEntityAdded(DbEntity entity) {
-
-    }
-
-    @Override
-    public void dbEntityRemoved(DbEntity entity) {
-
-    }
-
-    @Override
-    public boolean dbRelationship(DbEntity entity) {
-        return true;
-    }
-
-    @Override
-    public boolean dbRelationshipLoaded(DbEntity entity, DbRelationship relationship) {
-        return true;
-    }
-
-    @Override
-    public void objEntityAdded(ObjEntity entity) {
-
-    }
-
-    @Override
-    public void objEntityRemoved(ObjEntity entity) {
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilder.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilder.java
index 390d91a..2035f44 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilder.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilder.java
@@ -42,7 +42,7 @@ import java.util.regex.Pattern;
 import static org.apache.commons.lang.StringUtils.isBlank;
 
 /**
- * @since 4.0.
+ * @since 4.0
  */
 public final class FiltersConfigBuilder {
 
@@ -52,7 +52,7 @@ public final class FiltersConfigBuilder {
         this.engineering = engineering;
     }
 
-    public FiltersConfig filtersConfig() {
+    public FiltersConfig build() {
         compact();
 
         return new FiltersConfig(transformCatalogs(engineering.getCatalogs()));
@@ -120,6 +120,7 @@ public final class FiltersConfigBuilder {
     /**
      * Goal of this method transform ReverseEngineering config into more regular form
      * From
+     * <pre>
      *      ReverseEngineering
      *          Catalog
      *              Schema
@@ -156,9 +157,10 @@ public final class FiltersConfigBuilder {
      *          ExcludeProcedures
      *          IncludeColumn
      *          ExcludeColumn
-     *
+     * </pre>
      * Into
-     *      ReverseEngineering
+     * <pre>
+     *  ReverseEngineering
      *          Catalog
      *              Schema
      *                  IncludeTable
@@ -167,10 +169,9 @@ public final class FiltersConfigBuilder {
      *                  ExcludeTable
      *                  IncludeProcedures
      *                  ExcludeProcedures
-     *
-     *
-     * */
-    public void compact() {
+     * </pre>
+     */
+    void compact() {
         addEmptyElements();
 
         compactColumnFilters();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/LoggingDbLoaderDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/LoggingDbLoaderDelegate.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/LoggingDbLoaderDelegate.java
deleted file mode 100644
index 3777ccc..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/LoggingDbLoaderDelegate.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.reverse;
-
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.commons.logging.Log;
-
-/**
- * @since 4.0
- */
-public class LoggingDbLoaderDelegate extends DefaultDbLoaderDelegate {
-
-    private final Log logger;
-
-    public LoggingDbLoaderDelegate(Log logger) {
-        this.logger = logger;
-    }
-
-    @Override
-    public void dbEntityAdded(DbEntity entity) {
-        logger.info("  Table: " + entity.getFullyQualifiedName());
-    }
-
-    @Override
-    public void dbEntityRemoved(DbEntity entity) {
-        logger.info("  Table removed: " + entity.getFullyQualifiedName());
-    }
-
-    @Override
-    public boolean dbRelationship(DbEntity entity) {
-        if (logger.isDebugEnabled()) {
-            logger.debug("    Relationships for " + entity.getFullyQualifiedName());
-        }
-
-        return true;
-    }
-
-    @Override
-    public boolean dbRelationshipLoaded(DbEntity entity, DbRelationship relationship) {
-        logger.info("    " + relationship);
-
-        return true;
-    }
-
-    @Override
-    public void objEntityAdded(ObjEntity entity) {
-        if (logger.isDebugEnabled()) {
-            logger.debug("  Class: " + entity.getName());
-        }
-    }
-
-    @Override
-    public void objEntityRemoved(ObjEntity entity) {
-        if (logger.isDebugEnabled()) {
-            logger.debug("  Class removed: " + entity.getName());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/ManyToManyCandidateEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/ManyToManyCandidateEntity.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/ManyToManyCandidateEntity.java
deleted file mode 100644
index 9666e08..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/ManyToManyCandidateEntity.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
-import org.apache.cayenne.map.naming.ExportedKey;
-import org.apache.cayenne.map.naming.NameCheckers;
-import org.apache.cayenne.map.naming.ObjectNameGenerator;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Class represent ObjEntity that may be optimized using flattened relationships
- * as many to many table
- */
-public class ManyToManyCandidateEntity {
-
-    private static final Log LOG = LogFactory.getLog(ManyToManyCandidateEntity.class);
-
-    private final ObjEntity joinEntity;
-
-    private final DbRelationship dbRel1;
-    private final DbRelationship dbRel2;
-
-    private final ObjEntity entity1;
-    private final ObjEntity entity2;
-
-    private final DbRelationship reverseRelationship1;
-    private final DbRelationship reverseRelationship2;
-
-    private ManyToManyCandidateEntity(ObjEntity entityValue, List<ObjRelationship> relationships) {
-        joinEntity = entityValue;
-
-        ObjRelationship rel1 = relationships.get(0);
-        ObjRelationship rel2 = relationships.get(1);
-
-        dbRel1 = rel1.getDbRelationships().get(0);
-        dbRel2 = rel2.getDbRelationships().get(0);
-
-        reverseRelationship1 = dbRel1.getReverseRelationship();
-        reverseRelationship2 = dbRel2.getReverseRelationship();
-
-        entity1 = rel1.getTargetEntity();
-        entity2 = rel2.getTargetEntity();
-    }
-
-    /**
-     * Method check - if current entity represent many to many temporary table
-     * @return true if current entity is represent many to many table; otherwise returns false
-     */
-    public static ManyToManyCandidateEntity build(ObjEntity joinEntity) {
-        ArrayList<ObjRelationship> relationships = new ArrayList<ObjRelationship>(joinEntity.getRelationships());
-        if (relationships.size() != 2 || (relationships.get(0).getDbRelationships().isEmpty() || relationships.get(1).getDbRelationships().isEmpty())) {
-            return null;
-        }
-
-        ManyToManyCandidateEntity candidateEntity = new ManyToManyCandidateEntity(joinEntity, relationships);
-        if (candidateEntity.isManyToMany()) {
-            return candidateEntity;
-        }
-
-        return null;
-    }
-
-    private boolean isManyToMany() {
-        boolean isNotHaveAttributes = joinEntity.getAttributes().size() == 0;
-
-        return isNotHaveAttributes
-                && reverseRelationship1 != null && reverseRelationship1.isToDependentPK()
-                && reverseRelationship2 != null && reverseRelationship2.isToDependentPK()
-                && entity1 != null && entity2 != null;
-    }
-
-    private void addFlattenedRelationship(ObjectNameGenerator nameGenerator, ObjEntity srcEntity, ObjEntity dstEntity,
-                                          DbRelationship rel1, DbRelationship rel2) {
-
-        if (rel1.getSourceAttributes().isEmpty() && rel2.getTargetAttributes().isEmpty()) {
-            LOG.warn("Wrong call ManyToManyCandidateEntity.addFlattenedRelationship(... , " + srcEntity.getName()
-                    + ", " + dstEntity.getName() + ", ...)");
-
-            return;
-        }
-
-        ExportedKey key = new ExportedKey(
-                rel1.getSourceEntity().getName(),
-                rel1.getSourceAttributes().iterator().next().getName(),
-                null,
-                rel2.getTargetEntity().getName(),
-                rel2.getTargetAttributes().iterator().next().getName(),
-                null,
-                (short) 1);
-
-        ObjRelationship newRelationship = new ObjRelationship();
-        newRelationship.setName(DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, srcEntity,
-                nameGenerator.createDbRelationshipName(key, true)));
-
-        newRelationship.setSourceEntity(srcEntity);
-        newRelationship.setTargetEntityName(dstEntity);
-
-        newRelationship.addDbRelationship(rel1);
-        newRelationship.addDbRelationship(rel2);
-
-        srcEntity.addRelationship(newRelationship);
-    }
-
-    /**
-     * Method make direct relationships between 2 entities and remove relationships to
-     * many to many entity
-     *
-     * @param nameGenerator
-     */
-    public void optimizeRelationships(ObjectNameGenerator nameGenerator) {
-        entity1.removeRelationship(reverseRelationship1.getName());
-        entity2.removeRelationship(reverseRelationship2.getName());
-
-        addFlattenedRelationship(nameGenerator, entity1, entity2, reverseRelationship1, dbRel2);
-        addFlattenedRelationship(nameGenerator, entity2, entity1, reverseRelationship2, dbRel1);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesBaseLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesBaseLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesBaseLoader.java
new file mode 100644
index 0000000..591d8b5
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesBaseLoader.java
@@ -0,0 +1,107 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Set;
+
+/**
+* @since 4.0.
+*/
+public abstract class DbAttributesBaseLoader implements DbAttributesLoader {
+    private final String catalog;
+    private final String schema;
+
+    private final DatabaseMetaData metaData;
+    private final DbAdapter adapter;
+
+    public DbAttributesBaseLoader(String catalog, String schema, DatabaseMetaData metaData, DbAdapter adapter) {
+        this.catalog = catalog;
+        this.schema = schema;
+        this.metaData = metaData;
+        this.adapter = adapter;
+    }
+
+    protected DbAttribute loadDbAttribute(Set<String> columns, ResultSet rs) throws SQLException {
+
+        // gets attribute's (column's) information
+        int columnType = rs.getInt("DATA_TYPE");
+
+        // ignore precision of non-decimal columns
+        int decimalDigits = -1;
+        if (TypesMapping.isDecimal(columnType)) {
+            decimalDigits = rs.getInt("DECIMAL_DIGITS");
+            if (rs.wasNull()) {
+                decimalDigits = -1;
+            }
+        }
+
+        // create attribute delegating this task to adapter
+        DbAttribute attr = adapter.buildAttribute(
+                rs.getString("COLUMN_NAME"),
+                rs.getString("TYPE_NAME"),
+                columnType,
+                rs.getInt("COLUMN_SIZE"),
+                decimalDigits,
+                rs.getBoolean("NULLABLE"));
+
+        if (columns.contains("IS_AUTOINCREMENT")) {
+            String autoIncrement = rs.getString("IS_AUTOINCREMENT");
+            if ("YES".equals(autoIncrement)) {
+                attr.setGenerated(true);
+            }
+        }
+        return attr;
+    }
+
+    @Override
+    public void loadDbAttributes(DbEntity entity) {
+        for (DbAttribute attr : loadDbAttributes(entity.getName())) {
+            attr.setEntity(entity);
+
+            // override existing attributes if it comes again
+            if (entity.getAttribute(attr.getName()) != null) {
+                entity.removeAttribute(attr.getName());
+            }
+            entity.addAttribute(attr);
+        }
+    }
+
+    protected abstract List<DbAttribute> loadDbAttributes(String tableName);
+
+    protected String getCatalog() {
+        return catalog;
+    }
+
+    protected String getSchema() {
+        return schema;
+    }
+
+    protected DatabaseMetaData getMetaData() {
+        return metaData;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesLoader.java
new file mode 100644
index 0000000..fb342c9
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesLoader.java
@@ -0,0 +1,43 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import org.apache.cayenne.map.DbEntity;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Interface responsible for attributes loading. Several options possible here
+ *  1) load attributes for each table separately
+ *  2) load attributes for schema and group it by table names
+ *
+ *  here is a trade of between count of queries and amount af calculation.
+ *
+ *
+ * @since 4.0
+ */
+public interface DbAttributesLoader {
+
+    // TODO use instant field for logging
+    Log LOGGER = LogFactory.getLog(DbTableLoader.class);
+
+    void loadDbAttributes(DbEntity entity);
+
+}
+

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesPerSchemaLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesPerSchemaLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesPerSchemaLoader.java
new file mode 100644
index 0000000..cd26db7
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesPerSchemaLoader.java
@@ -0,0 +1,130 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
+import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.map.DbAttribute;
+
+/**
+ * Load all attributes for schema and return it for each table
+ * */
+public class DbAttributesPerSchemaLoader extends DbAttributesBaseLoader {
+
+	private final TableFilter filter;
+
+	private Map<String, List<DbAttribute>> attributes;
+
+	public DbAttributesPerSchemaLoader(String catalog, String schema, DatabaseMetaData metaData, DbAdapter adapter,
+			TableFilter filter) {
+		super(catalog, schema, metaData, adapter);
+
+		this.filter = filter;
+	}
+
+	private Map<String, List<DbAttribute>> loadDbAttributes() throws SQLException {
+		Map<String, List<DbAttribute>> attributes = new HashMap<>();
+
+		try (ResultSet rs = getMetaData().getColumns(getCatalog(), getSchema(), "%", "%");) {
+			Set<String> columns = new HashSet<String>();
+
+			while (rs.next()) {
+				if (columns.isEmpty()) {
+					ResultSetMetaData rsMetaData = rs.getMetaData();
+					for (int i = 1; i <= rsMetaData.getColumnCount(); i++) {
+						columns.add(rsMetaData.getColumnLabel(i));
+					}
+				}
+
+				// for a reason not quiet apparent to me, Oracle sometimes
+				// returns duplicate record sets for the same table, messing up
+				// table
+				// names. E.g. for the system table "WK$_ATTR_MAPPING" columns
+				// are
+				// returned twice - as "WK$_ATTR_MAPPING" and
+				// "WK$$_ATTR_MAPPING"... Go figure
+				String tableName = rs.getString("TABLE_NAME");
+				String columnName = rs.getString("COLUMN_NAME");
+
+				PatternFilter columnFilter = filter.isIncludeTable(tableName);
+				/*
+				 * Here is possible optimization if filter will contain
+				 * map<tableName, columnFilter> we can replace it after tables
+				 * loading since already done pattern matching once and exactly
+				 * know all tables that we want to process
+				 */
+				if (columnFilter == null || !columnFilter.isInclude(columnName)) {
+					if (LOGGER.isDebugEnabled()) {
+						LOGGER.debug("Skip column '" + tableName + "." + columnName + "' (Path: " + getCatalog() + "/"
+								+ getSchema() + "; Filter: " + columnFilter + ")");
+					}
+					continue;
+				}
+
+				List<DbAttribute> attrs = attributes.get(tableName);
+				if (attrs == null) {
+					attrs = new LinkedList<DbAttribute>();
+
+					attributes.put(tableName, attrs);
+				}
+
+				attrs.add(loadDbAttribute(columns, rs));
+			}
+		}
+
+		return attributes;
+	}
+
+	@Override
+	protected List<DbAttribute> loadDbAttributes(String tableName) {
+		Map<String, List<DbAttribute>> attributes = getAttributes();
+		if (attributes != null) {
+			List<DbAttribute> dbAttributes = attributes.get(tableName);
+			if (dbAttributes != null) {
+				return dbAttributes;
+			}
+		}
+
+		return new LinkedList<DbAttribute>();
+	}
+
+	public Map<String, List<DbAttribute>> getAttributes() {
+		if (attributes == null) {
+			try {
+				attributes = loadDbAttributes();
+			} catch (SQLException e) {
+				LOGGER.error(e);
+				attributes = new HashMap<>();
+			}
+		}
+		return attributes;
+	}
+}


[3/9] cayenne git commit: CAY-2115 DbLoader - allow loading DataMap without Obj layer

Posted by aa...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
new file mode 100644
index 0000000..e43c15a
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
@@ -0,0 +1,702 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.dbsync.merge.EntityMergeSupport;
+import org.apache.cayenne.dbsync.reverse.filters.CatalogFilter;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
+import org.apache.cayenne.dbsync.reverse.filters.SchemaFilter;
+import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbJoin;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.DbRelationshipDetected;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.map.ProcedureParameter;
+import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.ExportedKey;
+import org.apache.cayenne.map.naming.LegacyNameGenerator;
+import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.map.naming.ObjectNameGenerator;
+import org.apache.cayenne.util.EqualsBuilder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * Performs reverse engineering of the database. It can create
+ * DataMaps using database meta data obtained via JDBC driver.
+ *
+ * @since 4.0
+ */
+public class DbLoader {
+
+    private static final Log LOGGER = LogFactory.getLog(DbLoader.class);
+
+    private static final String WILDCARD = "%";
+
+    private final Connection connection;
+    private final DbAdapter adapter;
+    private final DbLoaderDelegate delegate;
+
+    private boolean creatingMeaningfulPK;
+
+    /**
+     * Strategy for choosing names for entities, attributes and relationships
+     */
+    private ObjectNameGenerator nameGenerator;
+
+    private DatabaseMetaData metaData;
+
+
+    /**
+     * Creates new DbLoader.
+     */
+    public DbLoader(Connection connection, DbAdapter adapter, DbLoaderDelegate delegate) {
+        this(connection, adapter, delegate, new LegacyNameGenerator());
+    }
+
+    /**
+     * Creates new DbLoader with specified naming strategy.
+     *
+     * @since 3.0
+     */
+    public DbLoader(Connection connection, DbAdapter adapter, DbLoaderDelegate delegate, ObjectNameGenerator strategy) {
+        this.adapter = adapter;
+        this.connection = connection;
+        this.delegate = delegate == null ? new DefaultDbLoaderDelegate() : delegate;
+
+        setNameGenerator(strategy);
+    }
+
+    private static List<String> getStrings(ResultSet rs) throws SQLException {
+        List<String> strings = new ArrayList<String>();
+
+        while (rs.next()) {
+            strings.add(rs.getString(1));
+        }
+
+        return strings;
+    }
+
+    private static Collection<ObjEntity> loadObjEntities(DataMap map, DbLoaderConfiguration config,
+                                                         Collection<DbEntity> entities, ObjectNameGenerator nameGenerator) {
+        if (entities.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        Collection<ObjEntity> loadedEntities = new ArrayList<ObjEntity>(entities.size());
+
+        // doLoad empty ObjEntities for all the tables
+        for (DbEntity dbEntity : entities) {
+
+            // check if there are existing entities
+
+            // TODO: performance. This is an O(n^2) search and it shows on
+            // YourKit profiles. Pre-cache mapped entities perhaps (?)
+            Collection<ObjEntity> existing = map.getMappedEntities(dbEntity);
+            if (!existing.isEmpty()) {
+                loadedEntities.addAll(existing);
+                continue;
+            }
+
+            String objEntityName = DefaultUniqueNameGenerator.generate(NameCheckers.objEntity, map,
+                    nameGenerator.createObjEntityName(dbEntity));
+
+            ObjEntity objEntity = new ObjEntity(objEntityName);
+            objEntity.setDbEntity(dbEntity);
+            objEntity.setClassName(config.getGenericClassName() != null ? config.getGenericClassName() : map
+                    .getNameWithDefaultPackage(objEntity.getName()));
+
+            map.addObjEntity(objEntity);
+            loadedEntities.add(objEntity);
+        }
+
+        return loadedEntities;
+    }
+
+    /**
+     * Flattens many-to-many relationships in the generated model.
+     */
+    public static void flattenManyToManyRelationships(DataMap map, Collection<ObjEntity> loadedObjEntities,
+                                                      ObjectNameGenerator objectNameGenerator) {
+        if (loadedObjEntities.isEmpty()) {
+            return;
+        }
+        Collection<ObjEntity> entitiesForDelete = new LinkedList<ObjEntity>();
+
+        for (ObjEntity curEntity : loadedObjEntities) {
+            ManyToManyCandidateEntity entity = ManyToManyCandidateEntity.build(curEntity);
+
+            if (entity != null) {
+                entity.optimizeRelationships(objectNameGenerator);
+                entitiesForDelete.add(curEntity);
+            }
+        }
+
+        // remove needed entities
+        for (ObjEntity curDeleteEntity : entitiesForDelete) {
+            map.removeObjEntity(curDeleteEntity.getName(), true);
+        }
+        loadedObjEntities.removeAll(entitiesForDelete);
+    }
+
+    private static int getDirection(short type) {
+        switch (type) {
+            case DatabaseMetaData.procedureColumnIn:
+                return ProcedureParameter.IN_PARAMETER;
+            case DatabaseMetaData.procedureColumnInOut:
+                return ProcedureParameter.IN_OUT_PARAMETER;
+            case DatabaseMetaData.procedureColumnOut:
+                return ProcedureParameter.OUT_PARAMETER;
+            default:
+                return -1;
+        }
+    }
+
+    /**
+     * Returns DatabaseMetaData object associated with this DbLoader.
+     */
+    private DatabaseMetaData getMetaData() throws SQLException {
+        if (metaData == null) {
+            metaData = connection.getMetaData();
+        }
+        return metaData;
+    }
+
+    /**
+     * Check if database support schemas.
+     */
+    protected boolean supportSchemas() throws SQLException {
+        if (metaData == null) {
+            metaData = connection.getMetaData();
+        }
+        return metaData.supportsSchemasInTableDefinitions();
+    }
+
+    /**
+     * Check if database support catalogs.
+     */
+    protected boolean supportCatalogs() throws SQLException {
+        if (metaData == null) {
+            metaData = connection.getMetaData();
+        }
+        return metaData.supportsCatalogsInTableDefinitions();
+    }
+
+    /**
+     * @since 3.0
+     */
+    public void setCreatingMeaningfulPK(boolean creatingMeaningfulPK) {
+        this.creatingMeaningfulPK = creatingMeaningfulPK;
+    }
+
+    /**
+     * Retrieves catalogs for the database associated with this DbLoader.
+     *
+     * @return List with the catalog names, empty Array if none found.
+     */
+    public List<String> loadCatalogs() throws SQLException {
+        try (ResultSet rs = getMetaData().getCatalogs()) {
+            return getStrings(rs);
+        }
+    }
+
+    /**
+     * Retrieves the schemas for the database.
+     *
+     * @return List with the schema names, empty Array if none found.
+     */
+    public List<String> loadSchemas() throws SQLException {
+
+        try (ResultSet rs = getMetaData().getSchemas()) {
+            return getStrings(rs);
+        }
+    }
+
+    /**
+     * Creates an ObjEntity for each DbEntity in the map.
+     */
+    Collection<ObjEntity> loadObjEntities(DataMap map, DbLoaderConfiguration config,
+                                          Collection<DbEntity> entities) {
+        Collection<ObjEntity> loadedEntities = DbLoader.loadObjEntities(map, config, entities, nameGenerator);
+
+        createEntityMerger(map).synchronizeWithDbEntities(loadedEntities);
+
+        return loadedEntities;
+    }
+
+    /**
+     * @since 4.0
+     */
+    protected EntityMergeSupport createEntityMerger(DataMap map) {
+        return new EntityMergeSupport(map, nameGenerator, !creatingMeaningfulPK);
+    }
+
+    protected void loadDbRelationships(DbLoaderConfiguration config, String catalog, String schema,
+                                       List<DbEntity> tables) throws SQLException {
+        if (config.isSkipRelationshipsLoading()) {
+            return;
+        }
+
+        // Get all the foreign keys referencing this table
+        Map<String, DbEntity> tablesMap = new HashMap<>();
+        for (DbEntity table : tables) {
+            tablesMap.put(table.getName(), table);
+        }
+
+        Map<String, Set<ExportedKey>> keys = loadExportedKeys(config, catalog, schema, tablesMap);
+        for (Map.Entry<String, Set<ExportedKey>> entry : keys.entrySet()) {
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Process keys for: " + entry.getKey());
+            }
+
+            Set<ExportedKey> exportedKeys = entry.getValue();
+            ExportedKey key = exportedKeys.iterator().next();
+            if (key == null) {
+                throw new IllegalStateException();
+            }
+
+            DbEntity pkEntity = tablesMap.get(key.getPKTableName());
+            if (pkEntity == null) {
+                skipRelationLog(key, key.getPKTableName());
+                continue;
+            }
+
+            DbEntity fkEntity = tablesMap.get(key.getFKTableName());
+            if (fkEntity == null) {
+                skipRelationLog(key, key.getFKTableName());
+                continue;
+            }
+
+            if (!new EqualsBuilder().append(pkEntity.getCatalog(), key.pkCatalog)
+                    .append(pkEntity.getSchema(), key.pkSchema).append(fkEntity.getCatalog(), key.fkCatalog)
+                    .append(fkEntity.getSchema(), key.fkSchema).isEquals()) {
+
+                LOGGER.info("Skip relation: '" + key + "' because it related to objects from other catalog/schema");
+                LOGGER.info("     relation primary key: '" + key.pkCatalog + "." + key.pkSchema + "'");
+                LOGGER.info("       primary key entity: '" + pkEntity.getCatalog() + "." + pkEntity.getSchema() + "'");
+                LOGGER.info("     relation foreign key: '" + key.fkCatalog + "." + key.fkSchema + "'");
+                LOGGER.info("       foreign key entity: '" + fkEntity.getCatalog() + "." + fkEntity.getSchema() + "'");
+                continue;
+            }
+
+            // forwardRelationship is a reference from table with primary key
+            DbRelationship forwardRelationship = new DbRelationship(generateName(pkEntity, key, true));
+            forwardRelationship.setSourceEntity(pkEntity);
+            forwardRelationship.setTargetEntityName(fkEntity);
+
+            // forwardRelationship is a reference from table with foreign key,
+            // it is what exactly we load from db
+            DbRelationshipDetected reverseRelationship = new DbRelationshipDetected(generateName(fkEntity, key, false));
+            reverseRelationship.setFkName(key.getFKName());
+            reverseRelationship.setSourceEntity(fkEntity);
+            reverseRelationship.setTargetEntityName(pkEntity);
+            reverseRelationship.setToMany(false);
+
+            createAndAppendJoins(exportedKeys, pkEntity, fkEntity, forwardRelationship, reverseRelationship);
+
+            boolean toDependentPK = isToDependentPK(forwardRelationship);
+            forwardRelationship.setToDependentPK(toDependentPK);
+
+            boolean isOneToOne = toDependentPK
+                    && fkEntity.getPrimaryKeys().size() == forwardRelationship.getJoins().size();
+
+            forwardRelationship.setToMany(!isOneToOne);
+            forwardRelationship.setName(generateName(pkEntity, key, !isOneToOne));
+
+            if (delegate.dbRelationshipLoaded(fkEntity, reverseRelationship)) {
+                fkEntity.addRelationship(reverseRelationship);
+            }
+            if (delegate.dbRelationshipLoaded(pkEntity, forwardRelationship)) {
+                pkEntity.addRelationship(forwardRelationship);
+            }
+        }
+    }
+
+    private boolean isToDependentPK(DbRelationship forwardRelationship) {
+        for (DbJoin dbJoin : forwardRelationship.getJoins()) {
+            if (!dbJoin.getTarget().isPrimaryKey()) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private void createAndAppendJoins(Set<ExportedKey> exportedKeys, DbEntity pkEntity, DbEntity fkEntity,
+                                      DbRelationship forwardRelationship, DbRelationshipDetected reverseRelationship) {
+        for (ExportedKey exportedKey : exportedKeys) {
+            // Create and append joins
+            String pkName = exportedKey.getPKColumnName();
+            String fkName = exportedKey.getFKColumnName();
+
+            // skip invalid joins...
+            DbAttribute pkAtt = pkEntity.getAttribute(pkName);
+            if (pkAtt == null) {
+                LOGGER.info("no attribute for declared primary key: " + pkName);
+                continue;
+            }
+
+            DbAttribute fkAtt = fkEntity.getAttribute(fkName);
+            if (fkAtt == null) {
+                LOGGER.info("no attribute for declared foreign key: " + fkName);
+                continue;
+            }
+
+            forwardRelationship.addJoin(new DbJoin(forwardRelationship, pkName, fkName));
+            reverseRelationship.addJoin(new DbJoin(reverseRelationship, fkName, pkName));
+        }
+    }
+
+    private Map<String, Set<ExportedKey>> loadExportedKeys(DbLoaderConfiguration config, String catalog, String schema,
+                                                           Map<String, DbEntity> tables) throws SQLException {
+        Map<String, Set<ExportedKey>> keys = new HashMap<>();
+
+        for (DbEntity dbEntity : tables.values()) {
+            if (!delegate.dbRelationship(dbEntity)) {
+                continue;
+            }
+
+            ResultSet rs;
+            try {
+                rs = getMetaData().getExportedKeys(catalog, schema, dbEntity.getName());
+            } catch (SQLException cay182Ex) {
+                // Sybase-specific - the line above blows on VIEWS, see CAY-182.
+                LOGGER.info(
+                        "Error getting relationships for '" + catalog + "." + schema + "', ignoring. "
+                                + cay182Ex.getMessage(), cay182Ex);
+                return new HashMap<>();
+            }
+
+            try {
+                while (rs.next()) {
+                    ExportedKey key = ExportedKey.extractData(rs);
+
+                    DbEntity fkEntity = tables.get(key.getFKTableName());
+                    if (fkEntity == null) {
+                        skipRelationLog(key, key.getFKTableName());
+                        continue;
+                    }
+
+                    if (config.getFiltersConfig().tableFilter(fkEntity.getCatalog(), fkEntity.getSchema())
+                            .isIncludeTable(fkEntity.getName()) == null) {
+                        continue;
+                    }
+
+                    Set<ExportedKey> exportedKeys = keys.get(key.getStrKey());
+                    if (exportedKeys == null) {
+                        exportedKeys = new TreeSet<ExportedKey>();
+
+                        keys.put(key.getStrKey(), exportedKeys);
+                    }
+                    exportedKeys.add(key);
+                }
+
+            } finally {
+                rs.close();
+            }
+        }
+        return keys;
+    }
+
+    private void skipRelationLog(ExportedKey key, String tableName) {
+        LOGGER.info("Skip relation: '" + key + "' because table '" + tableName + "' not found");
+    }
+
+    private String generateName(DbEntity entity, ExportedKey key, boolean toMany) {
+        String forwardPreferredName = nameGenerator.createDbRelationshipName(key, toMany);
+        return DefaultUniqueNameGenerator.generate(NameCheckers.dbRelationship, entity, forwardPreferredName);
+    }
+
+    private void fireObjEntitiesAddedEvents(Collection<ObjEntity> loadedObjEntities) {
+        for (ObjEntity curEntity : loadedObjEntities) {
+            // notify delegate
+            if (delegate != null) {
+                delegate.objEntityAdded(curEntity);
+            }
+        }
+    }
+
+    protected String[] getTableTypes(DbLoaderConfiguration config) {
+
+        String[] configTypes = config.getTableTypes();
+        if (configTypes != null && configTypes.length > 0) {
+            return configTypes;
+        }
+
+        List<String> list = new ArrayList<>(2);
+
+        String viewType = adapter.tableTypeForView();
+        if (viewType != null) {
+            list.add(viewType);
+        }
+
+        String tableType = adapter.tableTypeForTable();
+        if (tableType != null) {
+            list.add(tableType);
+        }
+
+        return list.toArray(new String[list.size()]);
+    }
+
+    /**
+     * Performs database reverse engineering based on the specified config and
+     * fills the specified DataMap object with DB and object mapping info.
+     *
+     * @since 4.0
+     */
+    public void load(DataMap dataMap, DbLoaderConfiguration config) throws SQLException {
+        LOGGER.info("Schema loading...");
+
+        String[] types = getTableTypes(config);
+
+        for (CatalogFilter catalog : config.getFiltersConfig().catalogs) {
+            for (SchemaFilter schema : catalog.schemas) {
+
+                List<DbEntity> entities = createTableLoader(catalog.name, schema.name, schema.tables).loadDbEntities(
+                        dataMap, config, types);
+
+                if (entities != null) {
+                    loadDbRelationships(config, catalog.name, schema.name, entities);
+
+                    prepareObjLayer(dataMap, config, entities);
+                }
+            }
+        }
+    }
+
+    protected DbTableLoader createTableLoader(String catalog, String schema, TableFilter filter) throws SQLException {
+        return new DbTableLoader(catalog, schema, getMetaData(), delegate, new DbAttributesPerSchemaLoader(catalog,
+                schema, getMetaData(), adapter, filter));
+    }
+
+    private void prepareObjLayer(DataMap dataMap, DbLoaderConfiguration config, Collection<DbEntity> entities) {
+        Collection<ObjEntity> loadedObjEntities = loadObjEntities(dataMap, config, entities);
+        flattenManyToManyRelationships(dataMap, loadedObjEntities, nameGenerator);
+        fireObjEntitiesAddedEvents(loadedObjEntities);
+    }
+
+    /**
+     * Performs database reverse engineering to match the specified catalog,
+     * schema, table name and table type patterns and fills the specified
+     * DataMap object with DB and object mapping info.
+     *
+     * @since 4.0
+     */
+    public DataMap load(DbLoaderConfiguration config) throws SQLException {
+
+        DataMap dataMap = new DataMap();
+        load(dataMap, config);
+        loadProcedures(dataMap, config);
+
+        return dataMap;
+    }
+
+    /**
+     * Loads database stored procedures into the DataMap.
+     * <p>
+     * <i>As of 1.1 there is no boolean property or delegate method to make
+     * procedure loading optional or to implement custom merging logic, so
+     * currently this method is NOT CALLED from "loadDataMapFromDB" and should
+     * be invoked explicitly by the user. </i>
+     * </p>
+     *
+     * @since 4.0
+     */
+    public Map<String, Procedure> loadProcedures(DataMap dataMap, DbLoaderConfiguration config) throws SQLException {
+
+        Map<String, Procedure> procedures = loadProcedures(config);
+        if (procedures.isEmpty()) {
+            return procedures;
+        }
+
+        loadProceduresColumns(config, procedures);
+
+        for (Procedure procedure : procedures.values()) {
+            dataMap.addProcedure(procedure);
+        }
+
+        return procedures;
+    }
+
+    private void loadProceduresColumns(DbLoaderConfiguration config, Map<String, Procedure> procedures)
+            throws SQLException {
+
+        for (CatalogFilter catalog : config.getFiltersConfig().catalogs) {
+            for (SchemaFilter schema : catalog.schemas) {
+                loadProceduresColumns(procedures, catalog.name, schema.name);
+            }
+        }
+    }
+
+    private void loadProceduresColumns(Map<String, Procedure> procedures, String catalog, String schema)
+            throws SQLException {
+
+        try (ResultSet columnsRS = getMetaData().getProcedureColumns(catalog, schema, null, null);) {
+            while (columnsRS.next()) {
+
+                String s = columnsRS.getString("PROCEDURE_SCHEM");
+                String name = columnsRS.getString("PROCEDURE_NAME");
+                String key = (s == null ? "" : s + '.') + name;
+                Procedure procedure = procedures.get(key);
+                if (procedure == null) {
+                    continue;
+                }
+
+                ProcedureParameter column = loadProcedureParams(columnsRS, key, procedure);
+                if (column == null) {
+                    continue;
+                }
+                procedure.addCallParameter(column);
+            }
+        }
+    }
+
+    private ProcedureParameter loadProcedureParams(ResultSet columnsRS, String key, Procedure procedure)
+            throws SQLException {
+        String columnName = columnsRS.getString("COLUMN_NAME");
+
+        // skip ResultSet columns, as they are not described in Cayenne
+        // procedures yet...
+        short type = columnsRS.getShort("COLUMN_TYPE");
+        if (type == DatabaseMetaData.procedureColumnResult) {
+            LOGGER.debug("skipping ResultSet column: " + key + "." + columnName);
+        }
+
+        if (columnName == null) {
+            if (type == DatabaseMetaData.procedureColumnReturn) {
+                LOGGER.debug("null column name, assuming result column: " + key);
+                columnName = "_return_value";
+                procedure.setReturningValue(true);
+            } else {
+                LOGGER.info("invalid null column name, skipping column : " + key);
+                return null;
+            }
+        }
+
+        int columnType = columnsRS.getInt("DATA_TYPE");
+
+        // ignore precision of non-decimal columns
+        int decimalDigits = -1;
+        if (TypesMapping.isDecimal(columnType)) {
+            decimalDigits = columnsRS.getShort("SCALE");
+            if (columnsRS.wasNull()) {
+                decimalDigits = -1;
+            }
+        }
+
+        ProcedureParameter column = new ProcedureParameter(columnName);
+        int direction = getDirection(type);
+        if (direction != -1) {
+            column.setDirection(direction);
+        }
+
+        column.setType(columnType);
+        column.setMaxLength(columnsRS.getInt("LENGTH"));
+        column.setPrecision(decimalDigits);
+
+        column.setProcedure(procedure);
+        return column;
+    }
+
+    private Map<String, Procedure> loadProcedures(DbLoaderConfiguration config) throws SQLException {
+        Map<String, Procedure> procedures = new HashMap<>();
+
+        FiltersConfig filters = config.getFiltersConfig();
+        for (CatalogFilter catalog : filters.catalogs) {
+            for (SchemaFilter schema : catalog.schemas) {
+                if (filters.proceduresFilter(catalog.name, schema.name).isEmpty()) {
+                    continue;
+                }
+
+                procedures.putAll(loadProcedures(filters, catalog.name, schema.name));
+            }
+        }
+
+        return procedures;
+    }
+
+    private Map<String, Procedure> loadProcedures(FiltersConfig filters, String catalog, String schema)
+            throws SQLException {
+        Map<String, Procedure> procedures = new HashMap<>();
+        // get procedures
+
+        try (ResultSet rs = getMetaData().getProcedures(catalog, schema, WILDCARD);) {
+            while (rs.next()) {
+
+                String name = rs.getString("PROCEDURE_NAME");
+                Procedure procedure = new Procedure(name);
+                procedure.setCatalog(rs.getString("PROCEDURE_CAT"));
+                procedure.setSchema(rs.getString("PROCEDURE_SCHEM"));
+
+                if (!filters.proceduresFilter(procedure.getCatalog(), procedure.getSchema()).isInclude(
+                        procedure.getName())) {
+                    LOGGER.info("skipping Cayenne PK procedure: " + name);
+                    continue;
+                }
+
+                switch (rs.getShort("PROCEDURE_TYPE")) {
+                    case DatabaseMetaData.procedureNoResult:
+                    case DatabaseMetaData.procedureResultUnknown:
+                        procedure.setReturningValue(false);
+                        break;
+                    case DatabaseMetaData.procedureReturnsResult:
+                        procedure.setReturningValue(true);
+                        break;
+                }
+
+                procedures.put(procedure.getFullyQualifiedName(), procedure);
+            }
+        }
+        return procedures;
+    }
+
+    /**
+     * Sets new naming strategy for reverse engineering
+     *
+     * @since 3.0
+     */
+    public void setNameGenerator(ObjectNameGenerator strategy) {
+        if (strategy == null) {
+            LOGGER.warn("Attempt to set null into NameGenerator. LegacyNameGenerator will be used.");
+            this.nameGenerator = new LegacyNameGenerator();
+        } else {
+            this.nameGenerator = strategy;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderConfiguration.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderConfiguration.java
new file mode 100644
index 0000000..f3adbd1
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderConfiguration.java
@@ -0,0 +1,128 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
+import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
+
+/**
+ * @since 4.0
+ */
+public class DbLoaderConfiguration {
+
+    /**
+     * Returns a name of a generic class that should be used for all
+     * ObjEntities. The most common generic class is
+     * {@link org.apache.cayenne.CayenneDataObject}. If generic class name is
+     * null (which is the default), DbLoader will assign each entity a unique
+     * class name derived from the table name.
+     *
+     */
+    private String genericClassName;
+
+    /**
+     * Java class implementing org.apache.cayenne.map.naming.NamingStrategy.
+     * This is used to specify how ObjEntities will be mapped from the imported
+     * DB schema.
+     */
+    private String namingStrategy;
+
+    private Boolean skipRelationshipsLoading;
+
+    private Boolean skipPrimaryKeyLoading;
+
+    private String[] tableTypes;
+
+    private FiltersConfig filtersConfig;
+
+    public String getGenericClassName() {
+        return genericClassName;
+    }
+
+    public void setGenericClassName(String genericClassName) {
+        this.genericClassName = genericClassName;
+    }
+
+    public String[] getTableTypes() {
+        return tableTypes;
+    }
+
+    public void setTableTypes(String[] tableTypes) {
+        this.tableTypes = tableTypes;
+    }
+
+    public String getNamingStrategy() {
+        return namingStrategy;
+    }
+
+    public void setNamingStrategy(String namingStrategy) {
+        this.namingStrategy = namingStrategy;
+    }
+
+    public FiltersConfig getFiltersConfig() {
+        if (filtersConfig == null) {
+            // this case is used often in tests where config not initialized properly
+            return FiltersConfig.create(null, null, TableFilter.everything(), PatternFilter.INCLUDE_NOTHING);
+        }
+        return filtersConfig;
+    }
+
+    public void setFiltersConfig(FiltersConfig filtersConfig) {
+        this.filtersConfig = filtersConfig;
+    }
+
+    public boolean isSkipRelationshipsLoading() {
+        return skipRelationshipsLoading != null && skipRelationshipsLoading;
+    }
+
+    public Boolean getSkipRelationshipsLoading() {
+        return skipRelationshipsLoading;
+    }
+
+    public void setSkipRelationshipsLoading(Boolean skipRelationshipsLoading) {
+        this.skipRelationshipsLoading = skipRelationshipsLoading;
+    }
+
+    public void setSkipPrimaryKeyLoading(Boolean skipPrimaryKeyLoading) {
+        this.skipPrimaryKeyLoading = skipPrimaryKeyLoading;
+    }
+
+    public boolean getSkipPrimaryKeyLoading() {
+        return skipPrimaryKeyLoading;
+    }
+
+    public boolean isSkipPrimaryKeyLoading() {
+        return skipPrimaryKeyLoading != null && skipPrimaryKeyLoading;
+    }
+
+    @Override
+    public String toString() {
+        String res = "EntitiesFilters: " + getFiltersConfig();
+        if (isSkipRelationshipsLoading()) {
+            res += "\n Skip Loading Relationships! \n";
+        }
+
+        if (isSkipPrimaryKeyLoading()) {
+            res += "\n Skip Loading PrimaryKeys! \n";
+        }
+
+        return res;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderDelegate.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderDelegate.java
new file mode 100644
index 0000000..e85059f
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderDelegate.java
@@ -0,0 +1,58 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjEntity;
+
+/**
+ * DbLoaderDelegate defines API that allows to control the behavior of DbLoader
+ * during the database reverse-engineering. Delegate is also notified of the
+ * progress of reverse-engineering.
+ */
+public interface DbLoaderDelegate {
+
+    void dbEntityAdded(DbEntity entity);
+
+    void dbEntityRemoved(DbEntity entity);
+
+    /**
+     * Called before relationship loading for db-entity
+     * @param entity
+     *
+     * @return true in case you want process relationships for this entity
+     *         false otherwise
+     */
+    boolean dbRelationship(DbEntity entity);
+
+    /**
+     * Called before relationship will be added into db-entity but after it was loaded from db
+     * @param entity
+     *
+     * @return true in case you want add this relationship into entity
+     *         false otherwise
+     */
+    boolean dbRelationshipLoaded(DbEntity entity, DbRelationship relationship);
+
+    void objEntityAdded(ObjEntity entity);
+
+    void objEntityRemoved(ObjEntity entity);
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbTableLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbTableLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbTableLoader.java
new file mode 100644
index 0000000..d1230bd
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbTableLoader.java
@@ -0,0 +1,195 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
+import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DetectedDbEntity;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @since 4.0
+ */
+public class DbTableLoader {
+
+	private static final Log LOGGER = LogFactory.getLog(DbTableLoader.class);
+
+	private static final String WILDCARD = "%";
+
+	private final String catalog;
+	private final String schema;
+
+	private final DatabaseMetaData metaData;
+	private final DbLoaderDelegate delegate;
+
+	private final DbAttributesLoader attributesLoader;
+
+	public DbTableLoader(String catalog, String schema, DatabaseMetaData metaData, DbLoaderDelegate delegate,
+			DbAttributesLoader attributesLoader) {
+		this.catalog = catalog;
+		this.schema = schema;
+		this.metaData = metaData;
+		this.delegate = delegate;
+
+		this.attributesLoader = attributesLoader;
+	}
+
+	/**
+	 * Returns all tables for given combination of the criteria. Tables returned
+	 * as DbEntities without any attributes or relationships.
+	 *
+	 * @param types
+	 *            The types of table names to retrieve, null returns all types.
+	 * @return
+	 * @since 4.0
+	 */
+	public List<DetectedDbEntity> getDbEntities(TableFilter filters, String[] types) throws SQLException {
+		if (LOGGER.isDebugEnabled()) {
+			LOGGER.debug("Read tables: catalog=" + catalog + ", schema=" + schema + ", types=" + Arrays.toString(types));
+		}
+
+		List<DetectedDbEntity> tables = new LinkedList<DetectedDbEntity>();
+		try (ResultSet rs = metaData.getTables(catalog, schema, WILDCARD, types);) {
+			while (rs.next()) {
+				// Oracle 9i and newer has a nifty recycle bin feature... but we
+				// don't
+				// want dropped tables to be included here; in fact they may
+				// even result
+				// in errors on reverse engineering as their names have special
+				// chars like
+				// "/", etc. So skip them all together
+
+				String name = rs.getString("TABLE_NAME");
+				if (name == null) {
+					continue;
+				}
+
+				DetectedDbEntity table = new DetectedDbEntity(name);
+
+				String catalog = rs.getString("TABLE_CAT");
+				table.setCatalog(catalog);
+
+				String schema = rs.getString("TABLE_SCHEM");
+				table.setSchema(schema);
+				if (!(this.catalog == null || this.catalog.equals(catalog))
+						|| !(this.schema == null || this.schema.equals(schema))) {
+
+					LOGGER.error(catalog + "." + schema + "." + name + " wrongly loaded for catalog/schema : "
+							+ this.catalog + "." + this.schema);
+
+					continue;
+				}
+
+				PatternFilter includeTable = filters.isIncludeTable(table.getName());
+				if (includeTable != null) {
+					tables.add(table);
+				}
+			}
+		}
+		return tables;
+	}
+
+	/**
+	 * Loads dbEntities for the specified tables.
+	 * 
+	 * @param config
+	 * @param types
+	 */
+	public List<DbEntity> loadDbEntities(DataMap map, DbLoaderConfiguration config, String[] types) throws SQLException {
+		/** List of db entities to process. */
+
+		List<DetectedDbEntity> tables = getDbEntities(config.getFiltersConfig().tableFilter(catalog, schema), types);
+
+		List<DbEntity> dbEntities = new ArrayList<DbEntity>();
+		for (DbEntity dbEntity : tables) {
+			DbEntity oldEnt = map.getDbEntity(dbEntity.getName());
+			if (oldEnt != null) {
+				Collection<ObjEntity> oldObjEnt = map.getMappedEntities(oldEnt);
+				if (!oldObjEnt.isEmpty()) {
+					for (ObjEntity objEntity : oldObjEnt) {
+						LOGGER.debug("Delete ObjEntity: " + objEntity.getName());
+						map.removeObjEntity(objEntity.getName(), true);
+						delegate.objEntityRemoved(objEntity);
+					}
+				}
+
+				LOGGER.debug("Overwrite DbEntity: " + oldEnt.getName());
+				map.removeDbEntity(oldEnt.getName(), true);
+				delegate.dbEntityRemoved(oldEnt);
+			}
+
+			map.addDbEntity(dbEntity);
+
+			delegate.dbEntityAdded(dbEntity);
+
+			// delegate might have thrown this entity out... so check if it is
+			// still
+			// around before continuing processing
+			if (map.getDbEntity(dbEntity.getName()) == dbEntity) {
+				dbEntities.add(dbEntity);
+				attributesLoader.loadDbAttributes(dbEntity);
+				if (!config.isSkipPrimaryKeyLoading()) {
+					loadPrimaryKey(dbEntity);
+				}
+			}
+		}
+
+		return dbEntities;
+	}
+
+	private void loadPrimaryKey(DbEntity dbEntity) throws SQLException {
+
+		try (ResultSet rs = metaData.getPrimaryKeys(dbEntity.getCatalog(), dbEntity.getSchema(), dbEntity.getName());) {
+			while (rs.next()) {
+				String columnName = rs.getString("COLUMN_NAME");
+				DbAttribute attribute = dbEntity.getAttribute(columnName);
+
+				if (attribute != null) {
+					attribute.setPrimaryKey(true);
+				} else {
+					// why an attribute might be null is not quiet clear
+					// but there is a bug report 731406 indicating that it is
+					// possible
+					// so just print the warning, and ignore
+					LOGGER.warn("Can't locate attribute for primary key: " + columnName);
+				}
+
+				String pkName = rs.getString("PK_NAME");
+				if (pkName != null && dbEntity instanceof DetectedDbEntity) {
+					((DetectedDbEntity) dbEntity).setPrimaryKeyName(pkName);
+				}
+
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DefaultDbLoaderDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DefaultDbLoaderDelegate.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DefaultDbLoaderDelegate.java
new file mode 100644
index 0000000..cf336df
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DefaultDbLoaderDelegate.java
@@ -0,0 +1,59 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjEntity;
+
+/**
+ * @since 4.0.
+ */
+public class DefaultDbLoaderDelegate implements DbLoaderDelegate {
+
+    @Override
+    public void dbEntityAdded(DbEntity entity) {
+
+    }
+
+    @Override
+    public void dbEntityRemoved(DbEntity entity) {
+
+    }
+
+    @Override
+    public boolean dbRelationship(DbEntity entity) {
+        return true;
+    }
+
+    @Override
+    public boolean dbRelationshipLoaded(DbEntity entity, DbRelationship relationship) {
+        return true;
+    }
+
+    @Override
+    public void objEntityAdded(ObjEntity entity) {
+
+    }
+
+    @Override
+    public void objEntityRemoved(ObjEntity entity) {
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/LoggingDbLoaderDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/LoggingDbLoaderDelegate.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/LoggingDbLoaderDelegate.java
new file mode 100644
index 0000000..3a9a905
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/LoggingDbLoaderDelegate.java
@@ -0,0 +1,76 @@
+/*
+ * 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.reverse.db;
+
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.commons.logging.Log;
+
+/**
+ * @since 4.0
+ */
+public class LoggingDbLoaderDelegate extends DefaultDbLoaderDelegate {
+
+    private final Log logger;
+
+    public LoggingDbLoaderDelegate(Log logger) {
+        this.logger = logger;
+    }
+
+    @Override
+    public void dbEntityAdded(DbEntity entity) {
+        logger.info("  Table: " + entity.getFullyQualifiedName());
+    }
+
+    @Override
+    public void dbEntityRemoved(DbEntity entity) {
+        logger.info("  Table removed: " + entity.getFullyQualifiedName());
+    }
+
+    @Override
+    public boolean dbRelationship(DbEntity entity) {
+        if (logger.isDebugEnabled()) {
+            logger.debug("    Relationships for " + entity.getFullyQualifiedName());
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean dbRelationshipLoaded(DbEntity entity, DbRelationship relationship) {
+        logger.info("    " + relationship);
+
+        return true;
+    }
+
+    @Override
+    public void objEntityAdded(ObjEntity entity) {
+        if (logger.isDebugEnabled()) {
+            logger.debug("  Class: " + entity.getName());
+        }
+    }
+
+    @Override
+    public void objEntityRemoved(ObjEntity entity) {
+        if (logger.isDebugEnabled()) {
+            logger.debug("  Class removed: " + entity.getName());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
new file mode 100644
index 0000000..f185619
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
@@ -0,0 +1,143 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.ExportedKey;
+import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.map.naming.ObjectNameGenerator;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class represent ObjEntity that may be optimized using flattened relationships
+ * as many to many table
+ */
+class ManyToManyCandidateEntity {
+
+    private static final Log LOG = LogFactory.getLog(ManyToManyCandidateEntity.class);
+
+    private final ObjEntity joinEntity;
+
+    private final DbRelationship dbRel1;
+    private final DbRelationship dbRel2;
+
+    private final ObjEntity entity1;
+    private final ObjEntity entity2;
+
+    private final DbRelationship reverseRelationship1;
+    private final DbRelationship reverseRelationship2;
+
+    private ManyToManyCandidateEntity(ObjEntity entityValue, List<ObjRelationship> relationships) {
+        joinEntity = entityValue;
+
+        ObjRelationship rel1 = relationships.get(0);
+        ObjRelationship rel2 = relationships.get(1);
+
+        dbRel1 = rel1.getDbRelationships().get(0);
+        dbRel2 = rel2.getDbRelationships().get(0);
+
+        reverseRelationship1 = dbRel1.getReverseRelationship();
+        reverseRelationship2 = dbRel2.getReverseRelationship();
+
+        entity1 = rel1.getTargetEntity();
+        entity2 = rel2.getTargetEntity();
+    }
+
+    /**
+     * Method check - if current entity represent many to many temporary table
+     *
+     * @return true if current entity is represent many to many table; otherwise returns false
+     */
+    public static ManyToManyCandidateEntity build(ObjEntity joinEntity) {
+        ArrayList<ObjRelationship> relationships = new ArrayList<ObjRelationship>(joinEntity.getRelationships());
+        if (relationships.size() != 2 || (relationships.get(0).getDbRelationships().isEmpty() || relationships.get(1).getDbRelationships().isEmpty())) {
+            return null;
+        }
+
+        ManyToManyCandidateEntity candidateEntity = new ManyToManyCandidateEntity(joinEntity, relationships);
+        if (candidateEntity.isManyToMany()) {
+            return candidateEntity;
+        }
+
+        return null;
+    }
+
+    private boolean isManyToMany() {
+        boolean isNotHaveAttributes = joinEntity.getAttributes().size() == 0;
+
+        return isNotHaveAttributes
+                && reverseRelationship1 != null && reverseRelationship1.isToDependentPK()
+                && reverseRelationship2 != null && reverseRelationship2.isToDependentPK()
+                && entity1 != null && entity2 != null;
+    }
+
+    private void addFlattenedRelationship(ObjectNameGenerator nameGenerator, ObjEntity srcEntity, ObjEntity dstEntity,
+                                          DbRelationship rel1, DbRelationship rel2) {
+
+        if (rel1.getSourceAttributes().isEmpty() && rel2.getTargetAttributes().isEmpty()) {
+            LOG.warn("Wrong call ManyToManyCandidateEntity.addFlattenedRelationship(... , " + srcEntity.getName()
+                    + ", " + dstEntity.getName() + ", ...)");
+
+            return;
+        }
+
+        ExportedKey key = new ExportedKey(
+                rel1.getSourceEntity().getName(),
+                rel1.getSourceAttributes().iterator().next().getName(),
+                null,
+                rel2.getTargetEntity().getName(),
+                rel2.getTargetAttributes().iterator().next().getName(),
+                null,
+                (short) 1);
+
+        ObjRelationship newRelationship = new ObjRelationship();
+        newRelationship.setName(DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, srcEntity,
+                nameGenerator.createDbRelationshipName(key, true)));
+
+        newRelationship.setSourceEntity(srcEntity);
+        newRelationship.setTargetEntityName(dstEntity);
+
+        newRelationship.addDbRelationship(rel1);
+        newRelationship.addDbRelationship(rel2);
+
+        srcEntity.addRelationship(newRelationship);
+    }
+
+    /**
+     * Method make direct relationships between 2 entities and remove relationships to
+     * many to many entity
+     *
+     * @param nameGenerator
+     */
+    public void optimizeRelationships(ObjectNameGenerator nameGenerator) {
+        entity1.removeRelationship(reverseRelationship1.getName());
+        entity2.removeRelationship(reverseRelationship2.getName());
+
+        addFlattenedRelationship(nameGenerator, entity1, entity2, reverseRelationship1, dbRel2);
+        addFlattenedRelationship(nameGenerator, entity2, entity1, reverseRelationship2, dbRel1);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DbMergerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DbMergerTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DbMergerTest.java
index 8cb03dd..a695d2d 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DbMergerTest.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DbMergerTest.java
@@ -20,7 +20,7 @@ package org.apache.cayenne.dbsync.merge;
 
 import org.apache.cayenne.dbsync.merge.builders.DbEntityBuilder;
 import org.apache.cayenne.dbsync.merge.factory.HSQLMergerTokenFactory;
-import org.apache.cayenne.dbsync.reverse.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
index c2357b0..ac68802 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.reverse.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/DbLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/DbLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/DbLoaderIT.java
deleted file mode 100644
index 93539ed..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/DbLoaderIT.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
-import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
-import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.TypesMapping;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.map.*;
-import org.apache.cayenne.unit.UnitDbAdapter;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.ServerCaseDataSourceFactory;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.sql.Connection;
-import java.sql.Types;
-import java.util.Collection;
-import java.util.List;
-
-import static org.junit.Assert.*;
-
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class DbLoaderIT extends ServerCase {
-
-    public static final DbLoaderConfiguration CONFIG = new DbLoaderConfiguration();
-    @Inject
-    private ServerRuntime runtime;
-
-    @Inject
-    private DbAdapter adapter;
-
-    @Inject
-    private ServerCaseDataSourceFactory dataSourceFactory;
-
-    @Inject
-    private UnitDbAdapter accessStackAdapter;
-
-    private DbLoader loader;
-
-    private Connection connection;
-
-    private static String msgForTypeMismatch(DbAttribute origAttr, DbAttribute newAttr) {
-        return msgForTypeMismatch(origAttr.getType(), newAttr);
-    }
-
-    private static String msgForTypeMismatch(int origType, DbAttribute newAttr) {
-        String nt = TypesMapping.getSqlNameByType(newAttr.getType());
-        String ot = TypesMapping.getSqlNameByType(origType);
-        return attrMismatch(newAttr.getName(), "expected type: <" + ot + ">, but was <" + nt + ">");
-    }
-
-    private static String attrMismatch(String attrName, String msg) {
-        return "[Error loading attribute '" + attrName + "': " + msg + "]";
-    }
-
-    @Before
-    public void before() throws Exception {
-        this.connection = dataSourceFactory.getSharedDataSource().getConnection();
-        this.loader = new DbLoader(connection, adapter, null);
-    }
-
-    @After
-    public void after() throws Exception {
-        connection.close();
-    }
-
-    @Test
-    public void testGetTableTypes() throws Exception {
-
-        List<?> tableTypes = loader.getTableTypes();
-
-        assertNotNull(tableTypes);
-
-        String tableLabel = adapter.tableTypeForTable();
-        if (tableLabel != null) {
-            assertTrue("Missing type for table '" + tableLabel + "' - " + tableTypes, tableTypes.contains(tableLabel));
-        }
-
-        String viewLabel = adapter.tableTypeForView();
-        if (viewLabel != null) {
-            assertTrue("Missing type for view '" + viewLabel + "' - " + tableTypes, tableTypes.contains(viewLabel));
-        }
-    }
-
-    @Test
-    public void testGetTables() throws Exception {
-
-        String tableLabel = adapter.tableTypeForTable();
-
-        List<DetectedDbEntity> tables = loader.createTableLoader(null, null, TableFilter.everything())
-                .getDbEntities(TableFilter.everything(), new String[]{tableLabel});
-
-        assertNotNull(tables);
-
-        boolean foundArtist = false;
-
-        for (DetectedDbEntity table : tables) {
-            if ("ARTIST".equalsIgnoreCase(table.getName())) {
-                foundArtist = true;
-                break;
-            }
-        }
-
-        assertTrue("'ARTIST' is missing from the table list: " + tables, foundArtist);
-    }
-
-    @Test
-    public void testGetTablesWithWrongCatalog() throws Exception {
-
-        DbLoaderConfiguration config = new DbLoaderConfiguration();
-        config.setFiltersConfig(
-                FiltersConfig.create("WRONG", null, TableFilter.everything(), PatternFilter.INCLUDE_NOTHING));
-        List<DetectedDbEntity> tables = loader
-                .createTableLoader("WRONG", null, TableFilter.everything())
-                .getDbEntities(TableFilter.everything(), new String[]{adapter.tableTypeForTable()});
-
-        assertNotNull(tables);
-        assertTrue(tables.isEmpty());
-    }
-
-    @Test
-    public void testGetTablesWithWrongSchema() throws Exception {
-
-        DbLoaderConfiguration config = new DbLoaderConfiguration();
-        config.setFiltersConfig(
-                FiltersConfig.create(null, "WRONG", TableFilter.everything(), PatternFilter.INCLUDE_NOTHING));
-        List<DetectedDbEntity> tables = loader
-                .createTableLoader(null, "WRONG", TableFilter.everything())
-                .getDbEntities(TableFilter.everything(), new String[]{adapter.tableTypeForTable()});
-
-        assertNotNull(tables);
-        assertTrue(tables.isEmpty());
-    }
-
-    @Test
-    public void testLoadWithMeaningfulPK() throws Exception {
-
-        DataMap map = new DataMap();
-        String[] tableLabel = {adapter.tableTypeForTable()};
-
-        loader.setCreatingMeaningfulPK(true);
-
-        List<DbEntity> entities = loader
-                .createTableLoader(null, null, TableFilter.everything())
-                .loadDbEntities(map, CONFIG, tableLabel);
-
-        loader.loadObjEntities(map, CONFIG, entities);
-
-        ObjEntity artist = map.getObjEntity("Artist");
-        assertNotNull(artist);
-
-        ObjAttribute id = artist.getAttribute("artistId");
-        assertNotNull(id);
-    }
-
-    /**
-     * DataMap loading is in one big test method, since breaking it in
-     * individual tests would require multiple reads of metatdata which is
-     * extremely slow on some RDBMS (Sybase).
-     */
-    @Test
-    public void testLoad() throws Exception {
-
-        boolean supportsUnique = runtime.getDataDomain().getDataNodes().iterator().next().getAdapter()
-                .supportsUniqueConstraints();
-        boolean supportsLobs = accessStackAdapter.supportsLobs();
-        boolean supportsFK = accessStackAdapter.supportsFKConstraints();
-
-        DataMap map = new DataMap();
-        map.setDefaultPackage("foo.x");
-
-        String tableLabel = adapter.tableTypeForTable();
-
-        // *** TESTING THIS ***
-        List<DbEntity> entities = loader
-                .createTableLoader(null, null, TableFilter.everything())
-                .loadDbEntities(map, CONFIG, new String[]{adapter.tableTypeForTable()});
-
-
-        assertDbEntities(map);
-
-        if (supportsLobs) {
-            assertLobDbEntities(map);
-        }
-
-        // *** TESTING THIS ***
-        loader.loadDbRelationships(CONFIG, null, null, entities);
-
-        if (supportsFK) {
-            Collection<DbRelationship> rels = getDbEntity(map, "ARTIST").getRelationships();
-            assertNotNull(rels);
-            assertTrue(!rels.isEmpty());
-
-            // test one-to-one
-            rels = getDbEntity(map, "PAINTING").getRelationships();
-            assertNotNull(rels);
-
-            // find relationship to PAINTING_INFO
-            DbRelationship oneToOne = null;
-            for (DbRelationship rel : rels) {
-                if ("PAINTING_INFO".equalsIgnoreCase(rel.getTargetEntityName())) {
-                    oneToOne = rel;
-                    break;
-                }
-            }
-
-            assertNotNull("No relationship to PAINTING_INFO", oneToOne);
-            assertFalse("Relationship to PAINTING_INFO must be to-one", oneToOne.isToMany());
-            assertTrue("Relationship to PAINTING_INFO must be to-one", oneToOne.isToDependentPK());
-
-            // test UNIQUE only if FK is supported...
-            if (supportsUnique) {
-                assertUniqueConstraintsInRelationships(map);
-            }
-        }
-
-        // *** TESTING THIS ***
-        loader.setCreatingMeaningfulPK(false);
-        loader.loadObjEntities(map, CONFIG, entities);
-
-        assertObjEntities(map);
-
-        // now when the map is loaded, test
-        // various things
-        // selectively check how different types were processed
-        if (accessStackAdapter.supportsColumnTypeReengineering()) {
-            checkTypes(map);
-        }
-    }
-
-    private void assertUniqueConstraintsInRelationships(DataMap map) {
-        // unfortunately JDBC metadata doesn't provide info for UNIQUE
-        // constraints....
-        // cant reengineer them...
-
-        // find rel to TO_ONEFK1
-        /*
-         * Iterator it = getDbEntity(map,
-         * "TO_ONEFK2").getRelationships().iterator(); DbRelationship rel =
-         * (DbRelationship) it.next(); assertEquals("TO_ONEFK1",
-         * rel.getTargetEntityName());
-         * assertFalse("UNIQUE constraint was ignored...", rel.isToMany());
-         */
-    }
-
-    private void assertDbEntities(DataMap map) {
-        DbEntity dae = getDbEntity(map, "ARTIST");
-        assertNotNull("Null 'ARTIST' entity, other DbEntities: " + map.getDbEntityMap(), dae);
-        assertEquals("ARTIST", dae.getName().toUpperCase());
-
-        DbAttribute a = getDbAttribute(dae, "ARTIST_ID");
-        assertNotNull(a);
-        assertTrue(a.isPrimaryKey());
-        assertFalse(a.isGenerated());
-
-        if (adapter.supportsGeneratedKeys()) {
-            DbEntity bag = getDbEntity(map, "GENERATED_COLUMN_TEST");
-            DbAttribute id = getDbAttribute(bag, "GENERATED_COLUMN");
-            assertTrue(id.isPrimaryKey());
-            assertTrue(id.isGenerated());
-        }
-    }
-
-    private void assertObjEntities(DataMap map) {
-
-        boolean supportsLobs = accessStackAdapter.supportsLobs();
-        boolean supportsFK = accessStackAdapter.supportsFKConstraints();
-
-        ObjEntity ae = map.getObjEntity("Artist");
-        assertNotNull(ae);
-        assertEquals("Artist", ae.getName());
-
-        // assert primary key is not an attribute
-        assertNull(ae.getAttribute("artistId"));
-
-        if (supportsLobs) {
-            assertLobObjEntities(map);
-        }
-
-        if (supportsFK) {
-            Collection<?> rels1 = ae.getRelationships();
-            assertNotNull(rels1);
-            assertTrue(rels1.size() > 0);
-        }
-
-        assertEquals("foo.x.Artist", ae.getClassName());
-    }
-
-    private void assertLobDbEntities(DataMap map) {
-        DbEntity blobEnt = getDbEntity(map, "BLOB_TEST");
-        assertNotNull(blobEnt);
-        DbAttribute blobAttr = getDbAttribute(blobEnt, "BLOB_COL");
-        assertNotNull(blobAttr);
-        assertTrue(msgForTypeMismatch(Types.BLOB, blobAttr), Types.BLOB == blobAttr.getType()
-                || Types.LONGVARBINARY == blobAttr.getType());
-
-        DbEntity clobEnt = getDbEntity(map, "CLOB_TEST");
-        assertNotNull(clobEnt);
-        DbAttribute clobAttr = getDbAttribute(clobEnt, "CLOB_COL");
-        assertNotNull(clobAttr);
-        assertTrue(msgForTypeMismatch(Types.CLOB, clobAttr), Types.CLOB == clobAttr.getType()
-                || Types.LONGVARCHAR == clobAttr.getType());
-
-/*
-        DbEntity nclobEnt = getDbEntity(map, "NCLOB_TEST");
-        assertNotNull(nclobEnt);
-        DbAttribute nclobAttr = getDbAttribute(nclobEnt, "NCLOB_COL");
-        assertNotNull(nclobAttr);
-        assertTrue(msgForTypeMismatch(Types.NCLOB, nclobAttr), Types.NCLOB == nclobAttr.getType()
-                || Types.LONGVARCHAR == nclobAttr.getType());
-*/
-    }
-
-    private void assertLobObjEntities(DataMap map) {
-        ObjEntity blobEnt = map.getObjEntity("BlobTest");
-        assertNotNull(blobEnt);
-        // BLOBs should be mapped as byte[]
-        ObjAttribute blobAttr = blobEnt.getAttribute("blobCol");
-        assertNotNull("BlobTest.blobCol failed to doLoad", blobAttr);
-        assertEquals("byte[]", blobAttr.getType());
-
-
-        ObjEntity clobEnt = map.getObjEntity("ClobTest");
-        assertNotNull(clobEnt);
-        // CLOBs should be mapped as Strings by default
-        ObjAttribute clobAttr = clobEnt.getAttribute("clobCol");
-        assertNotNull(clobAttr);
-        assertEquals(String.class.getName(), clobAttr.getType());
-
-
-        ObjEntity nclobEnt = map.getObjEntity("NclobTest");
-        assertNotNull(nclobEnt);
-        // CLOBs should be mapped as Strings by default
-        ObjAttribute nclobAttr = nclobEnt.getAttribute("nclobCol");
-        assertNotNull(nclobAttr);
-        assertEquals(String.class.getName(), nclobAttr.getType());
-    }
-
-    private DbEntity getDbEntity(DataMap map, String name) {
-        DbEntity de = map.getDbEntity(name);
-        // sometimes table names get converted to lowercase
-        if (de == null) {
-            de = map.getDbEntity(name.toLowerCase());
-        }
-
-        return de;
-    }
-
-    private DbAttribute getDbAttribute(DbEntity ent, String name) {
-        DbAttribute da = ent.getAttribute(name);
-        // sometimes table names get converted to lowercase
-        if (da == null) {
-            da = ent.getAttribute(name.toLowerCase());
-        }
-
-        return da;
-    }
-
-    private DataMap originalMap() {
-        return runtime.getDataDomain().getDataNodes().iterator().next().getDataMaps().iterator().next();
-    }
-
-    /**
-     * Selectively check how different types were processed.
-     */
-    public void checkTypes(DataMap map) {
-        DbEntity dbe = getDbEntity(map, "PAINTING");
-        DbEntity floatTest = getDbEntity(map, "FLOAT_TEST");
-        DbEntity smallintTest = getDbEntity(map, "SMALLINT_TEST");
-        DbAttribute integerAttr = getDbAttribute(dbe, "PAINTING_ID");
-        DbAttribute decimalAttr = getDbAttribute(dbe, "ESTIMATED_PRICE");
-        DbAttribute varcharAttr = getDbAttribute(dbe, "PAINTING_TITLE");
-        DbAttribute floatAttr = getDbAttribute(floatTest, "FLOAT_COL");
-        DbAttribute smallintAttr = getDbAttribute(smallintTest, "SMALLINT_COL");
-
-        // check decimal
-        assertTrue(msgForTypeMismatch(Types.DECIMAL, decimalAttr), Types.DECIMAL == decimalAttr.getType()
-                || Types.NUMERIC == decimalAttr.getType());
-        assertEquals(2, decimalAttr.getScale());
-
-        // check varchar
-        assertEquals(msgForTypeMismatch(Types.VARCHAR, varcharAttr), Types.VARCHAR, varcharAttr.getType());
-        assertEquals(255, varcharAttr.getMaxLength());
-        // check integer
-        assertEquals(msgForTypeMismatch(Types.INTEGER, integerAttr), Types.INTEGER, integerAttr.getType());
-        // check float
-        assertTrue(msgForTypeMismatch(Types.FLOAT, floatAttr), Types.FLOAT == floatAttr.getType()
-                || Types.DOUBLE == floatAttr.getType() || Types.REAL == floatAttr.getType());
-
-        // check smallint
-        assertTrue(msgForTypeMismatch(Types.SMALLINT, smallintAttr), Types.SMALLINT == smallintAttr.getType()
-                || Types.INTEGER == smallintAttr.getType());
-    }
-
-    public void checkAllDBEntities(DataMap map) {
-
-        for (DbEntity origEnt : originalMap().getDbEntities()) {
-            DbEntity newEnt = map.getDbEntity(origEnt.getName());
-            for (DbAttribute origAttr : origEnt.getAttributes()) {
-                DbAttribute newAttr = newEnt.getAttribute(origAttr.getName());
-                assertNotNull("No matching DbAttribute for '" + origAttr.getName(), newAttr);
-                assertEquals(msgForTypeMismatch(origAttr, newAttr), origAttr.getType(), newAttr.getType());
-                // length and precision doesn't have to be the same
-                // it must be greater or equal
-                assertTrue(origAttr.getMaxLength() <= newAttr.getMaxLength());
-                assertTrue(origAttr.getScale() <= newAttr.getScale());
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilderTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilderTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilderTest.java
index 6d945a5..5b1a0e7 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilderTest.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/FiltersConfigBuilderTest.java
@@ -272,7 +272,7 @@ public class FiltersConfigBuilderTest {
     /*@Test
     public void testEmptyDbEntitiesFilters() throws Exception {
         ReverseEngineering engineering = new ReverseEngineering();
-        FiltersConfig executions = new FiltersConfigBuilder(engineering).filtersConfig();
+        FiltersConfig executions = new FiltersConfigBuilder(engineering).build();
 
         assertEquals("If nothing was configured we have to import everything. Filter %/%/% true/true/true",
                 new FiltersConfig(eFilters(path(), TRUE, TRUE, NULL)),
@@ -283,7 +283,7 @@ public class FiltersConfigBuilderTest {
     public void testOnlyOneCatalogDbEntitiesFilters() throws Exception {
         ReverseEngineering engineering = new ReverseEngineering();
         engineering.addCatalog(new Catalog("catalog_01"));
-        FiltersConfig executions = new FiltersConfigBuilder(engineering).filtersConfig();
+        FiltersConfig executions = new FiltersConfigBuilder(engineering).build();
 
 
         assertEquals(new FiltersConfig(eFilters(path("catalog_01", null), TRUE, TRUE, NULL)),
@@ -301,7 +301,7 @@ public class FiltersConfigBuilderTest {
         engineering.addCatalog(new Catalog("catalog_03").schema(new Schema("schema_01")));
         engineering.addCatalog(new Catalog("catalog_03").schema(new Schema("schema_01")));
         engineering.addCatalog(new Catalog("catalog_03").schema(new Schema("schema_01")));
-        FiltersConfig executions = new FiltersConfigBuilder(engineering).filtersConfig();
+        FiltersConfig executions = new FiltersConfigBuilder(engineering).build();
 
 
         assertEquals(new FiltersConfig(
@@ -320,7 +320,7 @@ public class FiltersConfigBuilderTest {
         engineering.addSchema(new Schema("schema_01"));
         engineering.addSchema(new Schema("schema_02"));
         engineering.addSchema(new Schema("schema_03"));
-        FiltersConfig executions = new FiltersConfigBuilder(engineering).filtersConfig();
+        FiltersConfig executions = new FiltersConfigBuilder(engineering).build();
 
 
         assertEquals(new FiltersConfig(
@@ -341,7 +341,7 @@ public class FiltersConfigBuilderTest {
         engineering.addExcludeColumn(new ExcludeColumn("ExcludeColumn"));
         engineering.addExcludeProcedure(new ExcludeProcedure("ExcludeProcedure"));
 
-        FiltersConfig executions = new FiltersConfigBuilder(engineering).filtersConfig();
+        FiltersConfig executions = new FiltersConfigBuilder(engineering).build();
 
         assertEquals(new FiltersConfig(
                         eFilters(path(),
@@ -367,7 +367,7 @@ public class FiltersConfigBuilderTest {
         ReverseEngineering engineering = new ReverseEngineering();
         engineering.addCatalog(catalog);
 
-        FiltersConfig executions = new FiltersConfigBuilder(engineering).filtersConfig();
+        FiltersConfig executions = new FiltersConfigBuilder(engineering).build();
 
         assertEquals(new FiltersConfig(
                         eFilters(path("catalog", "schema"), include("table"), NULL, NULL),
@@ -385,7 +385,7 @@ public class FiltersConfigBuilderTest {
         builder.add(new EntityFilters(path, NULL, NULL, NULL));
         builder.add(new EntityFilters(path, NULL, NULL, NULL));
 
-        EntityFilters filter = builder.filtersConfig().filter(path);
+        EntityFilters filter = builder.build().filter(path);
         assertFalse(filter.isEmpty());
     }*/
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/ManyToManyCandidateEntityTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/ManyToManyCandidateEntityTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/ManyToManyCandidateEntityTest.java
deleted file mode 100644
index edecdfc..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/ManyToManyCandidateEntityTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*****************************************************************
- *   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.reverse;
-
-import org.apache.cayenne.configuration.ConfigurationNameMapper;
-import org.apache.cayenne.configuration.ConfigurationTree;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataMapLoader;
-import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
-import org.apache.cayenne.configuration.XMLDataChannelDescriptorLoader;
-import org.apache.cayenne.configuration.XMLDataMapLoader;
-import org.apache.cayenne.di.AdhocObjectFactory;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.ClassLoaderManager;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
-import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.Relationship;
-import org.apache.cayenne.map.naming.LegacyNameGenerator;
-import org.apache.cayenne.resource.URLResource;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.net.URL;
-import java.util.ArrayList;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-public class ManyToManyCandidateEntityTest {
-
-    private DataMap map;
-
-    @Before
-    public void setUp() throws Exception {
-        Module testModule = new Module() {
-
-            public void configure(Binder binder) {
-                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
-                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
-                binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
-                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
-            }
-        };
-
-        Injector injector = DIBootstrap.createInjector(testModule);
-
-        // create and initialize loader instance to test
-        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
-        injector.injectMembers(loader);
-
-        String testConfigName = "relationship-optimisation";
-        URL url = getClass().getResource("cayenne-" + testConfigName + ".xml");
-
-        ConfigurationTree<DataChannelDescriptor> tree = loader.load(new URLResource(url));
-
-        map = tree.getRootNode().getDataMap(testConfigName);
-    }
-
-    @Test
-    public void testMatchingForManyToManyEntity() throws Exception {
-        ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2");
-
-        assertNotNull(ManyToManyCandidateEntity.build(manyToManyEntity));
-    }
-
-    @Test
-    public void testMatchingForNotManyToManyEntity() throws Exception {
-        ObjEntity entity = map.getObjEntity("Table1");
-
-        assertNull(ManyToManyCandidateEntity.build(entity));
-    }
-
-    @Test
-    public void testOptimisationForManyToManyEntity() {
-        ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2");
-
-        ManyToManyCandidateEntity.build(manyToManyEntity).optimizeRelationships(new LegacyNameGenerator());
-
-        ObjEntity table1Entity = map.getObjEntity("Table1");
-        ObjEntity table2Entity = map.getObjEntity("Table2");
-
-        assertEquals(1, table1Entity.getRelationships().size());
-        assertEquals(table2Entity, new ArrayList<Relationship>(table1Entity.getRelationships()).get(0)
-                .getTargetEntity());
-
-        assertEquals(1, table2Entity.getRelationships().size());
-        assertEquals(table1Entity, new ArrayList<Relationship>(table2Entity.getRelationships()).get(0)
-                .getTargetEntity());
-    }
-
-}


[2/9] cayenne git commit: CAY-2115 DbLoader - allow loading DataMap without Obj layer

Posted by aa...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderIT.java
new file mode 100644
index 0000000..930d696
--- /dev/null
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderIT.java
@@ -0,0 +1,418 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
+import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
+import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.*;
+import org.apache.cayenne.unit.UnitDbAdapter;
+import org.apache.cayenne.unit.di.server.CayenneProjects;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.ServerCaseDataSourceFactory;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.Types;
+import java.util.Collection;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
+public class DbLoaderIT extends ServerCase {
+
+    public static final DbLoaderConfiguration CONFIG = new DbLoaderConfiguration();
+    @Inject
+    private ServerRuntime runtime;
+
+    @Inject
+    private DbAdapter adapter;
+
+    @Inject
+    private ServerCaseDataSourceFactory dataSourceFactory;
+
+    @Inject
+    private UnitDbAdapter accessStackAdapter;
+
+    private DbLoader loader;
+
+    private Connection connection;
+
+    private static String msgForTypeMismatch(DbAttribute origAttr, DbAttribute newAttr) {
+        return msgForTypeMismatch(origAttr.getType(), newAttr);
+    }
+
+    private static String msgForTypeMismatch(int origType, DbAttribute newAttr) {
+        String nt = TypesMapping.getSqlNameByType(newAttr.getType());
+        String ot = TypesMapping.getSqlNameByType(origType);
+        return attrMismatch(newAttr.getName(), "expected type: <" + ot + ">, but was <" + nt + ">");
+    }
+
+    private static String attrMismatch(String attrName, String msg) {
+        return "[Error loading attribute '" + attrName + "': " + msg + "]";
+    }
+
+    @Before
+    public void before() throws Exception {
+        this.connection = dataSourceFactory.getSharedDataSource().getConnection();
+        this.loader = new DbLoader(connection, adapter, null);
+    }
+
+    @After
+    public void after() throws Exception {
+        connection.close();
+    }
+
+    @Test
+    public void testGetTables() throws Exception {
+
+        String tableLabel = adapter.tableTypeForTable();
+
+        List<DetectedDbEntity> tables = loader.createTableLoader(null, null, TableFilter.everything())
+                .getDbEntities(TableFilter.everything(), new String[]{tableLabel});
+
+        assertNotNull(tables);
+
+        boolean foundArtist = false;
+
+        for (DetectedDbEntity table : tables) {
+            if ("ARTIST".equalsIgnoreCase(table.getName())) {
+                foundArtist = true;
+                break;
+            }
+        }
+
+        assertTrue("'ARTIST' is missing from the table list: " + tables, foundArtist);
+    }
+
+    @Test
+    public void testGetTablesWithWrongCatalog() throws Exception {
+
+        DbLoaderConfiguration config = new DbLoaderConfiguration();
+        config.setFiltersConfig(
+                FiltersConfig.create("WRONG", null, TableFilter.everything(), PatternFilter.INCLUDE_NOTHING));
+        List<DetectedDbEntity> tables = loader
+                .createTableLoader("WRONG", null, TableFilter.everything())
+                .getDbEntities(TableFilter.everything(), new String[]{adapter.tableTypeForTable()});
+
+        assertNotNull(tables);
+        assertTrue(tables.isEmpty());
+    }
+
+    @Test
+    public void testGetTablesWithWrongSchema() throws Exception {
+
+        DbLoaderConfiguration config = new DbLoaderConfiguration();
+        config.setFiltersConfig(
+                FiltersConfig.create(null, "WRONG", TableFilter.everything(), PatternFilter.INCLUDE_NOTHING));
+        List<DetectedDbEntity> tables = loader
+                .createTableLoader(null, "WRONG", TableFilter.everything())
+                .getDbEntities(TableFilter.everything(), new String[]{adapter.tableTypeForTable()});
+
+        assertNotNull(tables);
+        assertTrue(tables.isEmpty());
+    }
+
+    @Test
+    public void testLoadWithMeaningfulPK() throws Exception {
+
+        DataMap map = new DataMap();
+        String[] tableLabel = {adapter.tableTypeForTable()};
+
+        loader.setCreatingMeaningfulPK(true);
+
+        List<DbEntity> entities = loader
+                .createTableLoader(null, null, TableFilter.everything())
+                .loadDbEntities(map, CONFIG, tableLabel);
+
+        loader.loadObjEntities(map, CONFIG, entities);
+
+        ObjEntity artist = map.getObjEntity("Artist");
+        assertNotNull(artist);
+
+        ObjAttribute id = artist.getAttribute("artistId");
+        assertNotNull(id);
+    }
+
+    /**
+     * DataMap loading is in one big test method, since breaking it in
+     * individual tests would require multiple reads of metatdata which is
+     * extremely slow on some RDBMS (Sybase).
+     */
+    @Test
+    public void testLoad() throws Exception {
+
+        boolean supportsUnique = runtime.getDataDomain().getDataNodes().iterator().next().getAdapter()
+                .supportsUniqueConstraints();
+        boolean supportsLobs = accessStackAdapter.supportsLobs();
+        boolean supportsFK = accessStackAdapter.supportsFKConstraints();
+
+        DataMap map = new DataMap();
+        map.setDefaultPackage("foo.x");
+
+        String tableLabel = adapter.tableTypeForTable();
+
+        // *** TESTING THIS ***
+        List<DbEntity> entities = loader
+                .createTableLoader(null, null, TableFilter.everything())
+                .loadDbEntities(map, CONFIG, new String[]{adapter.tableTypeForTable()});
+
+
+        assertDbEntities(map);
+
+        if (supportsLobs) {
+            assertLobDbEntities(map);
+        }
+
+        // *** TESTING THIS ***
+        loader.loadDbRelationships(CONFIG, null, null, entities);
+
+        if (supportsFK) {
+            Collection<DbRelationship> rels = getDbEntity(map, "ARTIST").getRelationships();
+            assertNotNull(rels);
+            assertTrue(!rels.isEmpty());
+
+            // test one-to-one
+            rels = getDbEntity(map, "PAINTING").getRelationships();
+            assertNotNull(rels);
+
+            // find relationship to PAINTING_INFO
+            DbRelationship oneToOne = null;
+            for (DbRelationship rel : rels) {
+                if ("PAINTING_INFO".equalsIgnoreCase(rel.getTargetEntityName())) {
+                    oneToOne = rel;
+                    break;
+                }
+            }
+
+            assertNotNull("No relationship to PAINTING_INFO", oneToOne);
+            assertFalse("Relationship to PAINTING_INFO must be to-one", oneToOne.isToMany());
+            assertTrue("Relationship to PAINTING_INFO must be to-one", oneToOne.isToDependentPK());
+
+            // test UNIQUE only if FK is supported...
+            if (supportsUnique) {
+                assertUniqueConstraintsInRelationships(map);
+            }
+        }
+
+        // *** TESTING THIS ***
+        loader.setCreatingMeaningfulPK(false);
+        loader.loadObjEntities(map, CONFIG, entities);
+
+        assertObjEntities(map);
+
+        // now when the map is loaded, test
+        // various things
+        // selectively check how different types were processed
+        if (accessStackAdapter.supportsColumnTypeReengineering()) {
+            checkTypes(map);
+        }
+    }
+
+    private void assertUniqueConstraintsInRelationships(DataMap map) {
+        // unfortunately JDBC metadata doesn't provide info for UNIQUE
+        // constraints....
+        // cant reengineer them...
+
+        // find rel to TO_ONEFK1
+        /*
+         * Iterator it = getDbEntity(map,
+         * "TO_ONEFK2").getRelationships().iterator(); DbRelationship rel =
+         * (DbRelationship) it.next(); assertEquals("TO_ONEFK1",
+         * rel.getTargetEntityName());
+         * assertFalse("UNIQUE constraint was ignored...", rel.isToMany());
+         */
+    }
+
+    private void assertDbEntities(DataMap map) {
+        DbEntity dae = getDbEntity(map, "ARTIST");
+        assertNotNull("Null 'ARTIST' entity, other DbEntities: " + map.getDbEntityMap(), dae);
+        assertEquals("ARTIST", dae.getName().toUpperCase());
+
+        DbAttribute a = getDbAttribute(dae, "ARTIST_ID");
+        assertNotNull(a);
+        assertTrue(a.isPrimaryKey());
+        assertFalse(a.isGenerated());
+
+        if (adapter.supportsGeneratedKeys()) {
+            DbEntity bag = getDbEntity(map, "GENERATED_COLUMN_TEST");
+            DbAttribute id = getDbAttribute(bag, "GENERATED_COLUMN");
+            assertTrue(id.isPrimaryKey());
+            assertTrue(id.isGenerated());
+        }
+    }
+
+    private void assertObjEntities(DataMap map) {
+
+        boolean supportsLobs = accessStackAdapter.supportsLobs();
+        boolean supportsFK = accessStackAdapter.supportsFKConstraints();
+
+        ObjEntity ae = map.getObjEntity("Artist");
+        assertNotNull(ae);
+        assertEquals("Artist", ae.getName());
+
+        // assert primary key is not an attribute
+        assertNull(ae.getAttribute("artistId"));
+
+        if (supportsLobs) {
+            assertLobObjEntities(map);
+        }
+
+        if (supportsFK) {
+            Collection<?> rels1 = ae.getRelationships();
+            assertNotNull(rels1);
+            assertTrue(rels1.size() > 0);
+        }
+
+        assertEquals("foo.x.Artist", ae.getClassName());
+    }
+
+    private void assertLobDbEntities(DataMap map) {
+        DbEntity blobEnt = getDbEntity(map, "BLOB_TEST");
+        assertNotNull(blobEnt);
+        DbAttribute blobAttr = getDbAttribute(blobEnt, "BLOB_COL");
+        assertNotNull(blobAttr);
+        assertTrue(msgForTypeMismatch(Types.BLOB, blobAttr), Types.BLOB == blobAttr.getType()
+                || Types.LONGVARBINARY == blobAttr.getType());
+
+        DbEntity clobEnt = getDbEntity(map, "CLOB_TEST");
+        assertNotNull(clobEnt);
+        DbAttribute clobAttr = getDbAttribute(clobEnt, "CLOB_COL");
+        assertNotNull(clobAttr);
+        assertTrue(msgForTypeMismatch(Types.CLOB, clobAttr), Types.CLOB == clobAttr.getType()
+                || Types.LONGVARCHAR == clobAttr.getType());
+
+/*
+        DbEntity nclobEnt = getDbEntity(map, "NCLOB_TEST");
+        assertNotNull(nclobEnt);
+        DbAttribute nclobAttr = getDbAttribute(nclobEnt, "NCLOB_COL");
+        assertNotNull(nclobAttr);
+        assertTrue(msgForTypeMismatch(Types.NCLOB, nclobAttr), Types.NCLOB == nclobAttr.getType()
+                || Types.LONGVARCHAR == nclobAttr.getType());
+*/
+    }
+
+    private void assertLobObjEntities(DataMap map) {
+        ObjEntity blobEnt = map.getObjEntity("BlobTest");
+        assertNotNull(blobEnt);
+        // BLOBs should be mapped as byte[]
+        ObjAttribute blobAttr = blobEnt.getAttribute("blobCol");
+        assertNotNull("BlobTest.blobCol failed to doLoad", blobAttr);
+        assertEquals("byte[]", blobAttr.getType());
+
+
+        ObjEntity clobEnt = map.getObjEntity("ClobTest");
+        assertNotNull(clobEnt);
+        // CLOBs should be mapped as Strings by default
+        ObjAttribute clobAttr = clobEnt.getAttribute("clobCol");
+        assertNotNull(clobAttr);
+        assertEquals(String.class.getName(), clobAttr.getType());
+
+
+        ObjEntity nclobEnt = map.getObjEntity("NclobTest");
+        assertNotNull(nclobEnt);
+        // CLOBs should be mapped as Strings by default
+        ObjAttribute nclobAttr = nclobEnt.getAttribute("nclobCol");
+        assertNotNull(nclobAttr);
+        assertEquals(String.class.getName(), nclobAttr.getType());
+    }
+
+    private DbEntity getDbEntity(DataMap map, String name) {
+        DbEntity de = map.getDbEntity(name);
+        // sometimes table names get converted to lowercase
+        if (de == null) {
+            de = map.getDbEntity(name.toLowerCase());
+        }
+
+        return de;
+    }
+
+    private DbAttribute getDbAttribute(DbEntity ent, String name) {
+        DbAttribute da = ent.getAttribute(name);
+        // sometimes table names get converted to lowercase
+        if (da == null) {
+            da = ent.getAttribute(name.toLowerCase());
+        }
+
+        return da;
+    }
+
+    private DataMap originalMap() {
+        return runtime.getDataDomain().getDataNodes().iterator().next().getDataMaps().iterator().next();
+    }
+
+    /**
+     * Selectively check how different types were processed.
+     */
+    public void checkTypes(DataMap map) {
+        DbEntity dbe = getDbEntity(map, "PAINTING");
+        DbEntity floatTest = getDbEntity(map, "FLOAT_TEST");
+        DbEntity smallintTest = getDbEntity(map, "SMALLINT_TEST");
+        DbAttribute integerAttr = getDbAttribute(dbe, "PAINTING_ID");
+        DbAttribute decimalAttr = getDbAttribute(dbe, "ESTIMATED_PRICE");
+        DbAttribute varcharAttr = getDbAttribute(dbe, "PAINTING_TITLE");
+        DbAttribute floatAttr = getDbAttribute(floatTest, "FLOAT_COL");
+        DbAttribute smallintAttr = getDbAttribute(smallintTest, "SMALLINT_COL");
+
+        // check decimal
+        assertTrue(msgForTypeMismatch(Types.DECIMAL, decimalAttr), Types.DECIMAL == decimalAttr.getType()
+                || Types.NUMERIC == decimalAttr.getType());
+        assertEquals(2, decimalAttr.getScale());
+
+        // check varchar
+        assertEquals(msgForTypeMismatch(Types.VARCHAR, varcharAttr), Types.VARCHAR, varcharAttr.getType());
+        assertEquals(255, varcharAttr.getMaxLength());
+        // check integer
+        assertEquals(msgForTypeMismatch(Types.INTEGER, integerAttr), Types.INTEGER, integerAttr.getType());
+        // check float
+        assertTrue(msgForTypeMismatch(Types.FLOAT, floatAttr), Types.FLOAT == floatAttr.getType()
+                || Types.DOUBLE == floatAttr.getType() || Types.REAL == floatAttr.getType());
+
+        // check smallint
+        assertTrue(msgForTypeMismatch(Types.SMALLINT, smallintAttr), Types.SMALLINT == smallintAttr.getType()
+                || Types.INTEGER == smallintAttr.getType());
+    }
+
+    public void checkAllDBEntities(DataMap map) {
+
+        for (DbEntity origEnt : originalMap().getDbEntities()) {
+            DbEntity newEnt = map.getDbEntity(origEnt.getName());
+            for (DbAttribute origAttr : origEnt.getAttributes()) {
+                DbAttribute newAttr = newEnt.getAttribute(origAttr.getName());
+                assertNotNull("No matching DbAttribute for '" + origAttr.getName(), newAttr);
+                assertEquals(msgForTypeMismatch(origAttr, newAttr), origAttr.getType(), newAttr.getType());
+                // length and precision doesn't have to be the same
+                // it must be greater or equal
+                assertTrue(origAttr.getMaxLength() <= newAttr.getMaxLength());
+                assertTrue(origAttr.getScale() <= newAttr.getScale());
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntityTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntityTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntityTest.java
new file mode 100644
index 0000000..b4ab34c
--- /dev/null
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntityTest.java
@@ -0,0 +1,113 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import org.apache.cayenne.configuration.ConfigurationNameMapper;
+import org.apache.cayenne.configuration.ConfigurationTree;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.DataMapLoader;
+import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
+import org.apache.cayenne.configuration.XMLDataChannelDescriptorLoader;
+import org.apache.cayenne.configuration.XMLDataMapLoader;
+import org.apache.cayenne.di.AdhocObjectFactory;
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
+import org.apache.cayenne.di.DIBootstrap;
+import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.Relationship;
+import org.apache.cayenne.map.naming.LegacyNameGenerator;
+import org.apache.cayenne.resource.URLResource;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.net.URL;
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+public class ManyToManyCandidateEntityTest {
+
+    private DataMap map;
+
+    @Before
+    public void setUp() throws Exception {
+        Module testModule = new Module() {
+
+            public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
+                binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
+            }
+        };
+
+        Injector injector = DIBootstrap.createInjector(testModule);
+
+        // create and initialize loader instance to test
+        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
+        injector.injectMembers(loader);
+
+        String testConfigName = "relationship-optimisation";
+        URL url = getClass().getResource("cayenne-" + testConfigName + ".xml");
+
+        ConfigurationTree<DataChannelDescriptor> tree = loader.load(new URLResource(url));
+
+        map = tree.getRootNode().getDataMap(testConfigName);
+    }
+
+    @Test
+    public void testMatchingForManyToManyEntity() throws Exception {
+        ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2");
+
+        assertNotNull(ManyToManyCandidateEntity.build(manyToManyEntity));
+    }
+
+    @Test
+    public void testMatchingForNotManyToManyEntity() throws Exception {
+        ObjEntity entity = map.getObjEntity("Table1");
+
+        assertNull(ManyToManyCandidateEntity.build(entity));
+    }
+
+    @Test
+    public void testOptimisationForManyToManyEntity() {
+        ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2");
+
+        ManyToManyCandidateEntity.build(manyToManyEntity).optimizeRelationships(new LegacyNameGenerator());
+
+        ObjEntity table1Entity = map.getObjEntity("Table1");
+        ObjEntity table2Entity = map.getObjEntity("Table2");
+
+        assertEquals(1, table1Entity.getRelationships().size());
+        assertEquals(table2Entity, new ArrayList<Relationship>(table1Entity.getRelationships()).get(0)
+                .getTargetEntity());
+
+        assertEquals(1, table2Entity.getRelationships().size());
+        assertEquals(table1Entity, new ArrayList<Relationship>(table2Entity.getRelationships()).get(0)
+                .getTargetEntity());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index f1797f1..8da5038 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -81,7 +81,7 @@ public class DbImporterTask extends Task {
         File dataMapFile = config.getDataMapFile();
         config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering)
                 .add(filterBuilder)
-                .filtersConfig());
+                .build());
 
         validateAttributes();
 
@@ -134,7 +134,7 @@ public class DbImporterTask extends Task {
                             dataMap.setReverseEngineering(reverseEngineering);
 
                             FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(dataMap.getReverseEngineering());
-                            config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.filtersConfig());
+                            config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.build());
                             validateDbImportConfiguration(config, injector);
                             injector.getInstance(DbImportAction.class).execute(config);
                         } catch (Exception ex) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
index 296a452..ea0f6c7 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
@@ -26,11 +26,11 @@ import org.apache.cayenne.dbsync.merge.DbMergerConfig;
 import org.apache.cayenne.dbsync.merge.DefaultModelMergeDelegate;
 import org.apache.cayenne.dbsync.merge.EntityMergeSupport;
 import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
-import org.apache.cayenne.dbsync.reverse.DbLoader;
-import org.apache.cayenne.dbsync.reverse.DbLoaderConfiguration;
-import org.apache.cayenne.dbsync.reverse.DbLoaderDelegate;
-import org.apache.cayenne.dbsync.reverse.DefaultDbLoaderDelegate;
-import org.apache.cayenne.dbsync.reverse.LoggingDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.NameFilter;
 import org.apache.cayenne.dbsync.reverse.NamePatternMatcher;
 import org.apache.cayenne.dbsync.reverse.filters.CatalogFilter;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportDbLoaderDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportDbLoaderDelegate.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportDbLoaderDelegate.java
index bc6abab..0de47ab 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportDbLoaderDelegate.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportDbLoaderDelegate.java
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.tools.dbimport;
 
-import org.apache.cayenne.dbsync.reverse.DefaultDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
index 2eeb664..7d17fd7 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
@@ -32,7 +32,7 @@ import org.apache.cayenne.dbsync.merge.MergerToken;
 import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
 import org.apache.cayenne.dbsync.merge.ProxyModelMergeDelegate;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.dbsync.reverse.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.EntityResolver;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java
index 5a7c357..45f6478 100644
--- a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java
+++ b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java
@@ -33,9 +33,9 @@ import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.merge.MergerToken;
 import org.apache.cayenne.dbsync.merge.builders.DataMapBuilder;
 import org.apache.cayenne.dbsync.merge.factory.DefaultMergerTokenFactory;
-import org.apache.cayenne.dbsync.reverse.DbLoader;
-import org.apache.cayenne.dbsync.reverse.DbLoaderConfiguration;
-import org.apache.cayenne.dbsync.reverse.DbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.map.DataMap;
@@ -100,11 +100,6 @@ public class DefaultDbImportActionTest {
 			public void load(DataMap dataMap, DbLoaderConfiguration config) throws SQLException {
 				new DataMapBuilder(dataMap).withDbEntities(2).build();
 			}
-
-			@Override
-			public String[] getDefaultTableTypes() {
-				return null;
-			}
 		};
 
         DbImportConfiguration params = mock(DbImportConfiguration.class);
@@ -150,11 +145,6 @@ public class DefaultDbImportActionTest {
                                 objAttr("name").type(String.class).dbPath("NAME")
                         ));
             }
-
-			@Override
-			public String[] getDefaultTableTypes() {
-				return null;
-			}
 		};
 
         DbImportConfiguration params = mock(DbImportConfiguration.class);
@@ -213,11 +203,6 @@ public class DefaultDbImportActionTest {
                                 dbAttr("NAME").typeVarchar(100).mandatory()
                         ));
             }
-
-			@Override
-			public String[] getDefaultTableTypes() {
-				return null;
-			}
 		};
 
         DbImportConfiguration params = mock(DbImportConfiguration.class);
@@ -253,7 +238,6 @@ public class DefaultDbImportActionTest {
 	@Test
 	public void testImportWithDbError() throws Exception {
 		DbLoader dbLoader = mock(DbLoader.class);
-		when(dbLoader.getDefaultTableTypes()).thenReturn(null);
 		doThrow(new SQLException()).when(dbLoader).load(any(DataMap.class), any(DbLoaderConfiguration.class));
 
         DbImportConfiguration params = mock(DbImportConfiguration.class);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index 6a665fe..b8e7383 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.modeler.action;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.reverse.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.db.DataSourceController;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
index 35f4cb1..a9016c8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
@@ -24,8 +24,8 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.CayenneDbSyncModule;
-import org.apache.cayenne.dbsync.reverse.DbLoader;
-import org.apache.cayenne.dbsync.reverse.DefaultDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.FiltersConfigBuilder;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
@@ -359,7 +359,7 @@ public class DbLoaderHelper {
             }
 
             FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering);
-            config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.filtersConfig());
+            config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.build());
 
 
             ModelerDbImportAction importAction = new ModelerDbImportAction(logObj, DbLoaderHelper.this);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
index 0d07706..b8e2a08 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
@@ -30,7 +30,7 @@ import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.merge.MergerToken;
 import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.dbsync.reverse.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbLoader.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbLoader.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbLoader.java
index 15d15b0..6ca30af 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbLoader.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbLoader.java
@@ -18,9 +18,9 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.dialog.db;
 
-import org.apache.cayenne.dbsync.reverse.DbLoader;
-import org.apache.cayenne.dbsync.reverse.DbLoaderConfiguration;
-import org.apache.cayenne.dbsync.reverse.DefaultDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.CatalogFilter;
 import org.apache.cayenne.dbsync.reverse.filters.SchemaFilter;
 import org.apache.cayenne.map.DataMap;
@@ -70,10 +70,8 @@ class ModelerDbLoader extends DbLoader {
     public void load(DataMap dataMap, DbLoaderConfiguration config) throws SQLException {
         LOGGER.info("Schema loading...");
 
-        String[] types = config.getTableTypes();
-        if (types == null || types.length == 0) {
-            types = getDefaultTableTypes();
-        }
+        String[] types = getTableTypes(config);
+
         boolean isNullDetected = false;
         for (CatalogFilter catalog : config.getFiltersConfig().catalogs) {
             for (SchemaFilter schema : catalog.schemas) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
index da5dc7a..4e1172b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
@@ -20,8 +20,8 @@ package org.apache.cayenne.modeler.dialog.db;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbimport.ReverseEngineering;
-import org.apache.cayenne.dbsync.reverse.DbLoader;
-import org.apache.cayenne.dbsync.reverse.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
 import org.apache.cayenne.dbsync.reverse.FiltersConfigBuilder;
 import org.apache.cayenne.modeler.ClassLoadingService;
 import org.apache.cayenne.modeler.ProjectController;
@@ -107,7 +107,7 @@ public class ReverseEngineeringController extends CayenneController {
 
             FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering);
             DbLoaderConfiguration dbLoaderConfiguration = new DbLoaderConfiguration();
-            dbLoaderConfiguration.setFiltersConfig(filtersConfigBuilder.filtersConfig());
+            dbLoaderConfiguration.setFiltersConfig(filtersConfigBuilder.build());
 
             try(Connection connection = dataSource.getConnection()) {
                 DbLoader dbLoader = new ModelerDbLoader(this, treeEditor, connection);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/cf172fc9/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java b/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
index 7c8872b..c96e904 100644
--- a/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
+++ b/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
@@ -319,7 +319,7 @@ public class DbImporterMojo extends AbstractMojo {
                             dataMap.setReverseEngineering(reverseEngineering);
 
                             FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(dataMap.getReverseEngineering());
-                            config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.filtersConfig());
+                            config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.build());
                             validateDbImportConfiguration(config, injector);
                             injector.getInstance(DbImportAction.class).execute(config);
                         } catch (Exception ex) {
@@ -382,7 +382,7 @@ public class DbImporterMojo extends AbstractMojo {
         config.setUsername(username);
         config.setUsePrimitives(usePrimitives);
         config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering)
-                .add(filterBuilder).filtersConfig());
+                .add(filterBuilder).build());
         config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading());
         config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
         config.setTableTypes(reverseEngineering.getTableTypes());


[8/9] cayenne git commit: CAY-2118 cdbimport: drop support for the old style of table filtering

Posted by aa...@apache.org.
CAY-2118 cdbimport: drop support for the old style of table filtering

* maven


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

Branch: refs/heads/master
Commit: e9e81a6ed886428c118e0b03af89d1fb104e3a6e
Parents: ab6c204
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 13:51:20 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 17:16:49 2016 +0300

----------------------------------------------------------------------
 .../reverse/db/DbAttributesPerSchemaLoader.java | 11 +--
 .../DefaultReverseEngineeringLoaderTest.java    |  5 +-
 .../tools/DbImporterMojoConfigurationTest.java  | 54 +++++++++----
 .../cayenne/tools/DbImporterMojoTest.java       | 12 +--
 .../tools/config/pom-catalog-and-schema.xml     | 82 +++++++++----------
 .../apache/cayenne/tools/config/pom-catalog.xml | 84 ++++++++++----------
 .../apache/cayenne/tools/config/pom-schema.xml  | 84 ++++++++++----------
 .../tools/dbimport/testDefaultPackage-pom.xml   | 28 ++++---
 .../dbimport/testFilteringWithSchema-pom.xml    | 28 ++++---
 .../testOldParamsSchemasAndTableExclude-pom.xml | 43 ----------
 ...dParamsSchemasAndTableExclude.map.xml-result | 37 ---------
 .../testOldParamsSchemasAndTableExclude.sql     | 64 ---------------
 .../testPreserveCustomObjMappings-pom.xml       | 33 ++++----
 .../dbimport/testSchemasAndTableExclude-pom.xml | 35 ++++----
 .../tools/dbimport/testSimpleFiltering-pom.xml  | 41 ----------
 .../dbimport/testSimpleFiltering.map.xml-result | 37 ---------
 .../tools/dbimport/testSimpleFiltering.sql      | 37 ---------
 ...SupportsCatalogsOnReverseEngineering-pom.xml |  9 ++-
 .../tools/dbimport/testViewsExclude-pom.xml     | 28 ++++---
 .../apache/cayenne/tools/dbimporter-pom3.xml    |  3 +-
 20 files changed, 267 insertions(+), 488 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesPerSchemaLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesPerSchemaLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesPerSchemaLoader.java
index cd26db7..77896c8 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesPerSchemaLoader.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbAttributesPerSchemaLoader.java
@@ -18,6 +18,11 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.reverse.db;
 
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
+import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.map.DbAttribute;
+
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
@@ -29,11 +34,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
-import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.map.DbAttribute;
-
 /**
  * Load all attributes for schema and return it for each table
  * */
@@ -74,6 +74,7 @@ public class DbAttributesPerSchemaLoader extends DbAttributesBaseLoader {
 				String tableName = rs.getString("TABLE_NAME");
 				String columnName = rs.getString("COLUMN_NAME");
 
+				// TODO: instead of elaborate filtering, can we just limit this to the tables that we already have?
 				PatternFilter columnFilter = filter.isIncludeTable(tableName);
 				/*
 				 * Here is possible optimization if filter will contain

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/cayenne-server/src/test/java/org/apache/cayenne/dbimport/DefaultReverseEngineeringLoaderTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/dbimport/DefaultReverseEngineeringLoaderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/dbimport/DefaultReverseEngineeringLoaderTest.java
index c478db7..dd88eda 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/dbimport/DefaultReverseEngineeringLoaderTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/dbimport/DefaultReverseEngineeringLoaderTest.java
@@ -36,11 +36,10 @@ public class DefaultReverseEngineeringLoaderTest {
         assertEquals("catalog-name-01", catalogs.next().getName());
         assertEquals("catalog-name-02", catalogs.next().getName());
 
-        assertCatalog(catalogs);
+        assertCatalog(catalogs.next());
     }
 
-    public static void assertCatalog(Iterator<Catalog> catalogs) {
-        Catalog catalog = catalogs.next();
+    public static void assertCatalog(Catalog catalog ) {
         assertEquals("catalog-name-03", catalog.getName());
 
         Iterator<IncludeTable> includeTables = catalog.getIncludeTables().iterator();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
index f76eb90..20a65fa 100644
--- a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
+++ b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
@@ -18,33 +18,55 @@
  ****************************************************************/
 package org.apache.cayenne.tools;
 
-import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.*;
-
+import org.apache.cayenne.dbimport.Catalog;
+import org.apache.cayenne.dbimport.Schema;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.dbsync.reverse.filters.IncludeTableFilter;
 import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
 import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
-import org.apache.cayenne.dbimport.Schema;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.junit.Test;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.TreeSet;
 import java.util.regex.Pattern;
 
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertCatalog;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertCatalogAndSchema;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertFlat;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertSchemaContent;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertSkipPrimaryKeyLoading;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertSkipRelationshipsLoading;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertTableTypes;
+
 public class DbImporterMojoConfigurationTest extends AbstractMojoTestCase {
 
     @Test
     public void testLoadCatalog() throws Exception {
-        assertCatalog(getCdbImport("pom-catalog.xml").getReverseEngineering().getCatalogs().iterator());
+        Map<String, Catalog> catalogs = new HashMap<>();
+        for (Catalog c : getCdbImport("pom-catalog.xml").getReverseEngineering().getCatalogs()) {
+            catalogs.put(c.getName(), c);
+        }
+
+        assertEquals(3, catalogs.size());
+        Catalog c3 = catalogs.get("catalog-name-03");
+        assertNotNull(c3);
+        assertCatalog(c3);
     }
 
     @Test
     public void testLoadSchema() throws Exception {
-        Schema schema = getCdbImport("pom-schema.xml").getReverseEngineering().getSchemas().iterator().next();
-        assertEquals("schema-name-03", schema.getName());
-
-        assertSchemaContent(schema);
+        Map<String, Schema> schemas = new HashMap<>();
+        for (Schema s : getCdbImport("pom-schema.xml").getReverseEngineering().getSchemas()) {
+            schemas.put(s.getName(), s);
+        }
+
+        assertEquals(3, schemas.size());
+        Schema s3 = schemas.get("schema-name-03");
+        assertNotNull(s3);
+        assertSchemaContent(s3);
     }
 
     @Test
@@ -52,10 +74,10 @@ public class DbImporterMojoConfigurationTest extends AbstractMojoTestCase {
         FiltersConfig filters = getCdbImport("pom-schema-2.xml").toParameters()
                 .getDbLoaderConfig().getFiltersConfig();
 
-        TreeSet<IncludeTableFilter> includes = new TreeSet<IncludeTableFilter>();
+        TreeSet<IncludeTableFilter> includes = new TreeSet<>();
         includes.add(new IncludeTableFilter(null, new PatternFilter().exclude("^ETL_.*")));
 
-        TreeSet<Pattern> excludes = new TreeSet<Pattern>(PatternFilter.PATTERN_COMPARATOR);
+        TreeSet<Pattern> excludes = new TreeSet<>(PatternFilter.PATTERN_COMPARATOR);
         excludes.add(PatternFilter.pattern("^ETL_.*"));
 
         assertEquals(filters.tableFilter(null, "NHL_STATS"),
@@ -66,12 +88,12 @@ public class DbImporterMojoConfigurationTest extends AbstractMojoTestCase {
     public void testLoadCatalogAndSchema() throws Exception {
         assertCatalogAndSchema(getCdbImport("pom-catalog-and-schema.xml").getReverseEngineering());
     }
-    
-	@Test
-	public void testDefaultPackage() throws Exception {
-		DbImportConfiguration config = getCdbImport("pom-default-package.xml").toParameters();
-		assertEquals("com.example.test", config.getDefaultPackage());
-	}
+
+    @Test
+    public void testDefaultPackage() throws Exception {
+        DbImportConfiguration config = getCdbImport("pom-default-package.xml").toParameters();
+        assertEquals("com.example.test", config.getDefaultPackage());
+    }
 
     @Test
     public void testLoadFlat() throws Exception {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
index 1f0ed60..c2cdc6d 100644
--- a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
+++ b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
@@ -60,17 +60,18 @@ public class DbImporterMojoTest extends AbstractMojoTestCase {
     private static DerbyManager derbyAssembly;
 
     @BeforeClass
-    public static void setUpClass() throws IOException, SQLException {
+    public static void beforeClass() throws IOException, SQLException {
         derbyAssembly = new DerbyManager("target/derby");
     }
 
     @AfterClass
-    public static void tearDownClass() throws IOException, SQLException {
+    public static void afterClass() throws IOException, SQLException {
         derbyAssembly.shutdown();
         derbyAssembly = null;
     }
 
-	public void testToParameters_MeaningfulPk() throws Exception {
+    @Test
+	public void testToParameters_MeaningfulPkTables() throws Exception {
 
 		DbImportConfiguration parameters1 = getCdbImport("dbimporter-pom1.xml").toParameters();
 		assertNull(parameters1.getMeaningfulPkTables());
@@ -116,11 +117,6 @@ public class DbImporterMojoTest extends AbstractMojoTestCase {
 	}
 
     @Test
-	public void testSimpleFiltering() throws Exception {
-		test("testSimpleFiltering");
-	}
-
-    @Test
 	public void testFilteringWithSchema() throws Exception {
 		test("testFilteringWithSchema");
 	}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-catalog-and-schema.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-catalog-and-schema.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-catalog-and-schema.xml
index 5b6932d..185c280 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-catalog-and-schema.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-catalog-and-schema.xml
@@ -28,52 +28,54 @@
                 <configuration>
                     <map>target/test/org/apache/cayenne/tools/dbimporter-map1.map.xml</map>
 
-                    <catalog>
-                        <name>catalog-name</name>
-                        <schema>
-                            <name>schema-name</name>
-                            <includeTable>includeTable-01</includeTable>
+                    <reverseEngineering>
+                        <catalog>
+                            <name>catalog-name</name>
+                            <schema>
+                                <name>schema-name</name>
+                                <includeTable>includeTable-01</includeTable>
 
-                            <includeTable>
-                                <pattern>includeTable-02</pattern>
-                            </includeTable>
+                                <includeTable>
+                                    <pattern>includeTable-02</pattern>
+                                </includeTable>
 
-                            <includeTable>
-                                <pattern>includeTable-03</pattern>
+                                <includeTable>
+                                    <pattern>includeTable-03</pattern>
 
-                                <includeColumn>includeColumn-01</includeColumn>
-                                <excludeColumn>excludeColumn-01</excludeColumn>
-                            </includeTable>
+                                    <includeColumn>includeColumn-01</includeColumn>
+                                    <excludeColumn>excludeColumn-01</excludeColumn>
+                                </includeTable>
 
-                            <excludeTable>excludeTable-01</excludeTable>
-                            <excludeTable>
-                                <pattern>excludeTable-02</pattern>
-                            </excludeTable>
-                            <excludeTable>excludeTable-03</excludeTable>
+                                <excludeTable>excludeTable-01</excludeTable>
+                                <excludeTable>
+                                    <pattern>excludeTable-02</pattern>
+                                </excludeTable>
+                                <excludeTable>excludeTable-03</excludeTable>
 
-                            <includeColumn>includeColumn-01</includeColumn>
-                            <includeColumn>
-                                <pattern>includeColumn-02</pattern>
-                            </includeColumn>
-                            <includeColumn>includeColumn-03</includeColumn>
-                            <excludeColumn>excludeColumn-01</excludeColumn>
-                            <excludeColumn>
-                                <pattern>excludeColumn-02</pattern>
-                            </excludeColumn>
-                            <excludeColumn>excludeColumn-03</excludeColumn>
+                                <includeColumn>includeColumn-01</includeColumn>
+                                <includeColumn>
+                                    <pattern>includeColumn-02</pattern>
+                                </includeColumn>
+                                <includeColumn>includeColumn-03</includeColumn>
+                                <excludeColumn>excludeColumn-01</excludeColumn>
+                                <excludeColumn>
+                                    <pattern>excludeColumn-02</pattern>
+                                </excludeColumn>
+                                <excludeColumn>excludeColumn-03</excludeColumn>
 
-                            <includeProcedure>includeProcedure-01</includeProcedure>
-                            <includeProcedure>
-                                <pattern>includeProcedure-02</pattern>
-                            </includeProcedure>
-                            <includeProcedure>includeProcedure-03</includeProcedure>
-                            <excludeProcedure>excludeProcedure-01</excludeProcedure>
-                            <excludeProcedure>
-                                <pattern>excludeProcedure-02</pattern>
-                            </excludeProcedure>
-                            <excludeProcedure>excludeProcedure-03</excludeProcedure>
-                        </schema>
-                    </catalog>
+                                <includeProcedure>includeProcedure-01</includeProcedure>
+                                <includeProcedure>
+                                    <pattern>includeProcedure-02</pattern>
+                                </includeProcedure>
+                                <includeProcedure>includeProcedure-03</includeProcedure>
+                                <excludeProcedure>excludeProcedure-01</excludeProcedure>
+                                <excludeProcedure>
+                                    <pattern>excludeProcedure-02</pattern>
+                                </excludeProcedure>
+                                <excludeProcedure>excludeProcedure-03</excludeProcedure>
+                            </schema>
+                        </catalog>
+                    </reverseEngineering>
                 </configuration>
             </plugin>
         </plugins>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-catalog.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-catalog.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-catalog.xml
index 43bd650..b47f49d 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-catalog.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-catalog.xml
@@ -28,55 +28,57 @@
                 <configuration>
                     <map>target/test/org/apache/cayenne/tools/dbimporter-map1.map.xml</map>
 
-                    <catalog>catalog-name-01</catalog>
+                    <reverseEngineering>
+                        <catalog>catalog-name-01</catalog>
 
-                    <catalog>
-                        <name>catalog-name-02</name>
-                    </catalog>
+                        <catalog>
+                            <name>catalog-name-02</name>
+                        </catalog>
 
-                    <catalog>
-                        <name>catalog-name-03</name>
-                        <includeTable>includeTable-01</includeTable>
+                        <catalog>
+                            <name>catalog-name-03</name>
+                            <includeTable>includeTable-01</includeTable>
 
-                        <includeTable>
-                            <pattern>includeTable-02</pattern>
-                        </includeTable>
+                            <includeTable>
+                                <pattern>includeTable-02</pattern>
+                            </includeTable>
 
-                        <includeTable>
-                            <pattern>includeTable-03</pattern>
+                            <includeTable>
+                                <pattern>includeTable-03</pattern>
 
-                            <includeColumn>includeColumn-01</includeColumn>
-                            <excludeColumn>excludeColumn-01</excludeColumn>
-                        </includeTable>
+                                <includeColumn>includeColumn-01</includeColumn>
+                                <excludeColumn>excludeColumn-01</excludeColumn>
+                            </includeTable>
 
-                        <excludeTable>excludeTable-01</excludeTable>
-                        <excludeTable>
-                            <pattern>excludeTable-02</pattern>
-                        </excludeTable>
-                        <excludeTable>excludeTable-03</excludeTable>
+                            <excludeTable>excludeTable-01</excludeTable>
+                            <excludeTable>
+                                <pattern>excludeTable-02</pattern>
+                            </excludeTable>
+                            <excludeTable>excludeTable-03</excludeTable>
 
-                        <includeColumn>includeColumn-01</includeColumn>
-                        <includeColumn>
-                            <pattern>includeColumn-02</pattern>
-                        </includeColumn>
-                        <includeColumn>includeColumn-03</includeColumn>
-                        <excludeColumn>excludeColumn-01</excludeColumn>
-                        <excludeColumn>
-                            <pattern>excludeColumn-02</pattern>
-                        </excludeColumn>
-                        <excludeColumn>excludeColumn-03</excludeColumn>
+                            <includeColumn>includeColumn-01</includeColumn>
+                            <includeColumn>
+                                <pattern>includeColumn-02</pattern>
+                            </includeColumn>
+                            <includeColumn>includeColumn-03</includeColumn>
+                            <excludeColumn>excludeColumn-01</excludeColumn>
+                            <excludeColumn>
+                                <pattern>excludeColumn-02</pattern>
+                            </excludeColumn>
+                            <excludeColumn>excludeColumn-03</excludeColumn>
 
-                        <includeProcedure>includeProcedure-01</includeProcedure>
-                        <includeProcedure>
-                            <pattern>includeProcedure-02</pattern>
-                        </includeProcedure>
-                        <includeProcedure>includeProcedure-03</includeProcedure>
-                        <excludeProcedure>excludeProcedure-01</excludeProcedure>
-                        <excludeProcedure>
-                            <pattern>excludeProcedure-02</pattern>
-                        </excludeProcedure>
-                        <excludeProcedure>excludeProcedure-03</excludeProcedure>
-                    </catalog>
+                            <includeProcedure>includeProcedure-01</includeProcedure>
+                            <includeProcedure>
+                                <pattern>includeProcedure-02</pattern>
+                            </includeProcedure>
+                            <includeProcedure>includeProcedure-03</includeProcedure>
+                            <excludeProcedure>excludeProcedure-01</excludeProcedure>
+                            <excludeProcedure>
+                                <pattern>excludeProcedure-02</pattern>
+                            </excludeProcedure>
+                            <excludeProcedure>excludeProcedure-03</excludeProcedure>
+                        </catalog>
+                    </reverseEngineering>
                 </configuration>
             </plugin>
         </plugins>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-schema.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-schema.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-schema.xml
index 62fc3f5..c355fb8 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-schema.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-schema.xml
@@ -28,55 +28,57 @@
                 <configuration>
                     <map>target/test/org/apache/cayenne/tools/dbimporter-map1.map.xml</map>
 
-                    <schema>schema-name-01</schema>
+                    <reverseEngineering>
+                        <schema>schema-name-01</schema>
 
-                    <schema>
-                        <name>schema-name-02</name>
-                    </schema>
+                        <schema>
+                            <name>schema-name-02</name>
+                        </schema>
 
-                    <schema>
-                        <name>schema-name-03</name>
-                        <includeTable>includeTable-01</includeTable>
+                        <schema>
+                            <name>schema-name-03</name>
+                            <includeTable>includeTable-01</includeTable>
 
-                        <includeTable>
-                            <pattern>includeTable-02</pattern>
-                        </includeTable>
+                            <includeTable>
+                                <pattern>includeTable-02</pattern>
+                            </includeTable>
 
-                        <includeTable>
-                            <pattern>includeTable-03</pattern>
+                            <includeTable>
+                                <pattern>includeTable-03</pattern>
 
-                            <includeColumn>includeColumn-01</includeColumn>
-                            <excludeColumn>excludeColumn-01</excludeColumn>
-                        </includeTable>
+                                <includeColumn>includeColumn-01</includeColumn>
+                                <excludeColumn>excludeColumn-01</excludeColumn>
+                            </includeTable>
 
-                        <excludeTable>excludeTable-01</excludeTable>
-                        <excludeTable>
-                            <pattern>excludeTable-02</pattern>
-                        </excludeTable>
-                        <excludeTable>excludeTable-03</excludeTable>
+                            <excludeTable>excludeTable-01</excludeTable>
+                            <excludeTable>
+                                <pattern>excludeTable-02</pattern>
+                            </excludeTable>
+                            <excludeTable>excludeTable-03</excludeTable>
 
-                        <includeColumn>includeColumn-01</includeColumn>
-                        <includeColumn>
-                            <pattern>includeColumn-02</pattern>
-                        </includeColumn>
-                        <includeColumn>includeColumn-03</includeColumn>
-                        <excludeColumn>excludeColumn-01</excludeColumn>
-                        <excludeColumn>
-                            <pattern>excludeColumn-02</pattern>
-                        </excludeColumn>
-                        <excludeColumn>excludeColumn-03</excludeColumn>
+                            <includeColumn>includeColumn-01</includeColumn>
+                            <includeColumn>
+                                <pattern>includeColumn-02</pattern>
+                            </includeColumn>
+                            <includeColumn>includeColumn-03</includeColumn>
+                            <excludeColumn>excludeColumn-01</excludeColumn>
+                            <excludeColumn>
+                                <pattern>excludeColumn-02</pattern>
+                            </excludeColumn>
+                            <excludeColumn>excludeColumn-03</excludeColumn>
 
-                        <includeProcedure>includeProcedure-01</includeProcedure>
-                        <includeProcedure>
-                            <pattern>includeProcedure-02</pattern>
-                        </includeProcedure>
-                        <includeProcedure>includeProcedure-03</includeProcedure>
-                        <excludeProcedure>excludeProcedure-01</excludeProcedure>
-                        <excludeProcedure>
-                            <pattern>excludeProcedure-02</pattern>
-                        </excludeProcedure>
-                        <excludeProcedure>excludeProcedure-03</excludeProcedure>
-                    </schema>
+                            <includeProcedure>includeProcedure-01</includeProcedure>
+                            <includeProcedure>
+                                <pattern>includeProcedure-02</pattern>
+                            </includeProcedure>
+                            <includeProcedure>includeProcedure-03</includeProcedure>
+                            <excludeProcedure>excludeProcedure-01</excludeProcedure>
+                            <excludeProcedure>
+                                <pattern>excludeProcedure-02</pattern>
+                            </excludeProcedure>
+                            <excludeProcedure>excludeProcedure-03</excludeProcedure>
+                        </schema>
+                    </reverseEngineering>
                 </configuration>
             </plugin>
         </plugins>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml
index 10d85e6..0c70eb7 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml
@@ -18,25 +18,27 @@
   ~    under the License.
   -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 	http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
-	<name>DbImporterMojo Test1</name>	
+    <name>DbImporterMojo Test1</name>
 
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-cayenne-plugin</artifactId>
-				<configuration>
-					<map>target/test-classes/org/apache/cayenne/tools/dbimport/testDefaultPackage.map.xml</map>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-cayenne-plugin</artifactId>
+                <configuration>
+                    <map>target/test-classes/org/apache/cayenne/tools/dbimport/testDefaultPackage.map.xml</map>
                     <defaultPackage>com.example.test</defaultPackage>
                     <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
                     <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
 
-                    <schema>SCHEMA_01</schema>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
+                    <reverseEngineering>
+                        <schema>SCHEMA_01</schema>
+                    </reverseEngineering>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testFilteringWithSchema-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testFilteringWithSchema-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testFilteringWithSchema-pom.xml
index 70806d7..cc92813 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testFilteringWithSchema-pom.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testFilteringWithSchema-pom.xml
@@ -18,24 +18,26 @@
   ~    under the License.
   -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 	http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
-	<name>DbImporterMojo Test1</name>	
+    <name>DbImporterMojo Test1</name>
 
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-cayenne-plugin</artifactId>
-				<configuration>
-					<map>target/test-classes/org/apache/cayenne/tools/dbimport/testFilteringWithSchema.map.xml</map>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-cayenne-plugin</artifactId>
+                <configuration>
+                    <map>target/test-classes/org/apache/cayenne/tools/dbimport/testFilteringWithSchema.map.xml</map>
                     <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
                     <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
 
-                    <schema>SCHEMA_01</schema>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
+                    <reverseEngineering>
+                        <schema>SCHEMA_01</schema>
+                    </reverseEngineering>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude-pom.xml
deleted file mode 100644
index 8b1ba32..0000000
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude-pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
-	http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-	<name>DbImporterMojo Test1</name>	
-
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-cayenne-plugin</artifactId>
-				<configuration>
-					<map>target/test-classes/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude.map.xml</map>
-                    <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
-                    <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
-
-                    <schema>SCHEMA_01</schema>
-
-                    <tablePattern>Parent</tablePattern>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-
-</project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude.map.xml-result
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude.map.xml-result b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude.map.xml-result
deleted file mode 100644
index b07dfb6..0000000
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude.map.xml-result
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-	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.
--->
-<data-map xmlns="http://cayenne.apache.org/schema/8/modelMap"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://cayenne.apache.org/schema/8/modelMap http://cayenne.apache.org/schema/8/modelMap.xsd"
-          project-version="8">
-    <db-entity name="PARENT" schema="SCHEMA_01">
-        <db-attribute name="COL2" type="CHAR" length="25"/>
-        <db-attribute name="COL3" type="DECIMAL" length="10" scale="2"/>
-        <db-attribute name="COL4" type="VARCHAR" length="25"/>
-        <db-attribute name="COL5" type="DATE" length="10"/>
-        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-    </db-entity>
-    <obj-entity name="Parent" className="Parent" dbEntityName="PARENT">
-        <obj-attribute name="col2" type="java.lang.String" db-attribute-path="COL2"/>
-        <obj-attribute name="col3" type="java.math.BigDecimal" db-attribute-path="COL3"/>
-        <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
-        <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
-    </obj-entity>
-</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude.sql
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude.sql b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude.sql
deleted file mode 100644
index dba8da6..0000000
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testOldParamsSchemasAndTableExclude.sql
+++ /dev/null
@@ -1,64 +0,0 @@
---  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.
-
-CREATE SCHEMA schema_01;
-SET SCHEMA schema_01;
-
-CREATE TABLE schema_01.Parent (
-  id INTEGER NOT NULL,
-  COL2 CHAR(25),
-  COL3 DECIMAL(10,2),
-  COL4 VARCHAR(25),
-  COL5 DATE,
-
-  PRIMARY KEY (id),
-  UNIQUE (COL3)
-);
-
-CREATE TABLE schema_01.Child (
-  id INTEGER NOT NULL,
-  Parent_id CHAR(25),
-  COL3 DECIMAL(10,2),
-  COL4 VARCHAR(25),
-  COL5 DATE,
-
-  PRIMARY KEY (id)
-);
-
-CREATE SCHEMA schema_02;
-SET SCHEMA schema_02;
-
-CREATE TABLE schema_02.Parent (
-  id INTEGER NOT NULL,
-  COL2 CHAR(25),
-  COL3 DECIMAL(10,2),
-  COL4 VARCHAR(25),
-  COL5 DATE,
-
-  PRIMARY KEY (id),
-  UNIQUE (COL3)
-);
-
-CREATE TABLE schema_02.Child (
-  id INTEGER NOT NULL,
-  Parent_id CHAR(25),
-  COL3 DECIMAL(10,2),
-  COL4 VARCHAR(25),
-  COL5 DATE,
-
-  PRIMARY KEY (id)
-);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testPreserveCustomObjMappings-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testPreserveCustomObjMappings-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testPreserveCustomObjMappings-pom.xml
index 1dc63ea..8abae0d 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testPreserveCustomObjMappings-pom.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testPreserveCustomObjMappings-pom.xml
@@ -18,26 +18,29 @@
   ~    under the License.
   -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 	http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
-	<name>DbImporterMojo Test1</name>	
+    <name>DbImporterMojo Test1</name>
 
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-cayenne-plugin</artifactId>
-				<configuration>
-					<map>target/test-classes/org/apache/cayenne/tools/dbimport/testPreserveCustomObjMappings.map.xml</map>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-cayenne-plugin</artifactId>
+                <configuration>
+                    <map>target/test-classes/org/apache/cayenne/tools/dbimport/testPreserveCustomObjMappings.map.xml
+                    </map>
                     <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
                     <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
 
-                    <schema>
-                        <name>SCHEMA_01</name>
-                    </schema>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
+                    <reverseEngineering>
+                        <schema>
+                            <name>SCHEMA_01</name>
+                        </schema>
+                    </reverseEngineering>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSchemasAndTableExclude-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSchemasAndTableExclude-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSchemasAndTableExclude-pom.xml
index 66b051e..20411f4 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSchemasAndTableExclude-pom.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSchemasAndTableExclude-pom.xml
@@ -18,28 +18,29 @@
   ~    under the License.
   -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 	http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
-	<name>DbImporterMojo Test1</name>	
+    <name>DbImporterMojo Test1</name>
 
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-cayenne-plugin</artifactId>
-				<configuration>
-					<map>target/test-classes/org/apache/cayenne/tools/dbimport/testSchemasAndTableExclude.map.xml</map>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-cayenne-plugin</artifactId>
+                <configuration>
+                    <map>target/test-classes/org/apache/cayenne/tools/dbimport/testSchemasAndTableExclude.map.xml</map>
                     <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
                     <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
 
-                    <schema>
-                        <name>SCHEMA_01</name>
-                    </schema>
-
-                    <excludeTables>Child</excludeTables>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
+                    <reverseEngineering>
+                        <schema>
+                            <name>SCHEMA_01</name>
+                        </schema>
+                        <excludeTable>Child</excludeTable>
+                    </reverseEngineering>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering-pom.xml
deleted file mode 100644
index 1cb3ed6..0000000
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering-pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ 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.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
-	http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-	<name>DbImporterMojo Test1</name>	
-
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-cayenne-plugin</artifactId>
-				<configuration>
-					<map>target/test-classes/org/apache/cayenne/tools/dbimport/testSimpleFiltering.map.xml</map>
-                    <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
-                    <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
-
-                    <tablePattern>Parent</tablePattern>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-
-</project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering.map.xml-result
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering.map.xml-result b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering.map.xml-result
deleted file mode 100644
index e5ba734..0000000
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering.map.xml-result
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-	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.
--->
-<data-map xmlns="http://cayenne.apache.org/schema/8/modelMap"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://cayenne.apache.org/schema/8/modelMap http://cayenne.apache.org/schema/8/modelMap.xsd"
-          project-version="8">
-    <db-entity name="PARENT" schema="APP">
-        <db-attribute name="COL2" type="CHAR" length="25"/>
-        <db-attribute name="COL3" type="DECIMAL" length="10" scale="2"/>
-        <db-attribute name="COL4" type="VARCHAR" length="25"/>
-        <db-attribute name="COL5" type="DATE" length="10"/>
-        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-    </db-entity>
-    <obj-entity name="Parent" className="Parent" dbEntityName="PARENT">
-        <obj-attribute name="col2" type="java.lang.String" db-attribute-path="COL2"/>
-        <obj-attribute name="col3" type="java.math.BigDecimal" db-attribute-path="COL3"/>
-        <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
-        <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
-    </obj-entity>
-</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering.sql
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering.sql b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering.sql
deleted file mode 100644
index 0bdef9a..0000000
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSimpleFiltering.sql
+++ /dev/null
@@ -1,37 +0,0 @@
---  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.
-
-CREATE TABLE Parent (
-  id INTEGER NOT NULL,
-  COL2 CHAR(25),
-  COL3 DECIMAL(10,2),
-  COL4 VARCHAR(25),
-  COL5 DATE,
-
-  PRIMARY KEY (id),
-  UNIQUE (COL3)
-);
-
-CREATE TABLE Child (
-  id INTEGER NOT NULL,
-  Parent_id CHAR(25),
-  COL3 DECIMAL(10,2),
-  COL4 VARCHAR(25),
-  COL5 DATE,
-
-  PRIMARY KEY (id)
-);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSupportsCatalogsOnReverseEngineering-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSupportsCatalogsOnReverseEngineering-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSupportsCatalogsOnReverseEngineering-pom.xml
index 94e2965..1e07a50 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSupportsCatalogsOnReverseEngineering-pom.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSupportsCatalogsOnReverseEngineering-pom.xml
@@ -28,11 +28,16 @@
             <plugin>
                 <artifactId>maven-cayenne-plugin</artifactId>
                 <configuration>
-                    <map>target/test-classes/org/apache/cayenne/tools/dbimport/testSupportsCatalogsOnReverseEngineering.map.xml</map>
+                    <map>
+                        target/test-classes/org/apache/cayenne/tools/dbimport/testSupportsCatalogsOnReverseEngineering.map.xml
+                    </map>
                     <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
                     <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
                     <adapter>org.apache.cayenne.dba.postgres.PostgresAdapter</adapter>
-                    <catalog>DbImporterMojoTest1</catalog>
+
+                    <reverseEngineering>
+                        <catalog>DbImporterMojoTest1</catalog>
+                    </reverseEngineering>
                 </configuration>
             </plugin>
         </plugins>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testViewsExclude-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testViewsExclude-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testViewsExclude-pom.xml
index 1f8f25d..1045482 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testViewsExclude-pom.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testViewsExclude-pom.xml
@@ -18,24 +18,26 @@
   under the License.
   -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 	http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
-	<name>DbImporterMojo Test1</name>	
+    <name>DbImporterMojo Test1</name>
 
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-cayenne-plugin</artifactId>
-				<configuration>
-					<map>target/test-classes/org/apache/cayenne/tools/dbimport/testViewsExclude.map.xml</map>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-cayenne-plugin</artifactId>
+                <configuration>
+                    <map>target/test-classes/org/apache/cayenne/tools/dbimport/testViewsExclude.map.xml</map>
                     <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
                     <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
 
-                    <excludeTables>v_*</excludeTables>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
+                    <reverseEngineering>
+                        <excludeTable>^V_.*</excludeTable>
+                    </reverseEngineering>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e9e81a6e/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom3.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom3.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom3.xml
index 6e63b69..71d8d56 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom3.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom3.xml
@@ -28,8 +28,7 @@
 			<plugin>
 				<artifactId>maven-cayenne-plugin</artifactId>
 				<configuration>
-					<!-- this is a deprecated config, but it should work -->
-					<meaningfulPk>true</meaningfulPk>
+					<meaningfulPkTables>*</meaningfulPkTables>
 				</configuration>
 			</plugin>
 		</plugins>


[7/9] cayenne git commit: CAY-2118 cdbimport: drop support for the old style of table filtering

Posted by aa...@apache.org.
CAY-2118 cdbimport: drop support for the old style of table filtering


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

Branch: refs/heads/master
Commit: ab6c204f3f7cfca715e4eba58a20d9f95e375fc6
Parents: f3d7374
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 15:10:47 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 15:36:19 2016 +0300

----------------------------------------------------------------------
 .../cayenne/test/resource/ResourceUtil.java     |  10 +-
 .../DefaultReverseEngineeringLoaderTest.java    | 420 +++++++++----------
 .../org/apache/cayenne/tools/AntTableType.java  |  35 ++
 .../apache/cayenne/tools/DbImporterTask.java    |  19 +-
 .../cayenne/tools/DbImporterTaskTest.java       | 385 ++++++++---------
 .../tools/build-include-table.map.xml-result    |  37 ++
 .../cayenne/tools/build-include-table.xml       |  34 ++
 .../cayenne/tools/build-include-table.xml.sql   |  38 ++
 .../tools/build-skip-primary-key-loading.xml    |   3 +-
 .../tools/build-skip-relationships-loading.xml  |   6 +-
 .../dbimport/build-include-table.map.xml-result |  37 --
 .../tools/dbimport/build-include-table.xml      |  34 --
 .../tools/dbimport/build-include-table.xml.sql  |  38 --
 13 files changed, 573 insertions(+), 523 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/build-tools/cayenne-test-utilities/src/main/java/org/apache/cayenne/test/resource/ResourceUtil.java
----------------------------------------------------------------------
diff --git a/build-tools/cayenne-test-utilities/src/main/java/org/apache/cayenne/test/resource/ResourceUtil.java b/build-tools/cayenne-test-utilities/src/main/java/org/apache/cayenne/test/resource/ResourceUtil.java
index 0b5c20a..a8e70a5 100644
--- a/build-tools/cayenne-test-utilities/src/main/java/org/apache/cayenne/test/resource/ResourceUtil.java
+++ b/build-tools/cayenne-test-utilities/src/main/java/org/apache/cayenne/test/resource/ResourceUtil.java
@@ -18,8 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.test.resource;
 
-import static org.junit.Assert.assertNotNull;
-
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
@@ -30,6 +28,8 @@ import java.io.OutputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 
+import static org.junit.Assert.assertNotNull;
+
 public class ResourceUtil {
 
 	/**
@@ -82,6 +82,12 @@ public class ResourceUtil {
 	}
 
 	public static boolean copyResourceToFile(URL from, File to) {
+
+		File dir = to.getParentFile();
+		if(dir != null) {
+			dir.mkdirs();
+		}
+
 		int bufSize = 8 * 1024;
 		try (BufferedInputStream urlin = new BufferedInputStream(from.openConnection().getInputStream(), bufSize);) {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-server/src/test/java/org/apache/cayenne/dbimport/DefaultReverseEngineeringLoaderTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/dbimport/DefaultReverseEngineeringLoaderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/dbimport/DefaultReverseEngineeringLoaderTest.java
index 4dcc690..c478db7 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/dbimport/DefaultReverseEngineeringLoaderTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/dbimport/DefaultReverseEngineeringLoaderTest.java
@@ -19,222 +19,222 @@
 package org.apache.cayenne.dbimport;
 
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import org.apache.cayenne.resource.URLResource;
+import org.junit.Test;
 
 import java.net.MalformedURLException;
 import java.util.Iterator;
 
-import org.apache.cayenne.resource.URLResource;
-import org.junit.Test;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class DefaultReverseEngineeringLoaderTest {
 
-	@Test
-	public void testLoadCatalog() throws Exception {
-		ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
-				.load(getResource("reverseEngineering-catalog.xml").getURL().openStream());
-
-		assertCatalog(engineering);
-	}
-
-	public static void assertCatalog(ReverseEngineering engineering) {
-		Iterator<Catalog> catalogs = engineering.getCatalogs().iterator();
-		assertEquals("catalog-name-01", catalogs.next().getName());
-		assertEquals("catalog-name-02", catalogs.next().getName());
-
-		assertCatalog(catalogs);
-	}
-
-	public static void assertCatalog(Iterator<Catalog> catalogs) {
-		Catalog catalog = catalogs.next();
-		assertEquals("catalog-name-03", catalog.getName());
-
-		Iterator<IncludeTable> includeTables = catalog.getIncludeTables().iterator();
-		assertEquals("includeTable-01", includeTables.next().getPattern());
-		assertEquals("includeTable-02", includeTables.next().getPattern());
-
-		IncludeTable includeTable = includeTables.next();
-		assertEquals("includeTable-03", includeTable.getPattern());
-		assertEquals("includeColumn-01", includeTable.getIncludeColumns().iterator().next().getPattern());
-		assertEquals("excludeColumn-01", includeTable.getExcludeColumns().iterator().next().getPattern());
-
-		Iterator<ExcludeTable> excludeTables = catalog.getExcludeTables().iterator();
-		assertEquals("excludeTable-01", excludeTables.next().getPattern());
-		assertEquals("excludeTable-02", excludeTables.next().getPattern());
-		assertEquals("excludeTable-03", excludeTables.next().getPattern());
-
-		Iterator<ExcludeColumn> excludeColumns = catalog.getExcludeColumns().iterator();
-		assertEquals("excludeColumn-01", excludeColumns.next().getPattern());
-		assertEquals("excludeColumn-02", excludeColumns.next().getPattern());
-		assertEquals("excludeColumn-03", excludeColumns.next().getPattern());
-		Iterator<IncludeColumn> includeColumns = catalog.getIncludeColumns().iterator();
-		assertEquals("includeColumn-01", includeColumns.next().getPattern());
-		assertEquals("includeColumn-02", includeColumns.next().getPattern());
-		assertEquals("includeColumn-03", includeColumns.next().getPattern());
-
-		Iterator<ExcludeProcedure> excludeProcedures = catalog.getExcludeProcedures().iterator();
-		assertEquals("excludeProcedure-01", excludeProcedures.next().getPattern());
-		assertEquals("excludeProcedure-02", excludeProcedures.next().getPattern());
-		assertEquals("excludeProcedure-03", excludeProcedures.next().getPattern());
-		Iterator<IncludeProcedure> includeProcedures = catalog.getIncludeProcedures().iterator();
-		assertEquals("includeProcedure-01", includeProcedures.next().getPattern());
-		assertEquals("includeProcedure-02", includeProcedures.next().getPattern());
-		assertEquals("includeProcedure-03", includeProcedures.next().getPattern());
-	}
-
-	@Test
-	public void testLoadSchema() throws Exception {
-		ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
-				.load(getResource("reverseEngineering-schema.xml").getURL().openStream());
-
-		assertSchema(engineering);
-	}
-
-	public static void assertSchema(ReverseEngineering engineering) {
-		Iterator<Schema> schemas = engineering.getSchemas().iterator();
-		assertEquals("schema-name-01", schemas.next().getName());
-		assertEquals("schema-name-02", schemas.next().getName());
-
-		Schema schema = schemas.next();
-		assertEquals("schema-name-03", schema.getName());
-
-		assertSchemaContent(schema);
-	}
-
-	public static void assertSchemaContent(Schema schema) {
-		Iterator<IncludeTable> includeTables = schema.getIncludeTables().iterator();
-		assertEquals("includeTable-01", includeTables.next().getPattern());
-		assertEquals("includeTable-02", includeTables.next().getPattern());
-
-		IncludeTable includeTable = includeTables.next();
-		assertEquals("includeTable-03", includeTable.getPattern());
-		assertEquals("includeColumn-01", includeTable.getIncludeColumns().iterator().next().getPattern());
-		assertEquals("excludeColumn-01", includeTable.getExcludeColumns().iterator().next().getPattern());
-
-		Iterator<ExcludeTable> excludeTables = schema.getExcludeTables().iterator();
-		assertEquals("excludeTable-01", excludeTables.next().getPattern());
-		assertEquals("excludeTable-02", excludeTables.next().getPattern());
-		assertEquals("excludeTable-03", excludeTables.next().getPattern());
-
-		Iterator<ExcludeColumn> excludeColumns = schema.getExcludeColumns().iterator();
-		assertEquals("excludeColumn-01", excludeColumns.next().getPattern());
-		assertEquals("excludeColumn-02", excludeColumns.next().getPattern());
-		assertEquals("excludeColumn-03", excludeColumns.next().getPattern());
-		Iterator<IncludeColumn> includeColumns = schema.getIncludeColumns().iterator();
-		assertEquals("includeColumn-01", includeColumns.next().getPattern());
-		assertEquals("includeColumn-02", includeColumns.next().getPattern());
-		assertEquals("includeColumn-03", includeColumns.next().getPattern());
-
-		Iterator<ExcludeProcedure> excludeProcedures = schema.getExcludeProcedures().iterator();
-		assertEquals("excludeProcedure-01", excludeProcedures.next().getPattern());
-		assertEquals("excludeProcedure-02", excludeProcedures.next().getPattern());
-		assertEquals("excludeProcedure-03", excludeProcedures.next().getPattern());
-		Iterator<IncludeProcedure> includeProcedures = schema.getIncludeProcedures().iterator();
-		assertEquals("includeProcedure-01", includeProcedures.next().getPattern());
-		assertEquals("includeProcedure-02", includeProcedures.next().getPattern());
-		assertEquals("includeProcedure-03", includeProcedures.next().getPattern());
-	}
-
-	@Test
-	public void testLoadCatalogAndSchema() throws Exception {
-		ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
-				.load(getResource("reverseEngineering-catalog-and-schema.xml").getURL().openStream());
-
-		assertCatalogAndSchema(engineering);
-	}
-
-	public static void assertCatalogAndSchema(ReverseEngineering engineering) {
-		Catalog catalog = engineering.getCatalogs().iterator().next();
-		assertEquals("catalog-name", catalog.getName());
-
-		Schema schema = catalog.getSchemas().iterator().next();
-		assertEquals("schema-name", schema.getName());
-
-		assertSchemaContent(schema);
-	}
-
-	@Test
-	public void testLoadFlat() throws Exception {
-		ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
-				.load(getResource("reverseEngineering-flat.xml").getURL().openStream());
-
-		assertFlat(engineering);
-	}
-
-	public static void assertFlat(ReverseEngineering engineering) {
-		Iterator<IncludeTable> includeTables = engineering.getIncludeTables().iterator();
-		assertEquals("includeTable-01", includeTables.next().getPattern());
-		assertEquals("includeTable-02", includeTables.next().getPattern());
-
-		IncludeTable includeTable = includeTables.next();
-		assertEquals("includeTable-03", includeTable.getPattern());
-		assertEquals("includeColumn-01", includeTable.getIncludeColumns().iterator().next().getPattern());
-		assertEquals("excludeColumn-01", includeTable.getExcludeColumns().iterator().next().getPattern());
-
-		Iterator<ExcludeTable> excludeTables = engineering.getExcludeTables().iterator();
-		assertEquals("excludeTable-01", excludeTables.next().getPattern());
-		assertEquals("excludeTable-02", excludeTables.next().getPattern());
-		assertEquals("excludeTable-03", excludeTables.next().getPattern());
-
-		Iterator<ExcludeColumn> excludeColumns = engineering.getExcludeColumns().iterator();
-		assertEquals("excludeColumn-01", excludeColumns.next().getPattern());
-		assertEquals("excludeColumn-02", excludeColumns.next().getPattern());
-		assertEquals("excludeColumn-03", excludeColumns.next().getPattern());
-		Iterator<IncludeColumn> includeColumns = engineering.getIncludeColumns().iterator();
-		assertEquals("includeColumn-01", includeColumns.next().getPattern());
-		assertEquals("includeColumn-02", includeColumns.next().getPattern());
-		assertEquals("includeColumn-03", includeColumns.next().getPattern());
-
-		Iterator<ExcludeProcedure> excludeProcedures = engineering.getExcludeProcedures().iterator();
-		assertEquals("excludeProcedure-01", excludeProcedures.next().getPattern());
-		assertEquals("excludeProcedure-02", excludeProcedures.next().getPattern());
-		assertEquals("excludeProcedure-03", excludeProcedures.next().getPattern());
-		Iterator<IncludeProcedure> includeProcedures = engineering.getIncludeProcedures().iterator();
-		assertEquals("includeProcedure-01", includeProcedures.next().getPattern());
-		assertEquals("includeProcedure-02", includeProcedures.next().getPattern());
-		assertEquals("includeProcedure-03", includeProcedures.next().getPattern());
-	}
-
-	@Test
-	public void testSkipRelationships() throws Exception {
-		ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
-				.load(getResource("reverseEngineering-skipRelationshipsLoading.xml").getURL().openStream());
-
-		assertSkipRelationshipsLoading(engineering);
-	}
-
-	public static void assertSkipRelationshipsLoading(ReverseEngineering engineering) {
-		assertTrue(engineering.getSkipRelationshipsLoading());
-	}
-
-	@Test
-	public void testSkipPrimaryKeyLoading() throws Exception {
-		ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
-				.load(getResource("reverseEngineering-skipPrimaryKeyLoading.xml").getURL().openStream());
-
-		assertSkipPrimaryKeyLoading(engineering);
-	}
-
-	public static void assertSkipPrimaryKeyLoading(ReverseEngineering engineering) {
-		assertTrue(engineering.getSkipPrimaryKeyLoading());
-	}
-
-	@Test
-	public void testTableTypes() throws Exception {
-		ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
-				.load(getResource("reverseEngineering-tableTypes.xml").getURL().openStream());
-
-		assertTableTypes(engineering);
-	}
-
-	public static void assertTableTypes(ReverseEngineering engineering) {
-		assertArrayEquals(engineering.getTableTypes(), new String[] { "type1", "type2", "type3" });
-	}
-
-	protected URLResource getResource(String file) throws MalformedURLException {
-		return new URLResource(getClass().getResource(file));
-	}
+    public static void assertCatalog(ReverseEngineering engineering) {
+        Iterator<Catalog> catalogs = engineering.getCatalogs().iterator();
+        assertEquals("catalog-name-01", catalogs.next().getName());
+        assertEquals("catalog-name-02", catalogs.next().getName());
+
+        assertCatalog(catalogs);
+    }
+
+    public static void assertCatalog(Iterator<Catalog> catalogs) {
+        Catalog catalog = catalogs.next();
+        assertEquals("catalog-name-03", catalog.getName());
+
+        Iterator<IncludeTable> includeTables = catalog.getIncludeTables().iterator();
+        assertEquals("includeTable-01", includeTables.next().getPattern());
+        assertEquals("includeTable-02", includeTables.next().getPattern());
+
+        IncludeTable includeTable = includeTables.next();
+        assertEquals("includeTable-03", includeTable.getPattern());
+        assertEquals("includeColumn-01", includeTable.getIncludeColumns().iterator().next().getPattern());
+        assertEquals("excludeColumn-01", includeTable.getExcludeColumns().iterator().next().getPattern());
+
+        Iterator<ExcludeTable> excludeTables = catalog.getExcludeTables().iterator();
+        assertEquals("excludeTable-01", excludeTables.next().getPattern());
+        assertEquals("excludeTable-02", excludeTables.next().getPattern());
+        assertEquals("excludeTable-03", excludeTables.next().getPattern());
+
+        Iterator<ExcludeColumn> excludeColumns = catalog.getExcludeColumns().iterator();
+        assertEquals("excludeColumn-01", excludeColumns.next().getPattern());
+        assertEquals("excludeColumn-02", excludeColumns.next().getPattern());
+        assertEquals("excludeColumn-03", excludeColumns.next().getPattern());
+        Iterator<IncludeColumn> includeColumns = catalog.getIncludeColumns().iterator();
+        assertEquals("includeColumn-01", includeColumns.next().getPattern());
+        assertEquals("includeColumn-02", includeColumns.next().getPattern());
+        assertEquals("includeColumn-03", includeColumns.next().getPattern());
+
+        Iterator<ExcludeProcedure> excludeProcedures = catalog.getExcludeProcedures().iterator();
+        assertEquals("excludeProcedure-01", excludeProcedures.next().getPattern());
+        assertEquals("excludeProcedure-02", excludeProcedures.next().getPattern());
+        assertEquals("excludeProcedure-03", excludeProcedures.next().getPattern());
+        Iterator<IncludeProcedure> includeProcedures = catalog.getIncludeProcedures().iterator();
+        assertEquals("includeProcedure-01", includeProcedures.next().getPattern());
+        assertEquals("includeProcedure-02", includeProcedures.next().getPattern());
+        assertEquals("includeProcedure-03", includeProcedures.next().getPattern());
+    }
+
+    public static void assertSchema(ReverseEngineering engineering) {
+        Iterator<Schema> schemas = engineering.getSchemas().iterator();
+        assertEquals("schema-name-01", schemas.next().getName());
+        assertEquals("schema-name-02", schemas.next().getName());
+
+        Schema schema = schemas.next();
+        assertEquals("schema-name-03", schema.getName());
+
+        assertSchemaContent(schema);
+    }
+
+    public static void assertSchemaContent(Schema schema) {
+        Iterator<IncludeTable> includeTables = schema.getIncludeTables().iterator();
+        assertEquals("includeTable-01", includeTables.next().getPattern());
+        assertEquals("includeTable-02", includeTables.next().getPattern());
+
+        IncludeTable includeTable = includeTables.next();
+        assertEquals("includeTable-03", includeTable.getPattern());
+        assertEquals("includeColumn-01", includeTable.getIncludeColumns().iterator().next().getPattern());
+        assertEquals("excludeColumn-01", includeTable.getExcludeColumns().iterator().next().getPattern());
+
+        Iterator<ExcludeTable> excludeTables = schema.getExcludeTables().iterator();
+        assertEquals("excludeTable-01", excludeTables.next().getPattern());
+        assertEquals("excludeTable-02", excludeTables.next().getPattern());
+        assertEquals("excludeTable-03", excludeTables.next().getPattern());
+
+        Iterator<ExcludeColumn> excludeColumns = schema.getExcludeColumns().iterator();
+        assertEquals("excludeColumn-01", excludeColumns.next().getPattern());
+        assertEquals("excludeColumn-02", excludeColumns.next().getPattern());
+        assertEquals("excludeColumn-03", excludeColumns.next().getPattern());
+        Iterator<IncludeColumn> includeColumns = schema.getIncludeColumns().iterator();
+        assertEquals("includeColumn-01", includeColumns.next().getPattern());
+        assertEquals("includeColumn-02", includeColumns.next().getPattern());
+        assertEquals("includeColumn-03", includeColumns.next().getPattern());
+
+        Iterator<ExcludeProcedure> excludeProcedures = schema.getExcludeProcedures().iterator();
+        assertEquals("excludeProcedure-01", excludeProcedures.next().getPattern());
+        assertEquals("excludeProcedure-02", excludeProcedures.next().getPattern());
+        assertEquals("excludeProcedure-03", excludeProcedures.next().getPattern());
+        Iterator<IncludeProcedure> includeProcedures = schema.getIncludeProcedures().iterator();
+        assertEquals("includeProcedure-01", includeProcedures.next().getPattern());
+        assertEquals("includeProcedure-02", includeProcedures.next().getPattern());
+        assertEquals("includeProcedure-03", includeProcedures.next().getPattern());
+    }
+
+    public static void assertCatalogAndSchema(ReverseEngineering engineering) {
+        Catalog catalog = engineering.getCatalogs().iterator().next();
+        assertEquals("catalog-name", catalog.getName());
+
+        Schema schema = catalog.getSchemas().iterator().next();
+        assertEquals("schema-name", schema.getName());
+
+        assertSchemaContent(schema);
+    }
+
+    public static void assertFlat(ReverseEngineering engineering) {
+        Iterator<IncludeTable> includeTables = engineering.getIncludeTables().iterator();
+        assertEquals("includeTable-01", includeTables.next().getPattern());
+        assertEquals("includeTable-02", includeTables.next().getPattern());
+
+        IncludeTable includeTable = includeTables.next();
+        assertEquals("includeTable-03", includeTable.getPattern());
+        assertEquals("includeColumn-01", includeTable.getIncludeColumns().iterator().next().getPattern());
+        assertEquals("excludeColumn-01", includeTable.getExcludeColumns().iterator().next().getPattern());
+
+        Iterator<ExcludeTable> excludeTables = engineering.getExcludeTables().iterator();
+        assertEquals("excludeTable-01", excludeTables.next().getPattern());
+        assertEquals("excludeTable-02", excludeTables.next().getPattern());
+        assertEquals("excludeTable-03", excludeTables.next().getPattern());
+
+        Iterator<ExcludeColumn> excludeColumns = engineering.getExcludeColumns().iterator();
+        assertEquals("excludeColumn-01", excludeColumns.next().getPattern());
+        assertEquals("excludeColumn-02", excludeColumns.next().getPattern());
+        assertEquals("excludeColumn-03", excludeColumns.next().getPattern());
+        Iterator<IncludeColumn> includeColumns = engineering.getIncludeColumns().iterator();
+        assertEquals("includeColumn-01", includeColumns.next().getPattern());
+        assertEquals("includeColumn-02", includeColumns.next().getPattern());
+        assertEquals("includeColumn-03", includeColumns.next().getPattern());
+
+        Iterator<ExcludeProcedure> excludeProcedures = engineering.getExcludeProcedures().iterator();
+        assertEquals("excludeProcedure-01", excludeProcedures.next().getPattern());
+        assertEquals("excludeProcedure-02", excludeProcedures.next().getPattern());
+        assertEquals("excludeProcedure-03", excludeProcedures.next().getPattern());
+        Iterator<IncludeProcedure> includeProcedures = engineering.getIncludeProcedures().iterator();
+        assertEquals("includeProcedure-01", includeProcedures.next().getPattern());
+        assertEquals("includeProcedure-02", includeProcedures.next().getPattern());
+        assertEquals("includeProcedure-03", includeProcedures.next().getPattern());
+    }
+
+    public static void assertSkipRelationshipsLoading(ReverseEngineering engineering) {
+        assertTrue(engineering.getSkipRelationshipsLoading());
+    }
+
+    public static void assertSkipPrimaryKeyLoading(ReverseEngineering engineering) {
+        assertTrue(engineering.getSkipPrimaryKeyLoading());
+    }
+
+    public static void assertTableTypes(ReverseEngineering engineering) {
+        assertArrayEquals(new String[]{"type1", "type2", "type3"}, engineering.getTableTypes());
+    }
+
+    @Test
+    public void testLoadCatalog() throws Exception {
+        ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
+                .load(getResource("reverseEngineering-catalog.xml").getURL().openStream());
+
+        assertCatalog(engineering);
+    }
+
+    @Test
+    public void testLoadSchema() throws Exception {
+        ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
+                .load(getResource("reverseEngineering-schema.xml").getURL().openStream());
+
+        assertSchema(engineering);
+    }
+
+    @Test
+    public void testLoadCatalogAndSchema() throws Exception {
+        ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
+                .load(getResource("reverseEngineering-catalog-and-schema.xml").getURL().openStream());
+
+        assertCatalogAndSchema(engineering);
+    }
+
+    @Test
+    public void testLoadFlat() throws Exception {
+        ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
+                .load(getResource("reverseEngineering-flat.xml").getURL().openStream());
+
+        assertFlat(engineering);
+    }
+
+    @Test
+    public void testSkipRelationships() throws Exception {
+        ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
+                .load(getResource("reverseEngineering-skipRelationshipsLoading.xml").getURL().openStream());
+
+        assertSkipRelationshipsLoading(engineering);
+    }
+
+    @Test
+    public void testSkipPrimaryKeyLoading() throws Exception {
+        ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
+                .load(getResource("reverseEngineering-skipPrimaryKeyLoading.xml").getURL().openStream());
+
+        assertSkipPrimaryKeyLoading(engineering);
+    }
+
+    @Test
+    public void testTableTypes() throws Exception {
+        ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
+                .load(getResource("reverseEngineering-tableTypes.xml").getURL().openStream());
+
+        assertTableTypes(engineering);
+    }
+
+    protected URLResource getResource(String file) throws MalformedURLException {
+        return new URLResource(getClass().getResource(file));
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/main/java/org/apache/cayenne/tools/AntTableType.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/AntTableType.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/AntTableType.java
new file mode 100644
index 0000000..d195f9a
--- /dev/null
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/AntTableType.java
@@ -0,0 +1,35 @@
+/*
+ *    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.tools;
+
+public class AntTableType {
+    private String name;
+
+    public void addText(String string) {
+        setName(string);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index 5954b9f..48498a6 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -74,46 +74,57 @@ public class DbImporterTask extends Task {
     }
 
     public void addIncludeColumn(IncludeColumn includeColumn) {
+        isReverseEngineeringDefined = true;
         reverseEngineering.addIncludeColumn(includeColumn);
     }
 
     public void addExcludeColumn(ExcludeColumn excludeColumn) {
+        isReverseEngineeringDefined = true;
         reverseEngineering.addExcludeColumn(excludeColumn);
     }
 
     public void addIncludeTable(IncludeTable includeTable) {
+        isReverseEngineeringDefined = true;
         reverseEngineering.addIncludeTable(includeTable);
     }
 
     public void addExcludeTable(ExcludeTable excludeTable) {
+        isReverseEngineeringDefined = true;
         reverseEngineering.addExcludeTable(excludeTable);
     }
 
     public void addIncludeProcedure(IncludeProcedure includeProcedure) {
+        isReverseEngineeringDefined = true;
         reverseEngineering.addIncludeProcedure(includeProcedure);
     }
 
     public void addExcludeProcedure(ExcludeProcedure excludeProcedure) {
+        isReverseEngineeringDefined = true;
         reverseEngineering.addExcludeProcedure(excludeProcedure);
     }
 
-    public void addSkipRelationshipsLoading(boolean skipRelationshipsLoading) {
+    public void setSkipRelationshipsLoading(boolean skipRelationshipsLoading) {
+        isReverseEngineeringDefined = true;
         reverseEngineering.setSkipRelationshipsLoading(skipRelationshipsLoading);
     }
 
-    public void addSkipPrimaryKeyLoading(boolean skipPrimaryKeyLoading) {
+    public void setSkipPrimaryKeyLoading(boolean skipPrimaryKeyLoading) {
+        isReverseEngineeringDefined = true;
         reverseEngineering.setSkipPrimaryKeyLoading(skipPrimaryKeyLoading);
     }
 
-    public void addTableType(String type) {
-        reverseEngineering.addTableType(type);
+    public void addConfiguredTableType(AntTableType type) {
+        isReverseEngineeringDefined = true;
+        reverseEngineering.addTableType(type.getName());
     }
 
     public void addConfiguredSchema(Schema schema) {
+        isReverseEngineeringDefined = true;
         reverseEngineering.addSchema(schema);
     }
 
     public void addCatalog(Catalog catalog) {
+        isReverseEngineeringDefined = true;
         reverseEngineering.addCatalog(catalog);
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java b/cayenne-tools/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
index c597036..8806080 100644
--- a/cayenne-tools/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
+++ b/cayenne-tools/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
@@ -18,23 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.tools;
 
-import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.*;
-import static org.apache.commons.lang.StringUtils.isBlank;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.File;
-import java.io.FileReader;
-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 org.apache.cayenne.test.file.FileUtil;
 import org.apache.cayenne.test.jdbc.SQLReader;
 import org.apache.cayenne.test.resource.ResourceUtil;
@@ -50,184 +33,202 @@ import org.custommonkey.xmlunit.XMLUnit;
 import org.junit.Test;
 import org.xml.sax.SAXException;
 
+import java.io.File;
+import java.io.FileReader;
+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.dbimport.DefaultReverseEngineeringLoaderTest.assertCatalog;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertCatalogAndSchema;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertFlat;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertSchema;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertSkipRelationshipsLoading;
+import static org.apache.cayenne.dbimport.DefaultReverseEngineeringLoaderTest.assertTableTypes;
+import static org.apache.commons.lang.StringUtils.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.
 public class DbImporterTaskTest {
 
-	static {
-		XMLUnit.setIgnoreWhitespace(true);
-	}
-
-	@Test
-	public void testLoadCatalog() throws Exception {
-		assertCatalog(getCdbImport("build-catalog.xml").getReverseEngineering());
-	}
-
-	@Test
-	public void testLoadSchema() throws Exception {
-		assertSchema(getCdbImport("build-schema.xml").getReverseEngineering());
-	}
-
-	@Test
-	public void testLoadCatalogAndSchema() throws Exception {
-		assertCatalogAndSchema(getCdbImport("build-catalog-and-schema.xml").getReverseEngineering());
-	}
-
-	@Test
-	public void testLoadFlat() throws Exception {
-		assertFlat(getCdbImport("build-flat.xml").getReverseEngineering());
-	}
-
-	@Test
-	public void testSkipRelationshipsLoading() throws Exception {
-		assertSkipRelationshipsLoading(getCdbImport("build-skip-relationships-loading.xml").getReverseEngineering());
-	}
-
-	@Test
-	public void testTableTypes() throws Exception {
-		assertTableTypes(getCdbImport("build-table-types.xml").getReverseEngineering());
-	}
-
-	@Test
-	public void testIncludeTable() throws Exception {
-		test("build-include-table.xml");
-	}
-
-	private DbImporterTask getCdbImport(String buildFile) {
-		Project project = new Project();
-
-		File map = distDir(buildFile);
-		ResourceUtil.copyResourceToFile(getPackagePath() + "/" + buildFile, map);
-		ProjectHelper.configureProject(project, map);
-
-		UnknownElement task = (UnknownElement) project.getTargets().get("dist").getTasks()[0];
-		task.maybeConfigure();
-
-		return (DbImporterTask) task.getRealThing();
-	}
-
-	private static File distDir(String name) {
-		File distDir = new File(FileUtil.baseTestDirectory(), "cdbImport");
-		File file = new File(distDir, name);
-		distDir = file.getParentFile();
-		// prepare destination directory
-		if (!distDir.exists()) {
-			assertTrue(distDir.mkdirs());
-		}
-		return file;
-	}
-
-	private String getPackagePath() {
-		return getClass().getPackage().getName().replace('.', '/');
-	}
-
-	private void test(String name) throws Exception {
-		DbImporterTask cdbImport = getCdbImport("dbimport/" + name);
-		File mapFile = cdbImport.getMap();
-		URL mapUrl = this.getClass().getResource("dbimport/" + mapFile.getName());
-		if (mapUrl != null && new File(mapUrl.toURI()).exists()) {
-			ResourceUtil.copyResourceToFile(mapUrl, mapFile);
-		}
-
-		URL mapUrlRes = this.getClass().getResource("dbimport/" + mapFile.getName() + "-result");
-		if (mapUrlRes != null && new File(mapUrlRes.toURI()).exists()) {
-			ResourceUtil
-					.copyResourceToFile(mapUrlRes, new File(mapFile.getParentFile(), mapFile.getName() + "-result"));
-		}
-
-		File mapFileCopy = distDir("copy-" + mapFile.getName());
-		if (mapFile.exists()) {
-			FileUtils.getFileUtils().copyFile(mapFile, mapFileCopy);
-			cdbImport.setMap(mapFileCopy);
-		} else {
-			mapFileCopy = mapFile;
-		}
-
-		prepareDatabase(name, cdbImport.toParameters());
-
-		try {
-			cdbImport.execute();
-			verifyResult(mapFile, mapFileCopy);
-		} finally {
-			cleanDb(cdbImport.toParameters());
-		}
-	}
-
-	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");
-			}
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	private void verifyResult(File map, File mapFileCopy) {
-		try {
-			FileReader control = new FileReader(map.getAbsolutePath() + "-result");
-			FileReader test = new FileReader(mapFileCopy);
-
-			DetailedDiff diff = new DetailedDiff(new Diff(control, test));
-			if (!diff.similar()) {
-				for (Difference d : ((List<Difference>) diff.getAllDifferences())) {
-
-					System.out.println("-------------------------------------------");
-					System.out.println(d.getTestNodeDetail().getNode());
-					System.out.println(d.getControlNodeDetail().getValue());
-				}
-				fail(diff.toString());
-			}
-
-		} catch (SAXException e) {
-			e.printStackTrace();
-			fail();
-		} catch (IOException e) {
-			e.printStackTrace();
-			fail();
-		}
-	}
-
-	private void prepareDatabase(String sqlFile, DbImportConfiguration dbImportConfiguration) throws Exception {
-
-		URL sqlUrl = ResourceUtil.getResource(getClass(), "dbimport/" + sqlFile + ".sql");
-		assertNotNull(sqlUrl);
-
-		Class.forName(dbImportConfiguration.getDriver()).newInstance();
-
-		try (Connection c = DriverManager.getConnection(dbImportConfiguration.getUrl());) {
-
-			// TODO: move parsing SQL files to a common utility (DBHelper?) .
-			// ALso see UnitDbApater.executeDDL - this should use the same
-			// utility
-
-			try (Statement stmt = c.createStatement();) {
-				for (String sql : SQLReader.statements(sqlUrl, ";")) {
-
-					// skip comments
-					if (sql.startsWith("-- ")) {
-						continue;
-					}
-
-					stmt.execute(sql);
-				}
-			}
-		}
-	}
+    static {
+        XMLUnit.setIgnoreWhitespace(true);
+    }
+
+    private static File distDir(String name) {
+        File distDir = new File(FileUtil.baseTestDirectory(), "cdbImport");
+        File file = new File(distDir, name);
+        distDir = file.getParentFile();
+        // prepare destination directory
+        if (!distDir.exists()) {
+            assertTrue(distDir.mkdirs());
+        }
+        return file;
+    }
+
+    @Test
+    public void testLoadCatalog() throws Exception {
+        assertCatalog(getCdbImport("build-catalog.xml").getReverseEngineering());
+    }
+
+    @Test
+    public void testLoadSchema() throws Exception {
+        assertSchema(getCdbImport("build-schema.xml").getReverseEngineering());
+    }
+
+    @Test
+    public void testLoadCatalogAndSchema() throws Exception {
+        assertCatalogAndSchema(getCdbImport("build-catalog-and-schema.xml").getReverseEngineering());
+    }
+
+    @Test
+    public void testLoadFlat() throws Exception {
+        assertFlat(getCdbImport("build-flat.xml").getReverseEngineering());
+    }
+
+    @Test
+    public void testSkipRelationshipsLoading() throws Exception {
+        assertSkipRelationshipsLoading(getCdbImport("build-skip-relationships-loading.xml").getReverseEngineering());
+    }
+
+    @Test
+    public void testTableTypes() throws Exception {
+        assertTableTypes(getCdbImport("build-table-types.xml").getReverseEngineering());
+    }
+
+    @Test
+    public void testIncludeTable() throws Exception {
+        test("build-include-table.xml");
+    }
+
+    private DbImporterTask getCdbImport(String buildFile) {
+        Project project = new Project();
+
+        File map = distDir(buildFile);
+        ResourceUtil.copyResourceToFile(getPackagePath() + "/" + buildFile, map);
+        ProjectHelper.configureProject(project, map);
+
+        UnknownElement task = (UnknownElement) project.getTargets().get("dist").getTasks()[0];
+        task.maybeConfigure();
+
+        return (DbImporterTask) task.getRealThing();
+    }
+
+    private String getPackagePath() {
+        return getClass().getPackage().getName().replace('.', '/');
+    }
+
+    private void test(String name) throws Exception {
+        DbImporterTask cdbImport = getCdbImport(name);
+        File mapFile = cdbImport.getMap();
+
+        URL mapUrlRes = this.getClass().getResource(mapFile.getName() + "-result");
+        assertTrue(mapUrlRes != null && new File(mapUrlRes.toURI()).exists());
+        assertTrue(ResourceUtil
+                .copyResourceToFile(mapUrlRes, new File(mapFile.getParentFile(), mapFile.getName() + "-result")));
+
+
+        File mapFileCopy = distDir("copy-" + mapFile.getName());
+        if (mapFile.exists()) {
+            FileUtils.getFileUtils().copyFile(mapFile, mapFileCopy);
+            cdbImport.setMap(mapFileCopy);
+        } else {
+            mapFileCopy = mapFile;
+        }
+
+        prepareDatabase(name, cdbImport.toParameters());
+
+        try {
+            cdbImport.execute();
+            verifyResult(mapFile, mapFileCopy);
+        } finally {
+            cleanDb(cdbImport.toParameters());
+        }
+    }
+
+    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");
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private void verifyResult(File map, File mapFileCopy) {
+        try {
+            FileReader control = new FileReader(map.getAbsolutePath() + "-result");
+            FileReader test = new FileReader(mapFileCopy);
+
+            DetailedDiff diff = new DetailedDiff(new Diff(control, test));
+            if (!diff.similar()) {
+                for (Difference d : ((List<Difference>) diff.getAllDifferences())) {
+
+                    System.out.println("-------------------------------------------");
+                    System.out.println(d.getTestNodeDetail().getNode());
+                    System.out.println(d.getControlNodeDetail().getValue());
+                }
+                fail(diff.toString());
+            }
+
+        } catch (SAXException e) {
+            e.printStackTrace();
+            fail();
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    private void prepareDatabase(String sqlFile, DbImportConfiguration dbImportConfiguration) throws Exception {
+
+        URL sqlUrl = ResourceUtil.getResource(getClass(), sqlFile + ".sql");
+        assertNotNull(sqlUrl);
+
+        Class.forName(dbImportConfiguration.getDriver()).newInstance();
+
+        try (Connection c = DriverManager.getConnection(dbImportConfiguration.getUrl());) {
+
+            // TODO: move parsing SQL files to a common utility (DBHelper?) .
+            // ALso see UnitDbApater.executeDDL - this should use the same
+            // utility
+
+            try (Statement stmt = c.createStatement();) {
+                for (String sql : SQLReader.statements(sqlUrl, ";")) {
+
+                    // skip comments
+                    if (sql.startsWith("-- ")) {
+                        continue;
+                    }
+
+                    stmt.execute(sql);
+                }
+            }
+        }
+    }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.map.xml-result
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.map.xml-result b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.map.xml-result
new file mode 100644
index 0000000..760ce23
--- /dev/null
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.map.xml-result
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+	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.
+-->
+<data-map xmlns="http://cayenne.apache.org/schema/8/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/8/modelMap http://cayenne.apache.org/schema/8/modelMap.xsd"
+          project-version="8">
+    <db-entity name="PARENT" schema="APP">
+        <db-attribute name="COL2" type="CHAR" length="25"/>
+        <db-attribute name="COL3" type="DECIMAL" length="10" scale="2"/>
+        <db-attribute name="COL4" type="VARCHAR" length="25"/>
+        <db-attribute name="COL5" type="DATE" length="10"/>
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+    </db-entity>
+    <obj-entity name="Parent" className="Parent" dbEntityName="PARENT">
+        <obj-attribute name="col2" type="java.lang.String" db-attribute-path="COL2"/>
+        <obj-attribute name="col3" type="java.math.BigDecimal" db-attribute-path="COL3"/>
+        <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
+        <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
+    </obj-entity>
+</data-map>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.xml
new file mode 100644
index 0000000..befa01b
--- /dev/null
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.xml
@@ -0,0 +1,34 @@
+<!--
+  ~ 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.
+  -->
+
+<project name="MyProject" default="dist" basedir="../">
+
+    <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
+             classpath="${basedir}"/>
+
+    <target name="dist">
+        <cdbimport map="build-include-table.map.xml"
+                   driver="org.apache.derby.jdbc.EmbeddedDriver"
+                   url="jdbc:derby:memory:DbImporterMojoTest;create=true">
+            <includeTable>Parent</includeTable>
+        </cdbimport>
+    </target>
+
+
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.xml.sql
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.xml.sql b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.xml.sql
new file mode 100644
index 0000000..e392d08
--- /dev/null
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-include-table.xml.sql
@@ -0,0 +1,38 @@
+--  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.
+ 
+
+CREATE TABLE Parent (
+  id INTEGER NOT NULL,
+  COL2 CHAR(25),
+  COL3 DECIMAL(10,2),
+  COL4 VARCHAR(25),
+  COL5 DATE,
+
+  PRIMARY KEY (id),
+  UNIQUE (COL3)
+);
+
+CREATE TABLE Child (
+  id INTEGER NOT NULL,
+  Parent_id CHAR(25),
+  COL3 DECIMAL(10,2),
+  COL4 VARCHAR(25),
+  COL5 DATE,
+
+  PRIMARY KEY (id)
+);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
index bd12051..396b603 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
@@ -27,8 +27,7 @@
                    adapter="org.apache.cayenne.dba.hsqldb.HSQLDBAdapter"
                    driver="org.hsqldb.jdbcDriver"
                    url="jdbc:hsqldb:hsql://localhost/bookmarker"
-                   username="sa">
-            <skipPrimaryKeyLoading>true</skipPrimaryKeyLoading>
+                   username="sa" skipPrimaryKeyLoading="true">
         </cdbimport>
     </target>
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-relationships-loading.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-relationships-loading.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-relationships-loading.xml
index 8a3ee50..b2c801b 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-relationships-loading.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-relationships-loading.xml
@@ -27,10 +27,8 @@
                    adapter="org.apache.cayenne.dba.hsqldb.HSQLDBAdapter"
                    driver="org.hsqldb.jdbcDriver"
                    url="jdbc:hsqldb:hsql://localhost/bookmarker"
-                   username="sa">
-
-            <skipRelationshipsLoading>true</skipRelationshipsLoading>
-        </cdbimport>
+                   username="sa"
+                   skipRelationshipsLoading="true"/>
     </target>
 
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.map.xml-result
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.map.xml-result b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.map.xml-result
deleted file mode 100644
index 760ce23..0000000
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.map.xml-result
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-	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.
--->
-<data-map xmlns="http://cayenne.apache.org/schema/8/modelMap"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://cayenne.apache.org/schema/8/modelMap http://cayenne.apache.org/schema/8/modelMap.xsd"
-          project-version="8">
-    <db-entity name="PARENT" schema="APP">
-        <db-attribute name="COL2" type="CHAR" length="25"/>
-        <db-attribute name="COL3" type="DECIMAL" length="10" scale="2"/>
-        <db-attribute name="COL4" type="VARCHAR" length="25"/>
-        <db-attribute name="COL5" type="DATE" length="10"/>
-        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-    </db-entity>
-    <obj-entity name="Parent" className="Parent" dbEntityName="PARENT">
-        <obj-attribute name="col2" type="java.lang.String" db-attribute-path="COL2"/>
-        <obj-attribute name="col3" type="java.math.BigDecimal" db-attribute-path="COL3"/>
-        <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
-        <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
-    </obj-entity>
-</data-map>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml
deleted file mode 100644
index a100fcd..0000000
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-  ~ 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.
-  -->
-
-<project name="MyProject" default="dist" basedir="../">
-
-    <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
-             classpath="${basedir}"/>
-
-    <target name="dist">
-        <cdbimport map="dbimport/build-include-table.map.xml"
-                   driver="org.apache.derby.jdbc.EmbeddedDriver"
-                   url="jdbc:derby:memory:DbImporterMojoTest;create=true">
-            <includeTable>Parent</includeTable>
-        </cdbimport>
-    </target>
-
-
-</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ab6c204f/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml.sql
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml.sql b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml.sql
deleted file mode 100644
index e392d08..0000000
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml.sql
+++ /dev/null
@@ -1,38 +0,0 @@
---  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.
- 
-
-CREATE TABLE Parent (
-  id INTEGER NOT NULL,
-  COL2 CHAR(25),
-  COL3 DECIMAL(10,2),
-  COL4 VARCHAR(25),
-  COL5 DATE,
-
-  PRIMARY KEY (id),
-  UNIQUE (COL3)
-);
-
-CREATE TABLE Child (
-  id INTEGER NOT NULL,
-  Parent_id CHAR(25),
-  COL3 DECIMAL(10,2),
-  COL4 VARCHAR(25),
-  COL5 DATE,
-
-  PRIMARY KEY (id)
-);
\ No newline at end of file


[9/9] cayenne git commit: CAY-2118 cdbimport: drop support for the old style of table filtering

Posted by aa...@apache.org.
CAY-2118 cdbimport: drop support for the old style of table filtering


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

Branch: refs/heads/master
Commit: ec0d6b2ca18e30bd77e24b24b3ce23e0204a1086
Parents: e9e81a6
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 13:51:20 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 17:23:27 2016 +0300

----------------------------------------------------------------------
 docs/doc/src/main/resources/RELEASE-NOTES.txt |  3 ++-
 docs/doc/src/main/resources/UPGRADE.txt       | 15 +++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/ec0d6b2c/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index fcd7155..aa268b2 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -32,7 +32,8 @@ CAY-2107 cayenne-crypto: Lazy initialization of crypto subsystem
 CAY-2111 Unbind transaction object from the current thread for iterated queries
 CAY-2112 Expose callback for "performInTransaction"
 CAY-2113 cdbimport: Reverse-engineering reinstates previously ignored columns
-CAY-2116 Split schema synchronization code in a separate module 
+CAY-2116 Split schema synchronization code in a separate module
+CAY-2118 cdbimport: drop support for the old style of table filtering
 
 Bug Fixes:
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ec0d6b2c/docs/doc/src/main/resources/UPGRADE.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/UPGRADE.txt b/docs/doc/src/main/resources/UPGRADE.txt
index e8fc253..a99e083 100644
--- a/docs/doc/src/main/resources/UPGRADE.txt
+++ b/docs/doc/src/main/resources/UPGRADE.txt
@@ -15,6 +15,21 @@ UPGRADING TO 4.0.M4
   so if you were using org.apache.cayenne.configuration.rop.server.ROPHessianServlet in your web.xml configuration,
   you must change it to org.apache.cayenne.rop.ROPServlet
 
+* Per CAY-2118 we stopped a bunch of deprecated keys in cdbimport configuration, and also removed the ability to set
+  properties of "reverseEngineering" config object at the top level of configuration. So you will always need
+  <reverseEngineering></reverseEngineering> tag in Maven (but not Ant) to setup any DB filtering. Removed top-level
+  configuration keys:
+
+  1. catalog
+  2. schema (also schemaName)
+  3. excludeTables
+  4. includeTables
+  5. procedurePattern
+  6. tablePattern
+  7. importProcedures
+  8. meaningfulPk
+  9. overwrite
+
 UPGRADING TO 4.0.M3
 
 * Per CAY-2026 minimal Java version is now 1.7. If you are still need Java 1.6, you can use Cayenne 3.1 or 4.0.M2 until your


[6/9] cayenne git commit: CAY-2116 Split schema synchronization code in a separate module

Posted by aa...@apache.org.
CAY-2116 Split schema synchronization code in a separate module

* removing unused code... prolly work in progress ... does not belong on master


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

Branch: refs/heads/master
Commit: f3d737435953330c176023a9ef7b69314ea72518
Parents: 2ba43b0
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 14:55:48 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 14:55:48 2016 +0300

----------------------------------------------------------------------
 .../config/DefaultTypeMapperBuilder.java        |  82 ----------
 .../cayenne/tools/dbimport/config/Type.java     | 151 -------------------
 .../tools/dbimport/config/TypeMapper.java       | 101 -------------
 3 files changed, 334 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3d73743/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/DefaultTypeMapperBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/DefaultTypeMapperBuilder.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/DefaultTypeMapperBuilder.java
deleted file mode 100644
index c8cab3a..0000000
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/DefaultTypeMapperBuilder.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*****************************************************************
- *   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.tools.dbimport.config;
-
-import org.apache.cayenne.dbsync.reverse.mapper.DbType;
-import org.apache.cayenne.dbsync.reverse.mapper.DefaultJdbc2JavaTypeMapper;
-import org.apache.cayenne.dbsync.reverse.mapper.Jdbc2JavaTypeMapper;
-import org.apache.commons.lang.ClassUtils;
-import org.apache.commons.logging.Log;
-
-import static org.apache.commons.lang.StringUtils.isBlank;
-
-/**
- * @since 4.0.
- */
-public class DefaultTypeMapperBuilder {
-
-    private final DefaultJdbc2JavaTypeMapper mapper;
-    private final Log logger;
-
-    public DefaultTypeMapperBuilder(Log logger, TypeMapper typeMapper) {
-        this.logger = logger;
-        this.mapper = createMapper(typeMapper.getMapperClassName());
-
-        for (Type type : typeMapper.getTypes()) {
-            this.mapper.add(buildType(type), type.getJava());
-        }
-    }
-
-    private DbType buildType(Type type) {
-        return new DbType(
-                type.getJdbc(),
-                type.getLength(),
-                type.getPrecision(),
-                type.getScale(),
-                type.getNotNull()
-        );
-    }
-
-    private DefaultJdbc2JavaTypeMapper createMapper(String className) {
-        if (!isBlank(className)) {
-            try {
-                return (DefaultJdbc2JavaTypeMapper) ClassUtils.getClass(Thread.currentThread()
-                        .getContextClassLoader(), className).newInstance();
-            } catch (ClassNotFoundException e) {
-                logger.error("Can't load class '" + className + "': ", e);
-            } catch (InstantiationException e) {
-                logger.error("Can't instantiate '" + className + "' make sure it has default constructor.", e);
-            } catch (IllegalAccessException e) {
-                logger.error("Can't instantiate '" + className + "' make sure it has default constructor.", e);
-            }
-        }
-
-        return new DefaultJdbc2JavaTypeMapper();
-    }
-
-    public DefaultTypeMapperBuilder setUsePrimitives(Boolean usePrimitives) {
-        mapper.setUsePrimitives(usePrimitives);
-
-        return this;
-    }
-
-    public Jdbc2JavaTypeMapper build() {
-        return mapper;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3d73743/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Type.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Type.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Type.java
deleted file mode 100644
index b995c62..0000000
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Type.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*****************************************************************
- *   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.tools.dbimport.config;
-
-import org.apache.cayenne.util.ToStringBuilder;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-
-/**
- * @since 4.0.
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-public class Type {
-
-    @XmlElement(name = "jdbc")
-    private String jdbc;
-
-    @XmlElement(name = "java")
-    private String java;
-
-    @XmlElement(name = "length")
-    private Integer length;
-
-    @XmlElement(name = "precision")
-    private Integer precision;
-
-    @XmlElement(name = "scale")
-    private Integer scale;
-
-    @XmlElement(name = "notNull")
-    private Boolean notNull;
-
-    public String getJdbc() {
-        return jdbc;
-    }
-
-    public void setJdbc(String jdbc) {
-        this.jdbc = jdbc;
-    }
-
-    public String getJava() {
-        return java;
-    }
-
-    public void setJava(String java) {
-        this.java = java;
-    }
-
-    public Integer getLength() {
-        return length;
-    }
-
-    public void setLength(Integer length) {
-        this.length = length;
-    }
-
-    public Integer getPrecision() {
-        return precision;
-    }
-
-    public void setPrecision(Integer precision) {
-        this.precision = precision;
-    }
-
-    public Integer getScale() {
-        return scale;
-    }
-
-    public void setScale(Integer scale) {
-        this.scale = scale;
-    }
-
-    public Boolean getNotNull() {
-        return notNull;
-    }
-
-    public void setNotNull(Boolean notNull) {
-        this.notNull = notNull;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        Type type = (Type) o;
-
-        if (jdbc != null ? !jdbc.equals(type.jdbc) : type.jdbc != null) {
-            return false;
-        }
-        if (!length.equals(type.length)) {
-            return false;
-        }
-        if (!notNull.equals(type.notNull)) {
-            return false;
-        }
-        if (!precision.equals(type.precision)) {
-            return false;
-        }
-        if (!scale.equals(type.scale)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = jdbc != null ? jdbc.hashCode() : 0;
-        result = 31 * result + length.hashCode();
-        result = 31 * result + precision.hashCode();
-        result = 31 * result + scale.hashCode();
-        result = 31 * result + notNull.hashCode();
-        return result;
-    }
-
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this)
-                .append("jdbc", jdbc)
-                .append("java", java)
-                .append("length", length)
-                .append("precision", precision)
-                .append("scale", scale)
-                .append("notNull", notNull)
-                .toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3d73743/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/TypeMapper.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/TypeMapper.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/TypeMapper.java
deleted file mode 100644
index 048c753..0000000
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/TypeMapper.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*****************************************************************
- *   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.tools.dbimport.config;
-
-import org.apache.cayenne.util.EqualsBuilder;
-import org.apache.cayenne.util.HashCodeBuilder;
-
-import javax.xml.bind.annotation.*;
-import java.util.Collection;
-import java.util.LinkedList;
-
-/**
- * @since 4.0.
- */
-@XmlRootElement(name = "typeMapper")
-@XmlAccessorType(XmlAccessType.FIELD)
-public class TypeMapper {
-
-    @XmlElement(name = "mapperClassName")
-    private String mapperClassName;
-
-    @XmlElement(name = "usePrimitives")
-    private Boolean usePrimitives;
-
-    @XmlElement(name = "type")
-    private Collection<Type> types = new LinkedList<Type>();
-
-    public String getMapperClassName() {
-        return mapperClassName;
-    }
-
-    public void setMapperClassName(String mapperClassName) {
-        this.mapperClassName = mapperClassName;
-    }
-
-    public Boolean getUsePrimitives() {
-        return usePrimitives;
-    }
-
-    public void setUsePrimitives(Boolean usePrimitives) {
-        this.usePrimitives = usePrimitives;
-    }
-
-    public Collection<Type> getTypes() {
-        return types;
-    }
-
-    public void setTypes(Collection<Type> types) {
-        this.types = types;
-    }
-
-    public void addType(Type type) {
-        this.types.add(type);
-    }
-
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (obj == this) {
-            return true;
-        }
-        if (obj.getClass() != getClass()) {
-            return false;
-        }
-        TypeMapper rhs = (TypeMapper) obj;
-        return new EqualsBuilder()
-                .append(this.mapperClassName, rhs.mapperClassName)
-                .append(this.usePrimitives, rhs.usePrimitives)
-                .append(this.types, rhs.types)
-                .isEquals();
-    }
-
-    @Override
-    public int hashCode() {
-        return new HashCodeBuilder().append(mapperClassName).append(usePrimitives).append(types).toHashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "TypeMapper {mapperClassName=" + mapperClassName + ", usePrimitives=" + usePrimitives + ", types=" + types + '}';
-    }
-}


[5/9] cayenne git commit: CAY-2118 cdbimport: drop support for the old style of table filtering

Posted by aa...@apache.org.
CAY-2118 cdbimport: drop support for the old style of table filtering

* ant task...


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

Branch: refs/heads/master
Commit: 2ba43b064ed3fd0e6d7b058014bbd474ec5ca53a
Parents: a98f0a0
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 13:51:20 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 14:54:38 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbimport/ReverseEngineering.java    | 15 ++--
 .../apache/cayenne/tools/DbImporterTask.java    | 73 ++++++++++++++----
 .../tools/dbimport/DbImportConfiguration.java   | 13 ----
 .../cayenne/tools/build-catalog-and-schema.xml  | 16 ++--
 .../org/apache/cayenne/tools/build-catalog.xml  | 17 ++---
 .../org/apache/cayenne/tools/build-flat.xml     | 18 ++---
 .../org/apache/cayenne/tools/build-mapping.xml  | 12 +--
 .../org/apache/cayenne/tools/build-schema.xml   | 80 ++++++++++----------
 .../tools/build-skip-primary-key-loading.xml    |  7 +-
 .../tools/build-skip-relationships-loading.xml  |  6 +-
 .../apache/cayenne/tools/build-table-types.xml  |  6 +-
 .../tools/dbimport/build-include-table.xml      |  3 +-
 12 files changed, 148 insertions(+), 118 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineering.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineering.java b/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineering.java
index 06528bf..2d74d85 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineering.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineering.java
@@ -23,12 +23,15 @@ import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.util.XMLEncoder;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
-import javax.xml.bind.annotation.*;
-import java.io.*;
-import java.util.*;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.LinkedList;
 
 /**
  * @since 4.0.
@@ -37,8 +40,6 @@ import java.util.*;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class ReverseEngineering extends FilterContainer implements ConfigurationNode, Serializable {
 
-    private static final Log LOG = LogFactory.getLog(ReverseEngineering.class);
-
     @XmlTransient
     protected Resource configurationSource;
     @XmlTransient

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index ea95110..5954b9f 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -25,8 +25,16 @@ import org.apache.cayenne.configuration.server.DataSourceFactory;
 import org.apache.cayenne.configuration.server.DbAdapterFactory;
 import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbimport.Catalog;
 import org.apache.cayenne.dbimport.DefaultReverseEngineeringLoader;
+import org.apache.cayenne.dbimport.ExcludeColumn;
+import org.apache.cayenne.dbimport.ExcludeProcedure;
+import org.apache.cayenne.dbimport.ExcludeTable;
+import org.apache.cayenne.dbimport.IncludeColumn;
+import org.apache.cayenne.dbimport.IncludeProcedure;
+import org.apache.cayenne.dbimport.IncludeTable;
 import org.apache.cayenne.dbimport.ReverseEngineering;
+import org.apache.cayenne.dbimport.Schema;
 import org.apache.cayenne.dbsync.CayenneDbSyncModule;
 import org.apache.cayenne.dbsync.reverse.FiltersConfigBuilder;
 import org.apache.cayenne.di.DIBootstrap;
@@ -53,19 +61,65 @@ import java.net.URL;
 public class DbImporterTask extends Task {
 
     private final DbImportConfiguration config;
-    private final ReverseEngineering reverseEngineering = new ReverseEngineering();
-
+    private ReverseEngineering reverseEngineering;
     private boolean isReverseEngineeringDefined;
 
     public DbImporterTask() {
-        config = new DbImportConfiguration();
-        config.setOverwrite(true);
-        config.setUsePrimitives(true);
-        config.setNamingStrategy(DefaultNameGenerator.class.getName());
+        this.config = new DbImportConfiguration();
+        this.config.setUsePrimitives(true);
+        this.config.setNamingStrategy(DefaultNameGenerator.class.getName());
+
+        // reverse engineering config is flattened into task...
+        this.reverseEngineering = new ReverseEngineering();
+    }
+
+    public void addIncludeColumn(IncludeColumn includeColumn) {
+        reverseEngineering.addIncludeColumn(includeColumn);
+    }
+
+    public void addExcludeColumn(ExcludeColumn excludeColumn) {
+        reverseEngineering.addExcludeColumn(excludeColumn);
+    }
+
+    public void addIncludeTable(IncludeTable includeTable) {
+        reverseEngineering.addIncludeTable(includeTable);
+    }
+
+    public void addExcludeTable(ExcludeTable excludeTable) {
+        reverseEngineering.addExcludeTable(excludeTable);
+    }
+
+    public void addIncludeProcedure(IncludeProcedure includeProcedure) {
+        reverseEngineering.addIncludeProcedure(includeProcedure);
+    }
+
+    public void addExcludeProcedure(ExcludeProcedure excludeProcedure) {
+        reverseEngineering.addExcludeProcedure(excludeProcedure);
+    }
+
+    public void addSkipRelationshipsLoading(boolean skipRelationshipsLoading) {
+        reverseEngineering.setSkipRelationshipsLoading(skipRelationshipsLoading);
+    }
+
+    public void addSkipPrimaryKeyLoading(boolean skipPrimaryKeyLoading) {
+        reverseEngineering.setSkipPrimaryKeyLoading(skipPrimaryKeyLoading);
+    }
+
+    public void addTableType(String type) {
+        reverseEngineering.addTableType(type);
+    }
+
+    public void addConfiguredSchema(Schema schema) {
+        reverseEngineering.addSchema(schema);
+    }
+
+    public void addCatalog(Catalog catalog) {
+        reverseEngineering.addCatalog(catalog);
     }
 
     @Override
     public void execute() {
+
         File dataMapFile = config.getDataMapFile();
         config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering).build());
 
@@ -196,13 +250,6 @@ public class DbImporterTask extends Task {
     /**
      * @since 4.0
      */
-    public void setOverwrite(boolean overwrite) {
-        config.setOverwrite(overwrite);
-    }
-
-    /**
-     * @since 4.0
-     */
     public void setDefaultPackage(String defaultPackage) {
         config.setDefaultPackage(defaultPackage);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
index ea0f6c7..2e2bd21 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
@@ -70,11 +70,6 @@ public class DbImportConfiguration {
      * A default package for ObjEntity Java classes.
      */
     private String defaultPackage;
-    /**
-     * Indicates that the old mapping should be completely removed and replaced
-     * with the new data based on reverse engineering.
-     */
-    private boolean overwrite;
     private String meaningfulPkTables;
     /**
      * Java class implementing org.apache.cayenne.dba.DbAdapter. This attribute
@@ -109,14 +104,6 @@ public class DbImportConfiguration {
         this.defaultPackage = defaultPackage;
     }
 
-    public boolean isOverwrite() {
-        return overwrite;
-    }
-
-    public void setOverwrite(boolean overwrite) {
-        this.overwrite = overwrite;
-    }
-
     public String getNamingStrategy() {
         return dbLoaderConfiguration.getNamingStrategy();
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-catalog-and-schema.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-catalog-and-schema.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-catalog-and-schema.xml
index 64ee1bc..ee44b9c 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-catalog-and-schema.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-catalog-and-schema.xml
@@ -20,7 +20,7 @@
 <project name="MyProject" default="dist" basedir=".">
 
     <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
-             classpath="${basedir}"  />
+             classpath="${basedir}"/>
 
     <target name="dist">
         <cdbimport map="${context.dir}/WEB-INF/DefaultMap.map.xml"
@@ -38,37 +38,37 @@
                     </includeTable>
 
                     <includeTable pattern="includeTable-03">
-                        <includeColumn pattern="includeColumn-01" />
-                        <excludeColumn pattern="excludeColumn-01" />
+                        <includeColumn pattern="includeColumn-01"/>
+                        <excludeColumn pattern="excludeColumn-01"/>
                     </includeTable>
 
                     <excludeTable>excludeTable-01</excludeTable>
                     <excludeTable>
                         <pattern>excludeTable-02</pattern>
                     </excludeTable>
-                    <excludeTable pattern="excludeTable-03" />
+                    <excludeTable pattern="excludeTable-03"/>
 
                     <includeColumn>includeColumn-01</includeColumn>
                     <includeColumn>
                         <pattern>includeColumn-02</pattern>
                     </includeColumn>
-                    <includeColumn pattern="includeColumn-03" />
+                    <includeColumn pattern="includeColumn-03"/>
                     <excludeColumn>excludeColumn-01</excludeColumn>
                     <excludeColumn>
                         <pattern>excludeColumn-02</pattern>
                     </excludeColumn>
-                    <excludeColumn pattern="excludeColumn-03" />
+                    <excludeColumn pattern="excludeColumn-03"/>
 
                     <includeProcedure>includeProcedure-01</includeProcedure>
                     <includeProcedure>
                         <pattern>includeProcedure-02</pattern>
                     </includeProcedure>
-                    <includeProcedure pattern="includeProcedure-03" />
+                    <includeProcedure pattern="includeProcedure-03"/>
                     <excludeProcedure>excludeProcedure-01</excludeProcedure>
                     <excludeProcedure>
                         <pattern>excludeProcedure-02</pattern>
                     </excludeProcedure>
-                    <excludeProcedure pattern="excludeProcedure-03" />
+                    <excludeProcedure pattern="excludeProcedure-03"/>
                 </schema>
             </catalog>
         </cdbimport>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-catalog.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-catalog.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-catalog.xml
index 32d7c7a..fa1781b 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-catalog.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-catalog.xml
@@ -20,7 +20,7 @@
 <project name="MyProject" default="dist" basedir=".">
 
     <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
-             classpath="${basedir}"  />
+             classpath="${basedir}"/>
 
     <target name="dist">
         <cdbimport map="${context.dir}/WEB-INF/DefaultMap.map.xml"
@@ -43,39 +43,38 @@
                 </includeTable>
 
                 <includeTable pattern="includeTable-03">
-                    <includeColumn pattern="includeColumn-01" />
-                    <excludeColumn pattern="excludeColumn-01" />
+                    <includeColumn pattern="includeColumn-01"/>
+                    <excludeColumn pattern="excludeColumn-01"/>
                 </includeTable>
 
                 <excludeTable>excludeTable-01</excludeTable>
                 <excludeTable>
                     <pattern>excludeTable-02</pattern>
                 </excludeTable>
-                <excludeTable pattern="excludeTable-03" />
+                <excludeTable pattern="excludeTable-03"/>
 
                 <includeColumn>includeColumn-01</includeColumn>
                 <includeColumn>
                     <pattern>includeColumn-02</pattern>
                 </includeColumn>
-                <includeColumn pattern="includeColumn-03" />
+                <includeColumn pattern="includeColumn-03"/>
                 <excludeColumn>excludeColumn-01</excludeColumn>
                 <excludeColumn>
                     <pattern>excludeColumn-02</pattern>
                 </excludeColumn>
-                <excludeColumn pattern="excludeColumn-03" />
+                <excludeColumn pattern="excludeColumn-03"/>
 
                 <includeProcedure>includeProcedure-01</includeProcedure>
                 <includeProcedure>
                     <pattern>includeProcedure-02</pattern>
                 </includeProcedure>
-                <includeProcedure pattern="includeProcedure-03" />
+                <includeProcedure pattern="includeProcedure-03"/>
                 <excludeProcedure>excludeProcedure-01</excludeProcedure>
                 <excludeProcedure>
                     <pattern>excludeProcedure-02</pattern>
                 </excludeProcedure>
-                <excludeProcedure pattern="excludeProcedure-03" />
+                <excludeProcedure pattern="excludeProcedure-03"/>
             </catalog>
-
         </cdbimport>
     </target>
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-flat.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-flat.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-flat.xml
index 29f9e72..286bcf3 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-flat.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-flat.xml
@@ -20,7 +20,7 @@
 <project name="MyProject" default="dist" basedir=".">
 
     <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
-             classpath="${basedir}"  />
+             classpath="${basedir}"/>
 
     <target name="dist">
         <cdbimport map="${context.dir}/WEB-INF/DefaultMap.map.xml"
@@ -28,7 +28,6 @@
                    driver="org.hsqldb.jdbcDriver"
                    url="jdbc:hsqldb:hsql://localhost/bookmarker"
                    username="sa">
-
             <includeTable>includeTable-01</includeTable>
 
             <includeTable>
@@ -36,38 +35,37 @@
             </includeTable>
 
             <includeTable pattern="includeTable-03">
-                <includeColumn pattern="includeColumn-01" />
-                <excludeColumn pattern="excludeColumn-01" />
+                <includeColumn pattern="includeColumn-01"/>
+                <excludeColumn pattern="excludeColumn-01"/>
             </includeTable>
 
             <excludeTable>excludeTable-01</excludeTable>
             <excludeTable>
                 <pattern>excludeTable-02</pattern>
             </excludeTable>
-            <excludeTable pattern="excludeTable-03" />
+            <excludeTable pattern="excludeTable-03"/>
 
             <includeColumn>includeColumn-01</includeColumn>
             <includeColumn>
                 <pattern>includeColumn-02</pattern>
             </includeColumn>
-            <includeColumn pattern="includeColumn-03" />
+            <includeColumn pattern="includeColumn-03"/>
             <excludeColumn>excludeColumn-01</excludeColumn>
             <excludeColumn>
                 <pattern>excludeColumn-02</pattern>
             </excludeColumn>
-            <excludeColumn pattern="excludeColumn-03" />
+            <excludeColumn pattern="excludeColumn-03"/>
 
             <includeProcedure>includeProcedure-01</includeProcedure>
             <includeProcedure>
                 <pattern>includeProcedure-02</pattern>
             </includeProcedure>
-            <includeProcedure pattern="includeProcedure-03" />
+            <includeProcedure pattern="includeProcedure-03"/>
             <excludeProcedure>excludeProcedure-01</excludeProcedure>
             <excludeProcedure>
                 <pattern>excludeProcedure-02</pattern>
             </excludeProcedure>
-            <excludeProcedure pattern="excludeProcedure-03" />
-
+            <excludeProcedure pattern="excludeProcedure-03"/>
         </cdbimport>
     </target>
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-mapping.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-mapping.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-mapping.xml
index 90d6116..b6ab93e 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-mapping.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-mapping.xml
@@ -20,7 +20,7 @@
 <project name="MyProject" default="dist" basedir=".">
 
     <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
-             classpath="${basedir}"  />
+             classpath="${basedir}"/>
 
     <target name="dist">
         <cdbimport map="${context.dir}/WEB-INF/DefaultMap.map.xml"
@@ -30,11 +30,11 @@
                    username="sa">
 
             <typeMapper mapperClassName="class" usePrimitives="false">
-                <type java="my.personal.type" jdbc="varchar" />
-                <type java="java-01" jdbc="jdbc-01" />
-                <type java="java-02" jdbc="jdbc-02" length="21" notNull="true" />
-                <type java="java-03" jdbc="jdbc-03" precision="5" scale="2" />
-                <type java="java-03" jdbc="jdbc-03" precision="7" notNull="true" />
+                <type java="my.personal.type" jdbc="varchar"/>
+                <type java="java-01" jdbc="jdbc-01"/>
+                <type java="java-02" jdbc="jdbc-02" length="21" notNull="true"/>
+                <type java="java-03" jdbc="jdbc-03" precision="5" scale="2"/>
+                <type java="java-03" jdbc="jdbc-03" precision="7" notNull="true"/>
             </typeMapper>
 
         </cdbimport>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-schema.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-schema.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-schema.xml
index 2d7bb6b..911af23 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-schema.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-schema.xml
@@ -20,7 +20,7 @@
 <project name="MyProject" default="dist" basedir=".">
 
     <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
-             classpath="${basedir}"  />
+             classpath="${basedir}"/>
 
     <target name="dist">
         <cdbimport map="${context.dir}/WEB-INF/DefaultMap.map.xml"
@@ -29,52 +29,52 @@
                    url="jdbc:hsqldb:hsql://localhost/bookmarker"
                    username="sa">
 
-            <schema>schema-name-01</schema>
+                <schema>schema-name-01</schema>
 
-            <schema>
-                <name>schema-name-02</name>
-            </schema>
+                <schema>
+                    <name>schema-name-02</name>
+                </schema>
 
-            <schema name="schema-name-03">
-                <includeTable>includeTable-01</includeTable>
+                <schema name="schema-name-03">
+                    <includeTable>includeTable-01</includeTable>
 
-                <includeTable>
-                    <pattern>includeTable-02</pattern>
-                </includeTable>
+                    <includeTable>
+                        <pattern>includeTable-02</pattern>
+                    </includeTable>
 
-                <includeTable pattern="includeTable-03">
-                    <includeColumn pattern="includeColumn-01" />
-                    <excludeColumn pattern="excludeColumn-01" />
-                </includeTable>
+                    <includeTable pattern="includeTable-03">
+                        <includeColumn pattern="includeColumn-01"/>
+                        <excludeColumn pattern="excludeColumn-01"/>
+                    </includeTable>
 
-                <excludeTable>excludeTable-01</excludeTable>
-                <excludeTable>
-                    <pattern>excludeTable-02</pattern>
-                </excludeTable>
-                <excludeTable pattern="excludeTable-03" />
+                    <excludeTable>excludeTable-01</excludeTable>
+                    <excludeTable>
+                        <pattern>excludeTable-02</pattern>
+                    </excludeTable>
+                    <excludeTable pattern="excludeTable-03"/>
 
-                <includeColumn>includeColumn-01</includeColumn>
-                <includeColumn>
-                    <pattern>includeColumn-02</pattern>
-                </includeColumn>
-                <includeColumn pattern="includeColumn-03" />
-                <excludeColumn>excludeColumn-01</excludeColumn>
-                <excludeColumn>
-                    <pattern>excludeColumn-02</pattern>
-                </excludeColumn>
-                <excludeColumn pattern="excludeColumn-03" />
+                    <includeColumn>includeColumn-01</includeColumn>
+                    <includeColumn>
+                        <pattern>includeColumn-02</pattern>
+                    </includeColumn>
+                    <includeColumn pattern="includeColumn-03"/>
+                    <excludeColumn>excludeColumn-01</excludeColumn>
+                    <excludeColumn>
+                        <pattern>excludeColumn-02</pattern>
+                    </excludeColumn>
+                    <excludeColumn pattern="excludeColumn-03"/>
 
-                <includeProcedure>includeProcedure-01</includeProcedure>
-                <includeProcedure>
-                    <pattern>includeProcedure-02</pattern>
-                </includeProcedure>
-                <includeProcedure pattern="includeProcedure-03" />
-                <excludeProcedure>excludeProcedure-01</excludeProcedure>
-                <excludeProcedure>
-                    <pattern>excludeProcedure-02</pattern>
-                </excludeProcedure>
-                <excludeProcedure pattern="excludeProcedure-03" />
-            </schema>
+                    <includeProcedure>includeProcedure-01</includeProcedure>
+                    <includeProcedure>
+                        <pattern>includeProcedure-02</pattern>
+                    </includeProcedure>
+                    <includeProcedure pattern="includeProcedure-03"/>
+                    <excludeProcedure>excludeProcedure-01</excludeProcedure>
+                    <excludeProcedure>
+                        <pattern>excludeProcedure-02</pattern>
+                    </excludeProcedure>
+                    <excludeProcedure pattern="excludeProcedure-03"/>
+                </schema>
 
         </cdbimport>
     </target>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
index e438166..bd12051 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
@@ -20,16 +20,15 @@
 <project name="MyProject" default="dist" basedir=".">
 
     <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
-             classpath="${basedir}"  />
+             classpath="${basedir}"/>
 
     <target name="dist">
         <cdbimport map="${context.dir}/WEB-INF/DefaultMap.map.xml"
                    adapter="org.apache.cayenne.dba.hsqldb.HSQLDBAdapter"
                    driver="org.hsqldb.jdbcDriver"
                    url="jdbc:hsqldb:hsql://localhost/bookmarker"
-                   username="sa"
-                   skipPrimaryKeyLoading="true">
-
+                   username="sa">
+            <skipPrimaryKeyLoading>true</skipPrimaryKeyLoading>
         </cdbimport>
     </target>
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-relationships-loading.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-relationships-loading.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-relationships-loading.xml
index 1eb40a8..8a3ee50 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-relationships-loading.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-relationships-loading.xml
@@ -20,16 +20,16 @@
 <project name="MyProject" default="dist" basedir=".">
 
     <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
-             classpath="${basedir}"  />
+             classpath="${basedir}"/>
 
     <target name="dist">
         <cdbimport map="${context.dir}/WEB-INF/DefaultMap.map.xml"
                    adapter="org.apache.cayenne.dba.hsqldb.HSQLDBAdapter"
                    driver="org.hsqldb.jdbcDriver"
                    url="jdbc:hsqldb:hsql://localhost/bookmarker"
-                   username="sa"
-                   skipRelationshipsLoading="true">
+                   username="sa">
 
+            <skipRelationshipsLoading>true</skipRelationshipsLoading>
         </cdbimport>
     </target>
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-table-types.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-table-types.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-table-types.xml
index 6985520..25bf032 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-table-types.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-table-types.xml
@@ -20,7 +20,7 @@
 <project name="MyProject" default="dist" basedir=".">
 
     <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
-             classpath="${basedir}"  />
+             classpath="${basedir}"/>
 
     <target name="dist">
         <cdbimport map="${context.dir}/WEB-INF/DefaultMap.map.xml"
@@ -31,8 +31,8 @@
 
             <tableType>type1</tableType>
 
-            <tableType name="type2" />
-            <tableType name="type3" />
+            <tableType name="type2"/>
+            <tableType name="type3"/>
         </cdbimport>
     </target>
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ba43b06/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml
index 897869d..a100fcd 100644
--- a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/build-include-table.xml
@@ -20,13 +20,12 @@
 <project name="MyProject" default="dist" basedir="../">
 
     <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
-             classpath="${basedir}"  />
+             classpath="${basedir}"/>
 
     <target name="dist">
         <cdbimport map="dbimport/build-include-table.map.xml"
                    driver="org.apache.derby.jdbc.EmbeddedDriver"
                    url="jdbc:derby:memory:DbImporterMojoTest;create=true">
-
             <includeTable>Parent</includeTable>
         </cdbimport>
     </target>