Skip to content

Commit 279415d

Browse files
committed
Push abstract class methods up to default methods
Move abstract method implementations from AbstractConverter to Converter, and from AbstractConvertService to ConvertService.
1 parent a23583a commit 279415d

File tree

4 files changed

+213
-301
lines changed

4 files changed

+213
-301
lines changed

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

Lines changed: 1 addition & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,6 @@
2929

3030
package org.scijava.convert;
3131

32-
import java.lang.reflect.Type;
33-
import java.util.Collection;
34-
import java.util.HashSet;
35-
import java.util.LinkedHashSet;
36-
import java.util.Set;
37-
3832
import org.scijava.plugin.AbstractHandlerService;
3933

4034
/**
@@ -46,127 +40,5 @@ public abstract class AbstractConvertService //
4640
extends AbstractHandlerService<ConversionRequest, Converter<?, ?>> //
4741
implements ConvertService
4842
{
49-
50-
// -- ConversionService methods --
51-
@SuppressWarnings({ "unchecked", "rawtypes" })
52-
@Override
53-
public Class<Converter<?, ?>> getPluginType() {
54-
return (Class) Converter.class;
55-
}
56-
57-
@Override
58-
public Class<ConversionRequest> getType() {
59-
return ConversionRequest.class;
60-
}
61-
62-
@Override
63-
public Converter<?, ?> getHandler(final Object src, final Class<?> dest) {
64-
return getHandler(new ConversionRequest(src, dest));
65-
}
66-
67-
@Override
68-
public Converter<?, ?> getHandler(final Class<?> src, final Class<?> dest) {
69-
return getHandler(new ConversionRequest(src, dest));
70-
}
71-
72-
@Override
73-
public Converter<?, ?> getHandler(final Object src, final Type dest) {
74-
return getHandler(new ConversionRequest(src, dest));
75-
}
76-
77-
@Override
78-
public Converter<?, ?> getHandler(final Class<?> src, final Type dest) {
79-
return getHandler(new ConversionRequest(src, dest));
80-
}
81-
82-
@Override
83-
public boolean supports(final Object src, final Class<?> dest) {
84-
return supports(new ConversionRequest(src, dest));
85-
}
86-
87-
@Override
88-
public boolean supports(final Class<?> src, final Class<?> dest) {
89-
return supports(new ConversionRequest(src, dest));
90-
}
91-
92-
@Override
93-
public boolean supports(final Object src, final Type dest) {
94-
return supports(new ConversionRequest(src, dest));
95-
}
96-
97-
@Override
98-
public boolean supports(final Class<?> src, final Type dest) {
99-
return supports(new ConversionRequest(src, dest));
100-
}
101-
102-
@Override
103-
public Collection<Object> getCompatibleInputs(final Class<?> dest) {
104-
final Set<Object> objects = new LinkedHashSet<>();
105-
106-
for (final Converter<?, ?> c : getInstances()) {
107-
if (dest.isAssignableFrom(c.getOutputType())) {
108-
c.populateInputCandidates(objects);
109-
}
110-
}
111-
112-
return objects;
113-
}
114-
115-
@Override
116-
public Object convert(final Object src, final Type dest) {
117-
return convert(new ConversionRequest(src, dest));
118-
}
119-
120-
@Override
121-
public <T> T convert(final Object src, final Class<T> dest) {
122-
// NB: repeated code with convert(ConversionRequest), because the
123-
// handler's convert method respects the T provided
124-
final Converter<?, ?> handler = getHandler(src, dest);
125-
return handler == null ? null : handler.convert(src, dest);
126-
}
127-
128-
@Override
129-
public Object convert(final ConversionRequest request) {
130-
final Converter<?, ?> handler = getHandler(request);
131-
return handler == null ? null : handler.convert(request);
132-
}
133-
134-
@Override
135-
public Collection<Class<?>> getCompatibleInputClasses(final Class<?> dest) {
136-
final Set<Class<?>> compatibleClasses = new HashSet<>();
137-
138-
for (final Converter<?, ?> converter : getInstances()) {
139-
addIfMatches(dest, converter.getOutputType(), converter.getInputType(), compatibleClasses);
140-
}
141-
142-
return compatibleClasses;
143-
}
144-
145-
@Override
146-
public Collection<Class<?>> getCompatibleOutputClasses(final Class<?> source) {
147-
final Set<Class<?>> compatibleClasses = new HashSet<>();
148-
149-
for (final Converter<?, ?> converter : getInstances()) {
150-
try {
151-
addIfMatches(source, converter.getInputType(), converter.getOutputType(), compatibleClasses);
152-
}
153-
catch (final Throwable t) {
154-
log().error("Malfunctioning converter plugin: " + //
155-
converter.getClass().getName(), t);
156-
}
157-
}
158-
159-
return compatibleClasses;
160-
}
161-
162-
// -- Helper methods --
163-
164-
/**
165-
* Test two classes; if they match, a third class is added to the provided
166-
* set of classes.
167-
*/
168-
private void addIfMatches(final Class<?> c1, final Class<?> c2, final Class<?> toAdd, final Set<Class<?>> classes) {
169-
if (c1 == c2)
170-
classes.add(toAdd);
171-
}
43+
// NB: This layer remains merely for backwards compatibility.
17244
}

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

