diff options
Diffstat (limited to 'libjava/classpath/gnu/javax/management/Translator.java')
| -rw-r--r-- | libjava/classpath/gnu/javax/management/Translator.java | 78 |
1 files changed, 42 insertions, 36 deletions
diff --git a/libjava/classpath/gnu/javax/management/Translator.java b/libjava/classpath/gnu/javax/management/Translator.java index 69191d43f86..4ede3743088 100644 --- a/libjava/classpath/gnu/javax/management/Translator.java +++ b/libjava/classpath/gnu/javax/management/Translator.java @@ -39,11 +39,15 @@ 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; @@ -92,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; } @@ -131,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 " + @@ -144,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); @@ -440,33 +445,6 @@ public final class Translator SimpleType.STRING, null, names); } - try - { - c.getMethod("from", new Class[] { CompositeData.class }); - Method[] methods = c.getDeclaredMethods(); - List<String> names = new ArrayList<String>(); - List<OpenType> types = new ArrayList<OpenType>(); - for (int a = 0; a < methods.length; ++a) - { - String name = methods[a].getName(); - if (name.startsWith("get")) - { - names.add(name.substring(3)); - types.add(getTypeFromClass(methods[a].getReturnType())); - } - } - String[] fields = names.toArray(new String[names.size()]); - CompositeType ctype = new CompositeType(c.getName(), c.getName(), - fields, fields, - types.toArray(new OpenType[types.size()])); - return new OpenMBeanParameterInfoSupport("TransParam", - "Translated parameter", - ctype); - } - catch (NoSuchMethodException e) - { - /* Ignored; we expect this if this isn't a from(CompositeData) class */ - } if (c.isArray()) { int depth; @@ -478,7 +456,35 @@ public final class Translator new ArrayType(depth, ot) ); } - throw new InternalError("The type used does not have an open type translation."); + Method[] methods = c.getDeclaredMethods(); + List<String> names = new ArrayList<String>(); + List<OpenType> types = new ArrayList<OpenType>(); + for (int a = 0; a < methods.length; ++a) + { + String name = methods[a].getName(); + if (Modifier.isPublic(methods[a].getModifiers())) + { + if (name.startsWith("get")) + { + names.add(name.substring(3)); + types.add(getTypeFromClass(methods[a].getReturnType())); + } + else if (name.startsWith("is")) + { + names.add(name.substring(2)); + types.add(getTypeFromClass(methods[a].getReturnType())); + } + } + } + if (names.isEmpty()) + throw new OpenDataException("The type used does not have an open type translation."); + String[] fields = names.toArray(new String[names.size()]); + CompositeType ctype = new CompositeType(c.getName(), c.getName(), + fields, fields, + types.toArray(new OpenType[types.size()])); + return new OpenMBeanParameterInfoSupport("TransParam", + "Translated parameter", + ctype); } /** |

