You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2021/03/09 08:11:19 UTC

[cayenne] branch master updated: CAY-2678 Inheritance warnings caused by unnecessary MappingCache creations during initialization

This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new 22327d3  CAY-2678 Inheritance warnings caused by unnecessary MappingCache creations during initialization
22327d3 is described below

commit 22327d3891a70a27f83a396691a89fbbc476a536
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Tue Mar 9 11:10:49 2021 +0300

    CAY-2678 Inheritance warnings caused by unnecessary MappingCache creations during initialization
---
 RELEASE-NOTES.txt                                  |  1 +
 .../org/apache/cayenne/map/EntityResolver.java     | 34 ----------------------
 .../java/org/apache/cayenne/map/MappingCache.java  | 24 +++++++++++++++
 3 files changed, 25 insertions(+), 34 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 6af3f1a..2343ab7 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -22,6 +22,7 @@ Bug Fixes:
 
 CAY-2658 DataChannelMetaData is null during cgen execution
 CAY-2661 NPE on DB Import screen
+CAY-2678 Inheritance warnings caused by unnecessary MappingCache creations during initialization
 CAY-2683 Don't use DISTINCT for joins on to-one related tables
 CAY-2685 JsonType should use the actual JDBC type, not OTHER
 CAY-2686 SQL translator incorrectly quotes fully qualified tables' names
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
index 19deb97..0d498a3 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
@@ -399,7 +399,6 @@ public class EntityResolver implements MappingNamespace, Serializable {
 
     public synchronized void addDataMap(DataMap map) {
         if (!maps.contains(map)) {
-            checkForDuplicatedNames(map);
             maps.add(map);
             map.setNamespace(this);
             refreshMappingCache();
@@ -412,39 +411,6 @@ public class EntityResolver implements MappingNamespace, Serializable {
         }
     }
 
-    private void checkForDuplicatedNames(DataMap map) {
-        for(DbEntity entity : map.getDbEntities()) {
-            DbEntity foundDbEntity = getDbEntity(entity.getName());
-            if(foundDbEntity != null) {
-                processWarning(entity.getName(), map.getName(), foundDbEntity.getDataMap().getName());
-            }
-        }
-        for(ObjEntity entity : map.getObjEntities()) {
-            ObjEntity foundObjEntity = getObjEntity(entity.getName());
-            if(foundObjEntity != null) {
-                processWarning(entity.getName(), map.getName(), foundObjEntity.getDataMap().getName());
-            }
-        }
-        for(Procedure procedure : map.getProcedures()) {
-            Procedure foundProcedure = getProcedure(procedure.getName());
-            if(foundProcedure != null) {
-                processWarning(procedure.getName(), map.getName(), foundProcedure.getDataMap().getName());
-            }
-        }
-        for(Embeddable embeddable : map.getEmbeddables()) {
-            Embeddable foundEmbeddable = getEmbeddable(embeddable.getClassName());
-            if(foundEmbeddable != null) {
-                processWarning(embeddable.getClassName(), map.getName(), foundEmbeddable.getDataMap().getName());
-            }
-        }
-    }
-
-    private void processWarning(String duplicatedName, String dataMapName, String originalDataMapName) {
-        logger.warn("Duplicated name " + duplicatedName + " was found in " +
-                dataMapName + ". This name was also found in " +
-                originalDataMapName + ".");
-    }
-
     /**
      * Refreshes entity cache to reflect the current state of the DataMaps in
      * the EntityResolver.
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 87faec2..2c8d31a 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
@@ -26,6 +26,7 @@ import java.util.Map;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.Persistent;
+import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.commons.CompositeCollection;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -70,11 +71,13 @@ 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) {
+            checkNameDuplicates(map.getDbEntityMap(), dbEntities, map);
             dbEntities.putAll(map.getDbEntityMap());
         }
 
         for (DataMap map : maps) {
             // index ObjEntities by name
+            checkNameDuplicates(map.getObjEntityMap(), objEntities, map);
             objEntities.putAll(map.getObjEntityMap());
 
             // index ObjEntities by class name
@@ -96,6 +99,7 @@ class MappingCache implements MappingNamespace {
             }
 
             // index stored procedures
+            checkNameDuplicates(map.getProcedureMap(), procedures, map);
             procedures.putAll(map.getProcedureMap());
 
             // index embeddables
@@ -143,6 +147,26 @@ class MappingCache implements MappingNamespace {
         }
     }
 
+    /**
+     * Utility method to warn about name duplicates in different DataMaps.
+     *
+     * @param src map
+     * @param dst map with already added entities
+     * @param srcMap source DataMap
+     */
+    private void checkNameDuplicates(Map<String, ? extends CayenneMapEntry> src,
+                                     Map<String, ? extends CayenneMapEntry> dst,
+                                     DataMap srcMap) {
+        for(CayenneMapEntry entry : src.values()) {
+            CayenneMapEntry duplicate = dst.get(entry.getName());
+            if(duplicate != null) {
+                DataMap parent = (DataMap) duplicate.getParent();
+                logger.warn("Found duplicated name " + entry.getName()
+                        + " in datamaps " + srcMap.getName() + " and " + parent.getName());
+            }
+        }
+    }
+
     public Embeddable getEmbeddable(String className) {
         return embeddables.get(className);
     }