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