You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ro...@apache.org on 2011/10/29 19:11:16 UTC
svn commit: r1194934 -
/commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/ReflectionUtils.java
Author: rony
Date: Sat Oct 29 17:11:15 2011
New Revision: 1194934
URL: http://svn.apache.org/viewvc?rev=1194934&view=rev
Log:
Resolving issue [#BSF-20]: make a more user friendly error message, displaying all available event names, if any
Modified:
commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/ReflectionUtils.java
Modified: commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/ReflectionUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/ReflectionUtils.java?rev=1194934&r1=1194933&r2=1194934&view=diff
==============================================================================
--- commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/ReflectionUtils.java (original)
+++ commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/ReflectionUtils.java Sat Oct 29 17:11:15 2011
@@ -33,6 +33,10 @@ import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.TreeSet;
+import java.util.Comparator;
+import java.util.Iterator;
+
import org.apache.bsf.util.event.EventAdapter;
import org.apache.bsf.util.event.EventAdapterRegistry;
import org.apache.bsf.util.event.EventProcessor;
@@ -52,6 +56,9 @@ import org.apache.bsf.util.type.TypeConv
- supplied class loader (given as an argument)
- Thread's context class loader
- BSFManager's defining class loader
+
+ 2011-10-29: Rony G. Flatscher, in case an event is not found, create a
+ user-friendly error message that lists all available event names
*/
public class ReflectionUtils {
// rgf, 20070921: class loaders that we might need to load classes
@@ -85,13 +92,77 @@ public class ReflectionUtils {
InvocationTargetException {
// find the event set descriptor for this event
BeanInfo bi = Introspector.getBeanInfo (source.getClass ());
- EventSetDescriptor esd = (EventSetDescriptor)
- findFeatureByName ("event", eventSetName, bi.getEventSetDescriptors ());
+
+ EventSetDescriptor arrESD[]=bi.getEventSetDescriptors ();
+ EventSetDescriptor esd=(EventSetDescriptor) findFeatureByName ("event", eventSetName, arrESD);
if (esd == null) // no events found, maybe a proxy from OpenOffice.org?
{
- throw new IllegalArgumentException ("event set '" + eventSetName +
- "' unknown for source type '" + source.getClass () + "'");
+ String errMsg="event set '" + eventSetName +"' unknown for source type '" + source.getClass () + "': ";
+ if (arrESD.length==0) // no event sets found in class!
+ {
+ errMsg=errMsg+"class does not implement any event methods following Java's event pattern!";
+ }
+ else
+ {
+ // errMsg=errMsg+"class defines the following event set(s): {";
+ errMsg=errMsg+"class defines the following event set(s): ";
+
+ // sort ESD by Name
+ TreeSet ts=new TreeSet(new Comparator () {
+ public int compare(Object o1, Object o2) {return ((EventSetDescriptor)o1).getName().compareToIgnoreCase(((EventSetDescriptor)o2).getName());}
+ public boolean equals(Object o1, Object o2) {return ((EventSetDescriptor)o1).getName().equalsIgnoreCase (((EventSetDescriptor)o2).getName());}
+ });
+
+ for (int i=0;i<arrESD.length;i++)
+ {
+ ts.add(arrESD[i]);
+ }
+ Iterator it=ts.iterator(); // get iterator
+
+ int i=0;
+ while (it.hasNext()) // iterate in sorted order
+ {
+ EventSetDescriptor tmpESD=(EventSetDescriptor) it.next();
+
+ if (i>0)
+ {
+ errMsg=errMsg+", ";
+ }
+ errMsg=errMsg+"\n\t"+'\''+tmpESD.getName()+"'={"; // event set name
+
+
+ // iterate over listener methods and display their names in sorted order
+ Method m[]=tmpESD.getListenerMethods();
+ TreeSet tsM=new TreeSet(new Comparator () {
+ public int compare(Object o1, Object o2) {return ((Method)o1).getName().compareToIgnoreCase(((Method)o2).getName());}
+ public boolean equals(Object o1, Object o2) {return ((Method)o1).getName().equalsIgnoreCase (((Method)o2).getName());}
+ });
+
+ for (int j=0;j<m.length;j++)
+ {
+ tsM.add(m[j]);
+ }
+ Iterator itM=tsM.iterator();
+
+ int j=0;
+ while (itM.hasNext())
+ {
+ if (j>0)
+ {
+ errMsg=errMsg+',';
+ }
+ errMsg=errMsg+'\''+((Method) itM.next()).getName()+'\'';
+ j++;
+ }
+ errMsg=errMsg+'}'; // close event method set
+ i++;
+ }
+
+ // errMsg=errMsg+"}."; // close set of event sets
+ errMsg=errMsg+"."; // close set of event sets
+ }
+ throw new IllegalArgumentException (errMsg);
}
// get the class object for the event
@@ -285,6 +356,8 @@ public class ReflectionUtils {
}
return null;
}
+
+
public static Bean getField (Object target, String fieldName)
throws IllegalArgumentException, IllegalAccessException {
// This is to handle how we do static fields.
@@ -491,3 +564,5 @@ public class ReflectionUtils {
}
}
}
+
+