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;
}