Repository: groovy Updated Branches: refs/heads/master 0d86565c5 -> 6f6735356
formatting Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/6f673535 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/6f673535 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/6f673535 Branch: refs/heads/master Commit: 6f67353565e98c3c8c707f355974ff1296231275 Parents: 0d86565 Author: paulk <pa...@asert.com.au> Authored: Mon Jul 25 18:15:13 2016 +1000 Committer: paulk <pa...@asert.com.au> Committed: Mon Jul 25 18:15:13 2016 +1000 ---------------------------------------------------------------------- .../typehandling/DefaultTypeTransformation.java | 167 +++++++++---------- 1 file changed, 80 insertions(+), 87 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/6f673535/src/main/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java b/src/main/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java index 94e0084..e55b574 100644 --- a/src/main/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java +++ b/src/main/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java @@ -24,7 +24,14 @@ import groovy.lang.GroovyRuntimeException; import org.codehaus.groovy.reflection.ReflectionCache; import org.codehaus.groovy.reflection.stdclasses.CachedSAMClass; -import org.codehaus.groovy.runtime.*; +import org.codehaus.groovy.runtime.DefaultGroovyMethods; +import org.codehaus.groovy.runtime.InvokerHelper; +import org.codehaus.groovy.runtime.InvokerInvocationException; +import org.codehaus.groovy.runtime.IteratorClosureAdapter; +import org.codehaus.groovy.runtime.MethodClosure; +import org.codehaus.groovy.runtime.NullObject; +import org.codehaus.groovy.runtime.ResourceGroovyMethods; +import org.codehaus.groovy.runtime.StringGroovyMethods; import java.io.File; import java.io.IOException; @@ -34,12 +41,17 @@ import java.lang.reflect.Modifier; import java.math.BigDecimal; import java.math.BigInteger; import java.text.MessageFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; /** * Class providing various type conversions, coercions and boxing/unboxing operations. - * - * @author Guillaume Laforge */ public class DefaultTypeTransformation { @@ -50,7 +62,7 @@ public class DefaultTypeTransformation { // -------------------------------------------------------- // unboxing methods // -------------------------------------------------------- - + public static byte byteUnbox(Object value) { Number n = castToNumber(value, byte.class); return n.byteValue(); @@ -87,7 +99,7 @@ public class DefaultTypeTransformation { public static double doubleUnbox(Object value) { Number n = castToNumber(value, double.class); return n.doubleValue(); - } + } // -------------------------------------------------------- // boxing methods @@ -132,12 +144,12 @@ public class DefaultTypeTransformation { public static Object box(double value) { return Double.valueOf(value); } - + public static Number castToNumber(Object object) { // default to Number class in exception details, else use the specified Number subtype. return castToNumber(object, Number.class); } - + public static Number castToNumber(Object object, Class type) { if (object instanceof Number) return (Number) object; @@ -165,7 +177,7 @@ public class DefaultTypeTransformation { /** * Method used for coercing an object to a boolean value, - * thanks to an <code>asBoolean()</code> method added on types. + * thanks to an <code>asBoolean()</code> method added on types. * * @param object to coerce to a boolean value * @return a boolean value @@ -175,16 +187,16 @@ public class DefaultTypeTransformation { if (object == null) { return false; } - + // equality check is enough and faster than instanceof check, no need to check superclasses since Boolean is final - if (object.getClass() == Boolean.class) { - return ((Boolean)object).booleanValue(); + if (object.getClass() == Boolean.class) { + return ((Boolean) object).booleanValue(); } - + // if the object is not null and no Boolean, try to call an asBoolean() method on the object - return (Boolean)InvokerHelper.invokeMethod(object, "asBoolean", InvokerHelper.EMPTY_ARGS); + return (Boolean) InvokerHelper.invokeMethod(object, "asBoolean", InvokerHelper.EMPTY_ARGS); } - + @Deprecated public static char castToChar(Object object) { if (object instanceof Character) { @@ -196,13 +208,12 @@ public class DefaultTypeTransformation { String text = object.toString(); if (text.length() == 1) { return text.charAt(0); - } - else { - throw new GroovyCastException(text,char.class); + } else { + throw new GroovyCastException(text, char.class); } } } - + public static Object castToType(Object object, Class type) { if (object == null) return null; if (type == Object.class) return object; @@ -216,7 +227,7 @@ public class DefaultTypeTransformation { if (type.isEnum()) { return ShortTypeHandling.castToEnum(object, type); } else if (Collection.class.isAssignableFrom(type)) { - return continueCastOnCollection(object,type); + return continueCastOnCollection(object, type); } else if (type == String.class) { return ShortTypeHandling.castToString(object); } else if (type == Character.class) { @@ -226,10 +237,10 @@ public class DefaultTypeTransformation { } else if (type == Class.class) { return ShortTypeHandling.castToClass(object); } else if (type.isPrimitive()) { - return castToPrimitive(object,type); + return castToPrimitive(object, type); } - return continueCastOnNumber(object,type); + return continueCastOnNumber(object, type); } private static Object continueCastOnCollection(Object object, Class type) { @@ -237,7 +248,7 @@ public class DefaultTypeTransformation { Collection answer; if (object instanceof Collection && type.isAssignableFrom(LinkedHashSet.class) && (type == LinkedHashSet.class || Modifier.isAbstract(modifiers) || Modifier.isInterface(modifiers))) { - return new LinkedHashSet((Collection)object); + return new LinkedHashSet((Collection) object); } if (object.getClass().isArray()) { if (type.isAssignableFrom(ArrayList.class) && (Modifier.isAbstract(modifiers) || Modifier.isInterface(modifiers))) { @@ -249,9 +260,8 @@ public class DefaultTypeTransformation { // passing in the list wrapper try { answer = (Collection) type.newInstance(); - } - catch (Exception e) { - throw new GroovyCastException("Could not instantiate instance of: " + type.getName() + ". Reason: " + e); + } catch (Exception e) { + throw new GroovyCastException("Could not instantiate instance of: " + type.getName() + ". Reason: " + e); } } @@ -264,7 +274,7 @@ public class DefaultTypeTransformation { return answer; } - return continueCastOnNumber(object,type); + return continueCastOnNumber(object, type); } private static Object continueCastOnNumber(Object object, Class type) { @@ -321,7 +331,7 @@ public class DefaultTypeTransformation { private static Object castToPrimitive(Object object, Class type) { if (type == boolean.class) { - return booleanUnbox(object); + return booleanUnbox(object); } else if (type == byte.class) { return byteUnbox(object); } else if (type == char.class) { @@ -344,13 +354,13 @@ public class DefaultTypeTransformation { } return answer; } //nothing else possible - throw new GroovyCastException(object,type); + throw new GroovyCastException(object, type); } private static Object continueCastOnSAM(Object object, Class type) { if (object instanceof Closure) { Method m = CachedSAMClass.getSAMMethod(type); - if (m!=null) { + if (m != null) { return CachedSAMClass.coerceToSAM((Closure) object, m, type, type.isInterface()); } } @@ -373,13 +383,13 @@ public class DefaultTypeTransformation { if (args != null) { try { return InvokerHelper.invokeConstructorOf(type, args); - } catch (InvokerInvocationException iie){ + } catch (InvokerInvocationException iie) { throw iie; } catch (GroovyRuntimeException e) { - if(e.getMessage().contains("Could not find matching constructor for")) { + if (e.getMessage().contains("Could not find matching constructor for")) { try { return InvokerHelper.invokeConstructorOf(type, object); - } catch (InvokerInvocationException iie){ + } catch (InvokerInvocationException iie) { throw iie; } catch (Exception ex) { // let's ignore exception and return the original object @@ -425,7 +435,7 @@ public class DefaultTypeTransformation { return array; } - + public static <T> Collection<T> asCollection(T[] value) { return arrayAsCollection(value); } @@ -433,39 +443,30 @@ public class DefaultTypeTransformation { public static Collection asCollection(Object value) { if (value == null) { return Collections.EMPTY_LIST; - } - else if (value instanceof Collection) { + } else if (value instanceof Collection) { return (Collection) value; - } - else if (value instanceof Map) { + } else if (value instanceof Map) { Map map = (Map) value; return map.entrySet(); - } - else if (value.getClass().isArray()) { + } else if (value.getClass().isArray()) { return arrayAsCollection(value); - } - else if (value instanceof MethodClosure) { + } else if (value instanceof MethodClosure) { MethodClosure method = (MethodClosure) value; IteratorClosureAdapter adapter = new IteratorClosureAdapter(method.getDelegate()); method.call(adapter); return adapter.asList(); - } - else if (value instanceof String || value instanceof GString) { + } else if (value instanceof String || value instanceof GString) { return StringGroovyMethods.toList((CharSequence) value); - } - else if (value instanceof File) { + } else if (value instanceof File) { try { return ResourceGroovyMethods.readLines((File) value); - } - catch (IOException e) { + } catch (IOException e) { throw new GroovyRuntimeException("Error reading file: " + value, e); } - } - else if (value instanceof Class && ((Class)value).isEnum()) { - Object[] values = (Object[])InvokerHelper.invokeMethod(value, "values", EMPTY_OBJECT_ARRAY); + } else if (value instanceof Class && ((Class) value).isEnum()) { + Object[] values = (Object[]) InvokerHelper.invokeMethod(value, "values", EMPTY_OBJECT_ARRAY); return Arrays.asList(values); - } - else { + } else { // let's assume it's a collection of 1 return Collections.singletonList(value); } @@ -493,7 +494,7 @@ public class DefaultTypeTransformation { @Deprecated public static boolean isEnumSubclass(Object value) { if (value instanceof Class) { - Class superclass = ((Class)value).getSuperclass(); + Class superclass = ((Class) value).getSuperclass(); while (superclass != null) { if (superclass.getName().equals("java.lang.Enum")) { return true; @@ -504,7 +505,7 @@ public class DefaultTypeTransformation { return false; } - + /** * Allows conversion of arrays into a mutable List * @@ -523,16 +524,16 @@ public class DefaultTypeTransformation { } return list; } - + public static Object[] primitiveArrayBox(Object array) { int size = Array.getLength(array); Object[] ret = (Object[]) Array.newInstance(ReflectionCache.autoboxType(array.getClass().getComponentType()), size); for (int i = 0; i < size; i++) { - ret[i]=Array.get(array, i); + ret[i] = Array.get(array, i); } return ret; } - + /** * Compares the two objects handling nulls gracefully and performing numeric type coercion if required */ @@ -546,8 +547,7 @@ public class DefaultTypeTransformation { } if (left == null) { return -1; - } - else if (right == null) { + } else if (right == null) { return 1; } if (left instanceof Comparable) { @@ -558,32 +558,27 @@ public class DefaultTypeTransformation { if (isValidCharacterString(right)) { return DefaultGroovyMethods.compareTo((Number) left, ShortTypeHandling.castToChar(right)); } - } - else if (left instanceof Character) { + } else if (left instanceof Character) { if (isValidCharacterString(right)) { - return DefaultGroovyMethods.compareTo((Character)left, ShortTypeHandling.castToChar(right)); + return DefaultGroovyMethods.compareTo((Character) left, ShortTypeHandling.castToChar(right)); } if (right instanceof Number) { - return DefaultGroovyMethods.compareTo((Character)left,(Number)right); + return DefaultGroovyMethods.compareTo((Character) left, (Number) right); } - } - else if (right instanceof Number) { + } else if (right instanceof Number) { if (isValidCharacterString(left)) { - return DefaultGroovyMethods.compareTo(ShortTypeHandling.castToChar(left),(Number) right); + return DefaultGroovyMethods.compareTo(ShortTypeHandling.castToChar(left), (Number) right); } - } - else if (left instanceof String && right instanceof Character) { + } else if (left instanceof String && right instanceof Character) { return ((String) left).compareTo(right.toString()); - } - else if (left instanceof String && right instanceof GString) { + } else if (left instanceof String && right instanceof GString) { return ((String) left).compareTo(right.toString()); - } - else if (left instanceof GString && right instanceof String) { + } else if (left instanceof GString && right instanceof String) { return ((GString) left).compareTo(right); } if (!equalityCheckOnly || left.getClass().isAssignableFrom(right.getClass()) || (right.getClass() != Object.class && right.getClass().isAssignableFrom(left.getClass())) //GROOVY-4046 - ) { + ) { Comparable comparable = (Comparable) left; // GROOVY-7876: when comparing for equality we try to only call compareTo when an assignable // relationship holds but with a container/holder class and because of erasure, we might still end @@ -636,11 +631,11 @@ public class DefaultTypeTransformation { return DefaultGroovyMethods.equals((List) left, (List) right); } if (left instanceof Map.Entry && right instanceof Map.Entry) { - Object k1 = ((Map.Entry)left).getKey(); - Object k2 = ((Map.Entry)right).getKey(); + Object k1 = ((Map.Entry) left).getKey(); + Object k2 = ((Map.Entry) right).getKey(); if (k1 == k2 || (k1 != null && k1.equals(k2))) { - Object v1 = ((Map.Entry)left).getValue(); - Object v2 = ((Map.Entry)right).getValue(); + Object v1 = ((Map.Entry) left).getValue(); + Object v2 = ((Map.Entry) right).getValue(); if (v1 == v2 || (v1 != null && DefaultTypeTransformation.compareEqual(v1, v2))) return true; } @@ -687,8 +682,7 @@ public class DefaultTypeTransformation { // conservative coding if (a.getClass().getName().equals("[I")) { ans = (int[]) a; - } - else { + } else { Object[] ia = (Object[]) a; ans = new int[ia.length]; for (int i = 0; i < ia.length; i++) { @@ -860,8 +854,7 @@ public class DefaultTypeTransformation { } if (type == Double.TYPE) { return convertToDoubleArray(a); - } - else { + } else { return a; } } @@ -880,12 +873,12 @@ public class DefaultTypeTransformation { public static Object castToVargsArray(Object[] origin, int firstVargsPos, Class<?> arrayType) { Class<?> componentType = arrayType.getComponentType(); - if (firstVargsPos>= origin.length) return Array.newInstance(componentType, 0); - int length = origin.length-firstVargsPos; - if (length==1 && arrayType.isInstance(origin[firstVargsPos])) return origin[firstVargsPos]; + if (firstVargsPos >= origin.length) return Array.newInstance(componentType, 0); + int length = origin.length - firstVargsPos; + if (length == 1 && arrayType.isInstance(origin[firstVargsPos])) return origin[firstVargsPos]; Object newArray = Array.newInstance(componentType, length); - for (int i=0; i<length; i++) { - Object convertedValue = castToType(origin[firstVargsPos+i],componentType); + for (int i = 0; i < length; i++) { + Object convertedValue = castToType(origin[firstVargsPos + i], componentType); Array.set(newArray, i, convertedValue); } return newArray;