You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2010/05/01 21:00:23 UTC

svn commit: r940093 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ openjpa-kernel/src/main/java/org/apache/openjpa/meta/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ openjpa-persistence/...

Author: curtisr7
Date: Sat May  1 19:00:23 2010
New Revision: 940093

URL: http://svn.apache.org/viewvc?rev=940093&view=rev
Log:
OPENJPA-1634: Process JAXB metadata when preloading the MetaDataRepository.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/DelegatingMetaDataFactory.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataFactory.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/NoneMetaDataFactory.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetaDataRepository.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java?rev=940093&r1=940092&r2=940093&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java Sat May  1 19:00:23 2010
@@ -312,7 +312,7 @@ public abstract class AbstractExpression
         }
         else {
             // xmlsupport xpath
-            XMLMetaData xmlmeta = fmd.getRepository().getXMLMetaData(fmd);
+            XMLMetaData xmlmeta = fmd.getRepository().getXMLMetaData(fmd.getDeclaredType());
             if (xmlmeta != null) {
                 path.get(fmd, xmlmeta);
                 return path;

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/DelegatingMetaDataFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/DelegatingMetaDataFactory.java?rev=940093&r1=940092&r2=940093&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/DelegatingMetaDataFactory.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/DelegatingMetaDataFactory.java Sat May  1 19:00:23 2010
@@ -123,8 +123,8 @@ public class DelegatingMetaDataFactory
         _delegate.addFieldExtensionKeys(exts);
     }
 
-    public void loadXMLMetaData(FieldMetaData fmd) {
-        _delegate.loadXMLMetaData(fmd);
+    public void loadXMLMetaData(Class<?> cls) {
+        _delegate.loadXMLMetaData(cls);
     }
     
     public String getMetaModelClassName(String managedClassName) {

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataFactory.java?rev=940093&r1=940092&r2=940093&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataFactory.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataFactory.java Sat May  1 19:00:23 2010
@@ -151,7 +151,7 @@ public interface MetaDataFactory
      * Load XMLClassMetadata for the given class. Loaded
      * metadata should be added directly to the repository.
      */
-    public void loadXMLMetaData(FieldMetaData fmd);
+    public void loadXMLMetaData(Class<?> cls);
     
     /**
      * Gets the name of the meta-model class for the given fully-qualified

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java?rev=940093&r1=940092&r2=940093&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java Sat May  1 19:00:23 2010
@@ -332,7 +332,18 @@ public class MetaDataRepository implemen
             }
         }
         resolveAll(multi);
-
+        
+        // Preload XML MetaData
+        for (Class<?> cls : loaded) {
+            ClassMetaData cmd = getCachedMetaData(cls);
+            if (cmd != null) {
+                getXMLMetaData(cls);
+                for (FieldMetaData fmd : cmd.getFields()) {
+                    getXMLMetaData(fmd.getDeclaredType());
+                }
+            }
+        }
+        
         // Hook in this class as a listener and process registered classes list to populate _aliases
         // list.
         PCRegistry.addRegisterClassListener(this);
@@ -2344,25 +2355,27 @@ public class MetaDataRepository implemen
      * @param fmd
      * @return XML metadata
      */
-    public XMLMetaData getXMLMetaData(FieldMetaData fmd) {
+    public XMLMetaData getXMLMetaData(Class<?> cls) {
         if (_locking) {
             synchronized (this) {
-                return getXMLMetaDataInternal(fmd);
+                return getXMLMetaDataInternal(cls);
             }
         } else {
-            return getXMLMetaDataInternal(fmd);
+            return getXMLMetaDataInternal(cls);
         }
     }
     
-    private XMLMetaData getXMLMetaDataInternal(FieldMetaData fmd) {
-        Class<?> cls = fmd.getDeclaredType();
+    private XMLMetaData getXMLMetaDataInternal(Class<?> cls) {
+        if (cls == null) {
+            return null;
+        }
         // check if cached before
         XMLMetaData xmlmeta = _xmlmetas.get(cls);
         if (xmlmeta != null)
             return xmlmeta;
 
         // load JAXB XML metadata
-        _factory.loadXMLMetaData(fmd);
+        _factory.loadXMLMetaData(cls);
 
         xmlmeta = (XMLClassMetaData) _xmlmetas.get(cls);
 
@@ -2376,8 +2389,8 @@ public class MetaDataRepository implemen
      * @param access
      *            the access type to use in populating metadata
      */
-    public XMLClassMetaData addXMLMetaData(Class<?> type, String name) {
-        XMLClassMetaData meta = newXMLClassMetaData(type, name);
+    public XMLClassMetaData addXMLClassMetaData(Class<?> type) {
+        XMLClassMetaData meta = newXMLClassMetaData(type);
         if(_locking){
             synchronized(this){
                 _xmlmetas.put(type, meta);                
@@ -2402,8 +2415,8 @@ public class MetaDataRepository implemen
      * @param name
      * @return a XMLClassMetaData
      */
-    protected XMLClassMetaData newXMLClassMetaData(Class<?> type, String name) {
-        return new XMLClassMetaData(type, name);
+    protected XMLClassMetaData newXMLClassMetaData(Class<?> type) {
+        return new XMLClassMetaData(type);
     }
 
     /**

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/NoneMetaDataFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/NoneMetaDataFactory.java?rev=940093&r1=940092&r2=940093&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/NoneMetaDataFactory.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/NoneMetaDataFactory.java Sat May  1 19:00:23 2010
@@ -144,7 +144,7 @@ public class NoneMetaDataFactory
         return null;
     }
     
-    public void loadXMLMetaData(FieldMetaData fmd) {
+    public void loadXMLMetaData(Class<?> cls) {
     }
 
     public String getMetaModelClassName(String managedClassName) {

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetaDataRepository.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetaDataRepository.java?rev=940093&r1=940092&r2=940093&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetaDataRepository.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetaDataRepository.java Sat May  1 19:00:23 2010
@@ -18,50 +18,75 @@
  */
 package org.apache.openjpa.persistence.meta;
 
-import java.security.AccessController;
 import java.util.Collection;
 
-import org.apache.openjpa.lib.util.J2DoPrivHelper;
 import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.meta.FieldMetaData;
 import org.apache.openjpa.meta.MetaDataRepository;
 import org.apache.openjpa.meta.QueryMetaData;
+import org.apache.openjpa.meta.XMLMetaData;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
 import org.apache.openjpa.persistence.test.AbstractPersistenceTestCase;
+import org.apache.openjpa.persistence.xmlmapping.entities.Customer;
+import org.apache.openjpa.persistence.xmlmapping.entities.EAddress;
+import org.apache.openjpa.persistence.xmlmapping.entities.Order;
+import org.apache.openjpa.persistence.xmlmapping.xmlbindings.myaddress.Address;
 
 public class TestMetaDataRepository extends AbstractPersistenceTestCase {
-    private final String PU_NAME = "mdr-pu";
+	private final String PU_NAME = "mdr-pu";
 
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
+	@Override
+	public void setUp() throws Exception {
+		super.setUp();
+	}
+
+	/**
+	 * This method ensures that some of the basic MetaData is properly
+	 * registered after creating an EMF.
+	 */
+	public void testPreloadBasic() {
+		OpenJPAEntityManagerFactorySPI emf = null;
+		try {
+			emf = createNamedEMF(PU_NAME, "openjpa.MetaDataRepository",
+					"Preload=true");
+			MetaDataRepository mdr = emf.getConfiguration()
+					.getMetaDataRepositoryInstance();
+
+			// Check that there is cached metadata in the repo
+			ClassMetaData metadata = mdr.getCachedMetaData(MdrTestEntity.class);
+			assertNotNull(metadata);
+
+			// Make sure that there is an alias registered
+			// int numEntities =
+			// mdr.getPersistentTypeNames(false,
+			// AccessController.doPrivileged(J2DoPrivHelper.getContextClassLoaderAction())).size();
+			Collection<String> aliases = mdr.getAliasNames();
+			assertTrue(aliases.contains("MdrTestEntity"));
+
+			// assertTrue(aliases.size() == numEntities);
+
+			QueryMetaData query = mdr.getCachedQueryMetaData(
+					MdrTestEntity.class, "query");
+			assertNotNull(query);
+		} finally {
+			if (emf != null) {
+				emf.close();
+			}
+		}
+	}
 
-    }
-
-    /**
-     * This method ensures that some of the basic MetaData is properly registered after creating an
-     * EMF.
-     */
-    public void testPreloadBasic() {
+	public void testXmlMappingPreload() {
         OpenJPAEntityManagerFactorySPI emf = null;
         try {
-            emf = createNamedEMF(PU_NAME, "openjpa.MetaDataRepository", "Preload=true");
+            emf =
+                createNamedEMF("test", "openjpa.MetaDataRepository", "Preload=true", Customer.class,
+                    Customer.CustomerKey.class, Order.class, EAddress.class);
             MetaDataRepository mdr = emf.getConfiguration().getMetaDataRepositoryInstance();
 
-            // Check that there is cached metadata in the repo
-            ClassMetaData metadata = mdr.getCachedMetaData(MdrTestEntity.class);
-            assertNotNull(metadata);
-
-            // Make sure that there is an alias registered
-//            int numEntities =
-//                mdr.getPersistentTypeNames(false,
-//                    AccessController.doPrivileged(J2DoPrivHelper.getContextClassLoaderAction())).size();
-            Collection<String> aliases = mdr.getAliasNames();
-            assertTrue(aliases.contains("MdrTestEntity"));
-
-//            assertTrue(aliases.size() == numEntities);
+            assertNotNull(mdr.getCachedXMLMetaData(Address.class));
+            assertNull(mdr.getCachedXMLMetaData(Order.class));
+            
 
-            QueryMetaData query = mdr.getCachedQueryMetaData(MdrTestEntity.class, "query");
-            assertNotNull(query);
         } finally {
             if (emf != null) {
                 emf.close();

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java?rev=940093&r1=940092&r2=940093&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java Sat May  1 19:00:23 2010
@@ -145,20 +145,19 @@ public class AnnotationPersistenceXMLMet
     }
 
     /**
-     * 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.
+     * Parse persistence metadata for the given field metadata. This parser/class is NOT threadsafe! The caller of 
+     * this method needs to insure that the MetaData(/Mapping)Repository is locked prior to calling this method.
      */
-    public synchronized void parse(FieldMetaData fmd) {
-        Class<?> cls = fmd.getDeclaredType();
+    public synchronized void parse(Class<?> cls) {
         if (_log.isTraceEnabled())
             _log.trace(_loc.get("parse-class", cls.getName()));
-        parseXMLClassAnnotations(cls, fmd);
+        parseXMLClassAnnotations(cls);
     }
 
     /**
      * Read annotations for the current type.
      */
-    private XMLMetaData parseXMLClassAnnotations(Class<?> cls, FieldMetaData fmd) {
+    private XMLMetaData parseXMLClassAnnotations(Class<?> cls) {
         // check immediately whether the class has JAXB XML annotations
         if (cls == null || xmlTypeClass == null
             || !((AccessController.doPrivileged(J2DoPrivHelper
@@ -169,7 +168,7 @@ public class AnnotationPersistenceXMLMet
             return null;
 
         // find / create metadata
-        XMLMetaData meta = getXMLMetaData(cls, fmd);
+        XMLMetaData meta = getXMLMetaData(cls);
         
         return meta;
     }
@@ -177,11 +176,11 @@ public class AnnotationPersistenceXMLMet
     /**
      * Find or create xml metadata for the current type. 
      */
-    private XMLMetaData getXMLMetaData(Class<?> cls, FieldMetaData fmd) {
+    private XMLMetaData getXMLMetaData(Class<?> cls) {
         XMLMetaData meta = getRepository().getCachedXMLMetaData(cls);
         if (meta == null) {
             // if not in cache, create metadata
-            meta = getRepository().addXMLMetaData(cls, fmd.getName());
+            meta = getRepository().addXMLClassMetaData(cls);
             parseXmlRootElement(cls, meta);
             populateFromReflection(cls, meta);
         }
@@ -238,8 +237,7 @@ public class AnnotationPersistenceXMLMet
                     if ((AccessController.doPrivileged(J2DoPrivHelper
                         .isAnnotationPresentAction(((Field) member).getType(),
                             xmlTypeClass))).booleanValue()) {
-                        field = _repos.addXMLMetaData(((Field) member).getType()
-                            , member.getName());
+                        field = _repos.addXMLClassMetaData(((Field) member).getType());
                         parseXmlRootElement(((Field) member).getType(), field);
                         populateFromReflection(((Field) member).getType()
                             , field);

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java?rev=940093&r1=940092&r2=940093&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java Sat May  1 19:00:23 2010
@@ -573,10 +573,10 @@ public class PersistenceMetaDataFactory
             (repos.getConfiguration());
     }
 
-    public void loadXMLMetaData(FieldMetaData fmd) {
+    public void loadXMLMetaData(Class<?> cls) {
         AnnotationPersistenceXMLMetaDataParser parser
             = getXMLAnnotationParser();
-        parser.parse(fmd);
+        parser.parse(cls);
     }
     
     private static String UNDERSCORE = "_";