You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2016/11/16 18:48:12 UTC

[3/4] cayenne git commit: Update query name validator to check names across all data maps MappingCache skip query descriptor name uniqueness check Small code clean up

Update query name validator to check names across all data maps
MappingCache skip query descriptor name uniqueness check
Small code clean up


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

Branch: refs/heads/master
Commit: eeebf0087779d1f1d7140eb51fdfba7aaf3136a9
Parents: d2f4404
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Nov 15 15:27:51 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Tue Nov 15 15:27:51 2016 +0300

----------------------------------------------------------------------
 .../project/validation/BaseQueryValidator.java  | 86 ++++++++++++++++++++
 .../validation/ProcedureQueryValidator.java     | 35 +-------
 .../validation/SQLTemplateValidator.java        | 29 +------
 .../validation/SelectQueryValidator.java        | 32 +-------
 .../org/apache/cayenne/map/MappingCache.java    | 38 ++-------
 .../modeler/CayenneModelerController.java       | 20 ++---
 .../modeler/FileClassLoadingService.java        | 10 +--
 .../ChangeObjEntityListenerClassAction.java     |  1 +
 .../cayenne/modeler/graph/DbGraphBuilder.java   |  5 ++
 9 files changed, 120 insertions(+), 136 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/eeebf008/cayenne-project/src/main/java/org/apache/cayenne/project/validation/BaseQueryValidator.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/validation/BaseQueryValidator.java b/cayenne-project/src/main/java/org/apache/cayenne/project/validation/BaseQueryValidator.java