Lines changed: 4 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -29,37 +29,17 @@
2929

3030
package org.scijava.convert;
3131

32-
import java.lang.reflect.Type;
3332
import java.util.Collection;
3433

3534
import org.scijava.object.ObjectService;
3635
import org.scijava.plugin.AbstractHandlerPlugin;
3736
import org.scijava.plugin.Parameter;
38-
import org.scijava.util.Types;
3937

4038
/**
4139
* Abstract superclass for {@link Converter} plugins. Performs appropriate
4240
* dispatching of {@link #canConvert(ConversionRequest)} and
4341
* {@link #convert(ConversionRequest)} calls based on the actual state of the
4442
* given {@link ConversionRequest}.
45-
* <p>
46-
* Note that the {@link #supports(ConversionRequest)} method is overridden as
47-
* well, to delegate to the appropriate {@link #canConvert}.
48-
* </p>
49-
* <p>
50-
* NB: by default, the {@link #populateInputCandidates(Collection)} method has a
51-
* dummy implementation. Effectively, this is opt-in behavior. If a converter
52-
* implementation would like to suggest candidates for conversion, this method
53-
* can be overridden.
54-
* </p>
55-
* <p>
56-
* NB: by default, the provied {@link #canConvert} methods will return
57-
* {@code false} if the input is {@code null}. This allows {@link Converter}
58-
* implementors to assume any input is non-{@code null} - but this behavior is
59-
* overridden. Casting {@code null Object} inputs is handled by the
60-
* {@link NullConverter}, while {@code null class} inputs are handled by the
61-
* {@link DefaultConverter}.
62-
* </p>
6343
*
6444
* @author Mark Hiner
6545
*/
@@ -72,59 +52,7 @@ public abstract class AbstractConverter<I, O> extends
7252
@Parameter(required = false)
7353
private ObjectService objectService;
7454

75-
// -- ConversionHandler methods --
76-
77-
@Override
78-
public boolean canConvert(final ConversionRequest request) {
79-
Object src = request.sourceObject();
80-
if (src == null) {
81-
Class<?> srcClass = request.sourceClass();
82-
if (request.destType() != null) return canConvert(srcClass, request.destType());
83-
return canConvert(srcClass, request.destClass());
84-
}
85-
86-
if (request.destType() != null) return canConvert(src, request.destType());
87-
return canConvert(src, request.destClass());
88-
}
89-
90-
@Override
91-
public boolean canConvert(final Object src, final Type dest) {
92-
if (src == null) return false;
93-
final Class<?> srcClass = src.getClass();
94-
return canConvert(srcClass, dest);
95-
}
96-
97-
@Override
98-
public boolean canConvert(final Object src, final Class<?> dest) {
99-
if (src == null) return false;
100-
final Class<?> srcClass = src.getClass();
101-
102-
return canConvert(srcClass, dest);
103-
}
104-
105-
@Override
106-
public boolean canConvert(final Class<?> src, final Class<?> dest) {
107-
if (src == null) return false;
108-
final Class<?> saneSrc = Types.box(src);
109-
final Class<?> saneDest = Types.box(dest);
110-
return Types.isAssignable(saneSrc, getInputType()) &&
111-
Types.isAssignable(getOutputType(), saneDest);
112-
}
113-
114-
@Override
115-
public Object convert(final Object src, final Type dest) {
116-
final Class<?> destClass = Types.raw(dest);
117-
return convert(src, destClass);
118-
}
119-
120-
@Override
121-
public Object convert(final ConversionRequest request) {
122-
if (request.destType() != null) {
123-
return convert(request.sourceObject(), request.destType());
124-
}
125-
126-
return convert(request.sourceObject(), request.destClass());
127-
}
55+
// -- Converter methods --
12856

12957
@Override
13058
public void populateInputCandidates(final Collection<Object> objects) {
@@ -138,20 +66,8 @@ public void populateInputCandidates(final Collection<Object> objects) {
13866

13967
@Override
14068
public boolean supports(final ConversionRequest request) {
141-
return canConvert(request);
142-
}
143-
144-
@Override
145-
public Class<ConversionRequest> getType() {
146-
return ConversionRequest.class;
147-
}
148-
149-
// -- Deprecated API --
150-
151-
@Override
152-
@Deprecated
153-
public boolean canConvert(final Class<?> src, final Type dest) {
154-
final Class<?> destClass = Types.raw(dest);
155-
return canConvert(src, destClass);
69+
// NB: Overridden just for backwards compatibility, so that
70+
// downstream classes which call super.supports do the right thing.
71+
return Converter.super.supports(request);
15672
}
15773
}

0 commit comments

Comments
 (0)