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