summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/gnu/javax/management
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/gnu/javax/management')
-rw-r--r--libjava/classpath/gnu/javax/management/Server.java123
-rw-r--r--libjava/classpath/gnu/javax/management/Translator.java42
2 files changed, 81 insertions, 84 deletions
diff --git a/libjava/classpath/gnu/javax/management/Server.java b/libjava/classpath/gnu/javax/management/Server.java
index 8e8d826c00f..e35c3b11745 100644
--- a/libjava/classpath/gnu/javax/management/Server.java
+++ b/libjava/classpath/gnu/javax/management/Server.java
@@ -48,12 +48,13 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
+
import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.ConcurrentHashMap;
import javax.management.Attribute;
import javax.management.AttributeList;
@@ -113,19 +114,20 @@ public class Server
/**
* The registered beans, represented as a map of
* {@link javax.management.ObjectName}s to
- * {@link java.lang.Object}s.
+ * {@link gnu.javax.management.Server.ServerInfo}s.
*/
- private final Map beans = new HashMap();
+ private final ConcurrentHashMap<ObjectName,ServerInfo> beans =
+ new ConcurrentHashMap<ObjectName,ServerInfo>();
/**
* The default domain.
*/
- private String defaultDomain;
+ private final String defaultDomain;
/**
* The outer server.
*/
- private MBeanServer outer;
+ private final MBeanServer outer;
/**
* The class loader repository.
@@ -134,9 +136,15 @@ public class Server
/**
* The map of listener delegates to the true
- * listener.
+ * listener. We wrap this in an inner class
+ * to delay initialisation until a listener
+ * is actually added.
*/
- private Map listeners;
+ private static class LazyListenersHolder
+ {
+ private static final Map<NotificationListener,NotificationListener> listeners =
+ new ConcurrentHashMap<NotificationListener,NotificationListener>();
+ }
/**
* An MBean that emits notifications when an MBean is registered and
@@ -145,7 +153,10 @@ public class Server
*/
private final MBeanServerDelegate delegate;
- static private final AtomicLong sequenceNumber = new AtomicLong(1);
+ /**
+ * Provides sequencing for notifications about registrations.
+ */
+ private static final AtomicLong sequenceNumber = new AtomicLong(1);
/**
* Initialise the delegate name.
@@ -274,7 +285,7 @@ public class Server
private Object getBean(ObjectName name)
throws InstanceNotFoundException
{
- ServerInfo bean = (ServerInfo) beans.get(name);
+ ServerInfo bean = beans.get(name);
if (bean == null)
throw new InstanceNotFoundException("The bean, " + name +
", was not found.");
@@ -319,12 +330,10 @@ public class Server
if (bean instanceof NotificationBroadcaster)
{
NotificationBroadcaster bbean = (NotificationBroadcaster) bean;
- if (listeners == null)
- listeners = new HashMap();
NotificationListener indirection = new ServerNotificationListener(bean, name,
listener);
bbean.addNotificationListener(indirection, filter, passback);
- listeners.put(listener, indirection);
+ LazyListenersHolder.listeners.put(listener, indirection);
}
}
@@ -671,7 +680,7 @@ public class Server
{
try
{
- Class c = getClassLoaderRepository().loadClass(name);
+ Class<?> c = getClassLoaderRepository().loadClass(name);
return new ServerInputStream(new ByteArrayInputStream(data),
c.getClassLoader());
}
@@ -717,7 +726,7 @@ public class Server
{
try
{
- Class c = getClassLoader(loader).loadClass(name);
+ Class<?> c = getClassLoader(loader).loadClass(name);
return new ServerInputStream(new ByteArrayInputStream(data),
c.getClassLoader());
}
@@ -951,7 +960,6 @@ public class Server
return defaultDomain;
}
-
/**
* Returns an array containing all the domains used by beans registered
* with this server. The ordering of the array is undefined.
@@ -975,11 +983,11 @@ public class Server
public String[] getDomains()
{
checkSecurity(null, null, "getDomains");
- Set domains = new HashSet();
- Iterator iterator = beans.keySet().iterator();
+ Set<String> domains = new HashSet<String>();
+ Iterator<ObjectName> iterator = beans.keySet().iterator();
while (iterator.hasNext())
{
- String d = ((ObjectName) iterator.next()).getDomain();
+ String d = iterator.next().getDomain();
try
{
checkSecurity(new ObjectName(d + ":x=x"), null, "getDomains");
@@ -990,7 +998,7 @@ public class Server
/* Ignored */
}
}
- return (String[]) domains.toArray(new String[domains.size()]);
+ return domains.toArray(new String[domains.size()]);
}
/**
@@ -1077,7 +1085,7 @@ public class Server
public ObjectInstance getObjectInstance(ObjectName name)
throws InstanceNotFoundException
{
- ServerInfo bean = (ServerInfo) beans.get(name);
+ ServerInfo bean = beans.get(name);
if (bean == null)
throw new InstanceNotFoundException("The bean, " + name +
", was not found.");
@@ -1158,7 +1166,7 @@ public class Server
new IllegalArgumentException("The name was null.");
throw new RuntimeOperationsException(e);
}
- Class[] sigTypes = new Class[sig.length];
+ Class<?>[] sigTypes = new Class[sig.length];
for (int a = 0; a < sigTypes.length; ++a)
{
try
@@ -1174,7 +1182,7 @@ public class Server
}
try
{
- Constructor cons =
+ Constructor<?> cons =
repository.loadClass(name).getConstructor(sigTypes);
return cons.newInstance(params);
}
@@ -1288,7 +1296,7 @@ public class Server
throw new RuntimeOperationsException(e);
}
ClassLoader loader = getClassLoader(loaderName);
- Class[] sigTypes = new Class[sig.length];
+ Class<?>[] sigTypes = new Class[sig.length];
for (int a = 0; a < sig.length; ++a)
{
try
@@ -1304,7 +1312,7 @@ public class Server
}
try
{
- Constructor cons =
+ Constructor<?> cons =
Class.forName(name, true, loader).getConstructor(sigTypes);
return cons.newInstance(params);
}
@@ -1433,10 +1441,10 @@ public class Server
}
if (info.getClassName().equals(className))
return true;
- Class bclass = bean.getClass();
+ Class<?> bclass = bean.getClass();
try
{
- Class oclass = Class.forName(className);
+ Class<?> oclass = Class.forName(className);
return (bclass.getClassLoader().equals(oclass.getClassLoader()) &&
oclass.isAssignableFrom(bclass));
}
@@ -1502,21 +1510,19 @@ public class Server
* arise from the execution of the query, in which
* case that particular bean will again be excluded.
*/
- public Set queryMBeans(ObjectName name, QueryExp query)
+ public Set<ObjectInstance> queryMBeans(ObjectName name, QueryExp query)
{
checkSecurity(name, null, "queryMBeans");
- Set results = new HashSet();
- Iterator iterator = beans.entrySet().iterator();
- while (iterator.hasNext())
+ Set<ObjectInstance> results = new HashSet<ObjectInstance>();
+ for (Map.Entry<ObjectName,ServerInfo> entry : beans.entrySet())
{
- Map.Entry entry = (Map.Entry) iterator.next();
- ObjectName nextName = (ObjectName) entry.getKey();
+ ObjectName nextName = entry.getKey();
checkSecurity(name, nextName.toString(), "queryMBeans");
try
{
if ((name == null || name.apply(nextName)) &&
(query == null || query.apply(nextName)))
- results.add(((ServerInfo) entry.getValue()).getInstance());
+ results.add(entry.getValue().getInstance());
}
catch (BadStringOperationException e)
{
@@ -1575,15 +1581,12 @@ public class Server
* Note that these permissions are implied if the
* <code>queryMBeans</code> permissions are available.
*/
- public Set queryNames(ObjectName name, QueryExp query)
+ public Set<ObjectName> queryNames(ObjectName name, QueryExp query)
{
checkSecurity(name, null, "queryNames");
- Set results = new HashSet();
- Iterator iterator = beans.entrySet().iterator();
- while (iterator.hasNext())
+ Set<ObjectName> results = new HashSet<ObjectName>();
+ for (ObjectName nextName : beans.keySet())
{
- Map.Entry entry = (Map.Entry) iterator.next();
- ObjectName nextName = (ObjectName) entry.getKey();
checkSecurity(name, nextName.toString(), "queryNames");
try
{
@@ -1656,7 +1659,7 @@ public class Server
NotCompliantMBeanException
{
SecurityManager sm = System.getSecurityManager();
- Class cl = obj.getClass();
+ Class<?> cl = obj.getClass();
String className = cl.getName();
if (sm != null)
{
@@ -1712,14 +1715,13 @@ public class Server
throw new MBeanRegistrationException(e, "Pre-registration failed.");
}
}
- if (beans.containsKey(name))
+ ObjectInstance obji = new ObjectInstance(name, className);
+ if (beans.putIfAbsent(name, new ServerInfo(obji, obj)) != null)
{
if (register != null)
register.postRegister(Boolean.FALSE);
throw new InstanceAlreadyExistsException(name + "is already registered.");
}
- ObjectInstance obji = new ObjectInstance(name, className);
- beans.put(name, new ServerInfo(obji, obj));
if (register != null)
register.postRegister(Boolean.TRUE);
notify(name, MBeanServerNotification.REGISTRATION_NOTIFICATION);
@@ -1758,15 +1760,8 @@ public class Server
if (bean instanceof NotificationBroadcaster)
{
NotificationBroadcaster bbean = (NotificationBroadcaster) bean;
- NotificationListener indirection = (NotificationListener)
- listeners.get(listener);
- if (indirection == null)
- bbean.removeNotificationListener(listener);
- else
- {
- bbean.removeNotificationListener(indirection);
- listeners.remove(listener);
- }
+ bbean.removeNotificationListener(listener);
+ LazyListenersHolder.listeners.remove(listener);
}
}
@@ -1809,15 +1804,8 @@ public class Server
if (bean instanceof NotificationEmitter)
{
NotificationEmitter bbean = (NotificationEmitter) bean;
- NotificationListener indirection = (NotificationListener)
- listeners.get(listener);
- if (indirection == null)
- bbean.removeNotificationListener(listener, filter, passback);
- else
- {
- bbean.removeNotificationListener(indirection, filter, passback);
- listeners.remove(listener);
- }
+ bbean.removeNotificationListener(listener, filter, passback);
+ LazyListenersHolder.listeners.remove(listener);
}
}
@@ -2011,7 +1999,7 @@ public class Server
Object abean = getBean(name);
checkSecurity(name, null, "setAttribute");
AttributeList list = new AttributeList(attributes.size());
- Iterator it = attributes.iterator();
+ Iterator<Object> it = attributes.iterator();
while (it.hasNext())
{
try
@@ -2113,6 +2101,15 @@ public class Server
register.postDeregister();
}
+ /**
+ * Notifies the delegate of beans being registered
+ * and unregistered.
+ *
+ * @param name the bean being registered.
+ * @param type the type of notification;
+ * {@code REGISTRATION_NOTIFICATION} or
+ * {@code UNREGISTRATION_NOTIFICATION}.
+ */
private void notify(ObjectName name, String type)
{
delegate.sendNotification
@@ -2136,7 +2133,7 @@ public class Server
this.cl = cl;
}
- protected Class resolveClass(ObjectStreamClass osc)
+ protected Class<?> resolveClass(ObjectStreamClass osc)
throws ClassNotFoundException, IOException
{
try
diff --git a/libjava/classpath/gnu/javax/management/Translator.java b/libjava/classpath/gnu/javax/management/Translator.java
index 4ede3743088..a15994429a3 100644
--- a/libjava/classpath/gnu/javax/management/Translator.java
+++ b/libjava/classpath/gnu/javax/management/Translator.java
@@ -143,14 +143,14 @@ public final class Translator
throw new IllegalArgumentException(jtype + " has a " +
"non-comparable element " +
"type, " + elemClass);
- if (((SortedSet) jtype).comparator() != null)
+ if (((SortedSet<?>) jtype).comparator() != null)
throw new IllegalArgumentException(jtype + " does not " +
"use natural ordering.");
}
- Collection<Object> elems = (Collection<Object>) jtype;
+ Collection<?> elems = (Collection<?>) jtype;
int numElems = elems.size();
Object[] celems = new Object[numElems];
- Iterator<Object> i = elems.iterator();
+ Iterator<?> i = elems.iterator();
for (int a = 0; a < numElems; ++a)
{
Object elem = i.next();
@@ -159,7 +159,7 @@ public final class Translator
return makeArraySpecific(celems);
}
if (jtype instanceof Enum)
- return ((Enum) jtype).name();
+ return ((Enum<?>) jtype).name();
if (jtype instanceof Map || jtype instanceof SortedMap)
{
int lparam = tName.indexOf("<");
@@ -177,13 +177,13 @@ public final class Translator
throw new IllegalArgumentException(jtype + " has a " +
"non-comparable element " +
"type, " + keyClass);
- if (((SortedMap) jtype).comparator() != null)
+ if (((SortedMap<?,?>) jtype).comparator() != null)
throw new IllegalArgumentException(jtype + " does not " +
"use natural ordering.");
typeName = "java.util.SortedMap" + tName.substring(lparam);
}
- OpenType k = translate(key).getOpenType();
- OpenType v = translate(value).getOpenType();
+ OpenType<?> k = translate(key).getOpenType();
+ OpenType<?> v = translate(value).getOpenType();
CompositeType rowType = new CompositeType(typeName, typeName,
new String[] { "key", "value" },
new String[] { "Map key", "Map value"},
@@ -191,7 +191,7 @@ public final class Translator
TabularType tabType = new TabularType(typeName, typeName, rowType,
new String[]{"key"});
TabularData data = new TabularDataSupport(tabType);
- for (Map.Entry entry : (Set<Map.Entry>) ((Map) jtype).entrySet())
+ for (Map.Entry<?,?> entry : ((Map<?,?>) jtype).entrySet())
{
try
{
@@ -258,15 +258,15 @@ public final class Translator
if (returnType.isEnum())
{
String ename = (String) otype;
- Enum[] constants = (Enum[]) returnType.getEnumConstants();
- for (Enum c : constants)
+ Enum<?>[] constants = (Enum[]) returnType.getEnumConstants();
+ for (Enum<?> c : constants)
if (c.name().equals(ename))
return c;
}
if (List.class.isAssignableFrom(returnType))
{
Object[] elems = (Object[]) otype;
- List l = new ArrayList(elems.length);
+ List<Object> l = new ArrayList<Object>(elems.length);
for (Object elem : elems)
l.add(elem);
return l;
@@ -274,7 +274,7 @@ public final class Translator
if (Map.class.isAssignableFrom(returnType))
{
TabularData data = (TabularData) otype;
- Map m = new HashMap(data.size());
+ Map<Object,Object> m = new HashMap<Object,Object>(data.size());
for (Object val : data.values())
{
CompositeData vals = (CompositeData) val;
@@ -401,8 +401,8 @@ public final class Translator
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();
+ 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"},
@@ -417,13 +417,13 @@ public final class Translator
{
int lparam = type.indexOf("<");
int rparam = type.indexOf(">");
- OpenType e = translate(type.substring(lparam + 1, rparam).trim()).getOpenType();
+ OpenType<?> e = translate(type.substring(lparam + 1, rparam).trim()).getOpenType();
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
- new ArrayType(1, e)
+ new ArrayType<OpenType<?>>(1, e)
);
}
- Class c;
+ Class<?> c;
try
{
c = Class.forName(type);
@@ -450,15 +450,15 @@ public final class Translator
int depth;
for (depth = 0; c.getName().charAt(depth) == '['; ++depth)
;
- OpenType ot = getTypeFromClass(c.getComponentType());
+ OpenType<?> ot = getTypeFromClass(c.getComponentType());
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
- new ArrayType(depth, ot)
+ new ArrayType<OpenType<?>>(depth, ot)
);
}
Method[] methods = c.getDeclaredMethods();
List<String> names = new ArrayList<String>();
- List<OpenType> types = new ArrayList<OpenType>();
+ List<OpenType<?>> types = new ArrayList<OpenType<?>>();
for (int a = 0; a < methods.length; ++a)
{
String name = methods[a].getName();
@@ -495,7 +495,7 @@ public final class Translator
* @return the appropriate instance.
* @throws OpenDataException if the type is not open.
*/
- private static final OpenType getTypeFromClass(Class c)
+ private static final OpenType<?> getTypeFromClass(Class<?> c)
throws OpenDataException
{
return Translator.translate(c.getName()).getOpenType();
OpenPOWER on IntegriCloud