You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/11/19 16:12:37 UTC

svn commit: r882172 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/meta/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/ openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/embed...

Author: faywang
Date: Thu Nov 19 15:12:36 2009
New Revision: 882172

URL: http://svn.apache.org/viewvc?rev=882172&view=rev
Log:
OPENJPA-1396: fix metadata-complete problem so that it will override @Transient annotation in the entity class

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataDefaults.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/embed/EmbedXml.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/embed/embed-orm.xml
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java?rev=882172&r1=882171&r2=882172&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java Thu Nov 19 15:12:36 2009
@@ -151,6 +151,10 @@
     }
 
     public void populate(ClassMetaData meta, int access) {
+        populate(meta, access, false);
+    }
+    
+    public void populate(ClassMetaData meta, int access, boolean ignoreTransient) {
         if (meta.getDescribedType() == Object.class)
             return;
         meta.setAccessType(access);
@@ -161,7 +165,7 @@
         if (!_pcRegistry || !populateFromPCRegistry(meta)) {
             if (log.isTraceEnabled())
                 log.trace(_loc.get("meta-reflect"));
-            populateFromReflection(meta);
+            populateFromReflection(meta, ignoreTransient);
         }
     }
 
@@ -197,15 +201,15 @@
         }
     }
 
-    protected abstract List<Member> getPersistentMembers(ClassMetaData meta);
+    protected abstract List<Member> getPersistentMembers(ClassMetaData meta, boolean ignoreTransient);
     /**
      * Generate the given meta-data using reflection.
      * Adds FieldMetaData for each persistent state.
      * Delegate to concrete implementation to determine the persistent
      * members.
      */
