You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2018/03/28 11:22:11 UTC
[05/14] cayenne git commit: CAY-2337 Save reverse engineering
configuration with datamap XML
CAY-2337 Save reverse engineering configuration with datamap XML
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/2ead78b6
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/2ead78b6
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/2ead78b6
Branch: refs/heads/master
Commit: 2ead78b63c8ad1701f09b3a8d3b6e5ca39a20d5b
Parents: 2373263
Author: Maxim Petrusevich <ma...@gmail.com>
Authored: Mon Mar 26 16:31:04 2018 +0300
Committer: Maxim Petrusevich <ma...@gmail.com>
Committed: Mon Mar 26 16:31:05 2018 +0300
----------------------------------------------------------------------
RELEASE-NOTES.txt | 72 ++--
.../main/resources/assemblies/assembly-mac.xml | 13 +
.../apache/cayenne/tools/DbImporterTask.java | 3 +
.../cayenne/tools/DbImporterTaskTest.java | 41 +-
cayenne-dbsync/pom.xml | 5 +
.../reverse/configuration/ToolsModule.java | 3 +-
.../dbsync/reverse/dbimport/Catalog.java | 24 +-
.../reverse/dbimport/DbImportConfiguration.java | 9 +
.../dbsync/reverse/dbimport/DbImportModule.java | 3 +-
.../reverse/dbimport/DefaultDbImportAction.java | 42 +-
.../dbsync/reverse/dbimport/ExcludeColumn.java | 15 +-
.../reverse/dbimport/ExcludeProcedure.java | 15 +-
.../dbsync/reverse/dbimport/ExcludeTable.java | 15 +-
.../reverse/dbimport/FilterContainer.java | 25 ++
.../dbsync/reverse/dbimport/IncludeColumn.java | 15 +-
.../reverse/dbimport/IncludeProcedure.java | 15 +-
.../dbsync/reverse/dbimport/IncludeTable.java | 25 +-
.../dbsync/reverse/dbimport/PatternParam.java | 19 +
.../reverse/dbimport/ReverseEngineering.java | 85 +++-
.../cayenne/dbsync/reverse/dbimport/Schema.java | 23 +-
.../reverse/dbimport/SchemaContainer.java | 12 +-
.../cayenne/dbsync/reverse/dbload/DbLoader.java | 8 +-
.../dbsync/reverse/filters/PatternFilter.java | 4 +
.../dbsync/reverse/filters/TableFilter.java | 4 +
.../cayenne/dbsync/xml/CatalogHandler.java | 183 ++++++++
.../cayenne/dbsync/xml/ConfigHandler.java | 350 +++++++++++++++
.../cayenne/dbsync/xml/DbImportExtension.java | 56 +++
.../dbsync/xml/DbImportLoaderDelegate.java | 49 +++
.../dbsync/xml/DbImportSaverDelegate.java | 46 ++
.../cayenne/dbsync/xml/IncludeTableHandler.java | 112 +++++
.../cayenne/dbsync/xml/SchemaHandler.java | 186 ++++++++
.../merge/builders/DbAttributeBuilder.java | 2 +-
.../dbimport/DefaultDbImportActionTest.java | 5 +-
.../filters/FiltersConfigBuilderTest.java | 18 +-
.../org/apache/cayenne/di/BindingBuilder.java | 3 -
.../org/apache/cayenne/tools/DbImportTask.java | 24 +-
.../org/apache/cayenne/CayenneDataObject.java | 2 +
.../apache/cayenne/tools/DbImporterMojo.java | 3 +
.../cayenne/tools/CayenneGeneratorMojoTest.java | 28 +-
.../dbimport/testImportWithoutChanges-pom.xml | 2 +-
.../tools/dbimport/testInheritance-pom.xml | 2 +-
.../apache/cayenne/tools/dbimporter-pom1.xml | 2 +-
.../apache/cayenne/tools/dbimporter-pom3.xml | 2 +-
modeler/cayenne-modeler/pom.xml | 16 +-
.../cayenne/modeler/CayenneModelerFrame.java | 1 -
.../modeler/action/AddCatalogAction.java | 91 ++++
.../modeler/action/AddExcludeColumnAction.java | 41 ++
.../action/AddExcludeProcedureAction.java | 41 ++
.../modeler/action/AddExcludeTableAction.java | 41 ++
.../modeler/action/AddIncludeColumnAction.java | 41 ++
.../action/AddIncludeProcedureAction.java | 41 ++
.../modeler/action/AddIncludeTableAction.java | 92 ++++
.../modeler/action/AddPatternParamAction.java | 140 ++++++
.../cayenne/modeler/action/AddSchemaAction.java | 97 +++++
.../cayenne/modeler/action/DBWizardAction.java | 21 +-
.../action/DbEntityCounterpartAction.java | 3 +
.../modeler/action/DefaultActionManager.java | 14 +
.../modeler/action/DeleteNodeAction.java | 175 ++++++++
.../cayenne/modeler/action/EditNodeAction.java | 93 ++++
.../modeler/action/GetDbConnectionAction.java | 75 ++++
.../modeler/action/LoadDbSchemaAction.java | 292 +++++++++++++
.../cayenne/modeler/action/MigrateAction.java | 11 +-
.../modeler/action/MoveImportNodeAction.java | 235 ++++++++++
.../modeler/action/MoveInvertNodeAction.java | 35 ++
.../action/ReverseEngineeringAction.java | 88 +++-
.../modeler/action/TreeManipulationAction.java | 197 +++++++++
.../modeler/dialog/db/DataSourceWizard.java | 56 ++-
.../modeler/dialog/db/DataSourceWizardView.java | 9 +-
.../dialog/db/DbActionOptionsDialog.java | 7 +-
.../dialog/db/load/CatalogPopUpMenu.java | 33 ++
.../dialog/db/load/DbImportTreeNode.java | 194 +++++++++
.../dialog/db/load/DbLoadResultDialog.java | 105 +++++
.../modeler/dialog/db/load/DbLoaderContext.java | 86 ++--
.../dialog/db/load/DbLoaderOptionsDialog.java | 139 ------
.../dialog/db/load/DefaultPopUpMenu.java | 86 ++++
.../dialog/db/load/IncludeTablePopUpMenu.java | 37 ++
.../dialog/db/load/ModelerDbImportAction.java | 82 +++-
.../modeler/dialog/db/load/RootPopUpMenu.java | 133 ++++++
.../modeler/dialog/db/load/SchemaPopUpMenu.java | 33 ++
.../dialog/db/load/TransferableNode.java | 74 ++++
.../dialog/pref/DBConnectionInfoEditorView.java | 2 +-
.../modeler/editor/ColorTreeRenderer.java | 146 +++++++
.../modeler/editor/DataMapTabbedView.java | 3 +-
.../cayenne/modeler/editor/DataMapView.java | 6 +-
.../cayenne/modeler/editor/DbImportModel.java | 75 ++++
.../modeler/editor/DbImportNodeHandler.java | 341 +++++++++++++++
.../cayenne/modeler/editor/DbImportTree.java | 207 +++++++++
.../modeler/editor/DbImportTreeCellEditor.java | 154 +++++++
.../editor/DbImportTreeCellRenderer.java | 96 +++++
.../cayenne/modeler/editor/DbImportView.java | 236 ++++++++++
.../modeler/editor/DraggableTreePanel.java | 428 +++++++++++++++++++
.../editor/ReverseEngineeringConfigPanel.java | 223 ++++++++++
.../editor/ReverseEngineeringTreePanel.java | 169 ++++++++
.../modeler/editor/TreeToolbarPanel.java | 229 ++++++++++
.../modeler/graph/extension/GraphHandler.java | 7 +
.../modeler/init/CayenneModelerModule.java | 4 +-
.../modeler/undo/DbImportTreeUndoableEdit.java | 76 ++++
.../components/image/FilteredIconFactory.java | 1 +
.../cayenne/modeler/images/icon-dbi-catalog.png | Bin 0 -> 288 bytes
.../cayenne/modeler/images/icon-dbi-config.png | Bin 0 -> 635 bytes
.../modeler/images/icon-dbi-excludeColumn.png | Bin 0 -> 289 bytes
.../images/icon-dbi-excludeProcedure.png | Bin 0 -> 365 bytes
.../modeler/images/icon-dbi-excludeTable.png | Bin 0 -> 258 bytes
.../modeler/images/icon-dbi-includeColumn.png | Bin 0 -> 307 bytes
.../images/icon-dbi-includeProcedure.png | Bin 0 -> 386 bytes
.../modeler/images/icon-dbi-includeTable.png | Bin 0 -> 288 bytes
.../cayenne/modeler/images/icon-dbi-refresh.png | Bin 0 -> 547 bytes
.../modeler/images/icon-dbi-runImport.png | Bin 0 -> 577 bytes
.../cayenne/modeler/images/icon-dbi-schema.png | Bin 0 -> 316 bytes
109 files changed, 6587 insertions(+), 341 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 5228c96..57f2ea9 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -14,6 +14,7 @@ Date:
Changes/New Features:
CAY-2334 cgen: option to force run from maven/gradle
+CAY-2337 Save reverse engineering configuration with datamap XML
CAY-2372 Extract new modules from cayenne-server
CAY-2377 Cleanup deprecated code.
CAY-2391 cdbimport: add option to skip user-defined relationships
@@ -96,7 +97,7 @@ CAY-1873 Move DataDomain cache configuration from the Modeler and into DI
CAY-1891 Modeler: Add To-Many Warning
CAY-1892 Modeler: Add Relationship Data Type Warning
CAY-2057 Modeler: Clean up OS X version
-CAY-2109 cayenne-crypto: add value authentication (HMAC)
+CAY-2109 cayenne-crypto: add value authentication (HMAC)
CAY-2210 Query cache: incorrect cache key for queries with custom value objects
CAY-2255 ObjectSelect improvement: columns as full entities
CAY-2258 DI: type-safe binding of List and Map
@@ -318,16 +319,16 @@ CAY-1267 Some changes to LogDialog
CAY-1826 Merge Entity Attributes and Relationships tabs together with one toolbar.
CAY-1839 Allow to link DataMaps to DataNodes from DataNode editor.
CAY-1841 Filters for Left-hand project navigator
-CAY-1842 Remove Listeners support from the Modeler
+CAY-1842 Remove Listeners support from the Modeler
CAY-1843 DataMap v7: Stop saving listeners in DataMap, add upgrade handler
-CAY-1845 Upgrade javadoc plugin to 2.9.1
+CAY-1845 Upgrade javadoc plugin to 2.9.1
CAY-1846 Reworking of callback mapping
CAY-1847 Make ConverterFactory extensible
-CAY-1848 New method: ObjectContext.selectOne(Select query)
+CAY-1848 New method: ObjectContext.selectOne(Select query)
CAY-1851 Generate default serialVersionUID for generated java classes to avoid eclipse warnings
-CAY-1852 Straighten thread model and synchronization in the Modeler
-CAY-1855 Iterated and paginated queries must print result counts
-CAY-1856 Expression.expWithParameters does not work when parameters are placed in the inline collection
+CAY-1852 Straighten thread model and synchronization in the Modeler
+CAY-1855 Iterated and paginated queries must print result counts
+CAY-1856 Expression.expWithParameters does not work when parameters are placed in the inline collection
CAY-1860 In-memory matching of DataObjects against ObjectId or int
CAY-1861 Remove runtime relationships
CAY-1870 cgen - smarter default for 'superPkg' and 'destDir'
@@ -377,7 +378,7 @@ CAY-1966 SQLTemplate/SQLSelect positional parameter binding
CAY-1967 Deprecate SQLTemplate parameter batches
CAY-1968 SQLSelect cleanup and omissions
CAY-1971 Variants of Property.like(..) : contains(..), startsWith(..), endsWith(..)
-CAY-1972 A property to override DataSources of multi-module projects
+CAY-1972 A property to override DataSources of multi-module projects
CAY-1981 Add support of JDBC 4.0 N-types (nchar, nvarchar, longnvarchar, nclob)
CAY-1984 cdbimport doesn't flatten many to many relationships
@@ -385,7 +386,7 @@ Bug Fixes:
CAy-1988 ServerRuntimeBuilder: synthetic DataNode does not have domain's DataMaps linked
CAY-1480 Implement cross-db functional expressions
-CAY-1695 Unexpected null value in bidirectional one-to-one prefetch
+CAY-1695 Unexpected null value in bidirectional one-to-one prefetch
CAY-1736 IllegalArgumentException when synchronizing entities in the Modeler
CAY-1795 "Invisible" ObjAttribute in subclass
CAY-1796 ROP: All entity's to-many relationships getting faulted from database when using it as a parameter in qualifier expression
@@ -393,13 +394,13 @@ CAY-1797 NPE importing DataMap
CAY-1798 ROP: Reverse relationships of prefetched entity objects are not filled during server to client objects conversion
CAY-1799 ROP: Server can't deserialize LIKE expression with pattern already compiled
CAY-1818 Fix copyright year in the Modeler "about" panel
-CAY-1834 Exception: ToManyList cannot be cast to DataObject
-CAY-1857 Problem with hotkeys
-CAY-1859 NullPointerException when importing EOModel
+CAY-1834 Exception: ToManyList cannot be cast to DataObject
+CAY-1857 Problem with hotkeys
+CAY-1859 NullPointerException when importing EOModel
CAY-1863 Make determining whether a particular database type supports length adapter-specific not universal
CAY-1866 Change in General Modeler Preferences reverts old settings to default value
-CAY-1868 Select contention with multiple contexts
-CAY-1869 ResultIterator from cayenne-client dependency is subclassed from org.apache.cayenne.access.ResultIterator which is present only in cayenne-server dependency
+CAY-1868 Select contention with multiple contexts
+CAY-1869 ResultIterator from cayenne-client dependency is subclassed from org.apache.cayenne.access.ResultIterator which is present only in cayenne-server dependency
CAY-1874 DB2 Procedure action ignores the first result set
CAY-1877 In-memory evaluation of expression may fail with UnsupportedOpeartionException depending on order of nodes
CAY-1880 objectStore snapshots never cleared from RefreshQuery when "use shared cache" unchecked
@@ -434,10 +435,10 @@ CAY-1753 remove light-superclass.vm class template
CAY-1754 Modeler suggested URL for SQLServer should start with 'jdbc:sqlserver:' instead of 'jdbc:microsoft:sqlserver:'
CAY-1758 cdbimport improvements
CAY-1759 cdbimport improvements: add 'catalog', rename 'schemaName' to 'schema'
-CAY-1760 cdbimport improvements: Default adapter (if none specified) must be AutoAdapter, not JdbcAdapter
-CAY-1761 cdbimport improvements: DbLoader must reverse engineer PK auto-increment state.
-CAY-1762 cdbimport improvements: Support for "defaultPackage" parameter, as the new DataMaps ends up placing entities in the root package
-CAY-1763 cdbimport improvements: specified "schema" should become the default schema of the generated DataMap
+CAY-1760 cdbimport improvements: Default adapter (if none specified) must be AutoAdapter, not JdbcAdapter
+CAY-1761 cdbimport improvements: DbLoader must reverse engineer PK auto-increment state.
+CAY-1762 cdbimport improvements: Support for "defaultPackage" parameter, as the new DataMaps ends up placing entities in the root package
+CAY-1763 cdbimport improvements: specified "schema" should become the default schema of the generated DataMap
CAY-1764 cdbimport improvements: "overwrite" flag
CAY-1765 cdbimport improvements: add excludeTables/includeTables parameters
CAY-1766 Deprecating DataPort ant task
@@ -445,25 +446,25 @@ CAY-1768 cdbimport improvements: DataMap "project-version" attribute is skipped
CAY-1769 cdbimport improvements: meaningfulPk flag must be turned into a pattern
CAY-1771 cdbimport improvements: "usePrimitives" flag
CAY-1772 Real support for DbEntity catalogs
-CAY-1778 TransactionManager to simplify user-managed transactions
-CAY-1779 Flatten object entities for many to many relationships on reverse engineering
+CAY-1778 TransactionManager to simplify user-managed transactions
+CAY-1779 Flatten object entities for many to many relationships on reverse engineering
CAY-1781 Add StatelessContextRequestHandler as an alternative to the Session-based one
CAY-1785 SelectQuery<T> for DataRows
-CAY-1789 Lock-free EntityResolver
-CAY-1792 [PATCH] Supply additional factory methods for generic SelectQueries
-CAY-1803 Optimize Expression conversion to String and EJBQL
+CAY-1789 Lock-free EntityResolver
+CAY-1792 [PATCH] Supply additional factory methods for generic SelectQueries
+CAY-1803 Optimize Expression conversion to String and EJBQL
CAY-1809 Remove 'final' modifier from Cayenne, HessianUtil, PropertyComparator, ConversionUtil, and LinkedDeque
CAY-1813 Missing ObjEntity Attribute Validation with Duplicate DbEntity Columns
-CAY-1814 Support Property.nin
-CAY-1819 When adding a filter, auto-register it as a listener
-CAY-1820 DataDomain.addListener(Object) - a shortcut for adding annotated listeners
+CAY-1814 Support Property.nin
+CAY-1819 When adding a filter, auto-register it as a listener
+CAY-1820 DataDomain.addListener(Object) - a shortcut for adding annotated listeners
CAY-1821 AuditableFilter and friends should explicitly work with Persistent instead of Object
-CAY-1822 Make DataMap editor fields wider
-CAY-1823 remove ":sync w/DbEntity" button from ObjEntity - it is redundant and already present on the entity toolbar.
+CAY-1822 Make DataMap editor fields wider
+CAY-1823 remove ":sync w/DbEntity" button from ObjEntity - it is redundant and already present on the entity toolbar.
CAY-1825 Simplify API for setting up query caching
CAY-1828 SQLSelect - generics friendly fluent selecting sql query
CAY-1829 Make ResultIterator implement Iterable<T>, create ObjectContext.iterate method
-CAY-1836 Firebird Adapter
+CAY-1836 Firebird Adapter
CAY-1838 Deprecate EntityResolver.indexedByClassProperty
CAY-1840 Conditionally log slow / long-running queries
CAY-1844 Configuration for maximum time to wait for an available DB connection
@@ -476,7 +477,7 @@ CAY-1522 EJBQL query don't support quotes
CAY-1677 Modeler: text fields discard input unless you press enter
CAY-1701 Modeler cannot undo pasting of obj (db) entity
CAY-1708 Modeler error when pasting datamap with EJBQL query
-CAY-1714 ROP: Cayenne tries to build a query for non committed object when using more than 2 nested contexts
+CAY-1714 ROP: Cayenne tries to build a query for non committed object when using more than 2 nested contexts
CAY-1721 Writing blobs fails (Oracle)
CAY-1725 NullPointerException from call to removeToManyTarget
CAY-1719 Modeler - Obj Attribute Java Type editor won't focus sometimes
@@ -488,15 +489,14 @@ CAY-1742 ObjRelationship inspector says "ObjAttribute Inspector"
CAY-1744 Unexpected read-only relationships in vertical inheritance mapping
CAY-1749 NPE on simple nested context commit
CAY-1755 FaultFailureException resolving relationships to UNIQUE non-PK columns
-CAY-1757 ROP: Faulting entity relationship resets uncommitted modifications made to its reverse relationship
+CAY-1757 ROP: Faulting entity relationship resets uncommitted modifications made to its reverse relationship
CAY-1774 EhCacheQueryCache.get(QueryMetadata, QueryCacheEntryFactory) returns null if EhCache instance for group is not present
CAY-1780 cdbimport do not create xml file in resource folder
CAY-1782 Deadlock when performing many concurrent inserts
CAY-1783 JdbcPkGenerator.longPkFromDatabase would throw an exception if the PK value exceeds a range of Java int
CAY-1794 Duplicate attributes in discriminator columns of PersistentDescriptor
-CAY-1804 Serialisation of long[] type was not working correctly.
-CAY-1806 Error importing eomodel
-CAY-1817 NPE during Validate Project
+CAY-1804 Serialisation of long[] type was not working correctly.
+CAY-1806 Error importing eomodel
+CAY-1817 NPE during Validate Project
CAY-1827 EhCache region corresponding to a cache group loses its settings after 'removeGroup'
-CAY-1832 Exception when modifying objects in postLoad callback
-
+CAY-1832 Exception when modifying objects in postLoad callback
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/assembly/src/main/resources/assemblies/assembly-mac.xml
----------------------------------------------------------------------
diff --git a/assembly/src/main/resources/assemblies/assembly-mac.xml b/assembly/src/main/resources/assemblies/assembly-mac.xml
index 6ff90db..a6bd5a9 100644
--- a/assembly/src/main/resources/assemblies/assembly-mac.xml
+++ b/assembly/src/main/resources/assemblies/assembly-mac.xml
@@ -61,6 +61,19 @@
<include>KEYS</include>
</includes>
</fileSet>
+ <fileSet>
+ <directory>target/doc-staging</directory>
+ <outputDirectory>cayenne-${project.version}-macosx/doc</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>../</directory>
+ <outputDirectory>cayenne-${project.version}-macosx/</outputDirectory>
+ <includes>
+ <include>RELEASE-NOTES.txt</include>
+ <include>UPGRADE.txt</include>
+ <include>KEYS</include>
+ </includes>
+ </fileSet>
</fileSets>
<dependencySets>
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java b/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index 0d97213..a241e8c 100644
--- a/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -115,6 +115,9 @@ public class DbImporterTask extends Task {
@Override
public void execute() {
+ if (reverseEngineering.getCatalogs().size() == 0 && reverseEngineering.isEmptyContainer()) {
+ config.setUseDataMapReverseEngineering(true);
+ }
config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering).build());
validateAttributes();
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-ant/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java b/cayenne-ant/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
index 43745e7..7e88a1b 100644
--- a/cayenne-ant/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
+++ b/cayenne-ant/src/test/java/org/apache/cayenne/tools/DbImporterTaskTest.java
@@ -39,11 +39,16 @@ import java.io.IOException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import static org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineeringUtils.*;
-import static org.junit.Assert.*;
+import static org.apache.cayenne.util.Util.isBlank;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
// TODO: we are only testing on Derby. We may need to dynamically switch between DBs
// based on "cayenneTestConnection", like we do in cayenne-server, etc.
@@ -104,11 +109,6 @@ public class DbImporterTaskTest {
test("build-include-table.xml");
}
- @Test
- public void testExcludeRelationshipFirst() throws Exception {
- test("testExcludeRelationshipFirst.xml");
- }
-
private DbImporterTask getCdbImport(String buildFile) {
Project project = new Project();
@@ -149,9 +149,32 @@ public class DbImporterTaskTest {
try {
cdbImport.execute();
verifyResult(mapFile, mapFileCopy);
+ } finally {
+ cleanDb(cdbImport.toParameters());
}
- catch (Exception ex){
- fail();
+ }
+
+ private void cleanDb(DbImportConfiguration dbImportConfiguration) throws ClassNotFoundException,
+ IllegalAccessException, InstantiationException, SQLException {
+ Class.forName(dbImportConfiguration.getDriver()).newInstance();
+ // Get a connection
+ Connection connection = DriverManager.getConnection(dbImportConfiguration.getUrl());
+ Statement stmt = connection.createStatement();
+
+ ResultSet tables = connection.getMetaData().getTables(null, null, null, new String[]{"TABLE"});
+ while (tables.next()) {
+ String schema = tables.getString("TABLE_SCHEM");
+ System.out.println("DROP TABLE " + (isBlank(schema) ? "" : schema + ".") + tables.getString("TABLE_NAME"));
+ stmt.execute("DROP TABLE " + (isBlank(schema) ? "" : schema + ".") + tables.getString("TABLE_NAME"));
+ }
+
+ ResultSet schemas = connection.getMetaData().getSchemas();
+ while (schemas.next()) {
+ String schem = schemas.getString("TABLE_SCHEM");
+ if (schem.startsWith("SCHEMA")) {
+ System.out.println("DROP SCHEMA " + schem);
+ stmt.execute("DROP SCHEMA " + schem + " RESTRICT");
+ }
}
}
@@ -208,4 +231,6 @@ public class DbImporterTaskTest {
}
}
+
+
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/pom.xml b/cayenne-dbsync/pom.xml
index 5c68b4d..fa5809e 100644
--- a/cayenne-dbsync/pom.xml
+++ b/cayenne-dbsync/pom.xml
@@ -86,6 +86,11 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.cayenne</groupId>
+ <artifactId>cayenne-di</artifactId>
+ <version>4.1.M2-SNAPSHOT</version>
+ </dependency>
</dependencies>
<build>
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
index ceb1e11..0ca291d 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
@@ -65,6 +65,7 @@ import org.apache.cayenne.log.Slf4jJdbcEventLogger;
import org.apache.cayenne.log.JdbcEventLogger;
import org.apache.cayenne.project.ProjectModule;
import org.apache.cayenne.project.extension.ExtensionAwareHandlerFactory;
+import org.apache.cayenne.project.extension.info.InfoExtension;
import org.apache.cayenne.resource.ClassLoaderResourceLocator;
import org.apache.cayenne.resource.ResourceLocator;
import org.slf4j.Logger;
@@ -121,7 +122,7 @@ public class ToolsModule implements Module {
binder.bind(DataChannelMetaData.class).to(DefaultDataChannelMetaData.class);
binder.bind(XMLReader.class).toProviderInstance(new XMLReaderProvider(true)).withoutScope();
- ProjectModule.contributeExtensions(binder);
+ ProjectModule.contributeExtensions(binder).add(InfoExtension.class);
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Catalog.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Catalog.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Catalog.java
index 3ed8755..5fbb659 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Catalog.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Catalog.java
@@ -19,10 +19,14 @@
package org.apache.cayenne.dbsync.reverse.dbimport;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
/**
* @since 4.0.
*/
-public class Catalog extends SchemaContainer {
+public class Catalog extends SchemaContainer implements XMLSerializable {
public Catalog() {
}
@@ -31,9 +35,27 @@ public class Catalog extends SchemaContainer {
setName(name);
}
+ public Catalog(Catalog original) {
+ super(original);
+ }
+
@Override
public StringBuilder toString(StringBuilder res, String prefix) {
res.append(prefix).append("Catalog: ").append(getName()).append("\n");
return super.toString(res, prefix + " ");
}
+
+ @Override
+ public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+ encoder.start("catalog")
+ .nested(this.getIncludeTables(), delegate)
+ .nested(this.getExcludeTables(), delegate)
+ .nested(this.getIncludeColumns(), delegate)
+ .nested(this.getExcludeColumns(), delegate)
+ .nested(this.getIncludeProcedures(), delegate)
+ .nested(this.getExcludeProcedures(), delegate)
+ .simpleTag("name", this.getName())
+ .nested(this.getSchemas(), delegate)
+ .end();
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
index 06b04f0..87d249f 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
@@ -61,6 +61,7 @@ public class DbImportConfiguration {
private String stripFromTableNames;
private boolean forceDataMapCatalog;
private boolean forceDataMapSchema;
+ private boolean useDataMapReverseEngineering;
private File cayenneProject;
public DbImportConfiguration() {
@@ -317,4 +318,12 @@ public class DbImportConfiguration {
public boolean isForceDataMapSchema() {
return forceDataMapSchema;
}
+
+ public boolean isUseDataMapReverseEngineering() {
+ return useDataMapReverseEngineering;
+ }
+
+ public void setUseDataMapReverseEngineering(boolean useDataMapReverseEngineering) {
+ this.useDataMapReverseEngineering = useDataMapReverseEngineering;
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportModule.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportModule.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportModule.java
index 7cb227c..02d4fc3 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportModule.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportModule.java
@@ -27,6 +27,7 @@ import org.apache.cayenne.configuration.xml.DefaultDataChannelMetaData;
import org.apache.cayenne.configuration.xml.DefaultHandlerFactory;
import org.apache.cayenne.configuration.xml.HandlerFactory;
import org.apache.cayenne.configuration.xml.XMLDataMapLoader;
+import org.apache.cayenne.dbsync.xml.DbImportExtension;
import org.apache.cayenne.di.Binder;
import org.apache.cayenne.di.Module;
import org.apache.cayenne.project.FileProjectSaver;
@@ -51,7 +52,7 @@ public class DbImportModule implements Module {
binder.bind(HandlerFactory.class).to(DefaultHandlerFactory.class);
binder.bind(DataChannelMetaData.class).to(DefaultDataChannelMetaData.class);
binder.bind(HandlerFactory.class).to(ExtensionAwareHandlerFactory.class);
- ProjectModule.contributeExtensions(binder);
+ ProjectModule.contributeExtensions(binder).add(DbImportExtension.class);
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
index 37d895e..2c8f6b2 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
@@ -16,6 +16,7 @@
* specific language governing permissions and limitations
* under the License.
****************************************************************/
+
package org.apache.cayenne.dbsync.reverse.dbimport;
import org.apache.cayenne.CayenneRuntimeException;
@@ -27,6 +28,7 @@ import org.apache.cayenne.configuration.DataMapLoader;
import org.apache.cayenne.configuration.DataNodeDescriptor;
import org.apache.cayenne.configuration.server.DataSourceFactory;
import org.apache.cayenne.configuration.server.DbAdapterFactory;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.dbsync.merge.token.model.AbstractToModelToken;
import org.apache.cayenne.dbsync.merge.DataMapMerger;
@@ -41,6 +43,7 @@ import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderConfiguration;
import org.apache.cayenne.dbsync.reverse.filters.CatalogFilter;
import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.map.DataMap;
@@ -78,12 +81,13 @@ import static org.apache.cayenne.util.Util.isBlank;
public class DefaultDbImportAction implements DbImportAction {
private final ProjectSaver projectSaver;
- private final Logger logger;
+ protected final Logger logger;
private final DataSourceFactory dataSourceFactory;
private final DbAdapterFactory adapterFactory;
private final DataMapLoader mapLoader;
private final MergerTokenFactoryProvider mergerTokenFactoryProvider;
private final DataChannelDescriptorLoader dataChannelDescriptorLoader;
+ private final DataChannelMetaData metaData;
public DefaultDbImportAction(@Inject Logger logger,
@Inject ProjectSaver projectSaver,
@@ -91,13 +95,15 @@ public class DefaultDbImportAction implements DbImportAction {
@Inject DbAdapterFactory adapterFactory,
@Inject DataMapLoader mapLoader,
@Inject MergerTokenFactoryProvider mergerTokenFactoryProvider,
- @Inject DataChannelDescriptorLoader dataChannelDescriptorLoader) {
+ @Inject DataChannelDescriptorLoader dataChannelDescriptorLoader,
+ @Inject DataChannelMetaData metaData) {
this.logger = logger;
this.projectSaver = projectSaver;
this.dataSourceFactory = dataSourceFactory;
this.adapterFactory = adapterFactory;
this.mapLoader = mapLoader;
this.mergerTokenFactoryProvider = mergerTokenFactoryProvider;
+ this.metaData = metaData;
this.dataChannelDescriptorLoader = dataChannelDescriptorLoader;
}
@@ -146,11 +152,23 @@ public class DefaultDbImportAction implements DbImportAction {
DbAdapter adapter = adapterFactory.createAdapter(dataNodeDescriptor, dataSource);
DataMap sourceDataMap;
+ DataMap targetDataMap = existingTargetMap(config);
+
+ ReverseEngineering dataMapReverseEngineering = metaData.get(targetDataMap, ReverseEngineering.class);
+ if ((config.isUseDataMapReverseEngineering()) && (dataMapReverseEngineering != null)) {
+ putReverseEngineeringToConfig(dataMapReverseEngineering, config);
+ }
+ if ((dataMapReverseEngineering != null) && (!config.isUseDataMapReverseEngineering())) {
+ logger.warn("Found several dbimport configs. Configuration selected from 'build.gradle' file.");
+ }
+ if ((dataMapReverseEngineering == null) && (config.isUseDataMapReverseEngineering())) {
+ logger.warn("Missing dbimport config. Database is imported completely.");
+ }
+
try (Connection connection = dataSource.getConnection()) {
sourceDataMap = load(config, adapter, connection);
}
- DataMap targetDataMap = existingTargetMap(config);
if (targetDataMap == null) {
String path = config.getTargetDataMap() == null ? "null" : config.getTargetDataMap().getAbsolutePath() + "'";
@@ -184,6 +202,20 @@ public class DefaultDbImportAction implements DbImportAction {
saveLoaded(targetDataMap, config);
}
}
+ private void putReverseEngineeringToConfig(ReverseEngineering reverseEngineering, DbImportConfiguration config) {
+ config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading());
+ config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
+ config.setStripFromTableNames(reverseEngineering.getStripFromTableNames());
+ config.setTableTypes(reverseEngineering.getTableTypes());
+ config.setMeaningfulPkTables(reverseEngineering.getMeaningfulPkTables());
+ config.setNamingStrategy(reverseEngineering.getNamingStrategy());
+ config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering).build());
+ config.setForceDataMapCatalog(reverseEngineering.isForceDataMapCatalog());
+ config.setForceDataMapSchema(reverseEngineering.isForceDataMapSchema());
+ config.setDefaultPackage(reverseEngineering.getDefaultPackage());
+ config.setUsePrimitives(reverseEngineering.isUsePrimitives());
+ config.setUseJava7Types(reverseEngineering.isUseJava7Types());
+ }
protected void transformSourceBeforeMerge(DataMap sourceDataMap, DataMap targetDataMap, DbImportConfiguration configuration) {
if (configuration.isForceDataMapCatalog()) {
@@ -228,7 +260,7 @@ public class DefaultDbImportAction implements DbImportAction {
}
}
- private Collection<MergerToken> log(List<MergerToken> tokens) {
+ protected Collection<MergerToken> log(List<MergerToken> tokens) {
logger.info("");
if (tokens.isEmpty()) {
logger.info("Detected changes: No changes to import.");
@@ -365,7 +397,7 @@ public class DefaultDbImportAction implements DbImportAction {
return true;
}
- private boolean syncProcedures(DataMap targetDataMap, DataMap loadedDataMap, FiltersConfig filters) {
+ protected boolean syncProcedures(DataMap targetDataMap, DataMap loadedDataMap, FiltersConfig filters) {
Collection<Procedure> procedures = loadedDataMap.getProcedures();
if (procedures.isEmpty()) {
return false;
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeColumn.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeColumn.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeColumn.java
index a57400a..58fd551 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeColumn.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeColumn.java
@@ -19,14 +19,27 @@
package org.apache.cayenne.dbsync.reverse.dbimport;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
/**
* @since 4.0.
*/
-public class ExcludeColumn extends PatternParam {
+public class ExcludeColumn extends PatternParam implements XMLSerializable {
public ExcludeColumn() {
}
public ExcludeColumn(String pattern) {
super(pattern);
}
+
+ public ExcludeColumn(ExcludeColumn original) {
+ super(original);
+ }
+
+ @Override
+ public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+ encoder.simpleTag("excludeColumn", this.getPattern());
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeProcedure.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeProcedure.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeProcedure.java
index a42aa23..c629468 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeProcedure.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeProcedure.java
@@ -19,14 +19,27 @@
package org.apache.cayenne.dbsync.reverse.dbimport;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
/**
* @since 4.0.
*/
-public class ExcludeProcedure extends PatternParam {
+public class ExcludeProcedure extends PatternParam implements XMLSerializable {
public ExcludeProcedure() {
}
public ExcludeProcedure(String pattern) {
super(pattern);
}
+
+ public ExcludeProcedure(ExcludeProcedure original) {
+ super(original);
+ }
+
+ @Override
+ public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+ encoder.simpleTag("excludeProcedure", this.getPattern());
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeTable.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeTable.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeTable.java
index c55a5c4..61a4e9f 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeTable.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ExcludeTable.java
@@ -19,14 +19,27 @@
package org.apache.cayenne.dbsync.reverse.dbimport;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
/**
* @since 4.0.
*/
-public class ExcludeTable extends PatternParam {
+public class ExcludeTable extends PatternParam implements XMLSerializable {
public ExcludeTable() {
}
public ExcludeTable(String pattern) {
super(pattern);
}
+
+ public ExcludeTable(ExcludeTable original) {
+ super(original);
+ }
+
+ @Override
+ public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+ encoder.simpleTag("excludeTable", this.getPattern());
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/FilterContainer.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/FilterContainer.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/FilterContainer.java
index 7090522..3914439 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/FilterContainer.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/FilterContainer.java
@@ -46,6 +46,31 @@ public abstract class FilterContainer {
private final Collection<ExcludeRelationship> excludeRelationshipCollection = new LinkedList<>();
+ public FilterContainer() {
+ }
+
+ public FilterContainer(FilterContainer original) {
+ this.setName(original.getName());
+ for (IncludeTable includeTable : original.getIncludeTables()) {
+ this.addIncludeTable(new IncludeTable(includeTable));
+ }
+ for (ExcludeTable excludeTable : original.getExcludeTables()) {
+ this.addExcludeTable(new ExcludeTable(excludeTable));
+ }
+ for (IncludeColumn includeColumn : original.getIncludeColumns()) {
+ this.addIncludeColumn(new IncludeColumn(includeColumn));
+ }
+ for (ExcludeColumn excludeColumn : original.getExcludeColumns()) {
+ this.addExcludeColumn(new ExcludeColumn(excludeColumn));
+ }
+ for (IncludeProcedure includeProcedure : original.getIncludeProcedures()) {
+ this.addIncludeProcedure(new IncludeProcedure(includeProcedure));
+ }
+ for (ExcludeProcedure excludeProcedure : original.getExcludeProcedures()) {
+ this.addExcludeProcedure(new ExcludeProcedure(excludeProcedure));
+ }
+ }
+
public Collection<IncludeTable> getIncludeTables() {
return includeTableCollection;
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeColumn.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeColumn.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeColumn.java
index 780eb86..db54b07 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeColumn.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeColumn.java
@@ -19,14 +19,27 @@
package org.apache.cayenne.dbsync.reverse.dbimport;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
/**
* @since 4.0.
*/
-public class IncludeColumn extends PatternParam {
+public class IncludeColumn extends PatternParam implements XMLSerializable {
public IncludeColumn() {
}
public IncludeColumn(String pattern) {
super(pattern);
}
+
+ public IncludeColumn(IncludeColumn original) {
+ super(original);
+ }
+
+ @Override
+ public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+ encoder.simpleTag("includeColumn", this.getPattern());
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeProcedure.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeProcedure.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeProcedure.java
index f3b9040..d6140ea 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeProcedure.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeProcedure.java
@@ -19,14 +19,27 @@
package org.apache.cayenne.dbsync.reverse.dbimport;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
/**
* @since 4.0.
*/
-public class IncludeProcedure extends PatternParam {
+public class IncludeProcedure extends PatternParam implements XMLSerializable {
public IncludeProcedure() {
}
public IncludeProcedure(String pattern) {
super(pattern);
}
+
+ public IncludeProcedure(IncludeProcedure original) {
+ super(original);
+ }
+
+ @Override
+ public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+ encoder.simpleTag("includeProcedure", this.getPattern());
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeTable.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeTable.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeTable.java
index defa595..ff2ed59 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeTable.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/IncludeTable.java
@@ -19,13 +19,17 @@
package org.apache.cayenne.dbsync.reverse.dbimport;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
import java.util.Collection;
import java.util.LinkedList;
/**
* @since 4.0.
*/
-public class IncludeTable extends PatternParam {
+public class IncludeTable extends PatternParam implements XMLSerializable {
private final Collection<IncludeColumn> includeColumns = new LinkedList<>();
@@ -40,6 +44,16 @@ public class IncludeTable extends PatternParam {
super(pattern);
}
+ public IncludeTable(IncludeTable original) {
+ super(original);
+ for (IncludeColumn includeColumn : original.getIncludeColumns()) {
+ this.addIncludeColumn(new IncludeColumn(includeColumn));
+ }
+ for (ExcludeColumn excludeColumn : original.getExcludeColumns()) {
+ this.addExcludeColumn(new ExcludeColumn(excludeColumn));
+ }
+ }
+
public Collection<IncludeColumn> getIncludeColumns() {
return includeColumns;
}
@@ -86,6 +100,15 @@ public class IncludeTable extends PatternParam {
}
@Override
+ public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+ encoder.start("includeTable")
+ .simpleTag("name", this.getPattern())
+ .nested(this.getIncludeColumns(), delegate)
+ .nested(this.getExcludeColumns(), delegate)
+ .end();
+ }
+
+ @Override
public StringBuilder toString(StringBuilder res, String s) {
super.toString(res, s);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/PatternParam.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/PatternParam.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/PatternParam.java
index bef2d5e..b875234 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/PatternParam.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/PatternParam.java
@@ -35,6 +35,10 @@ public class PatternParam {
this.pattern = pattern;
}
+ public PatternParam(PatternParam original) {
+ this.setPattern(original.getPattern());
+ }
+
public String getPattern() {
return pattern;
}
@@ -82,4 +86,19 @@ public class PatternParam {
res.append(s).append(getClass().getSimpleName()).append(": ").append(pattern).append("\n");
return res;
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (obj.getClass() != this.getClass()) {
+ return false;
+ }
+ PatternParam patternParam = (PatternParam) obj;
+ return patternParam.getPattern().equals(pattern);
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ReverseEngineering.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ReverseEngineering.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ReverseEngineering.java
index 082f65a..4e0321d 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ReverseEngineering.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ReverseEngineering.java
@@ -16,20 +16,28 @@
* specific language governing permissions and limitations
* under the License.
****************************************************************/
+
package org.apache.cayenne.dbsync.reverse.dbimport;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.dbsync.xml.DbImportExtension;
+import org.apache.cayenne.util.Util;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
import java.io.Serializable;
+import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
/**
* @since 4.0
*/
-public class ReverseEngineering extends SchemaContainer implements Serializable {
+public class ReverseEngineering extends SchemaContainer implements Serializable, XMLSerializable {
- private Boolean skipRelationshipsLoading;
+ private boolean skipRelationshipsLoading;
- private Boolean skipPrimaryKeyLoading;
+ private boolean skipPrimaryKeyLoading;
/*
* <p>
@@ -118,6 +126,25 @@ public class ReverseEngineering extends SchemaContainer implements Serializable
public ReverseEngineering() {
}
+ public ReverseEngineering(ReverseEngineering original) {
+ super(original);
+ this.setDefaultPackage(original.getDefaultPackage());
+ this.setStripFromTableNames(original.getStripFromTableNames());
+ this.setNamingStrategy(original.getNamingStrategy());
+ this.setMeaningfulPkTables(original.getMeaningfulPkTables());
+ this.setSkipPrimaryKeyLoading(original.getSkipPrimaryKeyLoading());
+ this.setSkipRelationshipsLoading(original.getSkipRelationshipsLoading());
+ this.setForceDataMapSchema(original.isForceDataMapSchema());
+ this.setForceDataMapCatalog(original.isForceDataMapCatalog());
+ this.setUseJava7Types(original.isUseJava7Types());
+ this.setUsePrimitives(original.isUsePrimitives());
+ this.setTableTypes(Arrays.asList(original.getTableTypes()));
+ this.setName(original.getName());
+ for (Catalog catalog : original.getCatalogs()) {
+ this.addCatalog(new Catalog(catalog));
+ }
+ }
+
public Boolean getSkipRelationshipsLoading() {
return skipRelationshipsLoading;
}
@@ -175,14 +202,27 @@ public class ReverseEngineering extends SchemaContainer implements Serializable
}
}
- if (skipRelationshipsLoading != null && skipRelationshipsLoading) {
- res.append("\n Skip Relationships Loading");
+ super.toString(res, " ");
+
+ if (skipRelationshipsLoading) {
+ res.append("\n Skip Relationships Loading");
}
- if (skipPrimaryKeyLoading != null && skipPrimaryKeyLoading) {
- res.append("\n Skip PrimaryKey Loading");
+ if (skipPrimaryKeyLoading) {
+ res.append("\n Skip PrimaryKey Loading");
}
-
- return super.toString(res, " ").toString();
+ if (forceDataMapCatalog) {
+ res.append("\n Force DataMap catalog");
+ }
+ if (forceDataMapSchema) {
+ res.append("\n Force DataMap schema");
+ }
+ if (usePrimitives) {
+ res.append("\n Use primitives");
+ }
+ if (useJava7Types) {
+ res.append("\n Use Java 7 types");
+ }
+ return res.toString();
}
public String getDefaultPackage() {
@@ -248,4 +288,31 @@ public class ReverseEngineering extends SchemaContainer implements Serializable
public void setUseJava7Types(boolean useJava7Types) {
this.useJava7Types = useJava7Types;
}
+
+ @Override
+ public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+ encoder.start("config")
+ .attribute("xmlns", DbImportExtension.NAMESPACE)
+ .nested(this.getIncludeTables(), delegate)
+ .nested(this.getExcludeTables(), delegate)
+ .nested(this.getIncludeColumns(), delegate)
+ .nested(this.getExcludeColumns(), delegate)
+ .nested(this.getIncludeProcedures(), delegate)
+ .nested(this.getExcludeProcedures(), delegate)
+ .nested(this.getCatalogs(), delegate)
+ .nested(this.getSchemas(), delegate)
+ .simpleTag("db-type", Util.join(Arrays.asList(this.getTableTypes()), ","))
+ .simpleTag("defaultPackage", this.getDefaultPackage())
+ .simpleTag("forceDataMapCatalog", Boolean.toString(this.isForceDataMapCatalog()))
+ .simpleTag("forceDataMapSchema", Boolean.toString(this.isForceDataMapSchema()))
+ .simpleTag("meaningfulPkTables", this.getMeaningfulPkTables())
+ .simpleTag("namingStrategy", this.getNamingStrategy())
+ .simpleTag("skipPrimaryKeyLoading", this.getSkipPrimaryKeyLoading().toString())
+ .simpleTag("skipRelationshipsLoading", this.getSkipRelationshipsLoading().toString())
+ .simpleTag("stripFromTableNames", this.getStripFromTableNames())
+ .simpleTag("useJava7Types", Boolean.toString(this.isUseJava7Types()))
+ .simpleTag("usePrimitives", Boolean.toString(this.isUsePrimitives()))
+ .end();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Schema.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Schema.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Schema.java
index 7e7d273..6e6033f 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Schema.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/Schema.java
@@ -19,10 +19,14 @@
package org.apache.cayenne.dbsync.reverse.dbimport;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
/**
* @since 4.0.
*/
-public class Schema extends FilterContainer {
+public class Schema extends FilterContainer implements XMLSerializable {
public Schema() {
}
@@ -31,9 +35,26 @@ public class Schema extends FilterContainer {
setName(name);
}
+ public Schema(Schema original) {
+ super(original);
+ }
+
@Override
public StringBuilder toString(StringBuilder res, String prefix) {
res.append(prefix).append("Schema: ").append(getName()).append("\n");
return super.toString(res, prefix + " ");
}
+
+ @Override
+ public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+ encoder.start("schema")
+ .nested(this.getIncludeTables(), delegate)
+ .nested(this.getExcludeTables(), delegate)
+ .nested(this.getIncludeColumns(), delegate)
+ .nested(this.getExcludeColumns(), delegate)
+ .nested(this.getIncludeProcedures(), delegate)
+ .nested(this.getExcludeProcedures(), delegate)
+ .simpleTag("name", this.getName())
+ .end();
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/SchemaContainer.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/SchemaContainer.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/SchemaContainer.java
index 7b4a849..e7a9391 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/SchemaContainer.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/SchemaContainer.java
@@ -25,7 +25,7 @@ import java.util.LinkedList;
/**
* @since 4.0
*/
-abstract class SchemaContainer extends FilterContainer {
+public abstract class SchemaContainer extends FilterContainer implements Cloneable {
private final Collection<Schema> schemaCollection = new LinkedList<>();
@@ -37,6 +37,16 @@ abstract class SchemaContainer extends FilterContainer {
this.schemaCollection.add(schema);
}
+ public SchemaContainer(){
+ }
+
+ public SchemaContainer(SchemaContainer original) {
+ super(original);
+ for (Schema schema : original.getSchemas()) {
+ this.addSchema(new Schema(schema));
+ }
+ }
+
@Override
public boolean isEmptyContainer() {
if (!super.isEmptyContainer()) {
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
index f0da783..dd0851a 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
@@ -93,7 +93,7 @@ public class DbLoader {
*/
public static List<String> loadCatalogs(Connection connection) throws SQLException {
try (ResultSet rs = connection.getMetaData().getCatalogs()) {
- return getStrings(rs);
+ return getStrings(rs, 1);
}
}
@@ -104,14 +104,14 @@ public class DbLoader {
*/
public static List<String> loadSchemas(Connection connection) throws SQLException {
try (ResultSet rs = connection.getMetaData().getSchemas()) {
- return getStrings(rs);
+ return getStrings(rs, 1);
}
}
- private static List<String> getStrings(ResultSet rs) throws SQLException {
+ private static List<String> getStrings(ResultSet rs, int columnIndex) throws SQLException {
List<String> strings = new ArrayList<>();
while (rs.next()) {
- strings.add(rs.getString(1));
+ strings.add(rs.getString(columnIndex));
}
return strings;
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/PatternFilter.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/PatternFilter.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/PatternFilter.java
index feb90de..54eb641 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/PatternFilter.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/PatternFilter.java
@@ -75,6 +75,10 @@ public class PatternFilter {
this.excludes = new TreeSet<>(PATTERN_COMPARATOR);
}
+ public SortedSet<Pattern> getIncludes() {
+ return includes;
+ }
+
public PatternFilter include(Pattern p) {
includes.add(p);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/TableFilter.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/TableFilter.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/TableFilter.java
index ebc2358..ecf6dc3 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/TableFilter.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/TableFilter.java
@@ -84,6 +84,10 @@ public class TableFilter {
return include.columnsFilter;
}
+ public SortedSet<IncludeTableFilter> getIncludes() {
+ return includes;
+ }
+
public static TableFilter include(String tablePattern) {
TreeSet<IncludeTableFilter> includes = new TreeSet<IncludeTableFilter>();
includes.add(new IncludeTableFilter(tablePattern == null ? null : tablePattern.replaceAll("%", ".*")));
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/CatalogHandler.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/CatalogHandler.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/CatalogHandler.java
new file mode 100644
index 0000000..dd71840
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/CatalogHandler.java
@@ -0,0 +1,183 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dbsync.xml;
+
+import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
+import org.apache.cayenne.dbsync.reverse.dbimport.*;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * @since 4.1
+ */
+class CatalogHandler extends NamespaceAwareNestedTagHandler {
+
+ private static final String CATALOG_TAG = "catalog";
+ private static final String CATALOG_NAME_TAG = "name";
+ private static final String SCHEMA_TAG = "schema";
+ private static final String INCLUDE_TABLE_TAG = "includeTable";
+ private static final String EXCLUDE_TABLE_TAG = "excludeTable";
+ private static final String INCLUDE_COLUMN_TAG = "includeColumn";
+ private static final String EXCLUDE_COLUMN_TAG = "excludeColumn";
+ private static final String INCLUDE_PROCEDURE_TAG = "includeProcedure";
+ private static final String EXCLUDE_PROCEDURE_TAG = "excludeProcedure";
+
+ private ReverseEngineering configuration;
+
+ private Catalog catalog;
+
+ CatalogHandler(NamespaceAwareNestedTagHandler parentHandler, ReverseEngineering configuration) {
+ super(parentHandler);
+ this.configuration = configuration;
+ }
+
+ @Override
+ protected ContentHandler createChildTagHandler(String namespaceURI, String localName,
+ String qName, Attributes attributes) {
+
+ if (namespaceURI.equals(targetNamespace)) {
+ switch (localName) {
+ case SCHEMA_TAG:
+ return new SchemaHandler(this, catalog);
+ case INCLUDE_TABLE_TAG:
+ return new IncludeTableHandler(this, catalog);
+ }
+ }
+
+ return super.createChildTagHandler(namespaceURI, localName, qName, attributes);
+ }
+
+ @Override
+ protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException {
+ switch (localName) {
+ case CATALOG_TAG:
+ createCatalog();
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ protected void processCharData(String localName, String data) {
+ switch (localName) {
+ case INCLUDE_TABLE_TAG:
+ createIncludeTable(data);
+ break;
+ case CATALOG_NAME_TAG:
+ createCatalogName(data);
+ break;
+ case EXCLUDE_TABLE_TAG:
+ createExcludeTable(data);
+ break;
+ case INCLUDE_COLUMN_TAG:
+ createIncludeColumn(data);
+ break;
+ case EXCLUDE_COLUMN_TAG:
+ createExcludeColumn(data);
+ break;
+ case INCLUDE_PROCEDURE_TAG:
+ createIncludeProcedure(data);
+ break;
+ case EXCLUDE_PROCEDURE_TAG:
+ createExcludeProcedure(data);
+ break;
+ }
+ }
+
+ private void createIncludeTable(String includeTableData) {
+ if (includeTableData.trim().length() == 0) {
+ return;
+ }
+
+ if (catalog != null) {
+ IncludeTable includeTable = new IncludeTable();
+ includeTable.setName(includeTableData);
+ catalog.addIncludeTable(includeTable);
+ }
+ }
+
+ private void createCatalogName(String catalogName) {
+ if (catalogName.trim().length() == 0) {
+ return;
+ }
+
+ if (catalog != null) {
+ catalog.setName(catalogName);
+ }
+ }
+
+ private void createExcludeProcedure(String excludeProcedure) {
+ if (excludeProcedure.trim().length() == 0) {
+ return;
+ }
+
+ if (catalog != null) {
+ catalog.addExcludeProcedure(new ExcludeProcedure(excludeProcedure));
+ }
+ }
+
+ private void createIncludeProcedure(String includeProcedure) {
+ if (includeProcedure.trim().length() == 0) {
+ return;
+ }
+
+ if (catalog != null) {
+ catalog.addIncludeProcedure(new IncludeProcedure(includeProcedure));
+ }
+ }
+
+ private void createExcludeColumn(String excludeColumn) {
+ if (excludeColumn.trim().length() == 0) {
+ return;
+ }
+
+ if (catalog != null) {
+ catalog.addExcludeColumn(new ExcludeColumn(excludeColumn));
+ }
+ }
+
+ private void createIncludeColumn(String includeColumn) {
+ if (includeColumn.trim().length() == 0) {
+ return;
+ }
+
+ if (catalog != null) {
+ catalog.addIncludeColumn(new IncludeColumn(includeColumn));
+ }
+ }
+
+ private void createExcludeTable(String excludeTable) {
+ if (excludeTable.trim().length() == 0) {
+ return;
+ }
+
+ if (catalog != null) {
+ catalog.addExcludeTable(new ExcludeTable(excludeTable));
+ }
+ }
+
+ private void createCatalog() {
+ catalog = new Catalog();
+ configuration.addCatalog(catalog);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/ConfigHandler.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/ConfigHandler.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/ConfigHandler.java
new file mode 100644
index 0000000..e522d89
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/ConfigHandler.java
@@ -0,0 +1,350 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dbsync.xml;
+
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.configuration.xml.DataMapLoaderListener;
+import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
+import org.apache.cayenne.map.DataMap;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * @since 4.1
+ */
+class ConfigHandler extends NamespaceAwareNestedTagHandler {
+
+ public static final String CONFIG_TAG = "config";
+
+ private static final String CATALOG_TAG = "catalog";
+ private static final String SCHEMA_TAG = "schema";
+ private static final String TABLE_TYPE_TAG = "tableType";
+ private static final String DEFAULT_PACKAGE_TAG = "defaultPackage";
+ private static final String FORCE_DATAMAP_CATALOG_TAG = "forceDataMapCatalog";
+ private static final String FORCE_DATAMAP_SCHEMA_TAG = "forceDataMapSchema";
+ private static final String MEANINGFUL_PK_TABLES_TAG = "meaningfulPkTables";
+ private static final String NAMING_STRATEGY_TAG = "namingStrategy";
+ private static final String SKIP_PK_LOADING_TAG = "skipPrimaryKeyLoading";
+ private static final String SKIP_RELATIONSHIPS_LOADING_TAG = "skipRelationshipsLoading";
+ private static final String STRIP_FROM_TABLE_NAMES_TAG = "stripFromTableNames";
+ private static final String USE_JAVA7_TYPES_TAG = "useJava7Types";
+ private static final String USE_PRIMITIVES_TAG = "usePrimitives";
+ private static final String INCLUDE_TABLE_TAG = "includeTable";
+ private static final String EXCLUDE_TABLE_TAG = "excludeTable";
+ private static final String INCLUDE_COLUMN_TAG = "includeColumn";
+ private static final String EXCLUDE_COLUMN_TAG = "excludeColumn";
+ private static final String INCLUDE_PROCEDURE_TAG = "includeProcedure";
+ private static final String EXCLUDE_PROCEDURE_TAG = "excludeProcedure";
+
+ private static final String TRUE = "true";
+
+ private ReverseEngineering configuration;
+ private DataChannelMetaData metaData;
+
+ ConfigHandler(NamespaceAwareNestedTagHandler parentHandler, DataChannelMetaData metaData) {
+ super(parentHandler);
+ this.metaData = metaData;
+ this.targetNamespace = DbImportExtension.NAMESPACE;
+ }
+
+ @Override
+ protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException {
+ switch (localName) {
+ case CONFIG_TAG:
+ createConfig();
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ protected ContentHandler createChildTagHandler(String namespaceURI, String localName,
+ String qName, Attributes attributes) {
+
+ if (namespaceURI.equals(targetNamespace)) {
+ switch (localName) {
+ case CATALOG_TAG:
+ return new CatalogHandler(this, configuration);
+ case SCHEMA_TAG:
+ return new SchemaHandler(this, configuration);
+ case INCLUDE_TABLE_TAG:
+ return new IncludeTableHandler(this , configuration);
+ }
+ }
+
+ return super.createChildTagHandler(namespaceURI, localName, qName, attributes);
+ }
+
+ @Override
+ protected void processCharData(String localName, String data) {
+ switch (localName) {
+ case TABLE_TYPE_TAG:
+ createTableType(data);
+ break;
+ case DEFAULT_PACKAGE_TAG:
+ createDefaultPackage(data);
+ break;
+ case FORCE_DATAMAP_CATALOG_TAG:
+ createForceDatamapCatalog(data);
+ break;
+ case FORCE_DATAMAP_SCHEMA_TAG:
+ createForceDatamapSchema(data);
+ break;
+ case MEANINGFUL_PK_TABLES_TAG:
+ createMeaningfulPkTables(data);
+ break;
+ case NAMING_STRATEGY_TAG:
+ createNamingStrategy(data);
+ break;
+ case SKIP_PK_LOADING_TAG:
+ createSkipPkLoading(data);
+ break;
+ case SKIP_RELATIONSHIPS_LOADING_TAG:
+ createSkipRelationshipsLoading(data);
+ break;
+ case STRIP_FROM_TABLE_NAMES_TAG:
+ createStripFromTableNames(data);
+ break;
+ case USE_JAVA7_TYPES_TAG:
+ createUseJava7Types(data);
+ break;
+ case USE_PRIMITIVES_TAG:
+ createUsePrimitives(data);
+ break;
+ case EXCLUDE_TABLE_TAG:
+ createExcludeTable(data);
+ break;
+ case INCLUDE_COLUMN_TAG:
+ createIncludeColumn(data);
+ break;
+ case EXCLUDE_COLUMN_TAG:
+ createExcludeColumn(data);
+ break;
+ case INCLUDE_PROCEDURE_TAG:
+ createIncludeProcedure(data);
+ break;
+ case EXCLUDE_PROCEDURE_TAG:
+ createExcludeProcedure(data);
+ break;
+ }
+ }
+
+ private void createExcludeProcedure(String excludeProcedure) {
+ if (excludeProcedure.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ configuration.addExcludeProcedure(new ExcludeProcedure(excludeProcedure));
+ }
+ }
+
+ private void createIncludeProcedure(String includeProcedure) {
+ if (includeProcedure.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ configuration.addIncludeProcedure(new IncludeProcedure(includeProcedure));
+ }
+ }
+
+ private void createExcludeColumn(String excludeColumn) {
+ if (excludeColumn.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ configuration.addExcludeColumn(new ExcludeColumn(excludeColumn));
+ }
+ }
+
+ private void createIncludeColumn(String includeColumn) {
+ if (includeColumn.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ configuration.addIncludeColumn(new IncludeColumn(includeColumn));
+ }
+ }
+
+ private void createExcludeTable(String excludeTable) {
+ if (excludeTable.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ configuration.addExcludeTable(new ExcludeTable(excludeTable));
+ }
+ }
+
+ private void createUsePrimitives(String usePrimitives) {
+ if (usePrimitives.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ if (usePrimitives.equals(TRUE)) {
+ configuration.setUsePrimitives(true);
+ } else {
+ configuration.setUsePrimitives(false);
+ }
+ }
+ }
+
+ private void createUseJava7Types(String useJava7Types) {
+ if (useJava7Types.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ if (useJava7Types.equals(TRUE)) {
+ configuration.setUseJava7Types(true);
+ } else {
+ configuration.setUseJava7Types(false);
+ }
+ }
+ }
+
+ private void createStripFromTableNames(String stripFromTableNames) {
+ if (stripFromTableNames.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ configuration.setStripFromTableNames(stripFromTableNames);
+ }
+ }
+
+ private void createSkipRelationshipsLoading(String skipRelationshipsLoading) {
+ if (skipRelationshipsLoading.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ if (skipRelationshipsLoading.equals(TRUE)) {
+ configuration.setSkipRelationshipsLoading(true);
+ } else {
+ configuration.setSkipRelationshipsLoading(false);
+ }
+ }
+ }
+
+ private void createSkipPkLoading(String skipPkLoading) {
+ if (skipPkLoading.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ if (skipPkLoading.equals(TRUE)) {
+ configuration.setSkipPrimaryKeyLoading(true);
+ } else {
+ configuration.setSkipPrimaryKeyLoading(false);
+ }
+ }
+ }
+
+ private void createNamingStrategy(String namingStrategy) {
+ if (namingStrategy.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ configuration.setNamingStrategy(namingStrategy);
+ }
+ }
+
+ private void createMeaningfulPkTables(String meaningfulPkTables) {
+ if (meaningfulPkTables.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ configuration.setMeaningfulPkTables(meaningfulPkTables);
+ }
+ }
+
+ private void createForceDatamapSchema(String forceDatamapSchema) {
+ if (forceDatamapSchema.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ if (forceDatamapSchema.equals(TRUE)) {
+ configuration.setForceDataMapSchema(true);
+ } else {
+ configuration.setForceDataMapSchema(false);
+ }
+ }
+ }
+
+ private void createForceDatamapCatalog(String forceDatamapCatalog) {
+ if (forceDatamapCatalog.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ if (forceDatamapCatalog.equals(TRUE)) {
+ configuration.setForceDataMapCatalog(true);
+ } else {
+ configuration.setForceDataMapCatalog(false);
+ }
+ }
+ }
+
+ private void createDefaultPackage(String defaultPackage) {
+ if (defaultPackage.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ configuration.setDefaultPackage(defaultPackage);
+ }
+ }
+
+ private void createTableType(String tableType) {
+ if (tableType.trim().length() == 0) {
+ return;
+ }
+
+ if (configuration != null) {
+ configuration.addTableType(tableType);
+ }
+ }
+
+ private void createConfig() {
+ configuration = new ReverseEngineering();
+ loaderContext.addDataMapListener(new DataMapLoaderListener() {
+ @Override
+ public void onDataMapLoaded(DataMap dataMap) {
+ ConfigHandler.this.metaData.add(dataMap, configuration);
+ }
+ });
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java
new file mode 100644
index 0000000..120826d
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java
@@ -0,0 +1,56 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dbsync.xml;
+
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.extension.BaseNamingDelegate;
+import org.apache.cayenne.project.extension.LoaderDelegate;
+import org.apache.cayenne.project.extension.ProjectExtension;
+import org.apache.cayenne.project.extension.SaverDelegate;
+
+/**
+ * @since 4.1
+ */
+public class DbImportExtension implements ProjectExtension {
+
+ public static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/dbimport";
+
+ @Inject
+ private DataChannelMetaData metaData;
+
+ @Override
+ public LoaderDelegate createLoaderDelegate() {
+ return new DbImportLoaderDelegate(metaData);
+ }
+
+ @Override
+ public SaverDelegate createSaverDelegate() {
+ return new DbImportSaverDelegate(metaData);
+ }
+
+ @Override
+ public ConfigurationNodeVisitor<String> createNamingDelegate() {
+ return new BaseNamingDelegate();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportLoaderDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportLoaderDelegate.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportLoaderDelegate.java
new file mode 100644
index 0000000..e777665
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportLoaderDelegate.java
@@ -0,0 +1,49 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dbsync.xml;
+
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
+import org.apache.cayenne.project.extension.LoaderDelegate;
+
+/**
+ * @since 4.1
+ */
+class DbImportLoaderDelegate implements LoaderDelegate {
+
+ private DataChannelMetaData metaData;
+
+ DbImportLoaderDelegate(DataChannelMetaData metaData) {
+ this.metaData = metaData;
+ }
+
+ @Override
+ public String getTargetNamespace() {
+ return DbImportExtension.NAMESPACE;
+ }
+
+ @Override
+ public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent, String tag) {
+ if(ConfigHandler.CONFIG_TAG.equals(tag)) {
+ return new ConfigHandler(parent, metaData);
+ }
+ return null;
+ }
+}
\ No newline at end of file