mx4j/src/core/javax/management/modelmbean DescriptorSupport.java,1.28,1.29

Jeremy Boynes <[email protected]> Thu, 10 Feb 2005 19:08:12 +0000
Newsgroups gmane.comp.java.mx4j.cvs
Message-ID <[email protected]>
Update of /cvsroot/mx4j/mx4j/src/core/javax/management/modelmbean
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv573/src/core/javax/management/modelmbean

Modified Files:
	DescriptorSupport.java 
Log Message:
Fix for [ 1120257 ] Several issues with DescriptorSupport
Store fields in a Map from lowercase name to ValueHolder so we can preserve original case
Implement read/write object to have right Serialized form whilst only needing one Map
Validation rules reflect spec JavaDoc

Index: DescriptorSupport.java
===================================================================
RCS file: /cvsroot/mx4j/mx4j/src/core/javax/management/modelmbean/DescriptorSupport.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -C2 -d -r1.28 -r1.29
*** DescriptorSupport.java	13 Nov 2004 16:38:42 -0000	1.28
--- DescriptorSupport.java	10 Feb 2005 19:08:08 -0000	1.29
***************
*** 12,16 ****
  import java.io.IOException;
  import java.io.ObjectInputStream;
! import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Iterator;
--- 12,16 ----
  import java.io.IOException;
  import java.io.ObjectInputStream;
! import java.io.ObjectOutputStream;
  import java.util.HashMap;
  import java.util.Iterator;
***************
*** 36,40 ****
     private static final long serialVersionUID = -6292969195866300415L;
  
-    private HashMap descriptor = new HashMap(20);
     private transient HashMap fields = new HashMap(20);
  
--- 36,39 ----
***************
*** 49,53 ****
           throw new RuntimeOperationsException(new IllegalArgumentException("Number of Fields cannot be <= 0"));
        }
-       descriptor = new HashMap(initNumFields);
        fields = new HashMap(initNumFields);
     }
--- 48,51 ----
***************
*** 82,89 ****
           {
              String pair = pairs[i];
!             if (pair == null)
!             {
!                throw new RuntimeOperationsException(new IllegalArgumentException("Illegal pair: " + pair));
!             }
              int equal = pair.indexOf('=');
              if (equal < 1)
--- 80,86 ----
           {
              String pair = pairs[i];
!             // null or empty strings are to be ignored
!             if (pair == null || pair.length() == 0) continue;
! 
              int equal = pair.indexOf('=');
              if (equal < 1)
***************
*** 129,134 ****
     {
        checkField(name, value);
!       descriptor.put(name, value);
!       fields.put(name.toLowerCase(), new ValueHolder(name, value));
     }
  
--- 126,135 ----
     {
        checkField(name, value);
! 
!       // update field but keep the original name if an entry already exists
!       String lcase = name.toLowerCase();
!       ValueHolder holder = (ValueHolder) fields.get(lcase);
!       ValueHolder newHolder = new ValueHolder(holder == null ? name : holder.fieldName, value);
!       fields.put(lcase, newHolder);
     }
  
***************
*** 137,142 ****
        if (name != null)
        {
!          ValueHolder holder = (ValueHolder)fields.remove(name.toLowerCase());
!          if (holder != null) descriptor.remove(holder.fieldName);
        }
     }
--- 138,142 ----
        if (name != null)
        {
!          fields.remove(name.toLowerCase());
        }
     }
***************
*** 144,149 ****
     public String[] getFieldNames()
     {
!       // Preserve the case of field names
!       String[] names = (String[])descriptor.keySet().toArray(new String[0]);
        return names;
     }
--- 144,155 ----
     public String[] getFieldNames()
     {
!       // Preserve the case of field names so use the ones from the values
!       String[] names = new String[fields.size()];
!       int x = 0;
!       for (Iterator i = fields.values().iterator(); i.hasNext();)
!       {
!          ValueHolder holder = (ValueHolder) i.next();
!          names[x++] = holder.fieldName;
!       }
        return names;
     }
