You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/04/25 00:24:45 UTC

svn commit: r768428 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ openjpa-kernel/src/main/java/org/apache/openjpa/meta/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/ openjpa-persistence/s...

Author: ppoddar
Date: Fri Apr 24 22:24:45 2009
New Revision: 768428

URL: http://svn.apache.org/viewvc?rev=768428&view=rev
Log:
OPENJPA-926: entity without any property can have unknown access type.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ApplicationIdTool.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCSubclassValidator.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ReflectingPersistenceCapable.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AccessCode.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/TestSubclassedBehavior.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java
    openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ApplicationIdTool.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ApplicationIdTool.java?rev=768428&r1=768427&r2=768428&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ApplicationIdTool.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ApplicationIdTool.java Fri Apr 24 22:24:45 2009
@@ -49,6 +49,7 @@
 import org.apache.openjpa.lib.util.JavaVersions;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.lib.util.Options;
+import org.apache.openjpa.meta.AccessCode;
 import org.apache.openjpa.meta.ClassMetaData;
 import org.apache.openjpa.meta.DelegatingMetaDataFactory;
 import org.apache.openjpa.meta.FieldMetaData;
@@ -549,7 +550,8 @@
      * Return the getters and setters for all primary key fields.
      */
     private String getProperties() {
-        if (_meta.getAccessType() == ClassMetaData.ACCESS_FIELD)
+        if (AccessCode.isExplicit(_meta.getAccessType()) 
+         && AccessCode.isField(_meta.getAccessType()))
             return "";
 
         CodeFormat code = newCodeFormat();

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java?rev=768428&r1=768427&r2=768428&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java Fri Apr 24 22:24:45 2009
@@ -233,7 +233,7 @@
             // only warn about declared fields; superclass fields will be
             // warned about when the superclass is handled
             for (FieldMetaData fmd : meta.getDeclaredFields()) {
-                if (fmd.getAccessType() == ClassMetaData.ACCESS_PROPERTY)
+                if (AccessCode.isProperty(fmd.getAccessType()))
                     continue;
                 switch (fmd.getTypeCode()) {
                     case JavaTypes.COLLECTION:

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java?rev=768428&r1=768427&r2=768428&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java Fri Apr 24 22:24:45 2009
@@ -488,9 +488,6 @@
      * @return <code>ENHANCE_*</code> constant
      */
     public int run() {
-        if (_log.isTraceEnabled())
-            _log.trace(_loc.get("enhance-start", _managedType.getType()));
-
         try {
             // if managed interface, skip
             if (_pc.isInterface())
@@ -500,11 +497,14 @@
             Class[] interfaces = _managedType.getDeclaredInterfaceTypes();
             for (int i = 0; i < interfaces.length; i++) {
                 if (interfaces[i].getName().equals(PCTYPE.getName())) {
-                    if (_log.isTraceEnabled())
-                        _log.trace(_loc.get("pc-type", _managedType.getType()));
+                    if (_log.isInfoEnabled())
+                        _log.info(_loc.get("pc-type", _managedType.getType()));
                     return ENHANCE_NONE;
                 }
             }
+            if (_log.isInfoEnabled())
+                _log.info(_loc.get("enhance-start", _managedType.getType()));
+
 
             configureBCs();
 

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCSubclassValidator.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCSubclassValidator.java?rev=768428&r1=768427&r2=768428&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCSubclassValidator.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCSubclassValidator.java Fri Apr 24 22:24:45 2009
@@ -27,6 +27,7 @@
 import java.util.Collection;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.openjpa.meta.AccessCode;
 import org.apache.openjpa.meta.ClassMetaData;
 import org.apache.openjpa.meta.FieldMetaData;
 import org.apache.openjpa.util.UserException;
@@ -126,7 +127,7 @@
             throw new InternalException(
                 loc.get("subclasser-class-already-pc", name));
 
-        if (meta.getAccessType() == ClassMetaData.ACCESS_PROPERTY)
+        if (AccessCode.isProperty(meta.getAccessType()))
             checkPropertiesAreInterceptable();
 
         if (errors != null && !errors.isEmpty())

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ReflectingPersistenceCapable.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ReflectingPersistenceCapable.java?rev=768428&r1=768427&r2=768428&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ReflectingPersistenceCapable.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ReflectingPersistenceCapable.java Fri Apr 24 22:24:45 2009
@@ -28,6 +28,7 @@
 import org.apache.openjpa.conf.OpenJPAConfiguration;
 import org.apache.openjpa.kernel.OpenJPAStateManager;
 import org.apache.openjpa.kernel.StateManagerImpl;
+import org.apache.openjpa.meta.AccessCode;
 import org.apache.openjpa.meta.ClassMetaData;
 import org.apache.openjpa.meta.FieldMetaData;
 import org.apache.openjpa.meta.JavaTypes;
@@ -338,7 +339,7 @@
 
     private Object getValue(int i, Object o) {
         FieldMetaData fmd = meta.getField(i);
-        if (fmd.getAccessType() == ClassMetaData.ACCESS_PROPERTY) {
+        if (AccessCode.isProperty(fmd.getAccessType())) {
             Field field = Reflection.findField(meta.getDescribedType(),
                 toFieldName(i), true);
             return Reflection.get(o, field);
@@ -358,7 +359,7 @@
 
     private void setValue(int i, Object o, Object val) {
         FieldMetaData fmd = meta.getField(i);
-        if (fmd.getAccessType() == ClassMetaData.ACCESS_PROPERTY) {
+        if (AccessCode.isProperty(fmd.getAccessType())) {
             if (!meta.isIntercepting()) {
                 Method meth = Reflection.findSetter(meta.getDescribedType(),
                     meta.getField(i).getName(), true);

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AccessCode.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AccessCode.java?rev=768428&r1=768427&r2=768428&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AccessCode.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AccessCode.java Fri Apr 24 22:24:45 2009
@@ -120,6 +120,8 @@
 	 * access style.
 	 */
 	public static boolean isCompatibleSuper(int subCode, int superCode) {
+		if (!isSet(superCode))
+			return true;
 		if (isValidClassCode(subCode) && isValidClassCode(superCode)) {
 			if (isExplicit(subCode))
 				return true;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/TestSubclassedBehavior.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/TestSubclassedBehavior.java?rev=768428&r1=768427&r2=768428&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/TestSubclassedBehavior.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/TestSubclassedBehavior.java Fri Apr 24 22:24:45 2009
@@ -38,6 +38,7 @@
 import junit.framework.AssertionFailedError;
 import org.apache.openjpa.kernel.Broker;
 import org.apache.openjpa.kernel.OpenJPAStateManager;
+import org.apache.openjpa.meta.AccessCode;
 import org.apache.openjpa.meta.ClassMetaData;
 import org.apache.openjpa.meta.FieldMetaData;
 import org.apache.openjpa.persistence.JPAFacadeHelper;
@@ -539,7 +540,7 @@
             .getMetaDataRepositoryInstance().
             getMetaData(DerivedEntity.class, null, false);
         assertTrue("meta's access should be ACCESS_PROPERTY",
-            meta.getAccessType() == ClassMetaData.ACCESS_PROPERTY);
+        		AccessCode.isProperty(meta.getAccessType()));
         FieldMetaData[] fmds = meta.getFields();
         for (int i = 0; i < fmds.length; i++) {
             assertEquals(Method.class, fmds[i].getBackingMember().getClass());

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java?rev=768428&r1=768427&r2=768428&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java Fri Apr 24 22:24:45 2009
@@ -456,6 +456,8 @@
     @SuppressWarnings("unchecked")
     public <T> T find(Class<T> cls, Object oid) {
         assertNotCloseInvoked();
+        if (oid == null)
+        	return null;
         oid = _broker.newObjectId(cls, oid);
         return (T) _broker.find(oid, true, this);
     }
@@ -476,6 +478,8 @@
         if (mode != null && mode != LockModeType.NONE)
             _broker.assertActiveTransaction();
 
+        if (oid == null)
+        	return null;
         processLockProperties(pushFetchPlan(), mode, properties);
         try {
             oid = _broker.newObjectId(cls, oid);

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=768428&r1=768427&r2=768428&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 Fri Apr 24 22:24:45 2009
@@ -225,7 +225,7 @@
      */
     public void setDefaultAccessType(String type) {
         if ("PROPERTY".equals(type.toUpperCase()))
-            setDefaultAccessType(ClassMetaData.ACCESS_PROPERTY);
+            setDefaultAccessType(AccessCode.PROPERTY);
         else if ("FIELD".equals(type.toUpperCase()))
             setDefaultAccessType(ClassMetaData.ACCESS_FIELD);
         else
@@ -236,9 +236,7 @@
     @Override
     public void populate(ClassMetaData meta, int access) {
     	if (!AccessCode.isSet(access)) {
-    		meta.setAccessType(determineAccessType(meta));
-    	} else {
-    		meta.setAccessType(access);
+    		access = determineAccessType(meta);
     	}
         super.populate(meta, access);
         meta.setDetachable(true);
@@ -276,20 +274,36 @@
      * on members for the given class without an explicit access annotation.
      */
     private int determineAccessType(ClassMetaData meta) {
+    	if (meta == null)
+    		return AccessCode.UNKNOWN;
+        if (meta.getDescribedType().isInterface()) // managed interfaces 
+        	return AccessCode.PROPERTY;
+    	if (AccessCode.isSet(meta.getAccessType()))
+    		return meta.getAccessType();
+    	int access = determineImplicitAccessType(meta.getDescribedType());
+    	if (AccessCode.isSet(access))
+    		return access;
+    	
     	ClassMetaData sup = getCachedSuperclassMetaData(meta);
     	while (sup != null && sup.isExplicitAccess())
-    		sup = sup.getPCSuperclassMetaData();
+    		sup = getCachedSuperclassMetaData(sup);
     	if (sup != null && AccessCode.isSet(sup.getAccessType()))
     		return sup.getAccessType();
     	
-        // traversed entire hierarchy without finding access type
-        if (meta.getDescribedType().isInterface()) // managed interfaces 
-        	return ClassMetaData.ACCESS_PROPERTY;
+        return AccessCode.UNKNOWN;
+    }
+    
+    /**
+     * Determines the access type for the given class by placement of 
+     * annotations on field or getter method.
+     */
+    private int determineImplicitAccessType(Class cls) {
         Field[] allFields = AccessController.doPrivileged(J2DoPrivHelper.
-                getDeclaredFieldsAction(meta.getDescribedType()));
+                getDeclaredFieldsAction(cls));
         List<Field> fields = filter(allFields, nonTransientFilter, 
         		annotatedFilter);
-		Method[] publicMethods = meta.getDescribedType().getMethods();
+		Method[] publicMethods = AccessController.doPrivileged(
+				J2DoPrivHelper.getDeclaredMethodsAction(cls));
         
 		List<Method> getters = filter(publicMethods, getterFilter, 
     		nonTransientFilter, annotatedFilter);
@@ -300,9 +314,9 @@
         		throw new UserException(getters.toString());
         	return ClassMetaData.ACCESS_FIELD;
         } else if (!getters.isEmpty()) {
-        	return ClassMetaData.ACCESS_PROPERTY;
+        	return AccessCode.PROPERTY;
         } 
-        return getDefaultAccessType();
+        return AccessCode.UNKNOWN;
     }
     
     /**
@@ -328,8 +342,6 @@
                     break;
             }
             if (!matched) {
-                System.err.println(_loc.get("getter-unmatched", getter) 
-                    .toString());
                 unmatched.add(getter);
             }
 
@@ -368,7 +380,8 @@
     	boolean isProperty  = AccessCode.isProperty(meta.getAccessType());
     	
     	if (explicit || unknown || isProperty) {
-    		Method[] publicMethods = meta.getDescribedType().getMethods();
+    		Method[] publicMethods = AccessController.doPrivileged(
+              J2DoPrivHelper.getDeclaredMethodsAction(meta.getDescribedType()));
         
     		List<Method> getters = filter(publicMethods, methodFilter, 
                 getterFilter, nonTransientFilter, 
@@ -403,8 +416,7 @@
     	boolean unknown     = !AccessCode.isSet(meta.getAccessType());
     	
     	if (isEmpty) {
-    		if (unknown)
-    			warn(_loc.get("access-unknown", meta));
+    		warn(meta, _loc.get("access-empty", meta));
     		return Collections.EMPTY_LIST;
     	}
     	if (explicit) {
@@ -418,9 +430,9 @@
     		}
     	} else {
     		if (isMixed)
-    			error(_loc.get("access-mixed", meta, fields, getters));
+                error(meta, _loc.get("access-mixed", meta, fields, getters));
     		if (fields.isEmpty()) {
-    			meta.setAccessType(ClassMetaData.ACCESS_PROPERTY);
+    			meta.setAccessType(AccessCode.PROPERTY);
     			members.addAll(getters);
     		} else {
     			meta.setAccessType(ClassMetaData.ACCESS_FIELD);
@@ -434,11 +446,16 @@
     	
     }
     
-    void error(Localizer.Message message) {
-    	System.err.println(message.toString());
+    void error(ClassMetaData meta, Localizer.Message message) {
+    	Log log = meta.getRepository().getConfiguration()
+    		.getLog(OpenJPAConfiguration.LOG_RUNTIME);
+    	log.error(message.toString());
     }
-    void warn(Localizer.Message message) {
-    	System.err.println(message.toString());
+    
+    void warn(ClassMetaData meta, Localizer.Message message) {
+    	Log log = meta.getRepository().getConfiguration()
+		.getLog(OpenJPAConfiguration.LOG_RUNTIME);
+    	log.warn(message.toString());
     }
     
     @Override
@@ -475,11 +492,9 @@
             }            
             try {
                 // check for setters for methods
-                Method setter = AccessController.doPrivileged(
-                    J2DoPrivHelper.getDeclaredMethodAction(
-                        meta.getDescribedType(), "set" +
-                        StringUtils.capitalize(name), new Class[] { 
-                            ((Method) member).getReturnType() }));
+                Method setter = meta.getDescribedType().getMethod(
+                		"set" + StringUtils.capitalize(name), 
+                        new Class[] {((Method) member).getReturnType()});
                 if (setter == null && !isAnnotatedTransient(member)) {
                     logNoSetter(meta, name, null);
                     return false;

Modified: openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties?rev=768428&r1=768427&r2=768428&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties (original)
+++ openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties Fri Apr 24 22:24:45 2009
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+access-empty: Found no persistent property in "{0}" 
 close-invoked: You have closed the EntityManager, though the persistence \
     context will remain active until the current transaction commits.
 no-managed-trans: There is no managed transaction in progress to sync this \