I'm applying Andrew Haley's recent patch to HEAD, along with the addition of a new ObjectName constant.
Changelog:
2007-04-06 Andrew John Hughes <[EMAIL PROTECTED]>
* javax/management/ObjectName.java:
(WILDCARD): Added.
2007-04-04 Andrew Haley <[EMAIL PROTECTED]>
* javax/management/ObjectName.java:
(serialVersionUID): Declare.
Make all fields transient.
(parse): Break out from constructor.
(writeObject, readObject): New methods.
--
Andrew :-)
Escape the Java Trap with GNU Classpath!
http://www.gnu.org/philosophy/java-trap.html
public class gcj extends Freedom implements Java { ... }
Index: gnu/javax/management/Translator.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/javax/management/Translator.java,v
retrieving revision 1.3
diff -u -3 -p -u -r1.3 Translator.java
--- gnu/javax/management/Translator.java 1 Apr 2007 16:34:14 -0000 1.3
+++ gnu/javax/management/Translator.java 6 Apr 2007 15:15:14 -0000
@@ -127,11 +127,7 @@ public final class Translator
celems[a] = fromJava(elems[a], elems[a].getClass());
return makeArraySpecific(celems);
}
- String tName = null;
- if (type instanceof Class)
- tName = ((Class<?>) type).getName();
- else
- tName = type.toString();
+ String tName = getTypeName(type);
if (jtype instanceof List || jtype instanceof Set ||
jtype instanceof SortedSet)
{
@@ -499,4 +495,50 @@ public final class Translator
return Translator.translate(c.getName()).getOpenType();
}
+ /**
+ * <p>
+ * Returns the type name according to the rules described
+ * in [EMAIL PROTECTED] javax.management.MXBean}. Namely, for a type,
+ * [EMAIL PROTECTED] T}, [EMAIL PROTECTED] typename(T)} is computed as follows:
+ * </p>
+ * <ul>
+ * <li>If T is non-generic and not an array, then the value
+ * of [EMAIL PROTECTED] java.lang.Class#getName()} is returned.</li>
+ * <li>If T is an array type, [EMAIL PROTECTED], then the type name
+ * is [EMAIL PROTECTED] typename(E)} followed by an occurrence
+ * of [EMAIL PROTECTED] '[]'} for each dimension.</li>
+ * <li>If T is a generic or parameterized type, the type name
+ * is composed of [EMAIL PROTECTED] typename(P)}, where [EMAIL PROTECTED] P} is the
+ * parameterized type name, followed by [EMAIL PROTECTED] '<'}, the resulting
+ * list of type names of the parameters after applying [EMAIL PROTECTED] typename}
+ * to each, separated by commas, and [EMAIL PROTECTED] '>'}.</li>
+ * </ul>
+ *
+ * @param type the type to return the type name of.
+ * @return the type name computed according to the rules above.
+ */
+ private static final String getTypeName(Type type)
+ {
+ if (type instanceof Class)
+ {
+ Class<?> c = (Class<?>) type;
+ if (c.isArray())
+ {
+ StringBuilder b =
+ new StringBuilder(c.getComponentType().getName());
+ String normName = c.getName();
+ for (int a = 0; a < normName.length(); ++a)
+ {
+ if (normName.charAt(a) == '[')
+ b.append("[]");
+ else
+ break;
+ }
+ return b.toString();
+ }
+ return c.getName();
+ }
+ return type.toString();
+ }
+
}
Index: javax/management/ObjectName.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/management/ObjectName.java,v
retrieving revision 1.10
diff -u -3 -p -u -r1.10 ObjectName.java
--- javax/management/ObjectName.java 2 Apr 2007 18:24:30 -0000 1.10
+++ javax/management/ObjectName.java 6 Apr 2007 15:15:19 -0000
@@ -45,6 +45,11 @@ import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
+import java.io.IOException;
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
/**
* <p>
* An [EMAIL PROTECTED] ObjectName} instance represents the name of a management
@@ -97,30 +102,56 @@ public class ObjectName
implements Serializable, QueryExp
{
+ private static final long serialVersionUID = 1081892073854801359L;
+
+ /**
+ * The wildcard [EMAIL PROTECTED] ObjectName} [EMAIL PROTECTED] "*:*"}
+ *
+ * @since 1.6
+ */
+ public static final ObjectName WILDCARD;
+
/**
* The domain of the name.
*/
- private String domain;
+ private transient String domain;
/**
* The properties, as key-value pairs.
*/
- private TreeMap<String,String> properties = new TreeMap<String,String>();
+ private transient TreeMap<String,String> properties;
/**
* The properties as a string (stored for ordering).
*/
- private String propertyListString;
+ private transient String propertyListString;
/**
* True if this object name is a property pattern.
*/
- private boolean propertyPattern;
+ private transient boolean propertyPattern;
/**
* The management server associated with this object name.
*/
- private MBeanServer server;
+ private transient MBeanServer server;
+
+ /**
+ * Static initializer to set up the wildcard.
+ */
+ static
+ {
+ try
+ {
+ WILDCARD = new ObjectName("");
+ }
+ catch (MalformedObjectNameException e)
+ {
+ throw (InternalError) (new InternalError("A problem occurred " +
+ "initializing the ObjectName " +
+ "wildcard.").initCause(e));
+ }
+ }
/**
* Constructs an [EMAIL PROTECTED] ObjectName} instance from the given string,
@@ -145,12 +176,22 @@ public class ObjectName
{
if (name.length() == 0)
name = "*:*";
+ parse(name);
+ }
+ /**
+ * Parse the name in the same form as the constructor. Used by
+ * readObject().
+ */
+ private void parse(String name)
+ throws MalformedObjectNameException
+ {
int domainSep = name.indexOf(':');
if (domainSep == -1)
throw new MalformedObjectNameException("No domain separator was found.");
domain = name.substring(0, domainSep);
String rest = name.substring(domainSep + 1);
+ properties = new TreeMap<String,String>();
if (rest.equals("*"))
propertyPattern = true;
else
@@ -202,6 +243,7 @@ public class ObjectName
throws MalformedObjectNameException
{
this.domain = domain;
+ properties = new TreeMap<String,String>();
properties.put(key, value);
checkComponents();
}
@@ -224,6 +266,7 @@ public class ObjectName
throws MalformedObjectNameException
{
this.domain = domain;
+ this.properties = new TreeMap<String,String>();
this.properties.putAll(properties);
checkComponents();
}
@@ -744,6 +787,55 @@ public class ObjectName
return getCanonicalName();
}
+
+ /**
+ * Serialize this [EMAIL PROTECTED] ObjectName}. The serialized
+ * form is the same as the string parsed by the constructor.
+ *
+ * @param out the output stream to write to.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeObject(ObjectOutputStream out)
+ throws IOException
+ {
+ out.defaultWriteObject();
+ StringBuffer buffer = new StringBuffer(getDomain());
+ buffer.append(':');
+ String properties = getKeyPropertyListString();
+ buffer.append(properties);
+ if (isPropertyPattern())
+ {
+ if (properties.length() == 0)
+ buffer.append("*");
+ else
+ buffer.append(",*");
+ }
+ out.writeObject(buffer.toString());
+ }
+
+ /**
+ * Reads the serialized form, which is that used
+ * by the constructor.
+ *
+ * @param in the input stream to read from.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void readObject(ObjectInputStream in)
+ throws IOException, ClassNotFoundException
+ {
+ in.defaultReadObject();
+ String objectName = (String)in.readObject();
+ try
+ {
+ parse(objectName);
+ }
+ catch (MalformedObjectNameException x)
+ {
+ throw new InvalidObjectException(x.toString());
+ }
+ }
+
+
/**
* Unquotes the supplied string. The quotation marks are removed as
* are the backslashes preceding the escaped characters ('"', '?',
signature.asc
Description: Digital signature
