6501362: DescriptorSupport(String) could recognize "name=value" as well as XML format
authorjfdenise
Tue, 09 Dec 2008 14:44:42 +0100
changeset 1698 2f0b565a475e
parent 1697 98a530cd0594
child 1699 3611e5fd6da5
6501362: DescriptorSupport(String) could recognize "name=value" as well as XML format Reviewed-by: emcmanus
jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java
jdk/test/javax/management/descriptor/DescriptorConstructorTest.java
--- a/jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java	Tue Dec 09 12:01:07 2008 +0100
+++ b/jdk/src/share/classes/javax/management/modelmbean/DescriptorSupport.java	Tue Dec 09 14:44:42 2008 +0100
@@ -229,9 +229,10 @@
             init(inDescr.descriptorMap);
     }
 
-
     /**
-     * <p>Descriptor constructor taking an XML String.</p>
+     * <p>Descriptor constructor taking an XML String or a
+     * <i>fieldName=fieldValue</i> format String. The String parameter is
+     * parsed as XML if it begins with a '<' character.</p>
      *
      * <p>The format of the XML string is not defined, but an
      * implementation must ensure that the string returned by
@@ -244,17 +245,20 @@
      * programmer will have to reset or convert these fields
      * correctly.</p>
      *
-     * @param inStr An XML-formatted string used to populate this
-     * Descriptor.  The format is not defined, but any
+     * @param inStr An XML-format or a fieldName=fieldValue formatted string
+     * used to populate this Descriptor.  The XML format is not defined, but any
      * implementation must ensure that the string returned by
      * method {@link #toXMLString toXMLString} on an existing
      * descriptor can be used to instantiate an equivalent
      * descriptor when instantiated using this constructor.
      *
-     * @exception RuntimeOperationsException If the String inStr
-     * passed in parameter is null
+     * @exception RuntimeOperationsException If the String inStr passed in
+     * parameter is null or, when it is not an XML string, if the field name or
+     * field value is illegal. If inStr is not an XML string then it must
+     * contain an "=". "fieldValue", "fieldName", and "fieldValue" are illegal.
+     * FieldName cannot be empty. "fieldName=" will cause the value to be empty.
      * @exception XMLParseException XML parsing problem while parsing
-     * the input String
+     * the XML-format input String
      * @exception MBeanException Wraps a distributed communication Exception.
      */
     /* At some stage we should rewrite this code to be cleverer.  Using
@@ -283,14 +287,27 @@
             throw new RuntimeOperationsException(iae, msg);
         }
 
+        // parse parameter string into structures
+
+        init(null);
+
+        if(!inStr.startsWith("<")) {
+            parseNamesValues(inStr);
+            if (MODELMBEAN_LOGGER.isLoggable(Level.FINEST)) {
+                MODELMBEAN_LOGGER.logp(Level.FINEST,
+                    DescriptorSupport.class.getName(),
+                    "Descriptor(name=value)", "Exit");
+            }
+            return;
+        }
+
         final String lowerInStr = inStr.toLowerCase();
         if (!lowerInStr.startsWith("<descriptor>")
             || !lowerInStr.endsWith("</descriptor>")) {
             throw new XMLParseException("No <descriptor>, </descriptor> pair");
         }
 
-        // parse xmlstring into structures
-        init(null);
+
         // create dummy descriptor: should have same size
         // as number of fields in xmlstring
         // loop through structures and put them in descriptor
@@ -454,6 +471,16 @@
 
         init(null);
 
+        parseNamesValues(fields);
+
+        if (MODELMBEAN_LOGGER.isLoggable(Level.FINEST)) {
+            MODELMBEAN_LOGGER.logp(Level.FINEST,
+                    DescriptorSupport.class.getName(),
+                    "Descriptor(String... fields)", "Exit");
+        }
+    }
+
+    private void parseNamesValues(String... fields) {
         for (int i=0; i < fields.length; i++) {
             if ((fields[i] == null) || (fields[i].equals(""))) {
                 continue;
@@ -495,11 +522,6 @@
 
             setField(fieldName,fieldValue);
         }
-        if (MODELMBEAN_LOGGER.isLoggable(Level.FINEST)) {
-            MODELMBEAN_LOGGER.logp(Level.FINEST,
-                    DescriptorSupport.class.getName(),
-                    "Descriptor(String... fields)", "Exit");
-        }
     }
 
     private void init(Map<String, ?> initMap) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/management/descriptor/DescriptorConstructorTest.java	Tue Dec 09 14:44:42 2008 +0100
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2004-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6501362
+ * @summary DescriptorSupport(String) could recognize "name=value" as well as XML format
+ * @author Jean-Francois Denise
+ * @run clean DescriptorConstructorTest
+ * @run build DescriptorConstructorTest
+ * @run main DescriptorConstructorTest
+ */
+
+import javax.management.modelmbean.DescriptorSupport;
+
+public class DescriptorConstructorTest {
+    public static void main(String[] args) throws Exception {
+        DescriptorSupport d1 = new DescriptorSupport("MyName1=MyValue1");
+        if(!d1.getFieldValue("MyName1").equals("MyValue1"))
+            throw new Exception("Invalid parsing");
+        DescriptorSupport d2 = new DescriptorSupport("<Descriptor>" +
+                "<field name=\"MyName2\" value=\"MyValue2\"></field></Descriptor>");
+        if(!d2.getFieldValue("MyName2").equals("MyValue2"))
+            throw new Exception("Invalid parsing");
+    }
+}