|
32 | 32 | package org.scijava.convert; |
33 | 33 |
|
34 | 34 | import java.lang.reflect.Type; |
| 35 | +import java.util.Collection; |
| 36 | +import java.util.HashSet; |
| 37 | +import java.util.Set; |
35 | 38 |
|
36 | 39 | import org.scijava.plugin.AbstractHandlerService; |
37 | 40 | import org.scijava.util.ConversionUtils; |
38 | 41 |
|
39 | 42 | /** |
40 | | - * Abstract superclass for {@link ConvertService} implementations. Sets |
41 | | - * this service as the active delegate service in {@link ConversionUtils}. |
| 43 | + * Abstract superclass for {@link ConvertService} implementations. Sets this |
| 44 | + * service as the active delegate service in {@link ConversionUtils}. |
42 | 45 | * |
43 | 46 | * @author Mark Hiner |
44 | 47 | */ |
45 | | -public abstract class AbstractConvertService extends |
46 | | - AbstractHandlerService<ConversionRequest, Converter<?, ?>> implements |
47 | | - ConvertService |
48 | | -{ |
| 48 | +public abstract class AbstractConvertService extends AbstractHandlerService<ConversionRequest, Converter<?, ?>> |
| 49 | + implements ConvertService { |
49 | 50 |
|
50 | 51 | // -- ConversionService methods -- |
| 52 | + @SuppressWarnings({ "unchecked", "rawtypes" }) |
| 53 | + @Override |
| 54 | + public Class<Converter<?, ?>> getPluginType() { |
| 55 | + return (Class) Converter.class; |
| 56 | + } |
| 57 | + |
| 58 | + @Override |
| 59 | + public Class<ConversionRequest> getType() { |
| 60 | + return ConversionRequest.class; |
| 61 | + } |
| 62 | + |
| 63 | + @Override |
| 64 | + public Converter<?, ?> getHandler(final Object src, final Class<?> dest) { |
| 65 | + return getHandler(new ConversionRequest(src, dest)); |
| 66 | + } |
| 67 | + |
| 68 | + @Override |
| 69 | + public Converter<?, ?> getHandler(final Class<?> src, final Class<?> dest) { |
| 70 | + return getHandler(new ConversionRequest(src, dest)); |
| 71 | + } |
| 72 | + |
| 73 | + @Override |
| 74 | + public Converter<?, ?> getHandler(final Object src, final Type dest) { |
| 75 | + return getHandler(new ConversionRequest(src, dest)); |
| 76 | + } |
| 77 | + |
| 78 | + @Override |
| 79 | + public Converter<?, ?> getHandler(final Class<?> src, final Type dest) { |
| 80 | + return getHandler(new ConversionRequest(src, dest)); |
| 81 | + } |
| 82 | + |
| 83 | + @Override |
| 84 | + public boolean supports(final Object src, final Class<?> dest) { |
| 85 | + return supports(new ConversionRequest(src, dest)); |
| 86 | + } |
| 87 | + |
| 88 | + @Override |
| 89 | + public boolean supports(final Class<?> src, final Class<?> dest) { |
| 90 | + return supports(new ConversionRequest(src, dest)); |
| 91 | + } |
51 | 92 |
|
52 | 93 | @Override |
53 | | - public Object convert(Object src, Type dest) { |
| 94 | + public boolean supports(final Object src, final Type dest) { |
| 95 | + return supports(new ConversionRequest(src, dest)); |
| 96 | + } |
| 97 | + |
| 98 | + @Override |
| 99 | + public boolean supports(final Class<?> src, final Type dest) { |
| 100 | + return supports(new ConversionRequest(src, dest)); |
| 101 | + } |
| 102 | + |
| 103 | + @Override |
| 104 | + public Collection<Object> getCompatibleInputs(final Class<?> dest) { |
| 105 | + final Set<Object> objects = new HashSet<Object>(); |
| 106 | + |
| 107 | + for (final Converter<?, ?> c : getInstances()) { |
| 108 | + if (dest.isAssignableFrom(c.getOutputType())) { |
| 109 | + c.populateInputCandidates(objects); |
| 110 | + } |
| 111 | + } |
| 112 | + |
| 113 | + return objects; |
| 114 | + } |
| 115 | + |
| 116 | + @Override |
| 117 | + public Object convert(final Object src, final Type dest) { |
54 | 118 | return convert(new ConversionRequest(src, dest)); |
55 | 119 | } |
56 | 120 |
|
57 | 121 | @Override |
58 | | - public <T> T convert(Object src, Class<T> dest) { |
| 122 | + public <T> T convert(final Object src, final Class<T> dest) { |
59 | 123 | // NB: repeated code with convert(ConversionRequest), because the |
60 | 124 | // handler's convert method respects the T provided |
61 | | - Converter<?, ?> handler = getHandler(src, dest); |
| 125 | + final Converter<?, ?> handler = getHandler(src, dest); |
62 | 126 | return handler == null ? null : handler.convert(src, dest); |
63 | 127 | } |
64 | 128 |
|
65 | 129 | @Override |
66 | | - public Object convert(ConversionRequest request) { |
67 | | - Converter<?, ?> handler = getHandler(request); |
| 130 | + public Object convert(final ConversionRequest request) { |
| 131 | + final Converter<?, ?> handler = getHandler(request); |
68 | 132 | return handler == null ? null : handler.convert(request); |
69 | 133 | } |
70 | 134 |
|
| 135 | + @Override |
| 136 | + public Collection<Class<?>> getCompatibleInputClasses(final Class<?> dest) { |
| 137 | + final Set<Class<?>> compatibleClasses = new HashSet<Class<?>>(); |
| 138 | + |
| 139 | + for (final Converter<?, ?> converter : getInstances()) { |
| 140 | + addIfMatches(dest, converter.getOutputType(), converter.getInputType(), compatibleClasses); |
| 141 | + } |
| 142 | + |
| 143 | + return compatibleClasses; |
| 144 | + } |
| 145 | + |
| 146 | + @Override |
| 147 | + public Collection<Class<?>> getCompatibleOutputClasses(final Class<?> source) { |
| 148 | + final Set<Class<?>> compatibleClasses = new HashSet<Class<?>>(); |
| 149 | + |
| 150 | + for (final Converter<?, ?> converter : getInstances()) { |
| 151 | + addIfMatches(source, converter.getInputType(), converter.getOutputType(), compatibleClasses); |
| 152 | + } |
| 153 | + |
| 154 | + return compatibleClasses; |
| 155 | + } |
| 156 | + |
71 | 157 | // -- Service methods -- |
72 | 158 |
|
73 | 159 | @Override |
74 | 160 | public void initialize() { |
75 | 161 | ConversionUtils.setDelegateService(this, getPriority()); |
76 | 162 | } |
| 163 | + |
| 164 | + // -- Helper methods -- |
| 165 | + |
| 166 | + /** |
| 167 | + * Test two classes; if they match, a third class is added to the provided |
| 168 | + * set of classes. |
| 169 | + */ |
| 170 | + private void addIfMatches(final Class<?> c1, final Class<?> c2, final Class<?> toAdd, final Set<Class<?>> classes) { |
| 171 | + if (c1 == c2) |
| 172 | + classes.add(toAdd); |
| 173 | + } |
77 | 174 | } |
0 commit comments