This patch corrects a mistake in the JMX translator
for MXBeans.  It incorrectly casts both Lists and Sets
to List rather than Collection.  This also replaces the
ad-hoc method of obtaining the type with the correct way
using ParameterizedType.  I assume this didn't work before due
to a lack of support in the VMs.

ChangeLog:

2008-02-21  Andrew John Hughes  <[EMAIL PROTECTED]>

        * gnu/javax/management/Translator.java:
        (fromJava(Object[],Method)): Don't cast to Class<?>.
        (fromJava(Object,Type)): Use ParameterizedType
        and don't assume that List will work for Sets.

-- 
Andrew :)

Support Free Java!
Contribute to GNU Classpath and the OpenJDK
http://www.gnu.org/software/classpath
http://openjdk.java.net
PGP Key: 94EFD9D8 (http://subkeys.pgp.net)
Fingerprint = F8EF F1EA 401E 2E60 15FA  7927 142C 2591 94EF D9D8
Index: gnu/javax/management/Translator.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/javax/management/Translator.java,v
retrieving revision 1.5
diff -u -3 -p -u -r1.5 Translator.java
--- gnu/javax/management/Translator.java	2 Dec 2007 01:11:04 -0000	1.5
+++ gnu/javax/management/Translator.java	21 Feb 2008 19:52:36 -0000
@@ -40,11 +40,14 @@ package gnu.javax.management;
 import java.lang.reflect.Array;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -93,7 +96,7 @@ public final class Translator
     Type[] gtypes = method.getGenericParameterTypes();
     Object[] otypes = new Object[jtypes.length];
     for (int a = 0; a < jtypes.length; ++a)
-      otypes[a] = fromJava(jtypes[a], (Class<?>) gtypes[a]);
+      otypes[a] = fromJava(jtypes[a], gtypes[a]);
     return otypes;
   }
 
@@ -132,11 +135,10 @@ public final class Translator
     if (jtype instanceof List || jtype instanceof Set ||
 	jtype instanceof SortedSet)
       {
-	String elemType = tName.substring(tName.indexOf("<") + 1,
-					  tName.indexOf(">")).trim();
 	if (jtype instanceof SortedSet)
 	  {
-	    Class<?> elemClass = Class.forName(elemType);
+	    ParameterizedType ptype = (ParameterizedType) type;
+	    Class<?> elemClass = (Class<?>) ptype.getActualTypeArguments()[0];
 	    if (!Comparable.class.isAssignableFrom(elemClass))
 	      throw new IllegalArgumentException(jtype + " has a " +
 						 "non-comparable element " +
@@ -145,11 +147,13 @@ public final class Translator
 	      throw new IllegalArgumentException(jtype + " does not " +
 						 "use natural ordering.");
 	  }
-	List elems = (List) jtype;
-	Object[] celems = new Object[elems.size()];
-	for (int a = 0; a < elems.size(); ++a)
+	Collection<Object> elems = (Collection<Object>) jtype;
+	int numElems = elems.size();
+	Object[] celems = new Object[numElems];
+	Iterator<Object> i = elems.iterator();
+	for (int a = 0; a < numElems; ++a)
 	  {
-	    Object elem = elems.get(a);
+	    Object elem = i.next();
 	    celems[a] = fromJava(elem, elem.getClass());
 	  }
 	return makeArraySpecific(celems);

Attachment: signature.asc
Description: Digital signature

Reply via email to