CAY-2051 Fixes for reverse engineering in Modeler: configurtion file naming, 
catalog/schema handling, code formatting.


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

Branch: refs/heads/master
Commit: fdfeb3ac45fbf81551c82bcc6b2478372fb215d8
Parents: b5bfbd5
Author: Olya Bondareva <ollybondar...@gmail.com>
Authored: Wed Feb 24 20:50:36 2016 +0100
Committer: Dzmitry Kazimirchyk <dkazimirc...@gmail.com>
Committed: Fri Feb 26 11:38:58 2016 +0300

----------------------------------------------------------------------
 .../project/ReverseEngineeringSaverTest.java    |   2 +-
 .../org/apache/cayenne/access/DbLoader.java     |  20 ++
 .../DefaultConfigurationNameMapper.java         |   2 +-
 .../dbimport/ReverseEngineeringLoader.java      |   3 +-
 .../java/org/apache/cayenne/map/DataMap.java    |   2 +-
 .../java/org/apache/cayenne/map/MapLoader.java  |   2 +-
 .../apache/cayenne/tools/DbImporterTask.java    |  40 ++--
 .../tools/dbimport/DbImportActionDefault.java   |   7 +-
 .../dialog/db/DbImportActionModeler.java        |   6 +-
 .../dialog/db/ReverseEngineeringController.java | 226 +++++++++++++------
 .../dialog/db/ReverseEngineeringView.java       |  13 +-
 .../modeler/dialog/db/model/DBElement.java      |   9 +
 .../apache/cayenne/tools/DbImporterMojo.java    |  75 +++---
 13 files changed, 265 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/cayenne-project/src/test/java/org/apache/cayenne/project/ReverseEngineeringSaverTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-project/src/test/java/org/apache/cayenne/project/ReverseEngineeringSaverTest.java
 