***************
*** 151,188 ****
     public Object[] getFieldValues(String[] names)
     {
        if (names == null)
        {
           // All values must be returned
!          Object[] values = descriptor.values().toArray(new Object[0]);
!          return values;
        }
  
!       ArrayList list = new ArrayList();
        for (int i = 0; i < names.length; ++i)
        {
           try
           {
!             Object value = getFieldValue(names[i]);
!             list.add(value);
           }
           catch (RuntimeOperationsException x)
           {
!             list.add(null);
           }
        }
!       Object[] values = list.toArray(new Object[list.size()]);
!       return values;
     }
  
     public String[] getFields()
     {
!       ArrayList list = new ArrayList();
        StringBuffer buffer = new StringBuffer();
        // Preserve the case of field names
!       for (Iterator i = descriptor.entrySet().iterator(); i.hasNext();)
        {
!          Map.Entry entry = (Map.Entry)i.next();
!          String key = (String)entry.getKey();
!          Object value = entry.getValue();
           buffer.setLength(0);
           buffer.append(key);
--- 157,202 ----
     public Object[] getFieldValues(String[] names)
     {
+       // quick check for empty descriptor (which overrides all)
+       if (fields.isEmpty()) return new Object[0];
+ 
        if (names == null)
        {
           // All values must be returned
!          Object[] list = new Object[fields.size()];
!          int x = 0;
!          for (Iterator i = fields.values().iterator(); i.hasNext();)
!          {
!             ValueHolder holder = (ValueHolder) i.next();
!             list[x++] = holder.fieldValue;
!          }
!          return list;
        }
  
!       Object[] list = new Object[names.length];
        for (int i = 0; i < names.length; ++i)
        {
           try
           {
!             list[i] = getFieldValue(names[i]);
           }
           catch (RuntimeOperationsException x)
           {
!             list[i] = null;
           }
        }
!       return list;
     }
  
     public String[] getFields()
     {
!       String[] values = new String[fields.size()];
        StringBuffer buffer = new StringBuffer();
        // Preserve the case of field names
!       int x = 0;
!       for (Iterator i = fields.values().iterator(); i.hasNext();)
        {
!          ValueHolder holder = (ValueHolder) i.next();
!          String key = holder.fieldName;
!          Object value = holder.fieldValue;
           buffer.setLength(0);
           buffer.append(key);
***************
*** 201,208 ****
              }
           }
!          list.add(buffer.toString());
        }
!       String[] fields = (String[])list.toArray(new String[list.size()]);
!       return fields;
     }
  
--- 215,221 ----
              }
           }
!          values[x++] = buffer.toString();
        }
!       return values;
     }
  
