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:19:50 UTC

[cayenne] branch STABLE-4.1 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 STABLE-4.1
in repository https://gitbox.apache.org/repos/asf/cayenne.git


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

commit 241d544b37514e654f4254feb60612f96afb740e
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
    
    (cherry picked from commit 22327d3891a70a27f83a396691a89fbbc476a536)
---
 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 72b718c..b39dd84 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -17,6 +17,7 @@ Bug Fixes:
 CAY-2670 CommitLog does not include FKs for deleted objects with one-way relationships
 CAY-2676 Degradation: Custom class generation templates are not working anymore
 CAY-2677 Modeler: Custom Class Generation Templates for Embeddables and DataMaps
+CAY-2678 Inheritance warnings caused by unnecessary MappingCache creations during initialization
 CAY-2679 Unstable ordering of relationships in the .map.xml file
 CAY-2681 Modeler: All selected checkboxes cause project to become dirty at initialization
 CAY-2690 dbimport skips length changes for BINARY and VARBINARY columns
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 088326c..8eb0d8a 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
@@ -357,7 +357,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();
@@ -370,39 +369,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);
     }