Skip to content

Commit 0c7956a

Browse files
committed
Refactor Converter layers
Refactors AbstractConverter and DefaultConverter to take into account the new NullConverter and the migration of boilerplate to AbstractConverter. Key points: * Control flow at the abstract layer attempts to preserve the Type if given, as this contains information that can be lost in a Class. * Removed several delegating method implementations from DefaultConverter
1 parent 14a1183 commit 0c7956a

File tree

2 files changed

+15
-41
lines changed

2 files changed

+15
-41
lines changed

src/main/java/org/scijava/convert/AbstractConverter.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,15 @@ public abstract class AbstractConverter<I, O> extends
6363

6464
@Override
6565
public boolean canConvert(final ConversionRequest request) {
66-
final Class<?> src = request.sourceClass();
67-
if (src == null) return true;
66+
Object src = request.sourceObject();
67+
if (src == null) {
68+
Class<?> srcClass = request.sourceClass();
69+
if (request.destType() != null) return canConvert(srcClass, request.destType());
70+
return canConvert(srcClass, request.destClass());
71+
}
6872

69-
if (request.destClass() != null) return canConvert(src, request.destClass());
7073
if (request.destType() != null) return canConvert(src, request.destType());
71-
72-
return false;
74+
return canConvert(src, request.destClass());
7375
}
7476

7577
@Override
@@ -80,8 +82,9 @@ public boolean canConvert(final Class<?> src, final Type dest) {
8082

8183
@Override
8284
public boolean canConvert(final Object src, final Type dest) {
83-
final Class<?> destClass = GenericUtils.getClass(dest);
84-
return canConvert(src, destClass);
85+
if (src == null) return false;
86+
final Class<?> srcClass = src.getClass();
87+
return canConvert(srcClass, dest);
8588
}
8689

8790
@Override
@@ -100,14 +103,11 @@ public Object convert(final Object src, final Type dest) {
100103

101104
@Override
102105
public Object convert(final ConversionRequest request) {
103-
if (request.sourceObject() != null) {
104-
if (request.destClass() != null) return convert(request.sourceObject(),
105-
request.destClass());
106-
107-
if (request.destType() != null) return convert(request.sourceObject(),
108-
request.destType());
106+
if (request.destType() != null) {
107+
return convert(request.sourceObject(), request.destType());
109108
}
110-
return null;
109+
110+
return convert(request.sourceObject(), request.destClass());
111111
}
112112

113113
@Override

src/main/java/org/scijava/convert/DefaultConverter.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,6 @@ public class DefaultConverter extends AbstractConverter<Object, Object> {
6161

6262
@Override
6363
public boolean canConvert(final Class<?> src, final Type dest) {
64-
// NB: Regardless of whether the destination type is an array or collection,
65-
// we still want to cast directly if doing so is possible. But note that in
66-
// general, this check does not detect cases of incompatible generic
67-
// parameter types. If this limitation becomes a problem in the future we
68-
// can extend the logic here to provide additional signatures of canCast
69-
// which operate on Types in general rather than only Classes. However, the
70-
// logic could become complex very quickly in various subclassing cases,
71-
// generic parameters resolved vs. propagated, etc.
72-
final Class<?> c = GenericUtils.getClass(dest);
73-
if (c != null && ConversionUtils.canCast(src, c)) return true;
7464

7565
// Handle array types, including generic array types.
7666
if (isArray(dest)) return true;
@@ -80,8 +70,7 @@ public boolean canConvert(final Class<?> src, final Type dest) {
8070
return createCollection(GenericUtils.getClass(dest)) != null;
8171
}
8272

83-
// This wasn't a collection or array, so convert it as a single element.
84-
return canConvert(src, GenericUtils.getClass(dest));
73+
return super.canConvert(src, dest);
8574
}
8675

8776
@Override
@@ -125,18 +114,6 @@ public boolean canConvert(final Class<?> src, final Class<?> dest) {
125114
}
126115
}
127116

128-
@Override
129-
public boolean canConvert(final Object src, final Type dest) {
130-
if (src == null) return true;
131-
return canConvert(src.getClass(), dest);
132-
}
133-
134-
@Override
135-
public boolean canConvert(final Object src, final Class<?> dest) {
136-
if (src == null) return true;
137-
return canConvert(src.getClass(), dest);
138-
}
139-
140117
@Override
141118
public Object convert(final Object src, final Type dest) {
142119
// NB: Regardless of whether the destination type is an array or collection,
@@ -167,9 +144,6 @@ public Object convert(final Object src, final Type dest) {
167144

168145
@Override
169146
public <T> T convert(final Object src, final Class<T> dest) {
170-
// TODO: Would be better to split up this method into some helpers.
171-
if (dest == null) return null;
172-
if (src == null) return ConversionUtils.getNullValue(dest);
173147

174148
// ensure type is well-behaved, rather than a primitive type
175149
final Class<T> saneDest = ConversionUtils.getNonprimitiveType(dest);

0 commit comments

Comments
 (0)