You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by ht...@apache.org on 2013/08/09 23:27:36 UTC

svn commit: r1512501 - /openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java

Author: hthomann
Date: Fri Aug  9 21:27:35 2013
New Revision: 1512501

URL: http://svn.apache.org/r1512501
Log:
OPENJPA-1631: Add synchronization to AnnotationPersistenceXMLMetaDataParser.parse() method to make it thread safe - back ported to 1.2.x Rick Curtis' trunk changes.

Modified:
    openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java

Modified: openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java?rev=1512501&r1=1512500&r2=1512501&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java (original)
+++ openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java Fri Aug  9 21:27:35 2013
@@ -51,10 +51,6 @@ public class AnnotationPersistenceXMLMet
     private final OpenJPAConfiguration _conf;
     private final Log _log;
     private MetaDataRepository _repos = null;
-
-    // the class we were invoked to parse
-    private Class _cls = null;
-    private FieldMetaData _fmd = null;
     
     // cache the JAXB Xml... classes if they are present so we do not
     // have a hard-wired dependency on JAXB here
@@ -146,42 +142,34 @@ public class AnnotationPersistenceXMLMet
      * Clear caches.
      */
     public void clear() {
-        _cls = null;
-        _fmd = null;
     }
 
     /**
-     * Parse persistence metadata for the given field metadata.
+     * Parse persistence metadata for the given field metadata. If the MetaData(/Mapping)Repository
+     * is using locking, that lock MUST be held prior to calling this method.
      */
-    public void parse(FieldMetaData fmd) {
-        _fmd = fmd;
-        _cls = fmd.getDeclaredType();
+    public synchronized void parse(FieldMetaData fmd) {
+        Class<?> cls = fmd.getDeclaredType();
         if (_log.isTraceEnabled())
-            _log.trace(_loc.get("parse-class", _cls.getName()));
-
-        try {
-            parseXMLClassAnnotations();
-        } finally {
-            _cls = null;
-            _fmd = null;
-        }
+            _log.trace(_loc.get("parse-class", cls.getName()));
+        parseXMLClassAnnotations(cls, fmd);
     }
 
     /**
      * Read annotations for the current type.
      */
-    private XMLMetaData parseXMLClassAnnotations() {
+    private XMLMetaData parseXMLClassAnnotations(Class<?> cls, FieldMetaData fmd) {
         // check immediately whether the class has JAXB XML annotations
-        if (_cls == null || xmlTypeClass == null
+        if (cls == null || xmlTypeClass == null
             || !(((Boolean) AccessController.doPrivileged(J2DoPriv5Helper
-                .isAnnotationPresentAction(_cls, xmlTypeClass))).booleanValue()
+                .isAnnotationPresentAction(cls, xmlTypeClass))).booleanValue()
                 && ((Boolean) AccessController
-                .doPrivileged(J2DoPriv5Helper.isAnnotationPresentAction(_cls,
+                .doPrivileged(J2DoPriv5Helper.isAnnotationPresentAction(cls,
                     xmlRootElementClass))).booleanValue()))
             return null;
 
         // find / create metadata
-        XMLMetaData meta = getXMLMetaData();
+        XMLMetaData meta = getXMLMetaData(cls, fmd);
         
         return meta;
     }
@@ -189,13 +177,13 @@ public class AnnotationPersistenceXMLMet
     /**
      * Find or create xml metadata for the current type. 
      */
-    private synchronized XMLMetaData getXMLMetaData() {
-        XMLMetaData meta = getRepository().getCachedXMLMetaData(_cls);
+    private XMLMetaData getXMLMetaData(Class<?> cls, FieldMetaData fmd) {
+        XMLMetaData meta = getRepository().getCachedXMLMetaData(cls);
         if (meta == null) {
             // if not in cache, create metadata
-            meta = getRepository().addXMLMetaData(_cls, _fmd.getName());
-            parseXmlRootElement(_cls, meta);
-            populateFromReflection(_cls, meta);
+            meta = getRepository().addXMLMetaData(cls, fmd.getName());
+            parseXmlRootElement(cls, meta);
+            populateFromReflection(cls, meta);
         }
         return meta;
     }