-    private void populateFromReflection(ClassMetaData meta) {
-        List<Member> members = getPersistentMembers(meta);
+    private void populateFromReflection(ClassMetaData meta, boolean ignoreTransient) {
+        List<Member> members = getPersistentMembers(meta, ignoreTransient);
         boolean iface = meta.getDescribedType().isInterface();
         // If access is mixed or if the default is currently unknown, 
         // process all fields, otherwise only process members of the class  
@@ -220,7 +224,7 @@
             if (name == null || isReservedFieldName(name))
                 continue;
 
-            def = isDefaultPersistent(meta, member, name);
+            def = isDefaultPersistent(meta, member, name, ignoreTransient);
             if (!def && _ignore)
                 continue;
 
@@ -311,7 +315,7 @@
      * @param name the field name from {@link #getFieldName}
      */
     protected abstract boolean isDefaultPersistent(ClassMetaData meta,
-        Member member, String name);
+        Member member, String name, boolean ignoreTransient);
 
     /**
      * Gets the backing member of the given field. If the field has not been

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataDefaults.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataDefaults.java?rev=882172&r1=882171&r2=882172&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataDefaults.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataDefaults.java Thu Nov 19 15:12:36 2009
@@ -81,6 +81,13 @@
     public void populate(ClassMetaData meta, int access);
 
     /**
+     * Populate the given metadata with default settings.
+     *
+     * @param access access type constant from {@link ClassMetaData}
+     */
+    public void populate(ClassMetaData meta, int access, boolean ignoreTransient);
+
+    /**
      * Return the backing member for the given field metadata.
      */
     public Member getBackingMember(FieldMetaData field);

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=882172&r1=882171&r2=882172&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 Thu Nov 19 15:12:36 2009
@@ -889,11 +889,22 @@
      *            the access type to use in populating metadata
      */
     public ClassMetaData addMetaData(Class<?> cls, int access) {
+        return addMetaData(cls, access, false);
+    }
+    
+    /**
+     * Create a new metadata, populate it with default information, add it to the repository, and
+     * return it.
+     * 
+     * @param access
+     *            the access type to use in populating metadata
+     */
+    public ClassMetaData addMetaData(Class<?> cls, int access, boolean ignoreTransient) {
         if (cls == null || cls.isPrimitive())
             return null;
 
         ClassMetaData meta = newClassMetaData(cls);
-        _factory.getDefaults().populate(meta, access);
+        _factory.getDefaults().populate(meta, access, ignoreTransient);
 
         // synchronize on this rather than the map, because all other methods
         // that access _metas are synchronized on this

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=882172&r1=882171&r2=882172&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 Thu Nov 19 15:12:36 2009
@@ -128,6 +128,9 @@
     public void populate(ClassMetaData meta, int access) {
     }
 
+    public void populate(ClassMetaData meta, int access, boolean ignoreTransient) {
+    }
+
     public Member getBackingMember(FieldMetaData fmd) {
         return null;
     }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/EmbedXml.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/EmbedXml.java?rev=882172&r1=882171&r2=882172&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/EmbedXml.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/EmbedXml.java Thu Nov 19 15:12:36 2009
@@ -19,13 +19,17 @@
 package org.apache.openjpa.persistence.embed;
 
 import javax.persistence.Embeddable;
+import javax.persistence.Transient;
 
+@Embeddable
 public class EmbedXml {
     // owned by BasicA via Embed4
     // can not contain a collection of basic types if BasicA contains 
     // a collection of Embed4 
     protected int intVal1;
     protected int intVal2;
+    
+    @Transient
     protected int intVal3;
     
     public int getIntVal1() {

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/embed/embed-orm.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/embed/embed-orm.xml?rev=882172&r1=882171&r2=882172&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/embed/embed-orm.xml (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/embed/embed-orm.xml Thu Nov 19 15:12:36 2009
@@ -259,13 +259,7 @@
 	</embeddable>
 
 	<embeddable class="org.apache.openjpa.persistence.embed.EmbedXml"
-		access="FIELD">
-		<attributes>
-			<basic name="intVal1"></basic>
-			<basic name="intVal2"></basic>
-			<basic name="intVal3"></basic>
-		</attributes>
-	</embeddable>
+		access="FIELD"  metadata-complete="true"/>
 
     <embeddable class="org.apache.openjpa.persistence.embed.attrOverrides.BasicEmbedXML">
         <attributes>

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java?rev=882172&r1=882171&r2=882172&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java Thu Nov 19 15:12:36 2009
@@ -145,11 +145,20 @@
      * no strategy.
      */
     public static PersistenceStrategy getPersistenceStrategy
-        (FieldMetaData fmd, Member member) {
+    (FieldMetaData fmd, Member member) {
+        return getPersistenceStrategy(fmd, member, false);
+    }
+    
+    /**
+     * Return the code for the strategy of the given member. Return null if
+     * no strategy.
+     */
+    public static PersistenceStrategy getPersistenceStrategy
+        (FieldMetaData fmd, Member member, boolean ignoreTransient) {
         if (member == null)
             return null;
         AnnotatedElement el = (AnnotatedElement) member;
-        if ((AccessController.doPrivileged(J2DoPrivHelper
+        if (!ignoreTransient && (AccessController.doPrivileged(J2DoPrivHelper
             .isAnnotationPresentAction(el, Transient.class))).booleanValue())
             return TRANSIENT;
         if (fmd != null
@@ -248,13 +257,26 @@
      */
     @Override
     public void populate(ClassMetaData meta, int access) {
+        populate(meta, access, false);
+    }
+    
+    /**
+     * Populates the given class metadata. The access style determines which
+     * field and/or getter method will contribute as the persistent property
+     * of the given class. If the given access is unknown, then the access
+     * type is to be determined at first. 
+     * 
+     * @see #determineAccessType(ClassMetaData)
+     */
+    @Override
+    public void populate(ClassMetaData meta, int access, boolean ignoreTransient) {
     	if (AccessCode.isUnknown(access)) {
     		access = determineAccessType(meta);
     	}
     	if (AccessCode.isUnknown(access)) {
     		error(meta, _loc.get("access-unknown", meta));
     	}
-        super.populate(meta, access);
+        super.populate(meta, access, ignoreTransient);
         meta.setDetachable(true);
         // do not call get*Fields as it will lock down the fields.
     }
@@ -425,7 +447,7 @@
      * Gets the fields that are possible candidate for being persisted. The  
      * result depends on the current access style of the given class. 
      */
-    List<Field> getPersistentFields(ClassMetaData meta) {
+    List<Field> getPersistentFields(ClassMetaData meta, boolean ignoreTransient) {
     	boolean explicit = meta.isExplicitAccess();
     	boolean unknown  = AccessCode.isUnknown(meta);
     	boolean isField  = AccessCode.isField(meta);
@@ -434,7 +456,8 @@
     		Field[] fields = AccessController.doPrivileged(J2DoPrivHelper.
                 getDeclaredFieldsAction(meta.getDescribedType()));
     		
-        	return filter(fields, fieldFilter, nonTransientFilter, 
+        	return filter(fields, fieldFilter, 
+        	    ignoreTransient ? null : nonTransientFilter, 
         		unknown || isField  ? null : annotatedFilter, 
         	    explicit ? (isField ? null : fieldAccessFilter) : null);
     	} 
@@ -445,7 +468,7 @@
      * Gets the methods that are possible candidate for being persisted. The  
      * result depends on the current access style of the given class. 
      */
-    List<Method> getPersistentMethods(ClassMetaData meta) {
+    List<Method> getPersistentMethods(ClassMetaData meta, boolean ignoreTransient) {
     	boolean explicit = meta.isExplicitAccess();
     	boolean unknown  = AccessCode.isUnknown(meta.getAccessType());
     	boolean isProperty  = AccessCode.isProperty(meta.getAccessType());
@@ -455,7 +478,8 @@
               J2DoPrivHelper.getDeclaredMethodsAction(meta.getDescribedType()));
         
     		List<Method> getters = filter(publicMethods, methodFilter, 
-                getterFilter, nonTransientFilter, 
+                getterFilter, 
+                ignoreTransient ? null : nonTransientFilter, 
         		unknown || isProperty ? null : annotatedFilter, 
                 explicit ? (isProperty ? null : propertyAccessFilter) : null);
     		List<Method> setters = filter(publicMethods, setterFilter);
@@ -475,10 +499,10 @@
      * no access type set, this method will set it.
      */
     @Override
-    public List<Member> getPersistentMembers(ClassMetaData meta) {
+    public List<Member> getPersistentMembers(ClassMetaData meta, boolean ignoreTransient) {
     	List<Member> members = new ArrayList<Member>();
-    	List<Field> fields   = getPersistentFields(meta);
-    	List<Method> getters = getPersistentMethods(meta);
+    	List<Field> fields   = getPersistentFields(meta, ignoreTransient);
+    	List<Method> getters = getPersistentMethods(meta, ignoreTransient);
     	
     	boolean isMixed = !fields.isEmpty() && !getters.isEmpty();
     	boolean isEmpty = fields.isEmpty() && getters.isEmpty();
@@ -532,16 +556,21 @@
     
     @Override
     protected List<String> getFieldAccessNames(ClassMetaData meta) {
-    	return toNames(getPersistentFields(meta));
+    	return toNames(getPersistentFields(meta, false));
     }
 
     @Override
     protected List<String> getPropertyAccessNames(ClassMetaData meta) {
-    	return toNames(getPersistentMethods(meta));
+    	return toNames(getPersistentMethods(meta, false));
     }
 
     protected boolean isDefaultPersistent(ClassMetaData meta, Member member,
         String name) {
+        return isDefaultPersistent(meta, member, name, false);
+    }
+    
+    protected boolean isDefaultPersistent(ClassMetaData meta, Member member,
+        String name, boolean ignoreTransient) {
         int mods = member.getModifiers();
         if (Modifier.isTransient(mods))
             return false;
@@ -581,7 +610,7 @@
             }
         }
 
-        PersistenceStrategy strat = getPersistenceStrategy(null, member);
+        PersistenceStrategy strat = getPersistenceStrategy(null, member, ignoreTransient);
         if (strat == null || strat == PersistenceStrategy.TRANSIENT)
             return false;
         return true;

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java?rev=882172&r1=882171&r2=882172&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java Thu Nov 19 15:12:36 2009
@@ -829,8 +829,10 @@
     @Override
     protected boolean startClass(String elem, Attributes attrs)
         throws SAXException {
+        boolean metaDataComplete = false;
         super.startClass(elem, attrs);
         if (isMetaDataComplete(attrs)) {
+            metaDataComplete = true;
         	setAnnotationParser(null);
         } else if (!_isXMLMappingMetaDataComplete){
         	resetAnnotationParser();
@@ -874,7 +876,13 @@
             // be UNKNOWN)
             if (accessCode == AccessCode.UNKNOWN)
                 accessCode = _access;
-            meta = repos.addMetaData(_cls, accessCode);
+            meta = repos.addMetaData(_cls, accessCode, metaDataComplete);
+            FieldMetaData[] fmds = meta.getFields();
+            if (metaDataComplete) {
+                for (int i = 0; i < fmds.length; i++) {
+                    fmds[i].setExplicit(true);
+                }
+            }
             meta.setEnvClassLoader(_envLoader);
             meta.setSourceMode(MODE_NONE);