***************
*** 226,235 ****
        try
        {
!          for (Iterator i = descriptor.entrySet().iterator(); i.hasNext();)
           {
!             Map.Entry entry = (Map.Entry)i.next();
!             String name = (String)entry.getKey();
!             Object value = entry.getValue();
!             checkField(name, value);
           }
           return true;
--- 239,246 ----
        try
        {
!          for (Iterator i = fields.values().iterator(); i.hasNext();)
           {
!             ValueHolder holder = (ValueHolder) i.next();
!             checkField(holder.fieldName, holder.fieldValue);
           }
           return true;
***************
*** 248,262 ****
        try
        {
!          if (descriptor.size() != 0)
           {
!             for (Iterator i = descriptor.entrySet().iterator();
!                  i.hasNext();
                      )
              {
!                Map.Entry entry = (Map.Entry)i.next();
!                Object value = entry.getValue();
                 String valstr = toXMLValueString(value);
                 buf.append("<field name=\"");
!                buf.append(entry.getKey());
                 buf.append("\" value=\"");
                 buf.append(valstr);
--- 259,272 ----
        try
        {
!          if (fields.size() != 0)
           {
!             for (Iterator i = fields.values().iterator(); i.hasNext();
                      )
              {
!                ValueHolder holder = (ValueHolder) i.next();
!                Object value = holder.fieldValue;
                 String valstr = toXMLValueString(value);
                 buf.append("<field name=\"");
!                buf.append(holder.fieldName);
                 buf.append("\" value=\"");
                 buf.append(valstr);
***************
*** 278,287 ****
        try
        {
!          if (descriptor.size() != 0)
           {
!             for (Iterator i = descriptor.entrySet().iterator(); i.hasNext();)
              {
!                Map.Entry entry = (Map.Entry)i.next();
!                buf.append(entry.getKey()).append(" ").append(entry.getValue());
                 if (i.hasNext())
                 {
--- 288,297 ----
        try
        {
!          if (fields.size() != 0)
           {
!             for (Iterator i = fields.values().iterator(); i.hasNext();)
              {
!                ValueHolder holder = (ValueHolder) i.next();
!                buf.append(holder.fieldName).append(" ").append(holder.fieldValue);
                 if (i.hasNext())
                 {
***************
*** 334,408 ****
        boolean isValid = true;
  
!       if (name.equalsIgnoreCase("name"))
!       {
!          isValid = value != null && value instanceof String && ((String)value).length() != 0;
!       }
!       else if (name.equalsIgnoreCase("descriptorType"))
!       {
!          isValid = value != null && (value.toString().equalsIgnoreCase("MBean") ||
!                                      value.toString().equalsIgnoreCase("attribute") ||
!                                      value.toString().equalsIgnoreCase("operation") ||
!                                      value.toString().equalsIgnoreCase("notification"));
!       }
!       else if (name.equalsIgnoreCase("role"))
        {
!          isValid = value != null && (value.equals("constructor") ||
!                                      value.equals("operation") ||
!                                      value.equals("getter") ||
!                                      value.equals("setter"));
        }
!       else if (name.equalsIgnoreCase("persistPolicy"))
        {
!          isValid = value != null && (value.toString().equalsIgnoreCase("Never") ||
!                                      value.toString().equalsIgnoreCase("OnTimer") ||
!                                      value.toString().equalsIgnoreCase("OnUpdate") ||
!                                      value.toString().equalsIgnoreCase("NoMoreOftenThan") ||
!                                      value.toString().equalsIgnoreCase("Always"));
        }
!       else if (name.equalsIgnoreCase("persistPeriod"))
        {
!          int v = objectToInt(value);
!          isValid = v >= -1;
        }
!       else if (name.equalsIgnoreCase("currencyTimeLimit"))
        {
!          int v = objectToInt(value);
!          isValid = v >= -1;
        }
        else if (name.equalsIgnoreCase("visibility"))
        {
!          int v = objectToInt(value);
!          isValid = v >= 1 && v <= 4;
!       }
!       else if (name.equalsIgnoreCase("getMethod") || name.equalsIgnoreCase("setMethod"))
!       {
!          isValid = value != null && value.toString().trim().length() > 0;
!       }
!       else if (name.equalsIgnoreCase("protocolMap"))
!       {
!          isValid = value instanceof Descriptor;
!       }
!       else if (name.equalsIgnoreCase("lastUpdatedTimeStamp"))
!       {
!          long v = objectToLong(value);
!          isValid = v > 0;
        }
        else if (name.equalsIgnoreCase("severity"))
        {
!          int v = objectToInt(value);
!          isValid = v >= 0 && v <= 6;
!       }
!       else if (name.equalsIgnoreCase("messageId"))
!       {
!          isValid = value != null;
        }
!       else if (name.equalsIgnoreCase("log"))
        {
!          isValid = value != null &&
!                    (value instanceof Boolean ||
!                     (value instanceof String && (value.toString().equalsIgnoreCase("true") ||
!                                                  value.toString().equalsIgnoreCase("false") ||
!                                                  value.toString().equalsIgnoreCase("t") ||
!                                                  value.toString().equalsIgnoreCase("f"))));
        }
  
--- 344,458 ----
        boolean isValid = true;
  
!       // checks relaxed to match JavaDoc
!       if (name.equalsIgnoreCase("name") || name.equalsIgnoreCase("descriptorType"))
        {
!          isValid = value instanceof String && ((String)value).length() != 0;
        }
!       else if (name.equalsIgnoreCase("class") ||
!               name.equalsIgnoreCase("role") ||
!               name.equalsIgnoreCase("getMethod") ||
!               name.equalsIgnoreCase("setMethod"))
        {
!          isValid = value instanceof String;
        }
!       else if (name.equalsIgnoreCase("persistPeriod") ||
!             name.equalsIgnoreCase("currencyTimeLimit") ||
!             name.equalsIgnoreCase("lastUpdatedTimeStamp") ||
!             name.equalsIgnoreCase("lastReturnedTimeStamp"))
        {
!          if (value instanceof Number)
!          {
!             isValid = ((Number)value).longValue() >= -1;
!          }
!          else if (value instanceof String)
!          {
!             try
!             {
!                isValid = Long.parseLong((String)value) >= -1;
!             } catch (NumberFormatException e)
!             {
!                isValid = false;
!             }
!          }
!          else
!          {
!             isValid = false;
!          }
        }
!       else if (name.equalsIgnoreCase("log"))
        {
!          if (value instanceof String)
!          {
!             String s = (String) value;
!             isValid = "t".equalsIgnoreCase(s) || "true".equalsIgnoreCase(s) ||
!                   "f".equalsIgnoreCase(s) || "false".equalsIgnoreCase(s);
!          }
!          else
!          {
!             isValid = value instanceof Boolean;
!          }
        }
        else if (name.equalsIgnoreCase("visibility"))
        {
!          if (value instanceof Number)
!          {
!             long l = ((Number)value).longValue();
!             isValid = l >= 1 && l <= 4;
!          }
!          else if (value instanceof String)
!          {
!             try
!             {
!                long l = Long.parseLong((String)value);
!                isValid = l >= 1 && l <= 4;
!             } catch (NumberFormatException e)
!             {
!                isValid = false;
!             }
!          }
!          else
!          {
!             isValid = false;
!          }
        }
        else if (name.equalsIgnoreCase("severity"))
        {
!          if (value instanceof Number)
!          {
!             long l = ((Number)value).longValue();
!             isValid = l >= 0 && l <= 6;
!          }
!          else if (value instanceof String)
!          {
!             try
!             {
!                long l = Long.parseLong((String)value);
!                isValid = l >= 0 && l <= 6;
!             } catch (NumberFormatException e)
!             {
!                isValid = false;
!             }
!          }
!          else
!          {
!             isValid = false;
!          }
        }
!       else if (name.equalsIgnoreCase("persistPolicy"))
        {
!          if (value instanceof String)
!          {
!             String s = (String) value;
!             isValid =
!                   "OnUpdate".equalsIgnoreCase(s) ||
!                   "OnTimer".equalsIgnoreCase(s) ||
!                   "NoMoreOftenThan".equalsIgnoreCase(s) ||
!                   "Always".equalsIgnoreCase(s) ||
!                   "Never".equalsIgnoreCase(s);
!          }
!          else
!          {
!             isValid = false;
!          }
        }
  
***************
*** 466,501 ****
     }
  
-    private int objectToInt(Object obj) throws RuntimeOperationsException
-    {
-       try
-       {
-          return Integer.parseInt(obj.toString());
-       }
-       catch (NumberFormatException x)
-       {
-          throw new RuntimeOperationsException(new IllegalArgumentException("Illegal value '" + obj + "' for numeric field"));
-       }
-       catch (NullPointerException x)
-       {
-          throw new RuntimeOperationsException(new IllegalArgumentException("Illegal value '" + obj + "' for numeric field"));
-       }
-    }
- 
-    private long objectToLong(Object obj) throws RuntimeOperationsException
-    {
-       try
-       {
-          return Long.parseLong(obj.toString());
-       }
-       catch (NumberFormatException x)
-       {
-          throw new RuntimeOperationsException(new IllegalArgumentException("Illegal value '" + obj + "' for numeric field"));
-       }
-       catch (NullPointerException x)
-       {
-          throw new RuntimeOperationsException(new IllegalArgumentException("Illegal value '" + obj + "' for numeric field"));
-       }
-    }
- 
     private Object parseValueString(String value) throws XMLParseException
     {
--- 516,519 ----
***************
*** 579,585 ****
     private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException
     {
!       stream.defaultReadObject();
!       this.fields = new HashMap(descriptor.size());
!       for (Iterator i = descriptor.entrySet().iterator(); i.hasNext();)
        {
           Map.Entry entry = (Map.Entry)i.next();
--- 597,603 ----
     private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException
     {
!       HashMap desc = (HashMap) stream.readObject();
!       this.fields = new HashMap(desc.size());
!       for (Iterator i = desc.entrySet().iterator(); i.hasNext();)
        {
           Map.Entry entry = (Map.Entry)i.next();
***************
*** 589,592 ****
--- 607,620 ----
     }
  
+    private void writeObject(ObjectOutputStream stream) throws IOException {
+       HashMap desc = new HashMap(fields.size());
+       for (Iterator i = fields.values().iterator(); i.hasNext();)
+       {
+          ValueHolder holder = (ValueHolder) i.next();
+          desc.put(holder.fieldName, holder.fieldValue);
+       }
+       stream.writeObject(desc);
+    }
+ 
     private static class ValueHolder
     {



-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click