You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mi...@apache.org on 2010/02/17 21:52:25 UTC

svn commit: r911174 - /openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java

Author: mikedd
Date: Wed Feb 17 20:52:24 2010
New Revision: 911174

URL: http://svn.apache.org/viewvc?rev=911174&view=rev
Log:
OPENJPA-1350:
Synchronize when registering aliases

Modified:
    openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java

Modified: openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java?rev=911174&r1=911173&r2=911174&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java (original)
+++ openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java Wed Feb 17 20:52:24 2010
@@ -117,7 +117,7 @@
 	private Map _ifaces = Collections.synchronizedMap(new HashMap());
 	private Map _queries = new HashMap();
 	private Map _seqs = new HashMap();
-	private Map _aliases = Collections.synchronizedMap(new HashMap());
+    private Map<String, List<Class<?>>> _aliases = Collections.synchronizedMap(new HashMap<String, List<Class<?>>>());
 	private Map _pawares = Collections.synchronizedMap(new HashMap());
 	private Map _nonMapped = Collections.synchronizedMap(new HashMap());
     
@@ -1568,9 +1568,11 @@
         if (_locking) {
         synchronized (_registered) {
                 _registered.add(cls);
+                registerAlias(cls);
             }
         } else {
             _registered.add(cls);
+            registerAlias(cls);
         }
     }
 
@@ -1588,6 +1590,33 @@
             }
         }
     }
+    
+    /**
+     * Register the given class to the list of known aliases.
+     * The alias is registered only if the class has been enhanced.
+     * 
+     */
+    void registerAlias(Class<?> cls) {
+        registerAlias(PCRegistry.getTypeAlias(cls), cls);
+    }
+    
+    public void registerAlias(String alias, Class<?> cls) {
+        if (alias == null)
+            return;
+        try {
+            if (alias != null) {
+                List<Class<?>> classes = _aliases.get(alias);
+                if (classes == null)
+                    classes = new ArrayList<Class<?>>(3);
+                if (!classes.contains(cls)) {
+                    classes.add(cls);
+                    _aliases.put(alias, classes);
+                }
+            }
+        } catch (IllegalStateException ise) {
+            // the class has not been registered to PCRegistry
+        }
+    }
 
     /**
      * Updates our datastructures with the latest registered classes.
@@ -1701,33 +1730,16 @@
         // set alias for class
         String alias = PCRegistry.getTypeAlias(cls);
         if (alias != null) {
-            if(_locking){
-                setAliasForClassLocking(alias, cls);
-            }else{
-                setAliasForClassInternal(alias, cls);
+            if (_locking) {
+                synchronized (_aliases) {
+                    registerAlias(alias, cls);
+                }
+            } else {
+                registerAlias(alias, cls);
             }
         }
     }
-    /**
-     * Private worker method for use by processRegisterClasses.
-     */
-    private void setAliasForClassLocking(String alias, Class cls){
-        synchronized(_aliases){
-            setAliasForClassInternal(alias, cls);
-        }
-    }
-    /**
-     * Private worker method for use by processRegisterClasses.
-     */
-    private void setAliasForClassInternal(String alias, Class cls){
-        List classList = (List) _aliases.get(alias);
-        if (classList == null) {
-            classList = new ArrayList(3);
-            _aliases.put(alias, classList);
-        }
-        if (!classList.contains(cls))
-            classList.add(cls);
-    }
+
     /**
      * Private worker method for use by processRegisterClasses.
      */