<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><style type="text/css"><!--
#msg DL { border : 1px #006 solid; background-color : #369; padding : 6px; color : #fff; }
#msg DT { float : left; width : 6em; font-weight : bold; }
#msg DL, #msg DT, #msg UL, #msg LI { font-family : arial,helvetica,sans-serif; font-size : 10pt; }
h3 { font-family : arial,helvetica,sans-serif; font-size : 10pt; font-weight : bold; }
#msg PRE { overflow : auto; white-space : normal; background-color : #ffc; border : 1px #fc0 solid; padding : 6px; }
#msg UL, PRE, .diff { overflow : auto; }
#patch h4 { font-family : arial,helvetica,sans-serif; font-size : 10pt; }
#patch h4 { padding: 8px; background : #369; color : #fff; margin : 0; }
#patch .propset h4, #patch .binary h4 {margin: 0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {background:#eeeeee;padding: 0 0 10px 0;}
#patch .propset .diff, #patch .binary .diff {padding: 10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch .add {background:#ddffdd;}
#patch .rem {background:#ffdddd;}
#patch .lines, .info {color:#888888;background:#ffffff;}
.diff { width : 100%; }
#msg DL { border : 1px #006 solid; background-color : #369; padding : 6px; color : #fff; }
#msg DT { float : left; width : 6em; font-weight : bold; }
#msg DL, #msg DT, #msg UL, #msg LI { font-family : arial,helvetica,sans-serif; font-size : 10pt; }
h3 { font-family : arial,helvetica,sans-serif; font-size : 10pt; font-weight : bold; }
#msg PRE { overflow : auto; white-space : normal; background-color : #ffc; border : 1px #fc0 solid; padding : 6px; }
#msg UL, PRE, .diff { overflow : auto; }
#patch h4 { font-family : arial,helvetica,sans-serif; font-size : 10pt; }
#patch h4 { padding: 8px; background : #369; color : #fff; margin : 0; }
#patch .propset h4, #patch .binary h4 {margin: 0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {background:#eeeeee;padding: 0 0 10px 0;}
#patch .propset .diff, #patch .binary .diff {padding: 10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch .add {background:#ddffdd;}
#patch .rem {background:#ffdddd;}
#patch .lines, .info {color:#888888;background:#ffffff;}
.diff { width : 100%; }
--></style>
<title>[rhq-project.org rhq] [5276] Bug 535794 - modified code to conditionally handle PropertyMap as it is not instance of Map as assumed.</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd>5276</dd>
<dt>Author</dt> <dd>spinder</dd>
<dt>Date</dt> <dd>2010-01-18 11:26:43 -0600 (Mon, 18 Jan 2010)</dd>
</dl>
<h3>Log Message</h3>
<pre> Bug 535794 - modified code to conditionally handle PropertyMap as it is not instance of Map as assumed. Added code to order listings as UI does.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#rhqbranchesRHQ_1_3_0_GA_CPmodulesenterpriseremotingclisrcmainjavaorgrhqenterpriseclientTabularWriterjava">rhq/branches/RHQ_1_3_0_GA_CP/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/TabularWriter.java</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="rhqbranchesRHQ_1_3_0_GA_CPmodulesenterpriseremotingclisrcmainjavaorgrhqenterpriseclientTabularWriterjava"></a>
<div class="modfile"><h4>Modified: rhq/branches/RHQ_1_3_0_GA_CP/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/TabularWriter.java (5275 => 5276)</h4>
<pre class="diff">
<span class="info">--- rhq/branches/RHQ_1_3_0_GA_CP/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/TabularWriter.java 2010-01-18 16:00:38 UTC (rev 5275)
+++ rhq/branches/RHQ_1_3_0_GA_CP/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/TabularWriter.java 2010-01-18 17:26:43 UTC (rev 5276)
</span><span class="lines">@@ -18,31 +18,32 @@
</span><span class="cx"> */
package org.rhq.enterprise.client;
</span><span class="rem">-import au.com.bytecode.opencsv.CSVWriter;
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.Property;
-import org.rhq.core.domain.configuration.PropertyList;
-import org.rhq.core.domain.configuration.PropertyMap;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.measurement.ResourceAvailability;
-import org.rhq.enterprise.client.utility.LazyLoadScenario;
-import org.rhq.enterprise.client.utility.ShortOutput;
-
</span><span class="cx"> import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
</span><span class="add">+import java.util.Arrays;
</span><span class="cx"> import java.util.Collection;
import java.util.HashSet;
</span><span class="add">+import java.util.LinkedHashMap;
</span><span class="cx"> import java.util.List;
import java.util.Map;
import java.util.Set;
</span><span class="rem">-import java.util.LinkedHashMap;
-import java.util.Arrays;
</span><span class="cx">
</span><span class="add">+import au.com.bytecode.opencsv.CSVWriter;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.measurement.ResourceAvailability;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.client.utility.LazyLoadScenario;
+import org.rhq.enterprise.client.utility.ShortOutput;
+
</span><span class="cx"> /**
* @author Greg Hinkle
*/
</span><span class="lines">@@ -95,7 +96,6 @@
</span><span class="cx"> this.out = out;
}
</span><span class="rem">-
</span><span class="cx"> public TabularWriter(PrintWriter out) {
this.out = out;
}
</span><span class="lines">@@ -112,28 +112,25 @@
</span><span class="cx"> public void print(Object object) {
if (object instanceof Map) {
</span><span class="rem">- print((Map)object);
</span><span class="add">+ print((Map) object);
</span><span class="cx"> return;
}
</span><span class="rem">-
</span><span class="cx"> if (object instanceof Collection) {
print((Collection) object);
return;
}
</span><span class="rem">-
</span><span class="cx"> if (object instanceof Configuration) {
print((Configuration) object);
return;
}
if (object != null && object.getClass().isArray()) {
</span><span class="rem">- print((Object[])object);
</span><span class="add">+ print((Object[]) object);
</span><span class="cx"> return;
}
</span><span class="rem">-
</span><span class="cx"> try {
if (SIMPLE_TYPES.contains(object.getClass())) {
</span><span class="lines">@@ -145,12 +142,11 @@
</span><span class="cx"> Map<String, PropertyInfo> properties = new LinkedHashMap<String, PropertyInfo>();
int maxLength = 0;
</span><span class="rem">-
</span><span class="cx"> for (PropertyDescriptor pd : summaryFilter.getPropertyDescriptors(object, exportMode)) {
Method m = pd.getReadMethod();
Object val = null;
if (m != null) {
</span><span class="rem">- val = invoke(object,m);
</span><span class="add">+ val = invoke(object, m);
</span><span class="cx"> }
if (val != null) {
</span><span class="lines">@@ -171,8 +167,7 @@
</span><span class="cx"> e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
</span><span class="rem">- }
- catch (IntrospectionException e) {
</span><span class="add">+ } catch (IntrospectionException e) {
</span><span class="cx"> e.printStackTrace();
}
</span><span class="lines">@@ -196,8 +191,7 @@
</span><span class="cx">
if (exportMode || !String.class.equals(propertyInfo.type)) {
out.println(propertyInfo.value);
</span><span class="rem">- }
- else {
</span><span class="add">+ } else {
</span><span class="cx"> out.println(abbreviate(propertyInfo.value, width - 12 - maxLength));
}
}
</span><span class="lines">@@ -236,7 +230,7 @@
</span><span class="cx"> }
if ((offset + (maxWidth - 3)) < string.length()) {
</span><span class="rem">- return "..." + abbreviate(string.substring(offset), maxWidth - 3);
</span><span class="add">+ return "..." + abbreviate(string.substring(offset), maxWidth - 3);
</span><span class="cx"> }
return "..." + string.substring(string.length() - (maxWidth - 3));
</span><span class="lines">@@ -253,11 +247,10 @@
</span><span class="cx"> data[i][1] = shortVersion(value);
i++;
}
</span><span class="rem">- this.headers = new String[] { "Key", "Value"};
</span><span class="add">+ this.headers = new String[] { "Key", "Value" };
</span><span class="cx"> print(data);
}
</span><span class="rem">-
</span><span class="cx"> public void print(Collection list) {
// List of arbitrary objects
if (list == null || list.size() == 0)
</span><span class="lines">@@ -270,25 +263,21 @@
</span><span class="cx">
String[][] data = null;
</span><span class="rem">-
</span><span class="cx"> if (!allOneType(list)) {
printStrings(list);
} else {
</span><span class="rem">-
</span><span class="cx"> Object firstObject = list.iterator().next();
try {
</span><span class="rem">-
</span><span class="cx"> if (firstObject instanceof String) {
</span><span class="rem">- headers = new String[]{"Value"};
</span><span class="add">+ headers = new String[] { "Value" };
</span><span class="cx"> data = new String[list.size()][1];
int i = 0;
for (Object object : list) {
data[i++][0] = (String) object;
}
</span><span class="rem">-
</span><span class="cx"> } else {
if (consistentMaps(list)) {
</span><span class="lines">@@ -308,8 +297,9 @@
</span><span class="cx"> if (m != null) {
val = invoke(row, pd.getReadMethod());
}
</span><span class="rem">- if ((val != null && !(val instanceof Collection)) ||
- ((val != null && (val instanceof Collection) && !((Collection) val).isEmpty())))
</span><span class="add">+ if ((val != null && !(val instanceof Collection))
+ || ((val != null && (val instanceof Collection) && !((Collection) val)
+ .isEmpty())))
</span><span class="cx"> allNull = false;
}
if (!allNull && !IGNORED_PROPS.contains(pd.getName())) {
</span><span class="lines">@@ -320,7 +310,6 @@
</span><span class="cx"> }
}
</span><span class="rem">-
</span><span class="cx"> headers = new String[pdList.size()];
data = new String[list.size()][pdList.size()];
</span><span class="lines">@@ -339,13 +328,12 @@
</span><span class="cx"> i++;
}
</span><span class="rem">-
</span><span class="cx"> this.print(data);
}
}
} catch (Exception e) {
</span><span class="rem">- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
</span><span class="add">+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
</span><span class="cx"> } finally {
headers = null;
}
</span><span class="lines">@@ -355,9 +343,6 @@
</span><span class="cx">
}
</span><span class="rem">-
-
-
</span><span class="cx"> private boolean consistentMaps(Collection list) {
List<String> keys = null;
String[][] data = new String[list.size()][];
</span><span class="lines">@@ -369,18 +354,52 @@
</span><span class="cx"> if (keys == null) {
keys = new ArrayList<String>();
</span><span class="rem">- for (Object key : ((Map) row).keySet()) {
- String headerKey = stringValueOf(key);
- keys.add(headerKey);
</span><span class="add">+ //insert check for PropertyMap as they are not instances of Map
+ if (row instanceof PropertyMap) {
+ //TODO: spinder 1/15/10. PropertyMap is arbitrarily complex. Only serialize simple props?
+ for (Object key : ((PropertyMap) row).getMap().keySet()) {
+ String headerKey = stringValueOf(key);
+ keys.add(headerKey);
+ }
+ } else {//else row is a Map
+ for (Object key : ((Map) row).keySet()) {
+ String headerKey = stringValueOf(key);
+ keys.add(headerKey);
+ }
</span><span class="cx"> }
</span><span class="add">+ //conditionally put order on the headers to mimic core gui listing style/order
+ //Ex. Pid Name Size User Time Kernel Time
+ if (keys.contains("pid")) {
+ String[] processAttribute = { "pid", "name", "size", "userTime", "kernelTime" };
+ List<String> newKeyOrder = new ArrayList<String>();
+ for (String attribute : processAttribute) {
+ newKeyOrder.add(attribute);
+ keys.remove(attribute);
+ }
+ //postpend remaining keys if any to the newHeader list
+ for (String key : keys) {
+ newKeyOrder.add(key);
+ }
+ keys = newKeyOrder;
+ }
</span><span class="cx"> }
data[i] = new String[keys.size()];
</span><span class="rem">- for (Object key : ((Map) row).keySet()) {
- if (!keys.contains(stringValueOf(key))) {
- return false;
</span><span class="add">+ if (row instanceof PropertyMap) {
+ for (String key : keys) {
+ if (!keys.contains(stringValueOf(key))) {
+ return false;
+ }
+ data[i][keys.lastIndexOf(stringValueOf(key))] = shortVersion(((PropertyMap) row).get(String
+ .valueOf(key)));
</span><span class="cx"> }
</span><span class="rem">- data[i][keys.lastIndexOf(stringValueOf(key))] = shortVersion(((Map) row).get(key));
</span><span class="add">+ } else {//else row is a Map
+ for (Object key : ((Map) row).keySet()) {
+ if (!keys.contains(stringValueOf(key))) {
+ return false;
+ }
+ data[i][keys.lastIndexOf(stringValueOf(key))] = shortVersion(((Map) row).get(key));
+ }
</span><span class="cx"> }
i++;
}
</span><span class="lines">@@ -395,7 +414,6 @@
</span><span class="cx">
}
</span><span class="rem">-
</span><span class="cx"> public void print(Configuration config) {
out.println("Configuration [" + config.getId() + "] - " + config.getNotes());
for (PropertySimple p : config.getSimpleProperties().values()) {
</span><span class="lines">@@ -419,7 +437,6 @@
</span><span class="cx"> if (p.getList().get(0) instanceof PropertyMap) {
consistentMaps(p.getList());
</span><span class="rem">-
</span><span class="cx"> } else {
for (Property entry : p.getList()) {
if (entry instanceof PropertySimple) {
</span><span class="lines">@@ -446,7 +463,6 @@
</span><span class="cx"> out.println(indent(depth) + "}");
}
</span><span class="rem">-
</span><span class="cx"> private String indent(int x) {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < x; i++) {
</span><span class="lines">@@ -455,7 +471,6 @@
</span><span class="cx"> return buf.toString();
}
</span><span class="rem">-
</span><span class="cx"> private void printStrings(Collection list) {
for (Object object : list) {
out.println(stringValueOf(object));
</span><span class="lines">@@ -563,7 +578,6 @@
</span><span class="cx"> out.print(data.length + " rows\n");
}
</span><span class="rem">-
</span><span class="cx"> private void printSpaced(PrintWriter out, String data, int length) {
int dataLength = data.length();
if (dataLength > length) {
</span><span class="lines">@@ -608,12 +622,10 @@
</span><span class="cx"> this.exportMode = exportMode;
}
</span><span class="rem">-
-
</span><span class="cx"> private static String shortVersion(Object object) {
if (object instanceof ShortOutput) {
</span><span class="rem">- return ((ShortOutput)object).getShortOutput();
</span><span class="add">+ return ((ShortOutput) object).getShortOutput();
</span><span class="cx"> } else if (object instanceof PropertySimple) {
return ((PropertySimple) object).getStringValue();
} else if (object instanceof ResourceType) {
</span><span class="lines">@@ -627,9 +639,6 @@
</span><span class="cx"> }
}
</span><span class="rem">-
-
-
</span><span class="cx"> private static Object invoke(Object o, Method m) throws IllegalAccessException, InvocationTargetException {
boolean access = m.isAccessible();
m.setAccessible(true);
</span>
</pre>
</div>
</div>
</body>
</html>
|