new file mode 100644
index 0000000..2c73270
--- /dev/null
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/validation/BaseQueryValidator.java
@@ -0,0 +1,86 @@
+/*****************************************************************
+ *   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.project.validation;
+
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.QueryDescriptor;
+import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
+
+
+/**
+ * Base validation for all query types
+ */
+class BaseQueryValidator extends ConfigurationNodeValidator {
+
+    void validateName(QueryDescriptor query, ValidationResult validationResult) {
+        final String name = query.getName();
+
+        // Must have name
+        if (Util.isEmptyString(name)) {
+            addFailure(validationResult, query, "Unnamed " + query.getType());
+            return;
+        }
+
+        DataMap map = query.getDataMap();
+        if (map == null) {
+            return;
+        }
+
+        // check for duplicate names in the parent context
+        if(hasDuplicateQueryDescriptorInDataMap(query, map)) {
+            addFailure(validationResult, query, "Duplicate query name: %s", name);
+            return;
+        }
+
+        DataChannelDescriptor domain = query.getDataMap().getDataChannelDescriptor();
+        if (domain == null) {
+            return;
+        }
+
+        // check for duplicate names in sibling contexts
+        for (DataMap nextMap : domain.getDataMaps()) {
+            if (nextMap == map) {
+                continue;
+            }
+
+            if (hasDuplicateQueryDescriptorInDataMap(query, nextMap)) {
+                addFailure(validationResult, query,
+                        "Duplicate %s name in another DataMap: %s",
+                        query.getType(), name);
+                return;
+            }
+        }
+    }
+
+    private boolean hasDuplicateQueryDescriptorInDataMap(QueryDescriptor queryDescriptor, DataMap dataMap) {
+        for (final QueryDescriptor otherQuery : dataMap.getQueryDescriptors()) {
+            if (otherQuery == queryDescriptor) {
+                continue;
+            }
+
+            if (queryDescriptor.getName().equals(otherQuery.getName())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/eeebf008/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ProcedureQueryValidator.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ProcedureQueryValidator.java b/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ProcedureQueryValidator.java
index 9f031a5..4cac694 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ProcedureQueryValidator.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ProcedureQueryValidator.java
@@ -21,11 +21,9 @@ package org.apache.cayenne.project.validation;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureQueryDescriptor;
-import org.apache.cayenne.map.QueryDescriptor;
-import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationResult;
 
-class ProcedureQueryValidator extends ConfigurationNodeValidator {
+class ProcedureQueryValidator extends BaseQueryValidator {
 
     void validate(ProcedureQueryDescriptor query, ValidationResult validationResult) {
         validateName(query, validationResult);
@@ -70,35 +68,4 @@ class ProcedureQueryValidator extends ConfigurationNodeValidator {
             }
         }
     }
-
-    void validateName(QueryDescriptor query, ValidationResult validationResult) {
-        String name = query.getName();
-
-        // Must have name
-        if (Util.isEmptyString(name)) {
-            addFailure(validationResult, query, "Unnamed ProcedureQuery");
-            return;
-        }
-
-        DataMap map = query.getDataMap();
-        if (map == null) {
-            return;
-        }
-
-        // check for duplicate names in the parent context
-        for (final QueryDescriptor otherQuery : map.getQueryDescriptors()) {
-            if (otherQuery == query) {
-                continue;
-            }
-
-            if (name.equals(otherQuery.getName())) {
-                addFailure(
-                        validationResult,
-                        query,
-                        "Dulicate ProcedureQuery name: %s",
-                        name);
-                break;
-            }
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/eeebf008/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SQLTemplateValidator.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SQLTemplateValidator.java b/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SQLTemplateValidator.java
index 8b55418..80e1cbe 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SQLTemplateValidator.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SQLTemplateValidator.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.validation.ValidationResult;
 
 import java.util.Map;
 
-class SQLTemplateValidator extends ConfigurationNodeValidator {
+class SQLTemplateValidator extends BaseQueryValidator {
 
     void validate(SQLTemplateDescriptor query, ValidationResult validationResult) {
         validateName(query, validationResult);
@@ -63,31 +63,4 @@ class SQLTemplateValidator extends ConfigurationNodeValidator {
                     query.getName());
         }
     }
-
-    void validateName(QueryDescriptor query, ValidationResult validationResult) {
-        String name = query.getName();
-
-        // Must have name
-        if (Util.isEmptyString(name)) {
-            addFailure(validationResult, query, "Unnamed SQLTemplate");
-            return;
-        }
-
-        DataMap map = query.getDataMap();
-        if (map == null) {
-            return;
-        }
-
-        // check for duplicate names in the parent context
-        for (final QueryDescriptor otherQuery : map.getQueryDescriptors()) {
-            if (otherQuery == query) {
-                continue;
-            }
-
-            if (name.equals(otherQuery.getName())) {
-                addFailure(validationResult, query, "Duplicate query name: %s", name);
-                break;
-            }
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/eeebf008/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java b/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
index c0bb5bc..f9c0843 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
@@ -26,12 +26,11 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.SelectQueryDescriptor;
-import org.apache.cayenne.query.*;
+import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.util.CayenneMapEntry;
-import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationResult;
 
-class SelectQueryValidator extends ConfigurationNodeValidator {
+class SelectQueryValidator extends BaseQueryValidator {
 
     void validate(SelectQueryDescriptor query, ValidationResult validationResult) {
 
@@ -126,31 +125,4 @@ class SelectQueryValidator extends ConfigurationNodeValidator {
         return null;
     }
 
-    void validateName(QueryDescriptor query, ValidationResult validationResult) {
-        String name = query.getName();
-
-        // Must have name
-        if (Util.isEmptyString(name)) {
-            addFailure(validationResult, query, "Unnamed SelectQuery");
-            return;
-        }
-
-        DataMap map = query.getDataMap();
-        if (map == null) {
-            return;
-        }
-
-        // check for duplicate names in the parent context
-
-        for (final QueryDescriptor otherQuery : map.getQueryDescriptors()) {
-            if (otherQuery == query) {
-                continue;
-            }
-
-            if (name.equals(otherQuery.getName())) {
-                addFailure(validationResult, query, "Duplicate query name: %s", name);
-                break;
-            }
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/eeebf008/cayenne-server/src/main/java/org/apache/cayenne/map/MappingCache.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/MappingCache.java b/cayenne-server/src/main/java/org/apache/cayenne/map/MappingCache.java
index 8c7f8c2..ad4bc89 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/MappingCache.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/MappingCache.java
@@ -69,23 +69,17 @@ class MappingCache implements MappingNamespace {
 
         // index DbEntities separately and before ObjEntities to avoid infinite
         // loops when looking up DbEntities during ObjEntity index op
-
         for (DataMap map : maps) {
-            for (DbEntity de : map.getDbEntities()) {
-                dbEntities.put(de.getName(), de);
-            }
+            dbEntities.putAll(map.getDbEntityMap());
         }
 
         for (DataMap map : maps) {
+            // index ObjEntities by name
+            objEntities.putAll(map.getObjEntityMap());
 
-            // index ObjEntities
+            // index ObjEntities by class name
             for (ObjEntity oe : map.getObjEntities()) {
-
-                // index by name
-                objEntities.put(oe.getName(), oe);
-
-                // index by class.. use class name as a key to avoid class
-                // loading here...
+                // use class name as a key to avoid class loading here...
                 String className = oe.getJavaClassName();
                 if (className == null) {
                     continue;
@@ -94,35 +88,21 @@ class MappingCache implements MappingNamespace {
                 // allow duplicates, but put a special marker indicating
                 // that this entity can't be looked up by class
                 Object existing = objEntitiesByClassName.get(className);
-                if (existing != null) {
-
-                    if (existing != OBJ_DUPLICATE_MARKER) {
-                        objEntitiesByClassName.put(className, OBJ_DUPLICATE_MARKER);
-                    }
+                if (existing != null && existing != OBJ_DUPLICATE_MARKER) {
+                    objEntitiesByClassName.put(className, OBJ_DUPLICATE_MARKER);
                 } else {
                     objEntitiesByClassName.put(className, oe);
                 }
             }
 
             // index stored procedures
-            for (Procedure proc : map.getProcedures()) {
-                procedures.put(proc.getName(), proc);
-            }
+            procedures.putAll(map.getProcedureMap());
 
             // index embeddables
             embeddables.putAll(map.getEmbeddableMap());
 
             // index query descriptors
-            for (QueryDescriptor queryDescriptor : map.getQueryDescriptors()) {
-                String name = queryDescriptor.getName();
-                QueryDescriptor existingQueryDescriptor = queryDesriptors.put(name, queryDescriptor);
-
-                // No exception is thrown in case of any other entity's name conflict.
-                // Why do we throw it here!?
-//                if (existingQueryDescriptor != null && queryDescriptor != existingQueryDescriptor) {
-//                    throw new CayenneRuntimeException("More than one QueryDescriptor for name: " + name);
-//                }
-            }
+            queryDesriptors.putAll(map.getQueryDescriptorMap());
         }
 
         // restart the map iterator to index inheritance

http://git-wip-us.apache.org/repos/asf/cayenne/blob/eeebf008/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
index b7a84b0..30fdebc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
@@ -140,12 +140,13 @@ public class CayenneModelerController extends CayenneController {
         geometry.bind(frame, 650, 550, 0);
     }
 
+
+    @SuppressWarnings("unchecked")
     private boolean processDropAction(Transferable transferable) {
         List<File> fileList;
         try {
-            fileList = (List) transferable.getTransferData(DataFlavor.javaFileListFlavor);
-        }
-        catch (Exception e) {
+            fileList = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
+        } catch (Exception e) {
             return false;
         }
 
@@ -260,7 +261,7 @@ public class CayenneModelerController extends CayenneController {
 
         // for validation purposes combine load failures with post-load validation (not
         // sure if that'll cause duplicate messages?).
-        List<ValidationFailure> allFailures = new ArrayList<ValidationFailure>();
+        List<ValidationFailure> allFailures = new ArrayList<>();
         Collection<ValidationFailure> loadFailures = project
                 .getConfigurationTree()
                 .getLoadFailures();
@@ -305,14 +306,13 @@ public class CayenneModelerController extends CayenneController {
 
         try {
             frefLastProjFiles.clear();
-        }
-        catch (BackingStoreException e) {
+        } catch (BackingStoreException ignored) {
             // ignore exception
         }
         int size = arr.size();
 
         for (int i = 0; i < size; i++) {
-            frefLastProjFiles.put(String.valueOf(i), arr.get(i).toString());
+            frefLastProjFiles.put(String.valueOf(i), arr.get(i));
         }
     }
 
@@ -331,10 +331,10 @@ public class CayenneModelerController extends CayenneController {
 
     class ExpireThread extends Thread {
 
-        protected int seconds;
+        int seconds;
         protected String message;
 
-        public ExpireThread(String message, int seconds) {
+        ExpireThread(String message, int seconds) {
             this.seconds = seconds;
             this.message = message;
         }
@@ -380,7 +380,7 @@ public class CayenneModelerController extends CayenneController {
         int size = arr.size();
 
         for (int i = 0; i < size; i++) {
-            frefLastProjFiles.put(String.valueOf(i), arr.get(i).toString());
+            frefLastProjFiles.put(String.valueOf(i), arr.get(i));
         }
 
         getLastDirectory().setDirectory(new File(newPath));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/eeebf008/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/FileClassLoadingService.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/FileClassLoadingService.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/FileClassLoadingService.java
index 2827405..f834378 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/FileClassLoadingService.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/FileClassLoadingService.java
@@ -36,17 +36,17 @@ import java.util.List;
 public class FileClassLoadingService implements ClassLoadingService {
 
     private FileClassLoader classLoader;
-    protected List<File> pathFiles;
+    private List<File> pathFiles;
 
     public FileClassLoadingService() {
-        this.pathFiles = new ArrayList<File>(15);
+        this.pathFiles = new ArrayList<>(15);
     }
 
     /**
      * Returns class for a given name, loading it if needed from configured
      * locations.
      */
-    @SuppressWarnings("all")
+    @SuppressWarnings("unchecked")
     public <T> Class<T> loadClass(Class<T> interfaceType, String className) throws ClassNotFoundException {
         return (Class<T>) nonNullClassLoader().loadClass(className);
     }
@@ -106,7 +106,7 @@ public class FileClassLoadingService implements ClassLoadingService {
     }
 
     // URLClassLoader with addURL method exposed.
-    static class FileClassLoader extends URLClassLoader {
+    private static class FileClassLoader extends URLClassLoader {
 
         FileClassLoader(ClassLoader parent) {
             super(new URL[0], parent);
@@ -119,7 +119,7 @@ public class FileClassLoadingService implements ClassLoadingService {
                 // I guess here we have to quetly ignore invalid URLs...
                 try {
                     addURL(file.toURI().toURL());
-                } catch (MalformedURLException ex) {
+                } catch (MalformedURLException ignored) {
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/eeebf008/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ChangeObjEntityListenerClassAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ChangeObjEntityListenerClassAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ChangeObjEntityListenerClassAction.java
index d7d44fa..c06c017 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ChangeObjEntityListenerClassAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ChangeObjEntityListenerClassAction.java
@@ -32,6 +32,7 @@ import org.apache.cayenne.modeler.util.CayenneAction;
  * Action class for renaming entity listener class for ObjEntity
  *
  * @version 1.0 Oct 30, 2007
+ * @deprecated
  */
 public class ChangeObjEntityListenerClassAction extends CayenneAction {
     /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/eeebf008/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DbGraphBuilder.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DbGraphBuilder.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DbGraphBuilder.java
index 6a320e3..5e6ffd6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DbGraphBuilder.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DbGraphBuilder.java
@@ -22,6 +22,7 @@ import java.awt.Color;
 import java.util.Collection;
 
 import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DetectedDbEntity;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.map.event.AttributeEvent;
@@ -90,6 +91,10 @@ class DbGraphBuilder extends BaseGraphBuilder implements DbEntityListener,
     }
 
     public void dbEntityAdded(EntityEvent e) {
+        // skip new entities from DbLoader
+        if(e.getEntity() instanceof DetectedDbEntity) {
+            return;
+        }
         insertEntityCell(e.getEntity());
     }