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)}" }) }