b/cayenne-project/src/test/java/org/apache/cayenne/project/ReverseEngineeringSaverTest.java
index 38fe391..1176f19 100644
--- 
a/cayenne-project/src/test/java/org/apache/cayenne/project/ReverseEngineeringSaverTest.java
+++ 
b/cayenne-project/src/test/java/org/apache/cayenne/project/ReverseEngineeringSaverTest.java
@@ -53,7 +53,7 @@ public class ReverseEngineeringSaverTest extends Project2Case 
{
         DataMap dataMap1 = 
dataMapLoader.load(dataMap.getConfigurationSource());
         String reverseEngineeringName = 
dataMap1.getReverseEngineering().getName();
 
-        File reFile = new File(testFolder, reverseEngineeringName + 
".reverseEngineering.xml");
+        File reFile = new File(testFolder, reverseEngineeringName + ".xml");
         assertTrue(reFile.exists());
         assertTrue(reFile.length() > 0);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java 
b/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
index af4358b..67477dd 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
@@ -118,6 +118,26 @@ public class DbLoader {
        }
 
        /**
+        * Check if database support schemas.
+        */
+       protected boolean supportSchemas() throws SQLException {
+               if (metaData == null) {
+                       metaData = connection.getMetaData();
+               }
+               return metaData.supportsSchemasInTableDefinitions();
+       }
+
+       /**
+        * Check if database support catalogs.
+        */
+       protected boolean supportCatalogs() throws SQLException {
+               if (metaData == null) {
+                       metaData = connection.getMetaData();
+               }
+               return metaData.supportsCatalogsInTableDefinitions();
+       }
+
+       /**
         * @since 3.0
         */
        public void setCreatingMeaningfulPK(boolean creatingMeaningfulPK) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultConfigurationNameMapper.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultConfigurationNameMapper.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultConfigurationNameMapper.java
index 24cea5d..16b782a 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultConfigurationNameMapper.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultConfigurationNameMapper.java
@@ -32,7 +32,7 @@ public class DefaultConfigurationNameMapper implements 
ConfigurationNameMapper {
 
        private static final String DATA_MAP_SUFFIX = ".map.xml";
 
-       private static final String REVERSE_ENGINEERING_SUFFIX = 
".reverseEngineering.xml";
+       private static final String REVERSE_ENGINEERING_SUFFIX = ".xml";
 
        protected ConfigurationNodeVisitor<String> nameMapper;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineeringLoader.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineeringLoader.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineeringLoader.java
index b3dbb8d..83d0f45 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineeringLoader.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dbimport/ReverseEngineeringLoader.java
@@ -31,6 +31,7 @@ import java.net.URL;
  */
 public interface ReverseEngineeringLoader {
 
-    ReverseEngineering load(InputStream inputStream) throws 
CayenneRuntimeException, SAXException, ParserConfigurationException, 
IOException, ReverseEngineeringLoaderException;
+    ReverseEngineering load(InputStream inputStream) throws 
CayenneRuntimeException, SAXException, 
+            ParserConfigurationException, IOException, 
ReverseEngineeringLoaderException;
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java 
b/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
index 9c511c8..a570d66 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
@@ -322,7 +322,7 @@ public class DataMap implements Serializable, 
ConfigurationNode, XMLSerializable
                encoder.println(">");
 
         if (reverseEngineering != null) {
-            encoder.print("<reverseEngineering");
+                       encoder.print("<reverse-engineering-config");
             encoder.printAttribute("name", 
reverseEngineering.getName().trim());
             encoder.println("/>");
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/cayenne-server/src/main/java/org/apache/cayenne/map/MapLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/MapLoader.java 
b/cayenne-server/src/main/java/org/apache/cayenne/map/MapLoader.java
index c4787c7..213e38e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/MapLoader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/MapLoader.java
@@ -49,7 +49,7 @@ public class MapLoader extends DefaultHandler {
        /**
         * @since 4.0
         */
-       public static final String REVERSE_ENGINEERING = "reverseEngineering";
+       public static final String REVERSE_ENGINEERING = 
"reverse-engineering-config";
 
        public static final String PROPERTY_TAG = "property";
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
----------------------------------------------------------------------
diff --git 
a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java 
b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index ddc44ae..119ebf4 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -19,11 +19,11 @@
 package org.apache.cayenne.tools;
 
 import java.io.File;
-import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 
 import org.apache.cayenne.access.loader.filters.OldFilterConfigBridge;
+import org.apache.cayenne.configuration.ConfigurationNameMapper;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.XMLDataMapLoader;
 import org.apache.cayenne.configuration.server.DataSourceFactory;
@@ -98,12 +98,10 @@ public class DbImporterTask extends Task {
 
                 log(message, Project.MSG_ERR);
                 throw new BuildException(message, th);
-            }
-            finally {
+            } finally {
                 injector.shutdown();
             }
-        }
-        else {
+        } else {
             if (dataMapFile.exists()) {
                 try {
                     URL url = dataMapFile.toURI().toURL();
@@ -112,21 +110,21 @@ public class DbImporterTask extends Task {
                     XMLDataMapLoader xmlDataMapLoader = new XMLDataMapLoader();
                     DataMap dataMap = xmlDataMapLoader.load(resource);
                     if (dataMap.getReverseEngineering() != null) {
-                        Resource reverseEngineeringResource = new 
URLResource(dataMapFile.toURL()).getRelativeResource(dataMap.getReverseEngineering().getName()
 + ".reverseEngineering.xml");
-
-                        DefaultReverseEngineeringLoader 
reverseEngineeringLoader = new DefaultReverseEngineeringLoader();
-                        ReverseEngineering reverseEngineering = 
reverseEngineeringLoader.load(reverseEngineeringResource.getURL().openStream());
-                        
reverseEngineering.setName(dataMap.getReverseEngineering().getName());
-                        
reverseEngineering.setConfigurationSource(reverseEngineeringResource);
-                        dataMap.setReverseEngineering(reverseEngineering);
-
-                        FiltersConfigBuilder filtersConfigBuilder = new 
FiltersConfigBuilder(dataMap.getReverseEngineering());
-                        
config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.filtersConfig());
                         Injector injector = DIBootstrap.createInjector(new 
ToolsModule(logger), new DbImportModule());
-
-                        validateDbImportConfiguration(config, injector);
-
                         try {
+                            ConfigurationNameMapper nameMapper = 
injector.getInstance(ConfigurationNameMapper.class);
+                            String reverseEngineeringLocation = 
nameMapper.configurationLocation(ReverseEngineering.class, 
dataMap.getReverseEngineering().getName());
+                            Resource reverseEngineeringResource = new 
URLResource(dataMapFile.toURI().toURL()).getRelativeResource(reverseEngineeringLocation);
+
+                            DefaultReverseEngineeringLoader 
reverseEngineeringLoader = new DefaultReverseEngineeringLoader();
+                            ReverseEngineering reverseEngineering = 
reverseEngineeringLoader.load(reverseEngineeringResource.getURL().openStream());
+                            
reverseEngineering.setName(dataMap.getReverseEngineering().getName());
+                            
reverseEngineering.setConfigurationSource(reverseEngineeringResource);
+                            dataMap.setReverseEngineering(reverseEngineering);
+
+                            FiltersConfigBuilder filtersConfigBuilder = new 
FiltersConfigBuilder(dataMap.getReverseEngineering());
+                            
config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.filtersConfig());
+                            validateDbImportConfiguration(config, injector);
                             
injector.getInstance(DbImportAction.class).execute(config);
                         } catch (Exception ex) {
                             Throwable th = Util.unwindException(ex);
@@ -139,17 +137,13 @@ public class DbImporterTask extends Task {
 
                             log(message, Project.MSG_ERR);
                             throw new BuildException(message, th);
-                        }
-                        finally {
+                        } finally {
                             injector.shutdown();
                         }
                     }
                 } catch (MalformedURLException e) {
                     log(e.getMessage(), Project.MSG_ERR);
                     throw new BuildException(e.getMessage(), e);
-                } catch (IOException e) {
-                    log(e.getMessage(), Project.MSG_ERR);
-                    throw new BuildException(e.getMessage(), e);
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportActionDefault.java
----------------------------------------------------------------------
diff --git 
a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportActionDefault.java
 
b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportActionDefault.java
index aa58e56..fd1c235 100644
--- 
a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportActionDefault.java
+++ 
b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportActionDefault.java
@@ -210,7 +210,9 @@ public class DbImportActionDefault implements 
DbImportAction {
         return null;
     }
 
-    private List<MergerToken> reverse(MergerFactory mergerFactory, 
Iterable<MergerToken> mergeTokens) throws IOException {
+    private List<MergerToken> reverse(
+            MergerFactory mergerFactory, 
+            Iterable<MergerToken> mergeTokens) throws IOException {
         List<MergerToken> tokens = new LinkedList<>();
         for (MergerToken token : mergeTokens) {
             if (token instanceof AbstractToModelToken) {
@@ -254,7 +256,8 @@ public class DbImportActionDefault implements 
DbImportAction {
         return dataMap;
     }
 
-    private DbLoader getLoader(DbImportConfiguration config, DbAdapter 
adapter, Connection connection) throws InstantiationException, 
IllegalAccessException, ClassNotFoundException {
+    private DbLoader getLoader(DbImportConfiguration config, DbAdapter 
adapter, Connection connection) 
+            throws InstantiationException, IllegalAccessException, 
ClassNotFoundException {
         return config.createLoader(adapter, connection, 
config.createLoaderDelegate());
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java
index b131dd8..150444b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java
@@ -29,7 +29,6 @@ import org.apache.cayenne.map.MapLoader;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
 import org.apache.cayenne.project.ProjectSaver;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.tools.dbimport.DbImportAction;
@@ -38,8 +37,6 @@ import 
org.apache.cayenne.tools.dbimport.DbImportConfiguration;
 import org.apache.commons.logging.Log;
 
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.sql.Connection;
 
 public class DbImportActionModeler implements DbImportAction {
@@ -102,7 +99,8 @@ public class DbImportActionModeler implements DbImportAction 
{
             }
 
             @Override
-            protected DataMap load(DbImportConfiguration config, DbAdapter 
adapter, Connection connection) throws Exception {
+            protected DataMap load(DbImportConfiguration config, 
+                                   DbAdapter adapter, Connection connection) 
throws Exception {
                 DataMap dataMap;
 
                 try {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
index f084187..b2ac550 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
@@ -1,22 +1,21 @@
 /*****************************************************************
- * 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
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * 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.
+ *   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.modeler.dialog.db;
 
 import org.apache.cayenne.access.DbLoader;
@@ -27,7 +26,6 @@ import org.apache.cayenne.access.loader.filters.SchemaFilter;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbimport.FiltersConfigBuilder;
 import org.apache.cayenne.dbimport.ReverseEngineering;
-import org.apache.cayenne.dbimport.ReverseEngineeringLoaderException;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -117,25 +115,61 @@ public class ReverseEngineeringController extends 
CayenneController {
         try {
             buildDBProperties();
 
-            DbLoader dbLoader = new DbLoader(connection, adapter, new 
DefaultDbLoaderDelegate()) {
+            final DbLoader dbLoader = new DbLoader(connection, adapter, new 
DefaultDbLoaderDelegate()) {
                 @Override
                 public DataMap load(DbLoaderConfiguration config) throws 
SQLException {
                     DataMap dataMap = new DataMap();
                     Map<String, Procedure> procedureMap = 
loadProcedures(dataMap, config);
-                    load(dataMap, config, procedureMap);
+                    load(dataMap, config);
+                    addProcedures(procedureMap);
                     return dataMap;
                 }
 
-                public void load(DataMap dataMap, DbLoaderConfiguration 
config, Map<String, Procedure> procedureMap
-                )
-                        throws SQLException {
-                    LOGGER.info("Schema loading...");
-
-                    String[] types = config.getTableTypes();
-                    if (types == null || types.length == 0) {
-                        types = getDefaultTableTypes();
+                private void addProcedures(Map<String, Procedure> 
procedureMap) throws SQLException {
+                    DBElement currentDBCatalog;
+                    DBElement currentDBSchema;
+                    for (Map.Entry<String, Procedure> procedure : 
procedureMap.entrySet()) {
+                        if (supportCatalogs()) {
+                            String dbCatalogName = 
procedure.getValue().getCatalog();
+                            DBElement dbCatalog = 
dbModel.getExistingElement(dbCatalogName);
+                            if (dbCatalog != null) {
+                                currentDBCatalog = dbCatalog;
+                            } else {
+                                currentDBCatalog = new 
DBCatalog(dbCatalogName);
+                                dbModel.addElement(currentDBCatalog);
+                            }
+                            if (supportSchemas()) {
+                                String dbSchemaName = 
procedure.getValue().getSchema();
+                                DBElement dbSchema = 
currentDBCatalog.getExistingElement(dbSchemaName);
+                                if (dbSchema != null) {
+                                    currentDBSchema = dbSchema;
+                                } else {
+                                    currentDBSchema = new 
DBSchema(dbSchemaName);
+                                    
currentDBCatalog.addElement(currentDBSchema);
+                                }
+                                DBProcedure currentProcedure = new 
DBProcedure(procedure.getValue().getName());
+                                currentDBSchema.addElement(currentProcedure);
+                            } else {
+                                DBProcedure currentProcedure = new 
DBProcedure(procedure.getValue().getName());
+                                currentDBCatalog.addElement(currentProcedure);
+                            }
+                        } else if (supportSchemas()) {
+                            String dbSchemaName = 
procedure.getValue().getSchema();
+                            DBElement dbSchema = 
dbModel.getExistingElement(dbSchemaName);
+                            if (dbSchema != null) {
+                                currentDBSchema = dbSchema;
+                            } else {
+                                currentDBSchema = new DBSchema(dbSchemaName);
+                                dbModel.addElement(currentDBSchema);
+                            }
+                            DBProcedure currentProcedure = new 
DBProcedure(procedure.getValue().getName());
+                            currentDBSchema.addElement(currentProcedure);
+                        }
                     }
+                }
 
+                private void createIfNotNull(DataMap dataMap, 
DbLoaderConfiguration config, 
+                                             String[] types) throws 
SQLException {
                     treeEditor.setRoot(dataSourceKey);
                     dbModel = new DBModel(dataSourceKey);
                     boolean catalogSetted = false;
@@ -144,13 +178,13 @@ public class ReverseEngineeringController extends 
CayenneController {
 
                     for (CatalogFilter catalog : 
config.getFiltersConfig().catalogs) {
                         for (SchemaFilter schema : catalog.schemas) {
-                            boolean entityChecked = false;
-                            List<DbEntity> entityList = 
createTableLoader(catalog.name, schema.name, schema.tables).loadDbEntities(
-                                    dataMap, config, types);
+                            List<DbEntity> entityList = 
+                                    createTableLoader(catalog.name, 
schema.name, schema.tables)
+                                            .loadDbEntities(dataMap, config, 
types);
                             DbEntity entityFromLoader = entityList.get(0);
 
                             if (entityFromLoader != null) {
-                                if (catalogSetted == false && 
entityFromLoader.getCatalog() != null) {
+                                if (!catalogSetted && 
entityFromLoader.getCatalog() != null) {
                                     currentDBCatalog = new 
DBCatalog(entityFromLoader.getCatalog());
                                     dbModel.addElement(currentDBCatalog);
                                     catalogSetted = true;
@@ -158,28 +192,7 @@ public class ReverseEngineeringController extends 
CayenneController {
 
                                 if (entityFromLoader.getSchema() != null) {
                                     currentDBSchema = new 
DBSchema(entityFromLoader.getSchema());
-                                    if(currentDBCatalog != null) {
-                                        
currentDBCatalog.addElement(currentDBSchema);
-                                    } else {
-                                        dbModel.addElement(currentDBSchema);
-                                    }
-                                }
-                                entityChecked = true;
-                            }
-
-                            if (!entityChecked && !procedureMap.isEmpty()) {
-                                Map.Entry<String, Procedure> entry = 
procedureMap.entrySet().iterator().next();
-                                Procedure procedure = entry.getValue();
-
-                                if (catalogSetted && procedure.getCatalog() != 
null) {
-                                    currentDBCatalog = new 
DBCatalog(procedure.getCatalog());
-                                    dbModel.addElement(currentDBCatalog);
-                                    catalogSetted = true;
-                                }
-
-                                if (procedure.getSchema() != null) {
-                                    currentDBSchema = new 
DBSchema(procedure.getSchema());
-                                    if(currentDBCatalog != null) {
+                                    if (currentDBCatalog != null) {
                                         
currentDBCatalog.addElement(currentDBSchema);
                                     } else {
                                         dbModel.addElement(currentDBSchema);
@@ -205,22 +218,103 @@ public class ReverseEngineeringController extends 
CayenneController {
                                     
currentDBCatalog.addElement(currentDBEntity);
                                 }
                             }
-
-                            if (currentDBSchema != null) {
-                                for (Map.Entry<String, Procedure> entry : 
procedureMap.entrySet()) {
-                                    currentDBSchema.addElement(new 
DBProcedure(entry.getValue().getName()));
-                                }
-                            } else {
-                                for (Map.Entry<String, Procedure> entry : 
procedureMap.entrySet()) {
-                                    currentDBCatalog.addElement(new 
DBProcedure(entry.getValue().getName()));
-                                }
-                            }
                             currentDBSchema = null;
                         }
                         catalogSetted = false;
                         currentDBCatalog = null;
                     }
                 }
+
+                private void createIfNull(DataMap dataMap, 
DbLoaderConfiguration config, 
+                                          String[] types) throws SQLException {
+                    
+                    treeEditor.setRoot(dataSourceKey);
+                    dbModel = new DBModel(dataSourceKey);
+                    DBElement currentDBCatalog;
+                    DBElement currentDBSchema;
+
+                    for (CatalogFilter catalog : 
config.getFiltersConfig().catalogs) {
+                        for (SchemaFilter schema : catalog.schemas) {
+                            List<DbEntity> entityList = 
+                                    createTableLoader(catalog.name, 
schema.name, schema.tables)
+                                            .loadDbEntities(dataMap, config, 
types);
+
+                            for (DbEntity dbEntity : entityList) {
+                                if (supportCatalogs()) {
+                                    String dbCatalogName = 
dbEntity.getCatalog();
+                                    DBElement dbCatalog = 
dbModel.getExistingElement(dbCatalogName);
+                                    if (dbCatalog != null) {
+                                        currentDBCatalog = dbCatalog;
+                                    } else {
+                                        currentDBCatalog = new 
DBCatalog(dbCatalogName);
+                                        dbModel.addElement(currentDBCatalog);
+                                    }
+                                    if (supportSchemas()) {
+                                        String dbSchemaName = 
dbEntity.getSchema();
+                                        DBElement dbSchema = 
currentDBCatalog.getExistingElement(dbSchemaName);
+                                        if (dbSchema != null) {
+                                            currentDBSchema = dbSchema;
+                                        } else {
+                                            currentDBSchema = new 
DBSchema(dbSchemaName);
+                                            
currentDBCatalog.addElement(currentDBSchema);
+                                        }
+                                        DBEntity currentDBEntity = new 
DBEntity(dbEntity.getName());
+                                        
currentDBSchema.addElement(currentDBEntity);
+                                        for (DbAttribute dbColumn : 
dbEntity.getAttributes()) {
+                                            currentDBEntity.addElement(new 
DBColumn(dbColumn.getName()));
+                                        }
+                                    } else {
+                                        DBEntity currentDBEntity = new 
DBEntity(dbEntity.getName());
+                                        
currentDBCatalog.addElement(currentDBEntity);
+                                        for (DbAttribute dbColumn : 
dbEntity.getAttributes()) {
+                                            currentDBEntity.addElement(new 
DBColumn(dbColumn.getName()));
+                                        }
+                                    }
+                                } else {
+                                    if (supportSchemas()) {
+                                        String dbSchemaName = 
dbEntity.getSchema();
+                                        DBElement dbSchema = 
dbModel.getExistingElement(dbSchemaName);
+                                        if (dbSchema != null) {
+                                            currentDBSchema = dbSchema;
+                                        } else {
+                                            currentDBSchema = new 
DBSchema(dbSchemaName);
+                                            
dbModel.addElement(currentDBSchema);
+                                        }
+                                        DBEntity currentDBEntity = new 
DBEntity(dbEntity.getName());
+                                        
currentDBSchema.addElement(currentDBEntity);
+                                        for (DbAttribute dbColumn : 
dbEntity.getAttributes()) {
+                                            currentDBEntity.addElement(new 
DBColumn(dbColumn.getName()));
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+                public void load(DataMap dataMap, DbLoaderConfiguration config
+                )
+                        throws SQLException {
+                    LOGGER.info("Schema loading...");
+
+                    String[] types = config.getTableTypes();
+                    if (types == null || types.length == 0) {
+                        types = getDefaultTableTypes();
+                    }
+                    boolean isNullDetected = false;
+                    for (CatalogFilter catalog : 
config.getFiltersConfig().catalogs) {
+                        for (SchemaFilter schema : catalog.schemas) {
+                            if (schema.name == null && catalog.name == null) {
+                                isNullDetected = true;
+                            }
+                        }
+                    }
+                    if (isNullDetected) {
+                        createIfNull(dataMap, config, types);
+                    } else {
+                        createIfNotNull(dataMap, config, types);
+                    }
+                }
             };
 
             ReverseEngineering reverseEngineering = 
xmlFileEditor.convertTextIntoReverseEngineering();
@@ -238,8 +332,6 @@ public class ReverseEngineeringController extends 
CayenneController {
             
dataMapViewModel.setReverseEngineeringText(xmlFileEditor.getView().getEditorPane().getText());
             reverseEngineeringMap.put(mapName, dataMapViewModel);
             treeEditor.convertTreeViewIntoTreeNode(dbModel);
-        } catch (ReverseEngineeringLoaderException e) {
-            xmlFileEditor.addAlertMessage(e.getMessage());
         } catch (Exception e) {
             xmlFileEditor.addAlertMessage(e.getMessage());
         }
@@ -274,8 +366,6 @@ public class ReverseEngineeringController extends 
CayenneController {
 
             th.start();
             view.setTempDataMap(projectController.getCurrentDataMap());
-        } catch (ReverseEngineeringLoaderException e) {
-            xmlFileEditor.addAlertMessage(e.getMessage());
         } catch (Exception e) {
             xmlFileEditor.addAlertMessage(e.getMessage());
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringView.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringView.java
index 087ab26..80e0070 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringView.java
@@ -40,7 +40,6 @@ import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
-import javax.swing.JSeparator;
 import javax.swing.JSplitPane;
 import java.awt.BorderLayout;
 import java.awt.FlowLayout;
@@ -52,7 +51,7 @@ import java.util.Map;
  */
 public class ReverseEngineeringView extends JPanel {
     protected ProjectController controller;
-    public ReverseEngineeringController reverseEngineeringController;
+    protected ReverseEngineeringController reverseEngineeringController;
     protected JPanel reverseEngineering;
 
     protected JComboBox dataSources;
@@ -61,7 +60,6 @@ public class ReverseEngineeringView extends JPanel {
     protected JButton executeButton;
 
     protected PanelBuilder builder;
-    protected JSeparator separator;
     protected JSplitPane splitPane;
     protected JLabel xmlLabel;
     protected JLabel treeLabel;
@@ -199,7 +197,8 @@ public class ReverseEngineeringView extends JPanel {
             if (dataMap != null) {
                 String reverseEngineeringText = null;
                 if (reverseEngineeringViewMap.containsKey(dataMap.getName())) {
-                    reverseEngineeringText = 
reverseEngineeringViewMap.get(dataMap.getName()).getReverseEngineeringText();
+                    reverseEngineeringText = reverseEngineeringViewMap
+                            
.get(dataMap.getName()).getReverseEngineeringText();
                 }
                 if (reverseEngineeringText != null) {
                     
xmlFileEditor.getView().getEditorPane().setText(reverseEngineeringText);
@@ -209,14 +208,16 @@ public class ReverseEngineeringView extends JPanel {
                     } else {
                         ReverseEngineering reverseEngineering = 
dataMap.getReverseEngineering();
                         if (reverseEngineering.getConfigurationSource() != 
null) {
-                            
xmlFileEditor.getView().getEditorPane().setPage(reverseEngineering.getConfigurationSource().getURL());
+                            xmlFileEditor.getView().getEditorPane()
+                                    
.setPage(reverseEngineering.getConfigurationSource().getURL());
                         }
                     }
                 }
 
                 if (reverseEngineeringViewMap.containsKey(dataMap.getName())) {
                     if 
(reverseEngineeringViewMap.get(dataMap.getName()).getReverseEngineeringTree() 
!= null) {
-                        DBModel loadedPreviousTree = 
reverseEngineeringViewMap.get(dataMap.getName()).getReverseEngineeringTree();
+                        DBModel loadedPreviousTree = reverseEngineeringViewMap
+                                
.get(dataMap.getName()).getReverseEngineeringTree();
                         
treeEditor.convertTreeViewIntoTreeNode(loadedPreviousTree);
                     } else {
                         treeEditor.setRoot("");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/model/DBElement.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/model/DBElement.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/model/DBElement.java
index b3a352f..c9c9411 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/model/DBElement.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/model/DBElement.java
@@ -37,6 +37,15 @@ public abstract class DBElement {
         return dbElements;
     }
 
+    public DBElement getExistingElement(String name) {
+        for (DBElement dbElement : dbElements) {
+            if (dbElement.name.equals(name)) {
+                return dbElement;
+            }
+        }
+        return null;
+    }
+
     public abstract void addElement(DBElement dbElement);
 
     public String getName() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fdfeb3ac/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
----------------------------------------------------------------------
diff --git 
a/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
 
b/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
index f3dfdc7..f3198d8 100644
--- 
a/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
+++ 
b/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
@@ -18,14 +18,15 @@
  ****************************************************************/
 package org.apache.cayenne.tools;
 
-import org.apache.cayenne.access.loader.filters.*;
+import org.apache.cayenne.access.loader.filters.OldFilterConfigBridge;
+import org.apache.cayenne.configuration.ConfigurationNameMapper;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.XMLDataMapLoader;
 import org.apache.cayenne.configuration.server.DataSourceFactory;
 import org.apache.cayenne.configuration.server.DbAdapterFactory;
 import org.apache.cayenne.dba.DbAdapter;
+
 import java.io.File;
-import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 
@@ -49,16 +50,16 @@ import javax.sql.DataSource;
 
 /**
  * Maven mojo to reverse engineer datamap from DB.
- * 
+ *
  * @since 3.0
- * 
+ *
  * @phase generate-sources
  * @goal cdbimport
  */
 public class DbImporterMojo extends AbstractMojo {
     /**
      * DataMap XML file to use as a base for DB importing.
-     * 
+     *
      * @parameter map="map"
      * @required
      */
@@ -68,7 +69,7 @@ public class DbImporterMojo extends AbstractMojo {
      * A default package for ObjEntity Java classes. If not specified, and the
      * existing DataMap already has the default package, the existing package
      * will be used.
-     * 
+     *
      * @parameter defaultPackage="defaultPackage"
      * @since 4.0
      */
@@ -78,7 +79,7 @@ public class DbImporterMojo extends AbstractMojo {
      * Indicates that the old mapping should be completely removed and replaced
      * with the new data based on reverse engineering. Default is
      * <code>true</code>.
-     * 
+     *
      * @parameter overwrite="overwrite" default-value="true"
      */
     private boolean overwrite;
@@ -93,9 +94,9 @@ public class DbImporterMojo extends AbstractMojo {
      * Java class implementing org.apache.cayenne.map.naming.NamingStrategy.
      * This is used to specify how ObjEntities will be mapped from the imported
      * DB schema.
-     * 
+     *
      * The default is a basic naming strategy.
-     * 
+     *
      * @parameter namingStrategy="namingStrategy"
      *            
default-value="org.apache.cayenne.map.naming.DefaultNameGenerator"
      */
@@ -105,7 +106,7 @@ public class DbImporterMojo extends AbstractMojo {
      * Java class implementing org.apache.cayenne.dba.DbAdapter. This attribute
      * is optional, the default is AutoAdapter, i.e. Cayenne would try to guess
      * the DB type.
-     * 
+     *
      * @parameter adapter="adapter"
      *            default-value="org.apache.cayenne.dba.AutoAdapter"
      */
@@ -113,7 +114,7 @@ public class DbImporterMojo extends AbstractMojo {
 
     /**
      * A class of JDBC driver to use for the target database.
-     * 
+     *
      * @parameter driver="driver"
      * @required
      */
@@ -121,7 +122,7 @@ public class DbImporterMojo extends AbstractMojo {
 
     /**
      * JDBC connection URL of a target database.
-     * 
+     *
      * @parameter url="url"
      * @required
      */
@@ -129,21 +130,21 @@ public class DbImporterMojo extends AbstractMojo {
 
     /**
      * Database user name.
-     * 
+     *
      * @parameter username="username"
      */
     private String username;
 
     /**
      * Database user password.
-     * 
+     *
      * @parameter password="password"
      */
     private String password;
 
     /**
      * If true, would use primitives instead of numeric and boolean classes.
-     * 
+     *
      * @parameter usePrimitives="usePrimitives" default-value="true"
      */
     private boolean usePrimitives;
@@ -157,6 +158,16 @@ public class DbImporterMojo extends AbstractMojo {
      */
     private ReverseEngineering reverseEngineering = new ReverseEngineering();
 
+    /**
+     * Flag which defines from where to take the configuration of cdbImport.
+     * If we define the config of cdbImport in pom.xml
+     * we should set it to true or it will be setted to true automatically
+     * if we will define some configuration parameters in pom.xml
+     * Else it remains default(false) and for cdbImport
+     * we use the configuration defined in signed dataMap
+     *
+     *  @parameter isReverseEngineeringDefined="isReverseEngineeringDefined" 
default-value="false"
+     */
     private boolean isReverseEngineeringDefined = false;
 
     public void setIsReverseEngineeringDefined(boolean 
isReverseEngineeringDefined) {
@@ -283,8 +294,7 @@ public class DbImporterMojo extends AbstractMojo {
                 getLog().error(message);
                 throw new MojoExecutionException(message, th);
             }
-        }
-        else {
+        } else {
             if (dataMapFile.exists()) {
                 try {
                     URL url = dataMapFile.toURI().toURL();
@@ -293,21 +303,21 @@ public class DbImporterMojo extends AbstractMojo {
                     XMLDataMapLoader xmlDataMapLoader = new XMLDataMapLoader();
                     DataMap dataMap = xmlDataMapLoader.load(resource);
                     if (dataMap.getReverseEngineering() != null) {
-                        Resource reverseEngineeringResource = new 
URLResource(dataMapFile.toURI().toURL()).getRelativeResource(dataMap.getReverseEngineering().getName()
 + ".reverseEngineering.xml");
-
-                        DefaultReverseEngineeringLoader 
reverseEngineeringLoader = new DefaultReverseEngineeringLoader();
-                        ReverseEngineering reverseEngineering = 
reverseEngineeringLoader.load(reverseEngineeringResource.getURL().openStream());
-                        
reverseEngineering.setName(dataMap.getReverseEngineering().getName());
-                        
reverseEngineering.setConfigurationSource(reverseEngineeringResource);
-                        dataMap.setReverseEngineering(reverseEngineering);
-
-                        FiltersConfigBuilder filtersConfigBuilder = new 
FiltersConfigBuilder(dataMap.getReverseEngineering());
-                        
config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.filtersConfig());
-                        Injector injector = DIBootstrap.createInjector(new 
ToolsModule(logger), new DbImportModule());
-
-                        validateDbImportConfiguration(config, injector);
-
                         try {
+                            Injector injector = DIBootstrap.createInjector(new 
ToolsModule(logger), new DbImportModule());
+                            ConfigurationNameMapper nameMapper = 
injector.getInstance(ConfigurationNameMapper.class);
+                            String reverseEngineeringLocation = 
nameMapper.configurationLocation(ReverseEngineering.class, 
dataMap.getReverseEngineering().getName());
+                            Resource reverseEngineeringResource = new 
URLResource(dataMapFile.toURI().toURL()).getRelativeResource(reverseEngineeringLocation);
+
+                            DefaultReverseEngineeringLoader 
reverseEngineeringLoader = new DefaultReverseEngineeringLoader();
+                            ReverseEngineering reverseEngineering = 
reverseEngineeringLoader.load(reverseEngineeringResource.getURL().openStream());
+                            
reverseEngineering.setName(dataMap.getReverseEngineering().getName());
+                            
reverseEngineering.setConfigurationSource(reverseEngineeringResource);
+                            dataMap.setReverseEngineering(reverseEngineering);
+
+                            FiltersConfigBuilder filtersConfigBuilder = new 
FiltersConfigBuilder(dataMap.getReverseEngineering());
+                            
config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.filtersConfig());
+                            validateDbImportConfiguration(config, injector);
                             
injector.getInstance(DbImportAction.class).execute(config);
                         } catch (Exception ex) {
                             Throwable th = Util.unwindException(ex);
@@ -325,9 +335,6 @@ public class DbImporterMojo extends AbstractMojo {
                 } catch (MalformedURLException e) {
                     getLog().error(e);
                     throw new MojoExecutionException(e.getMessage(), e);
-                } catch (IOException e) {
-                    getLog().error(e);
-                    throw new MojoExecutionException(e.getMessage(), e);
                 }
             }
         }

Reply via email to