You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2013/11/24 09:50:28 UTC

svn commit: r1544947 - in /cayenne/main/trunk: cayenne-di/src/main/java/org/apache/cayenne/di/ cayenne-di/src/main/java/org/apache/cayenne/di/spi/ cayenne-server/src/main/java/org/apache/cayenne/map/ cayenne-server/src/main/java/org/apache/cayenne/util/

Author: aadamchik
Date: Sun Nov 24 08:50:28 2013
New Revision: 1544947

URL: http://svn.apache.org/r1544947
Log:
CAY-1887 Move class loading under Di, differentiate between Cayenne and application classes

(also supporting for 'void' primitive type)

Modified:
    cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java
    cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java

Modified: cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java?rev=1544947&r1=1544946&r2=1544947&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java (original)
+++ cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java Sun Nov 24 08:50:28 2013
@@ -33,6 +33,14 @@ public interface AdhocObjectFactory {
     <T> T newInstance(Class<? super T> superType, String className);
 
     /**
+     * Returns a Java class loaded using ClassLoader returned from
+     * {@link #getClassLoader(String)} for a given class name.
+     * 
+     * @since 3.2
+     */
+    Class<?> getJavaClass(String className);
+
+    /**
      * Returns a ClassLoader appropriate for loading a given resource. Resource
      * path should be compatible with Class.getResource(..) and such, i.e. the
      * path component separator should be slash, not dot.

Modified: cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java?rev=1544947&r1=1544946&r2=1544947&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java (original)
+++ cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java Sun Nov 24 08:50:28 2013
@@ -48,12 +48,7 @@ public class DefaultAdhocObjectFactory i
             throw new NullPointerException("Null className");
         }
 
-        Class<T> type;
-        try {
-            type = (Class<T>) getJavaClass(className);
-        } catch (ClassNotFoundException e) {
-            throw new DIRuntimeException("Invalid class %s of type %s", e, className, superType.getName());
-        }
+        Class<T> type = (Class<T>) getJavaClass(className);
 
         if (!superType.isAssignableFrom(type)) {
             throw new DIRuntimeException("Class %s is not assignable to %s", className, superType.getName());
@@ -93,12 +88,13 @@ public class DefaultAdhocObjectFactory i
         return classLoader;
     }
 
-    public Class<?> getJavaClass(String className) throws ClassNotFoundException {
+    @Override
+    public Class<?> getJavaClass(String className) {
 
         // is there a better way to get array class from string name?
 
         if (className == null) {
-            throw new ClassNotFoundException("Null class name");
+            throw new NullPointerException("Null class name");
         }
 
         ClassLoader classLoader = getClassLoader(className.replace('.', '/'));
@@ -125,6 +121,8 @@ public class DefaultAdhocObjectFactory i
                     return Float.TYPE;
                 } else if ("boolean".equals(className)) {
                     return Boolean.TYPE;
+                } else if ("void".equals(className)) {
+                    return Void.TYPE;
                 }
                 // try inner class often specified with "." instead of $
                 else {
@@ -139,7 +137,7 @@ public class DefaultAdhocObjectFactory i
                     }
                 }
 
-                throw e;
+                throw new DIRuntimeException("Invalid class: %s", e, className);
             }
 
             if (className.length() < 3) {
@@ -167,7 +165,11 @@ public class DefaultAdhocObjectFactory i
                 return boolean[].class;
             }
 
-            return Class.forName("[L" + className + ";", true, classLoader);
+            try {
+                return Class.forName("[L" + className + ";", true, classLoader);
+            } catch (ClassNotFoundException e1) {
+                throw new DIRuntimeException("Invalid class: %s", e1, className);
+            }
         }
     }
 }

Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java?rev=1544947&r1=1544946&r2=1544947&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java Sun Nov 24 08:50:28 2013
@@ -34,6 +34,7 @@ import org.apache.cayenne.CayenneRuntime
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.exp.ExpressionFactory;
@@ -281,8 +282,10 @@ public class ObjEntity extends Entity im
      * Returns a non-null class name. For generic entities with no class
      * specified explicitly, default DataMap superclass is used, and if it is
      * not set - CayenneDataObject is used.
+     * 
+     * @since 3.2
      */
-    String getJavaClassName() {
+   public  String getJavaClassName() {
         String name = getClassName();
 
         if (name == null && getDataMap() != null) {
@@ -303,7 +306,12 @@ public class ObjEntity extends Entity im
      * Casts any thrown exceptions into CayenneRuntimeException.
      * 
      * @since 1.2
+     * @deprecated since 3.2 this method based on statically defined class
+     *             loading algorithm is not going to work in environments like
+     *             OSGi. {@link AdhocObjectFactory} should be used as it can
+     *             provide the environment-specific class loading policy. 
      */
+    @Deprecated
     public Class<?> getJavaClass() {
         String name = getJavaClassName();
 

Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java?rev=1544947&r1=1544946&r2=1544947&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java Sun Nov 24 08:50:28 2013
@@ -502,11 +502,16 @@ public class Util {
     }
 
     /**
-     * Creates a Java class, handling regular class names as well as single-dimensional
-     * arrays and primitive types.
-     *
+     * Creates a Java class, handling regular class names as well as
+     * single-dimensional arrays and primitive types.
+     * 
      * @since 1.2
+     * @deprecated since 3.2 this method based on statically defined class
+     *             loading algorithm is not going to work in environments like
+     *             OSGi. {@link AdhocObjectFactory} should be used as it can
+     *             provide the environment-specific class loading policy.
      */
+    @Deprecated
     public static Class<?> getJavaClass(String className) throws ClassNotFoundException {
         return objectFactory.getJavaClass(className);
     }