You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2022/06/24 09:22:23 UTC
[groovy] 03/03: GROOVY-10661: reduce some duplication in Inspector (port to 3_0_X)
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit b94d761b9c26b56399499b20d13daa11efd2ec52
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Jun 23 23:58:52 2022 +1000
GROOVY-10661: reduce some duplication in Inspector (port to 3_0_X)
---
src/main/java/groovy/inspect/Inspector.java | 117 +++++++++------------
.../groovy/groovy/console/ui/ObjectBrowser.groovy | 28 ++---
2 files changed, 61 insertions(+), 84 deletions(-)
diff --git a/src/main/java/groovy/inspect/Inspector.java b/src/main/java/groovy/inspect/Inspector.java
index 73fa806d6a..61fd80a970 100644
--- a/src/main/java/groovy/inspect/Inspector.java
+++ b/src/main/java/groovy/inspect/Inspector.java
@@ -22,6 +22,7 @@ import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import groovy.lang.MetaMethod;
import groovy.lang.PropertyValue;
+import groovy.lang.Tuple2;
import org.codehaus.groovy.runtime.DefaultGroovyMethods;
import org.codehaus.groovy.runtime.InvokerHelper;
@@ -59,7 +60,6 @@ public class Inspector {
public static final int MEMBER_PARAMS_IDX = 5;
public static final int MEMBER_VALUE_IDX = 5;
public static final int MEMBER_EXCEPTIONS_IDX = 6;
- public static final int MEMBER_RAW_VALUE_IDX = 6;
public static final String NOT_APPLICABLE = "n/a";
public static final String GROOVY = "GROOVY";
@@ -164,12 +164,12 @@ public class Inspector {
return result;
}
- public Object[] getPublicFieldsWithRawValue() {
+ public Object[] getPublicFieldsWithInfo() {
Field[] fields = getClassUnderInspection().getFields();
Object[] result = new Object[fields.length];
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
- result[i] = fieldInfoWithRawValue(field);
+ result[i] = fieldWithInfo(field);
}
return result;
}
@@ -190,17 +190,6 @@ public class Inspector {
return result;
}
- public Object[] getPropertyInfoWithRawValue() {
- List props = DefaultGroovyMethods.getMetaPropertyValues(objectUnderInspection);
- Object[] result = new Object[props.size()];
- int i = 0;
- for (Iterator iter = props.iterator(); iter.hasNext(); i++) {
- PropertyValue pv = (PropertyValue) iter.next();
- result[i] = fieldInfoWithRawValue(pv);
- }
- return result;
- }
-
protected String[] fieldInfo(Field field) {
String[] result = new String[MEMBER_VALUE_IDX + 1];
result[MEMBER_ORIGIN_IDX] = JAVA;
@@ -216,23 +205,22 @@ public class Inspector {
return withoutNulls(result);
}
- protected Object[] fieldInfoWithRawValue(Field field) {
- Object[] result = new Object[MEMBER_RAW_VALUE_IDX + 1];
- result[MEMBER_ORIGIN_IDX] = JAVA;
- result[MEMBER_MODIFIER_IDX] = Modifier.toString(field.getModifiers());
- result[MEMBER_DECLARER_IDX] = shortName(field.getDeclaringClass());
- result[MEMBER_TYPE_IDX] = shortName(field.getType());
- result[MEMBER_NAME_IDX] = field.getName();
+ protected Tuple2<Object, String[]> fieldWithInfo(Field field) {
+ String[] info = new String[MEMBER_VALUE_IDX + 1];
+ info[MEMBER_ORIGIN_IDX] = JAVA;
+ info[MEMBER_MODIFIER_IDX] = Modifier.toString(field.getModifiers());
+ info[MEMBER_DECLARER_IDX] = shortName(field.getDeclaringClass());
+ info[MEMBER_TYPE_IDX] = shortName(field.getType());
+ info[MEMBER_NAME_IDX] = field.getName();
+ info = withoutNulls(info);
Object rawValue = null;
try {
rawValue = field.get(objectUnderInspection);
- result[MEMBER_VALUE_IDX] = InvokerHelper.inspect(rawValue);
+ info[MEMBER_VALUE_IDX] = InvokerHelper.inspect(rawValue);
} catch (IllegalAccessException e) {
- result[MEMBER_VALUE_IDX] = NOT_APPLICABLE;
+ info[MEMBER_VALUE_IDX] = NOT_APPLICABLE;
}
- result = withoutNullsWithRawValue(result);
- result[MEMBER_RAW_VALUE_IDX] = rawValue;
- return result;
+ return new Tuple2<>(rawValue, info);
}
protected String[] fieldInfo(PropertyValue pv) {
@@ -250,22 +238,31 @@ public class Inspector {
return withoutNulls(result);
}
- protected Object[] fieldInfoWithRawValue(PropertyValue pv) {
- Object[] result = new Object[MEMBER_VALUE_IDX + 2];
- result[MEMBER_ORIGIN_IDX] = GROOVY;
- result[MEMBER_MODIFIER_IDX] = "public";
- result[MEMBER_DECLARER_IDX] = NOT_APPLICABLE;
- result[MEMBER_TYPE_IDX] = shortName(pv.getType());
- result[MEMBER_NAME_IDX] = pv.getName();
- Object rawValue = null;
+ protected Tuple2<Object, String[]> fieldWithInfo(PropertyValue pv) {
+ String[] info = new String[MEMBER_VALUE_IDX + 1];
+ info[MEMBER_ORIGIN_IDX] = GROOVY;
+ info[MEMBER_MODIFIER_IDX] = "public";
+ info[MEMBER_DECLARER_IDX] = NOT_APPLICABLE;
+ info[MEMBER_TYPE_IDX] = shortName(pv.getType());
+ info[MEMBER_NAME_IDX] = pv.getName();
+ Object field = null;
try {
- rawValue = pv.getValue();
- result[MEMBER_VALUE_IDX] = InvokerHelper.inspect(rawValue);
+ field = pv.getValue();
+ info[MEMBER_VALUE_IDX] = InvokerHelper.inspect(field);
} catch (Exception e) {
- result[MEMBER_VALUE_IDX] = NOT_APPLICABLE;
+ info[MEMBER_VALUE_IDX] = NOT_APPLICABLE;
+ }
+ info = withoutNulls(info);
+ return new Tuple2<>(field, info);
+ }
+
+ public Object[] getPropertiesWithInfo() {
+ List<PropertyValue> props = DefaultGroovyMethods.getMetaPropertyValues(objectUnderInspection);
+ Object[] result = new Object[props.size()];
+ int i = 0;
+ for (Iterator<PropertyValue> iter = props.iterator(); iter.hasNext(); i++) {
+ result[i] = fieldWithInfo(iter.next());
}
- result = withoutNullsWithRawValue(result);
- result[MEMBER_RAW_VALUE_IDX] = rawValue;
return result;
}
@@ -349,15 +346,6 @@ public class Inspector {
return toNormalize;
}
- protected Object[] withoutNullsWithRawValue(Object[] toNormalize) {
- for (int i = 0; i < toNormalize.length; i++) {
- if (toNormalize[i] == null) {
- toNormalize[i] = NOT_APPLICABLE;
- }
- }
- return toNormalize;
- }
-
public static void print(Object[] memberInfo) {
print(System.out, memberInfo);
}
@@ -374,7 +362,11 @@ public class Inspector {
}
public static Collection sort(List<Object> memberInfo) {
- memberInfo.sort(new MemberComparator());
+ return sort(memberInfo, new MemberComparator());
+ }
+
+ public static Collection sort(List<Object> memberInfo, Comparator<Object> comparator) {
+ memberInfo.sort(comparator);
return memberInfo;
}
@@ -399,30 +391,15 @@ public class Inspector {
}
}
- public static Collection sortWithRawValue(List<Object> memberInfo) {
- memberInfo.sort(new MemberComparatorWithRawValue());
- return memberInfo;
- }
-
- public static class MemberComparatorWithRawValue implements Comparator<Object>, Serializable {
- private static final long serialVersionUID = -7691851726606749542L;
+ public static class MemberComparatorWithValue implements Comparator<Object>, Serializable {
+ private static final long serialVersionUID = 294298614093394525L;
+ private static final MemberComparator delegate = new MemberComparator();
@Override
public int compare(Object a, Object b) {
- Object[] aStr = (Object[]) a;
- Object[] bStr = (Object[]) b;
- int result = ((String) aStr[Inspector.MEMBER_NAME_IDX]).compareTo((String) bStr[Inspector.MEMBER_NAME_IDX]);
- if (0 != result) return result;
- result = ((String) aStr[Inspector.MEMBER_TYPE_IDX]).compareTo((String) bStr[Inspector.MEMBER_TYPE_IDX]);
- if (0 != result) return result;
- result = ((String)aStr[Inspector.MEMBER_PARAMS_IDX]).compareTo((String) bStr[Inspector.MEMBER_PARAMS_IDX]);
- if (0 != result) return result;
- result =((String) aStr[Inspector.MEMBER_DECLARER_IDX]).compareTo((String) bStr[Inspector.MEMBER_DECLARER_IDX]);
- if (0 != result) return result;
- result = ((String)aStr[Inspector.MEMBER_MODIFIER_IDX]).compareTo((String) bStr[Inspector.MEMBER_MODIFIER_IDX]);
- if (0 != result) return result;
- result = ((String) aStr[Inspector.MEMBER_ORIGIN_IDX]).compareTo((String) bStr[Inspector.MEMBER_ORIGIN_IDX]);
- return result;
+ Tuple2<Object, String[]> aTuple = (Tuple2<Object, String[]>) a;
+ Tuple2<Object, String[]> bTuple = (Tuple2<Object, String[]>) b;
+ return delegate.compare(aTuple.getV2(), bTuple.getV2());
}
}
}
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy
index 26769b5a0b..2db788cd2b 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy
@@ -37,7 +37,6 @@ import static groovy.inspect.Inspector.MEMBER_ORIGIN_IDX
import static groovy.inspect.Inspector.MEMBER_PARAMS_IDX
import static groovy.inspect.Inspector.MEMBER_TYPE_IDX
import static groovy.inspect.Inspector.MEMBER_VALUE_IDX
-import static groovy.inspect.Inspector.MEMBER_RAW_VALUE_IDX
/**
* A little GUI to show some of the Inspector capabilities.
@@ -52,6 +51,7 @@ class ObjectBrowser {
def inspector
def path
def swing, frame, fieldTable, methodTable, arrayTable, collectionTable, mapTable
+ private static final Comparator<Object> comparator = new Inspector.MemberComparatorWithValue()
static void main(args) {
inspect('some String')
@@ -96,7 +96,7 @@ class ObjectBrowser {
tableModel(list: inspector.object.toList().withIndex()) {
closureColumn(header: 'Index', read: { it[1] })
closureColumn(header: 'Value', read: { it[0] })
- closureColumn(header: 'Raw Value', read: { it[0] }) // to support sorting
+ closureColumn(header: 'Raw Value', read: { it[0] })
}
}
arrayTable.columnModel.getColumn(2).with {
@@ -114,7 +114,7 @@ class ObjectBrowser {
tableModel(list: inspector.object.withIndex()) {
closureColumn(header: 'Index', read: { it[1] })
closureColumn(header: 'Value', read: { it[0] })
- closureColumn(header: 'Raw Value', read: { it[0] }) // to support sorting
+ closureColumn(header: 'Raw Value', read: { it[0] })
}
}
collectionTable.columnModel.getColumn(2).with {
@@ -133,7 +133,7 @@ class ObjectBrowser {
closureColumn(header: 'Index', read: { it[1] })
closureColumn(header: 'Key', read: { it[0].key })
closureColumn(header: 'Value', read: { it[0].value })
- closureColumn(header: 'Raw Value', read: { it[0].value }) // to support sorting
+ closureColumn(header: 'Raw Value', read: { it[0].value })
}
}
mapTable.columnModel.getColumn(3).with {
@@ -148,16 +148,16 @@ class ObjectBrowser {
}
scrollPane(name: ' Public Fields and Properties ') {
fieldTable = table(selectionMode: SINGLE_SELECTION) {
- def data = Inspector.sortWithRawValue(inspector.publicFieldsWithRawValue.toList())
- data.addAll(Inspector.sortWithRawValue(inspector.propertyInfoWithRawValue.toList()))
+ def data = Inspector.sort(inspector.propertiesWithInfo.toList(), comparator)
+ data.addAll(Inspector.sort(inspector.publicFieldsWithInfo.toList(), comparator))
tableModel(list: data) {
- closureColumn(header: 'Name', read: { it[MEMBER_NAME_IDX] })
- closureColumn(header: 'Value', read: { it[MEMBER_VALUE_IDX] })
- closureColumn(header: 'Type', read: { it[MEMBER_TYPE_IDX] })
- closureColumn(header: 'Origin', read: { it[MEMBER_ORIGIN_IDX] })
- closureColumn(header: 'Modifier', read: { it[MEMBER_MODIFIER_IDX] })
- closureColumn(header: 'Declarer', read: { it[MEMBER_DECLARER_IDX] })
- closureColumn(header: 'Raw Value', read: { it[MEMBER_RAW_VALUE_IDX] }) // to support sorting
+ closureColumn(header: 'Name', read: { it.v2[MEMBER_NAME_IDX] })
+ closureColumn(header: 'Value', read: { it.v2[MEMBER_VALUE_IDX] })
+ closureColumn(header: 'Type', read: { it.v2[MEMBER_TYPE_IDX] })
+ closureColumn(header: 'Origin', read: { it.v2[MEMBER_ORIGIN_IDX] })
+ closureColumn(header: 'Modifier', read: { it.v2[MEMBER_MODIFIER_IDX] })
+ closureColumn(header: 'Declarer', read: { it.v2[MEMBER_DECLARER_IDX] })
+ closureColumn(header: 'Raw Value', read: { it.v1 })
}
}
fieldTable.columnModel.getColumn(6).with {
@@ -165,7 +165,7 @@ class ObjectBrowser {
maxWidth = 0
width = 0
}
- fieldTable.addMouseListener(makeClickAdapter(fieldTable, MEMBER_RAW_VALUE_IDX) { row ->
+ fieldTable.addMouseListener(makeClickAdapter(fieldTable, 6) { row ->
path + (path.size() == 0 ? '' : '.') + "${fieldTable.model.getValueAt(row, 0)}"
})
}