Author: henrib
Date: Thu Oct 20 08:10:56 2011
New Revision: 1186657

URL: http://svn.apache.org/viewvc?rev=1186657&view=rev
Log:
JEXL-119:
* Stricter checks / defensive coding for indexed properties resolution

Modified:
    
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/UberspectImpl.java

Modified: 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/UberspectImpl.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/UberspectImpl.java?rev=1186657&r1=1186656&r2=1186657&view=diff
==============================================================================
--- 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/UberspectImpl.java
 (original)
+++ 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/UberspectImpl.java
 Thu Oct 20 08:10:56 2011
@@ -16,6 +16,7 @@
  */
 package org.apache.commons.jexl2.introspection;
 
+import java.beans.IntrospectionException;
 import org.apache.commons.jexl2.internal.Introspector;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
@@ -98,7 +99,7 @@ public class UberspectImpl extends Intro
         }
         return null;
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -117,7 +118,7 @@ public class UberspectImpl extends Intro
             return null;
         }
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -134,7 +135,7 @@ public class UberspectImpl extends Intro
         }
         return get;
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -150,7 +151,7 @@ public class UberspectImpl extends Intro
         }
         return set;
     }
-    
+
     /**
      * Returns a class field.
      * @param obj the object
@@ -163,7 +164,6 @@ public class UberspectImpl extends Intro
         return getField(clazz, name);
     }
 
-
     /**
      * Attempts to find an indexed-property getter in an object.
      * The code attempts to find the list of methods getXXX() and setXXX().
@@ -174,16 +174,17 @@ public class UberspectImpl extends Intro
      * @return a JexlPropertyGet is successfull, null otherwise
      */
     protected JexlPropertyGet getIndexedGet(Object object, String name) {
-        String base = name.substring(0, 1).toUpperCase() + name.substring(1);
-        final String container = name;
-        final Class<?> clazz = object.getClass();
-        final Method[] getters = getMethods(object.getClass(), "get" + base);
-        final Method[] setters = getMethods(object.getClass(), "set" + base);
-        if (getters != null) {
-            return new IndexedType(container, clazz, getters, setters);
-        } else {
-            return null;
+        if (object != null && name != null) {
+            String base = name.substring(0, 1).toUpperCase() + 
name.substring(1);
+            final String container = name;
+            final Class<?> clazz = object.getClass();
+            final Method[] getters = getMethods(object.getClass(), "get" + 
base);
+            final Method[] setters = getMethods(object.getClass(), "set" + 
base);
+            if (getters != null) {
+                return new IndexedType(container, clazz, getters, setters);
+            }
         }
+        return null;
     }
 
     /**
@@ -219,10 +220,10 @@ public class UberspectImpl extends Intro
          * {@inheritDoc}
          */
         public Object invoke(Object obj) throws Exception {
-            if (clazz.equals(obj.getClass())) {
+            if (obj != null && clazz.equals(obj.getClass())) {
                 return new IndexedContainer(this, obj);
             } else {
-                return null;
+                throw new IntrospectionException("property resolution error");
             }
         }
 
@@ -230,7 +231,7 @@ public class UberspectImpl extends Intro
          * {@inheritDoc}
          */
         public Object tryInvoke(Object obj, Object key) {
-            if (clazz.equals(obj.getClass()) && 
container.equals(key.toString())) {
+            if (obj != null && key != null && clazz.equals(obj.getClass()) && 
container.equals(key.toString())) {
                 return new IndexedContainer(this, obj);
             } else {
                 return TRY_FAILED;
@@ -253,10 +254,10 @@ public class UberspectImpl extends Intro
 
         /**
          * Gets the value of a property from a container.
-         * @param object the instance owning the container
-         * @param key the property key
+         * @param object the instance owning the container (not null)
+         * @param key the property key (not null)
          * @return the property value
-         * @throws Exception if the property can not be resolved
+         * @throws IntrospectionException if a property getter can not be found
          */
         private Object invokeGet(Object object, Object key) throws Exception {
             if (getters != null) {
@@ -271,16 +272,17 @@ public class UberspectImpl extends Intro
                     return jm.invoke(object, args);
                 }
             }
-            throw new Exception("property resolution error");
+            throw new IntrospectionException("property get error: "
+                    + object.getClass().toString() + "@" + key.toString());
         }
 
         /**
          * Sets the value of a property in a container.
-         * @param object the instance owning the container
-         * @param key the property key
-         * @param value the property value
+         * @param object the instance owning the container (not null)
+         * @param key the property key (not null)
+         * @param value the property value (not null)
          * @return the result of the method invocation (frequently null)
-         * @throws Exception if the property can not be resolved
+         * @throws IntrospectionException if a property getter can not be found
          */
         private Object invokeSet(Object object, Object key, Object value) 
throws Exception {
             if (setters != null) {
@@ -295,9 +297,9 @@ public class UberspectImpl extends Intro
                     return jm.invoke(object, args);
                 }
             }
-            throw new Exception("property resolution error");
+            throw new IntrospectionException("property set error: "
+                    + object.getClass().toString() + "@" + key.toString());
         }
-
     }
 
     /**
@@ -372,7 +374,7 @@ public class UberspectImpl extends Intro
             if (clazz.equals(ctor.getDeclaringClass())) {
                 return ctor.newInstance(params);
             } else {
-                return null;
+                throw new IntrospectionException("constructor resolution 
error");
             }
         }
 
@@ -427,7 +429,6 @@ public class UberspectImpl extends Intro
         }
     }
 
-
     /**
      * A JexlPropertyGet for public fields.
      */
@@ -481,7 +482,6 @@ public class UberspectImpl extends Intro
         }
     }
 
-
     /**
      * A JexlPropertySet for public fields.
      */
@@ -538,5 +538,4 @@ public class UberspectImpl extends Intro
             return true;
         }
     }
-
 }


Reply via email to