Merged gcj-eclipse branch to trunk.

From-SVN: r120621
This commit is contained in:
Tom Tromey
2007-01-09 19:58:05 +00:00
parent c648dedbde
commit 97b8365caf
17478 changed files with 606493 additions and 100744 deletions
@@ -1,6 +1,6 @@
/* InstrumentationImpl.java -- GNU implementation of
java.lang.instrument.Instrumentation
Copyright (C) 2005 Free Software Foundation, Inc.
Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -63,11 +63,11 @@ public final class InstrumentationImpl implements Instrumentation
{
/* List of transformers */
/* FIXME[GENERICS]: Should be ClassFileTransformer list */
private ArrayList transformers = new ArrayList();
private ArrayList<ClassFileTransformer> transformers =
new ArrayList<ClassFileTransformer>();
private InstrumentationImpl()
InstrumentationImpl()
{
}
@@ -210,9 +210,8 @@ public final class InstrumentationImpl implements Instrumentation
*
* @return the new class file
*/
/* FIXME[GENERICS]: Should be Class<?> */
public byte[] callTransformers(ClassLoader loader, String className,
Class classBeingRedefined, ProtectionDomain protectionDomain,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer)
{
byte[] newBuffer = null;
@@ -220,11 +219,10 @@ public final class InstrumentationImpl implements Instrumentation
ClassFileTransformer current;
synchronized (transformers)
{
Iterator i = transformers.iterator();
Iterator<ClassFileTransformer> i = transformers.iterator();
while (i.hasNext())
{
/* FIXME[GENERICS]: Remove cast */
current = (ClassFileTransformer) i.next();
current = i.next();
try
{
newBuffer = current.transform(loader, className,
@@ -39,9 +39,50 @@ package gnu.java.lang.management;
import java.lang.management.ManagementPermission;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.management.AttributeNotFoundException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.MBeanInfo;
import javax.management.NotCompliantMBeanException;
import javax.management.ReflectionException;
import javax.management.StandardMBean;
import javax.management.openmbean.ArrayType;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.OpenDataException;
import javax.management.openmbean.OpenMBeanAttributeInfo;
import javax.management.openmbean.OpenMBeanAttributeInfoSupport;
import javax.management.openmbean.OpenMBeanConstructorInfo;
import javax.management.openmbean.OpenMBeanConstructorInfoSupport;
import javax.management.openmbean.OpenMBeanInfo;
import javax.management.openmbean.OpenMBeanInfoSupport;
import javax.management.openmbean.OpenMBeanOperationInfo;
import javax.management.openmbean.OpenMBeanOperationInfoSupport;
import javax.management.openmbean.OpenMBeanParameterInfo;
import javax.management.openmbean.OpenMBeanParameterInfoSupport;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.SimpleType;
import javax.management.openmbean.TabularData;
import javax.management.openmbean.TabularDataSupport;
import javax.management.openmbean.TabularType;
/**
* A common superclass for bean implementations.
*
@@ -51,7 +92,12 @@ import javax.management.StandardMBean;
public class BeanImpl
extends StandardMBean
{
/**
* Cached open bean information.
*/
private OpenMBeanInfo openInfo;
/**
* Constructs a new <code>BeanImpl</code>.
*
@@ -67,6 +113,71 @@ public class BeanImpl
super(iface);
}
protected void cacheMBeanInfo(MBeanInfo info)
{
if (info == null)
return;
try
{
MBeanAttributeInfo[] oldA = info.getAttributes();
OpenMBeanAttributeInfo[] attribs =
new OpenMBeanAttributeInfoSupport[oldA.length];
for (int a = 0; a < oldA.length; ++a)
{
OpenMBeanParameterInfo param = translate(oldA[a].getType());
if (param.getMinValue() == null)
{
Object[] lv;
if (param.getLegalValues() == null)
lv = null;
else
lv = param.getLegalValues().toArray();
attribs[a] = new OpenMBeanAttributeInfoSupport(oldA[a].getName(),
oldA[a].getDescription(),
param.getOpenType(),
oldA[a].isReadable(),
oldA[a].isWritable(),
oldA[a].isIs(),
param.getDefaultValue(),
lv);
}
else
attribs[a] = new OpenMBeanAttributeInfoSupport(oldA[a].getName(),
oldA[a].getDescription(),
param.getOpenType(),
oldA[a].isReadable(),
oldA[a].isWritable(),
oldA[a].isIs(),
param.getDefaultValue(),
param.getMinValue(),
param.getMaxValue());
}
MBeanConstructorInfo[] oldC = info.getConstructors();
OpenMBeanConstructorInfo[] cons = new OpenMBeanConstructorInfoSupport[oldC.length];
for (int a = 0; a < oldC.length; ++a)
cons[a] =
new OpenMBeanConstructorInfoSupport(oldC[a].getName(),
oldC[a].getDescription(),
translateSignature(oldC[a].getSignature()));
MBeanOperationInfo[] oldO = info.getOperations();
OpenMBeanOperationInfo[] ops = new OpenMBeanOperationInfoSupport[oldO.length];
for (int a = 0; a < oldO.length; ++a)
ops[a] =
new OpenMBeanOperationInfoSupport(oldO[a].getName(),
oldO[a].getDescription(),
translateSignature(oldO[a].getSignature()),
translate(oldO[a].getReturnType()).getOpenType(),
oldO[a].getImpact());
openInfo = new OpenMBeanInfoSupport(info.getClassName(), info.getDescription(),
attribs, cons, ops, info.getNotifications());
}
catch (OpenDataException e)
{
throw (InternalError) (new InternalError("A problem occurred creating the open type " +
"descriptors.").initCause(e));
}
}
protected void checkMonitorPermissions()
{
SecurityManager sm = System.getSecurityManager();
@@ -81,4 +192,328 @@ public class BeanImpl
sm.checkPermission(new ManagementPermission("control"));
}
public Object getAttribute(String attribute)
throws AttributeNotFoundException, MBeanException,
ReflectionException
{
Object value = super.getAttribute(attribute);
if (value instanceof Enum)
return ((Enum) value).name();
Class vClass = value.getClass();
if (vClass.isArray())
return value;
String cName = vClass.getName();
String[] allowedTypes = OpenType.ALLOWED_CLASSNAMES;
for (int a = 0; a < allowedTypes.length; ++a)
if (cName.equals(allowedTypes[a]))
return value;
if (value instanceof List)
{
List l = (List) value;
Class e = null;
TypeVariable[] vars = vClass.getTypeParameters();
for (int a = 0; a < vars.length; ++a)
if (vars[a].getName().equals("E"))
e = (Class) vars[a].getGenericDeclaration();
if (e == null)
e = Object.class;
Object[] array = (Object[]) Array.newInstance(e, l.size());
return l.toArray(array);
}
OpenMBeanInfo info = (OpenMBeanInfo) getMBeanInfo();
OpenMBeanAttributeInfo[] attribs =
(OpenMBeanAttributeInfo[]) info.getAttributes();
OpenType type = null;
for (int a = 0; a < attribs.length; ++a)
if (attribs[a].getName().equals("attribute"))
type = attribs[a].getOpenType();
if (value instanceof Map)
{
TabularType ttype = (TabularType) type;
TabularData data = new TabularDataSupport(ttype);
Iterator it = ((Map) value).entrySet().iterator();
while (it.hasNext())
{
Map.Entry entry = (Map.Entry) it.next();
try
{
data.put(new CompositeDataSupport(ttype.getRowType(),
new String[] {
"key",
"value"
},
new Object[] {
entry.getKey(),
entry.getValue()
}));
}
catch (OpenDataException e)
{
throw (InternalError) (new InternalError("A problem occurred " +
"converting the map " +
"to a composite data " +
"structure.").initCause(e));
}
}
return data;
}
CompositeType cType = (CompositeType) type;
Set names = cType.keySet();
Iterator it = names.iterator();
List values = new ArrayList(names.size());
while (it.hasNext())
{
String field = (String) it.next();
Method getter = null;
try
{
getter = vClass.getMethod("get" + field, null);
}
catch (NoSuchMethodException e)
{
/* Ignored; the type tells us it's there. */
}
try
{
values.add(getter.invoke(value, null));
}
catch (IllegalAccessException e)
{
throw new ReflectionException(e, "Failed to retrieve " + field);
}
catch (IllegalArgumentException e)
{
throw new ReflectionException(e, "Failed to retrieve " + field);
}
catch (InvocationTargetException e)
{
throw new MBeanException((Exception) e.getCause(),
"The getter of " + field +
" threw an exception");
}
}
try
{
return new CompositeDataSupport(cType,
(String[])
names.toArray(new String[names.size()]),
values.toArray());
}
catch (OpenDataException e)
{
throw (InternalError) (new InternalError("A problem occurred " +
"converting the value " +
"to a composite data " +
"structure.").initCause(e));
}
}
protected MBeanInfo getCachedMBeanInfo()
{
return (MBeanInfo) openInfo;
}
public MBeanInfo getMBeanInfo()
{
super.getMBeanInfo();
return getCachedMBeanInfo();
}
private OpenType getTypeFromClass(Class c)
throws OpenDataException
{
return translate(c.getName()).getOpenType();
}
private OpenMBeanParameterInfo[] translateSignature(MBeanParameterInfo[] oldS)
throws OpenDataException
{
OpenMBeanParameterInfo[] sig = new OpenMBeanParameterInfoSupport[oldS.length];
for (int a = 0; a < oldS.length; ++a)
{
OpenMBeanParameterInfo param = translate(oldS[a].getType());
if (param.getMinValue() == null)
{
Object[] lv;
if (param.getLegalValues() == null)
lv = null;
else
lv = param.getLegalValues().toArray();
sig[a] = new OpenMBeanParameterInfoSupport(oldS[a].getName(),
oldS[a].getDescription(),
param.getOpenType(),
param.getDefaultValue(),
lv);
}
else
sig[a] = new OpenMBeanParameterInfoSupport(oldS[a].getName(),
oldS[a].getDescription(),
param.getOpenType(),
param.getDefaultValue(),
param.getMinValue(),
param.getMaxValue());
}
return sig;
}
private OpenMBeanParameterInfo translate(String type)
throws OpenDataException
{
if (type.equals("boolean") || type.equals(Boolean.class.getName()))
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.BOOLEAN,
null,
new Object[] {
Boolean.TRUE,
Boolean.FALSE
});
if (type.equals("byte") || type.equals(Byte.class.getName()))
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.BYTE,
null,
Byte.valueOf(Byte.MIN_VALUE),
Byte.valueOf(Byte.MAX_VALUE));
if (type.equals("char") || type.equals(Character.class.getName()))
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.CHARACTER,
null,
Character.valueOf(Character.MIN_VALUE),
Character.valueOf(Character.MAX_VALUE));
if (type.equals("double") || type.equals(Double.class.getName()))
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.DOUBLE,
null,
Double.valueOf(Double.MIN_VALUE),
Double.valueOf(Double.MAX_VALUE));
if (type.equals("float") || type.equals(Float.class.getName()))
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.FLOAT,
null,
Float.valueOf(Float.MIN_VALUE),
Float.valueOf(Float.MAX_VALUE));
if (type.equals("int") || type.equals(Integer.class.getName()))
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.INTEGER,
null,
Integer.valueOf(Integer.MIN_VALUE),
Integer.valueOf(Integer.MAX_VALUE));
if (type.equals("long") || type.equals(Long.class.getName()))
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.LONG,
null,
Long.valueOf(Long.MIN_VALUE),
Long.valueOf(Long.MAX_VALUE));
if (type.equals("short") || type.equals(Short.class.getName()))
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.SHORT,
null,
Short.valueOf(Short.MIN_VALUE),
Short.valueOf(Short.MAX_VALUE));
if (type.equals(String.class.getName()))
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.STRING);
if (type.equals("void"))
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.VOID);
if (type.startsWith("java.util.Map"))
{
int lparam = type.indexOf("<");
int comma = type.indexOf(",", lparam);
int rparam = type.indexOf(">", comma);
String key = type.substring(lparam + 1, comma).trim();
OpenType k = translate(key).getOpenType();
OpenType v = translate(type.substring(comma + 1, rparam).trim()).getOpenType();
CompositeType ctype = new CompositeType(Map.class.getName(), Map.class.getName(),
new String[] { "key", "value" },
new String[] { "Map key", "Map value"},
new OpenType[] { k, v});
TabularType ttype = new TabularType(key, key, ctype,
new String[] { "key" });
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
ttype);
}
if (type.startsWith("java.util.List"))
{
int lparam = type.indexOf("<");
int rparam = type.indexOf(">");
OpenType e = translate(type.substring(lparam + 1, rparam).trim()).getOpenType();
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
new ArrayType(1, e)
);
}
Class c;
try
{
c = Class.forName(type);
}
catch (ClassNotFoundException e)
{
throw (InternalError)
(new InternalError("The class for a type used in a management bean " +
"could not be loaded.").initCause(e));
}
if (c.isEnum())
{
Object[] values = c.getEnumConstants();
String[] names = new String[values.length];
for (int a = 0; a < values.length; ++a)
names[a] = values[a].toString();
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
SimpleType.STRING,
null,
(Object[]) names);
}
try
{
c.getMethod("from", new Class[] { CompositeData.class });
Method[] methods = c.getMethods();
List names = new ArrayList();
List types = new ArrayList();
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 = (String[]) names.toArray();
CompositeType ctype = new CompositeType(c.getName(), c.getName(),
fields, fields,
(OpenType[]) types.toArray());
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;
for (depth = 0; c.getName().charAt(depth) == '['; ++depth);
OpenType ot = getTypeFromClass(c.getComponentType());
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
new ArrayType(depth, ot)
);
}
throw new InternalError("The type used does not have an open type translation.");
}
}
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.lang.management;
import gnu.classpath.ListenerData;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryNotificationInfo;
import java.lang.management.MemoryUsage;
@@ -168,49 +170,6 @@ public final class MemoryMXBeanImpl
VMMemoryMXBeanImpl.setVerbose(verbose);
}
private class ListenerData
{
private NotificationListener listener;
private NotificationFilter filter;
private Object passback;
public ListenerData(NotificationListener listener,
NotificationFilter filter, Object passback)
{
this.listener = listener;
this.filter = filter;
this.passback = passback;
}
public NotificationListener getListener()
{
return listener;
}
public NotificationFilter getFilter()
{
return filter;
}
public Object getPassback()
{
return passback;
}
public boolean equals(Object obj)
{
if (obj instanceof ListenerData)
{
ListenerData data = (ListenerData) obj;
return (data.getListener() == listener &&
data.getFilter() == filter &&
data.getPassback() == passback);
}
return false;
}
}
public void addNotificationListener(NotificationListener listener,
NotificationFilter filter,
Object passback)
@@ -40,6 +40,7 @@ package gnu.java.lang.management;
import gnu.classpath.SystemProperties;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryType;
import java.lang.management.MemoryUsage;
import javax.management.NotCompliantMBeanException;
@@ -133,9 +134,10 @@ public final class MemoryPoolMXBeanImpl
return null;
}
public String getType()
public MemoryType getType()
{
return VMMemoryPoolMXBeanImpl.getType(name);
return
MemoryType.valueOf(VMMemoryPoolMXBeanImpl.getType(name));
}
public MemoryUsage getUsage()
@@ -61,7 +61,7 @@ public class ClassSignatureParser extends GenericSignatureParser
}
// SuperclassSignature
superclassType = readClassTypeSignature();
ArrayList interfaces = new ArrayList();
ArrayList<Type> interfaces = new ArrayList<Type>();
while (peekChar() == 'L')
{
// SuperinterfaceSignature
@@ -60,7 +60,6 @@ final class TypeVariableImpl extends TypeImpl implements TypeVariable
return this;
}
/* FIXME[GENERICS]: Remove cast */
public Type[] getBounds()
{
resolve(bounds);
@@ -141,10 +140,9 @@ final class ParameterizedTypeImpl extends TypeImpl implements ParameterizedType
return this;
}
/* FIXME[GENERICS]: Remove cast */
public Type[] getActualTypeArguments()
{
return (Type[]) typeArgs.clone();
return (Type[]) typeArgs.clone();
}
public Type getRawType()
@@ -276,12 +274,11 @@ final class UnresolvedTypeVariable extends TypeImpl implements Type
GenericDeclaration d = decl;
while (d != null)
{
TypeVariable[] vars = d.getTypeParameters();
for (int a = 0; a < vars.length ; ++a)
for (TypeVariable t : d.getTypeParameters())
{
if (vars[a].getName().equals(name))
if (t.getName().equals(name))
{
return vars[a];
return t;
}
}
d = getParent(d);
@@ -414,7 +411,7 @@ class GenericSignatureParser
TypeVariable[] readFormalTypeParameters()
{
consume('<');
ArrayList params = new ArrayList();
ArrayList<TypeVariable> params = new ArrayList<TypeVariable>();
do
{
// TODO should we handle name clashes?
@@ -430,7 +427,7 @@ class GenericSignatureParser
{
String identifier = readIdentifier();
consume(':');
ArrayList bounds = new ArrayList();
ArrayList<Type> bounds = new ArrayList<Type>();
if (peekChar() != ':')
{
bounds.add(readFieldTypeSignature());
@@ -501,7 +498,7 @@ class GenericSignatureParser
private Type[] readTypeArguments()
{
consume('<');
ArrayList list = new ArrayList();
ArrayList<Type> list = new ArrayList<Type>();
do
{
list.add(readTypeArgument());
@@ -72,7 +72,7 @@ public class MethodSignatureParser extends GenericSignatureParser
typeParameters = new TypeVariable[0];
}
consume('(');
ArrayList args = new ArrayList();
ArrayList<Type> args = new ArrayList<Type>();
while (peekChar() != ')')
{
args.add(readTypeSignature());
@@ -81,7 +81,7 @@ public class MethodSignatureParser extends GenericSignatureParser
args.toArray(argTypes);
consume(')');
retType = readTypeSignature();
ArrayList throwsSigs = new ArrayList();
ArrayList<Type> throwsSigs = new ArrayList<Type>();
while (peekChar() == '^')
{
consume('^');