From 42eb9e3e1de1fb23be61afda9d7e6294c87d5bc9 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Thu, 7 May 2015 11:50:39 -0400 Subject: [PATCH 1/4] ConversionRequest: rename source object variable --- .../java/org/scijava/convert/ConversionRequest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/scijava/convert/ConversionRequest.java b/src/main/java/org/scijava/convert/ConversionRequest.java index e2510e377..be6d9dc92 100644 --- a/src/main/java/org/scijava/convert/ConversionRequest.java +++ b/src/main/java/org/scijava/convert/ConversionRequest.java @@ -63,7 +63,7 @@ public class ConversionRequest { // -- Fields -- private final Class srcClass; - private Object srcObject; + private Object src; private Class destClass; private Type destType; @@ -71,7 +71,7 @@ public class ConversionRequest { public ConversionRequest(final Object s, final Class d) { this(s == null ? null : s.getClass(), d); - srcObject = s; + src = s; } public ConversionRequest(final Class s, final Class d) { @@ -81,7 +81,7 @@ public ConversionRequest(final Class s, final Class d) { public ConversionRequest(final Object s, final Type d) { this(s == null ? null : s.getClass(), d); - srcObject = s; + src = s; } public ConversionRequest(final Class s, final Type d) { @@ -102,7 +102,7 @@ public Class sourceClass() { * @return Source object for conversion. */ public Object sourceObject() { - return srcObject; + return src; } /** @@ -133,6 +133,6 @@ public void setSourceObject(final Object o) { " provided. Expected: " + srcClass); } - srcObject = o; + src = o; } } From eb1a7733c0a47b882173f2e670485459dc7823cf Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Thu, 7 May 2015 11:52:22 -0400 Subject: [PATCH 2/4] ConversionRequest: tweak formatting --- src/main/java/org/scijava/convert/ConversionRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/scijava/convert/ConversionRequest.java b/src/main/java/org/scijava/convert/ConversionRequest.java index be6d9dc92..e8800fdb0 100644 --- a/src/main/java/org/scijava/convert/ConversionRequest.java +++ b/src/main/java/org/scijava/convert/ConversionRequest.java @@ -119,7 +119,7 @@ public Class destClass() { return destClass; } -// -- Setters -- + // -- Setters -- /** * Sets the source object for this {@link ConversionRequest}. From 44ba930ebe50c0a806e137df0d2767477a242447 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Thu, 7 May 2015 11:52:35 -0400 Subject: [PATCH 3/4] Converter: tweak formatting --- src/main/java/org/scijava/convert/Converter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/scijava/convert/Converter.java b/src/main/java/org/scijava/convert/Converter.java index e721e366e..2ad015dfe 100644 --- a/src/main/java/org/scijava/convert/Converter.java +++ b/src/main/java/org/scijava/convert/Converter.java @@ -47,8 +47,7 @@ * @see ConversionRequest * @author Mark Hiner */ -public interface Converter extends HandlerPlugin -{ +public interface Converter extends HandlerPlugin { /** * Checks whether a given {@ConversionRequest} can be From d98294180f89d5f0243d653d90ba4bc72628c0f5 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Thu, 7 May 2015 11:52:49 -0400 Subject: [PATCH 4/4] ConversionRequest: track Types, not Classes A converter may need to verify type compatibility not just at the Class level, but potentially for any generic type. Generic types are not available at runtime from object instances, but they are available in other scenarios; e.g., the ImageJ OPS framework uses the converter framework to decide type compatibility (i.e., assignability or convertibility) based on generic types. This is possible (rather than generics being erased at runtime) because OPS parameters are declared as instance fields, which can be introspected at runtime. --- .../scijava/convert/ConversionRequest.java | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/scijava/convert/ConversionRequest.java b/src/main/java/org/scijava/convert/ConversionRequest.java index e8800fdb0..4ca2b0fdd 100644 --- a/src/main/java/org/scijava/convert/ConversionRequest.java +++ b/src/main/java/org/scijava/convert/ConversionRequest.java @@ -33,6 +33,8 @@ import java.lang.reflect.Type; +import org.scijava.util.GenericUtils; + /** * Currency for use in {@link Converter} and {@link ConvertService} * methods. @@ -57,45 +59,49 @@ *

* * @author Mark Hiner + * @author Curtis Rueden */ public class ConversionRequest { // -- Fields -- - private final Class srcClass; + private final Type srcType; + private final Type destType; + private Object src; - private Class destClass; - private Type destType; // -- Constructors -- - public ConversionRequest(final Object s, final Class d) { - this(s == null ? null : s.getClass(), d); - src = s; + public ConversionRequest(final Object src, final Type destType) { + this(src, src == null ? null : src.getClass(), destType); } - public ConversionRequest(final Class s, final Class d) { - srcClass = s; - destClass = d; + public ConversionRequest(final Type srcType, final Type destType) { + this(null, srcType, destType); } - public ConversionRequest(final Object s, final Type d) { - this(s == null ? null : s.getClass(), d); - src = s; - } - - public ConversionRequest(final Class s, final Type d) { - srcClass = s; - destType = d; + public ConversionRequest(final Object src, final Type srcType, + final Type destType) + { + this.src = src; + this.srcType = srcType; + this.destType = destType; } // -- Accessors -- + /** + * @return Source type for conversion or lookup. + */ + public Type sourceType() { + return srcType; + } + /** * @return Source class for conversion or lookup. */ public Class sourceClass() { - return srcClass; + return GenericUtils.getClass(srcType); } /** @@ -116,7 +122,7 @@ public Type destType() { * @return Destination class for conversion. */ public Class destClass() { - return destClass; + return GenericUtils.getClass(destType); } // -- Setters -- @@ -128,11 +134,13 @@ public Class destClass() { * not match {@link #sourceClass()}. */ public void setSourceObject(final Object o) { - if (!srcClass.isAssignableFrom(o.getClass())) { + // TODO: More careful check against srcType itself. + if (!sourceClass().isInstance(o)) { throw new IllegalArgumentException("Object of type: " + o.getClass() + - " provided. Expected: " + srcClass); + " provided. Expected: " + srcType); } src = o; } + }