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>