Skip to content

Commit

Permalink
Merge branch 'api-driven-translation'
Browse files Browse the repository at this point in the history
Removes all @attr usage from Translators, Filters, and MetadataWrappers.

This also eliminates the static constants that were being used in the @attr
fields, as these constants can cause versioning issues when they are copied
into consuming libraries (e.g., even if the SCIFIO library updates these
constants, the copied values will remain until the consuming library is
recompiled).

All functionality that used the @attr annotation is now API-based.

Closes #20
Closes #108
  • Loading branch information
hinerm committed Dec 12, 2013
2 parents 53b7b79 + be67219 commit c343e83
Show file tree
Hide file tree
Showing 42 changed files with 434 additions and 712 deletions.
18 changes: 13 additions & 5 deletions scifio/src/main/java/io/scif/DefaultTranslator.java
Expand Up @@ -39,7 +39,6 @@
import java.util.List;

import org.scijava.Priority;
import org.scijava.plugin.Attr;
import org.scijava.plugin.Plugin;

/**
Expand All @@ -51,12 +50,21 @@
* @see io.scif.ImageMetadata
* @author Mark Hiner
*/
@Plugin(type = Translator.class, attrs = {
@Attr(name = DefaultTranslator.SOURCE, value = Metadata.CNAME),
@Attr(name = DefaultTranslator.DEST, value = Metadata.CNAME) },
priority = Priority.VERY_LOW_PRIORITY)
@Plugin(type = Translator.class, priority = Priority.VERY_LOW_PRIORITY)
public class DefaultTranslator extends AbstractTranslator<Metadata, Metadata> {

// -- Translater API Methods --

@Override
public Class<? extends io.scif.Metadata> source() {
return io.scif.Metadata.class;
}

@Override
public Class<? extends io.scif.Metadata> dest() {
return io.scif.Metadata.class;
}

@Override
protected void typedTranslate(final Metadata source, final Metadata dest) {
final List<ImageMetadata> metaList = source.getAll();
Expand Down
11 changes: 0 additions & 11 deletions scifio/src/main/java/io/scif/Metadata.java
Expand Up @@ -59,17 +59,6 @@ public interface Metadata extends Serializable, HasFormat, HasSource,
HasMetaTable
{

// -- Static Constents --

/**
* String representation of this classes package-qualified name.
* <p>
* Necessary for dynamic use annotations. All Metadata implementations should
* override this constant.
* </p>
*/
public static final String CNAME = "io.scif.Metadata";

// -- Metadata API --

/**
Expand Down
22 changes: 13 additions & 9 deletions scifio/src/main/java/io/scif/Translator.java
Expand Up @@ -36,6 +36,8 @@

package io.scif;

import org.scijava.plugin.SingletonPlugin;

/**
* Interface for all SCIFIO {@code Translators}.
* <p>
Expand All @@ -60,18 +62,20 @@
* @see io.scif.services.TranslatorService
* @author Mark Hiner
*/
public interface Translator extends SCIFIOPlugin {

// -- Fields --

/** Source key flag, for use in annotations. */
public static final String SOURCE = "source";

/** Destination key flag, for use in annotations. */
public static final String DEST = "dest";
public interface Translator extends SCIFIOPlugin, SingletonPlugin {

// -- Translator API methods --

/**
* @return The Metadata class accepted by this translator as input
*/
Class<? extends Metadata> source();

/**
* @return The Metadata class accepted by this translator as output
*/
Class<? extends Metadata> dest();

/**
* Uses the source {@code Metadata} to populate the destination
* {@code Metadata}
Expand Down
5 changes: 5 additions & 0 deletions scifio/src/main/java/io/scif/filters/AbstractFilter.java
Expand Up @@ -76,6 +76,11 @@ public AbstractFilter(final Class<? extends T> parentClass) {

// -- Filter API Methods --

@Override
public boolean enabledDefault() {
return false;
}

@Override
public T getParent() {
return parent;
Expand Down
59 changes: 26 additions & 33 deletions scifio/src/main/java/io/scif/filters/AbstractReaderFilter.java
Expand Up @@ -46,14 +46,11 @@

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.scijava.Context;
import org.scijava.plugin.Parameter;
import org.scijava.plugin.Plugin;
import org.scijava.plugin.PluginInfo;
import org.scijava.plugin.PluginService;
import org.scijava.util.ClassUtils;

/**
* Abstract superclass for all {@link io.scif.filters.Filter} that delegate to
Expand Down Expand Up @@ -82,7 +79,7 @@ public abstract class AbstractReaderFilter extends AbstractFilter<Reader>
/* Need to wrap each Reader's Metadata separately */
private Metadata wrappedMeta = null;

private final Class<? extends Metadata> metaClass;
private final Class<? extends MetadataWrapper> metaClass;

@Parameter
private PluginService pluginService;
Expand All @@ -93,7 +90,8 @@ public AbstractReaderFilter() {
this(null);
}

public AbstractReaderFilter(final Class<? extends Metadata> metaClass) {
public AbstractReaderFilter(final Class<? extends MetadataWrapper> metaClass)
{
super(Reader.class);
this.metaClass = metaClass;
}
Expand Down Expand Up @@ -140,42 +138,37 @@ protected Metadata getParentMeta() {

// -- Filter API Methods --

@Override
public Class<?> target() {
return io.scif.Reader.class;
}

@Override
public void setParent(final Object parent) {
super.setParent(parent);

final Reader r = (Reader) parent;

// TODO Maybe cache this result so we don't have to discover every time
// setparent is called
// because it will be called frequently, given how MasterFilterHelper is
// implemented

final List<PluginInfo<MetadataWrapper>> wrapperInfos =
getContext().getPluginIndex().getPlugins(MetadataWrapper.class);

// look for a compatible MetadataWrapper class
for (final PluginInfo<MetadataWrapper> info : wrapperInfos) {
final String wrapperClassName = info.get(MetadataWrapper.METADATA_KEY);

if (wrapperClassName != null) {
final Class<?> wrapperClass = ClassUtils.loadClass(wrapperClassName);
if (wrapperClass == null) {
log().error("Failed to find class: " + wrapperClassName);
continue;
}
if (wrapperClass.isAssignableFrom(getClass())) {
final MetadataWrapper metaWrapper =
getContext().getService(PluginService.class).createInstance(info);
metaWrapper.wrap(r.getMetadata());
wrappedMeta = metaWrapper;
return;
}
if (metaClass != null) {
MetadataWrapper wrapper = null;
try {
wrappedMeta = wrapper = metaClass.newInstance();
getContext().inject(wrapper);
wrapper.wrap(r.getMetadata());
}
catch (InstantiationException e) {
log()
.error("Failed to create MetadataWrapper of type: " + metaClass, e);
}
catch (IllegalAccessException e) {
log()
.error("Failed to create MetadataWrapper of type: " + metaClass, e);
}
}

// No Filter-specific wrapper found
wrappedMeta = r.getMetadata();
else {
// No Filter-specific wrapper found
wrappedMeta = r.getMetadata();
}
}

@Override
Expand Down
18 changes: 7 additions & 11 deletions scifio/src/main/java/io/scif/filters/ChannelFiller.java
Expand Up @@ -48,7 +48,6 @@
import net.imglib2.display.ColorTable;
import net.imglib2.meta.Axes;

import org.scijava.plugin.Attr;
import org.scijava.plugin.Plugin;

/**
Expand All @@ -58,18 +57,9 @@
* lut length is not guaranteed to be accurate until a plane has been read
*/
@Plugin(
type = Filter.class,
priority = ChannelFiller.PRIORITY,
attrs = {
@Attr(name = ChannelFiller.FILTER_KEY, value = ChannelFiller.FILTER_VALUE),
@Attr(name = ChannelFiller.ENABLED_KEY, value = ChannelFiller.ENABLED_VAULE) })
type = Filter.class)
public class ChannelFiller extends AbstractReaderFilter {

// -- Constants --

public static final double PRIORITY = 1.0;
public static final String FILTER_VALUE = "io.scif.Reader";

// -- Fields --

/**
Expand Down Expand Up @@ -236,6 +226,12 @@ public void close(final boolean fileOnly) throws IOException {
protected void setSourceHelper(final String source) {
cleanUp();
}
// -- Prioritized API --

@Override
public double getPriority() {
return 1.0;
}

// -- Helper Methods --
/**
Expand Down
26 changes: 7 additions & 19 deletions scifio/src/main/java/io/scif/filters/ChannelFillerMetadata.java
Expand Up @@ -51,9 +51,7 @@
import net.imglib2.display.ColorTable;
import net.imglib2.meta.Axes;

import org.scijava.plugin.Attr;
import org.scijava.plugin.Parameter;
import org.scijava.plugin.Plugin;

/**
* {@link io.scif.filters.MetadataWrapper} implementation specifically for use
Expand All @@ -63,15 +61,8 @@
* @see io.scif.filters.ChannelFiller
* @author Mark Hiner
*/
@Plugin(type = MetadataWrapper.class, attrs = { @Attr(
name = ChannelFillerMetadata.METADATA_KEY,
value = ChannelFillerMetadata.METADATA_VALUE) })
public class ChannelFillerMetadata extends AbstractMetadataWrapper {

// -- Constants --

public static final String METADATA_VALUE = "io.scif.filters.ChannelFiller";

// -- Fields --

@Parameter
Expand All @@ -82,16 +73,6 @@ public class ChannelFillerMetadata extends AbstractMetadataWrapper {
*/
private int lutLength;

// -- Constructors --

public ChannelFillerMetadata() {
this(null);
}

public ChannelFillerMetadata(final Metadata metadata) {
super(metadata);
}

// -- ChannelFiller API methods --

public int getLutLength() {
Expand Down Expand Up @@ -163,4 +144,11 @@ public void populateImageMetadata() {
add(iMeta, false);
}
}

// -- MetadataWrapper API --

@Override
public Class<? extends Filter> filterType() {
return io.scif.filters.ChannelFiller.class;
}
}
19 changes: 8 additions & 11 deletions scifio/src/main/java/io/scif/filters/DimensionSwapper.java
Expand Up @@ -48,26 +48,16 @@
import net.imglib2.meta.AxisType;
import net.imglib2.meta.CalibratedAxis;

import org.scijava.plugin.Attr;
import org.scijava.plugin.Plugin;

/**
* Handles swapping the dimension order of an image series. This class is useful
* for both reassigning ZCT sizes (the input dimension order), and shuffling
* around the resultant planar order (the output dimension order).
*/
@Plugin(type = Filter.class, priority = DimensionSwapper.PRIORITY, attrs = {
@Attr(name = DimensionSwapper.FILTER_KEY,
value = DimensionSwapper.FILTER_VALUE),
@Attr(name = DimensionSwapper.ENABLED_KEY,
value = DimensionSwapper.ENABLED_VAULE) })
@Plugin(type = Filter.class)
public class DimensionSwapper extends AbstractReaderFilter {

// -- Constants --

public static final double PRIORITY = 4.0;
public static final String FILTER_VALUE = "io.scif.Reader";

// -- Fields --

private List<AxisType> inputOrder;
Expand Down Expand Up @@ -242,6 +232,13 @@ public Metadata getMetadata() {
return super.getMetadata();
}

// -- Prioritized API --

@Override
public double getPriority() {
return 4.0;
}

// -- Helper methods --

/* Computes the reordered plane index for the current axes order */
Expand Down
30 changes: 7 additions & 23 deletions scifio/src/main/java/io/scif/filters/DimensionSwapperMetadata.java
Expand Up @@ -36,15 +36,10 @@

package io.scif.filters;

import io.scif.Metadata;

import java.util.List;

import net.imglib2.meta.AxisType;

import org.scijava.plugin.Attr;
import org.scijava.plugin.Plugin;

/**
* {@link io.scif.filters.MetadataWrapper} implementation specifically for use
* with the {@link io.scif.filters.DimensionSwapper}.
Expand All @@ -53,30 +48,12 @@
* @see io.scif.filters.DimensionSwapper
* @author Mark Hiner
*/
@Plugin(type = MetadataWrapper.class, attrs = { @Attr(
name = DimensionSwapperMetadata.METADATA_KEY,
value = DimensionSwapperMetadata.METADATA_VALUE) })
public class DimensionSwapperMetadata extends AbstractMetadataWrapper {

// -- Constants --

public static final String METADATA_VALUE =
"io.scif.filters.DimensionSwapper";

// -- Fields --

private List<AxisType>[] outputOrder;

// -- Constructors --

public DimensionSwapperMetadata() {
this(null);
}

public DimensionSwapperMetadata(final Metadata metadata) {
super(metadata);
}

// -- DimensionSwapperMetadata API --

/**
Expand All @@ -99,4 +76,11 @@ public List<AxisType>[] getOutputOrder() {
public void setOutputOrder(final List<AxisType>[] outputOrder) {
this.outputOrder = outputOrder;
}

// -- MetadataWrapper API --

@Override
public Class<? extends Filter> filterType() {
return io.scif.filters.DimensionSwapper.class;
}
}

0 comments on commit c343e83

Please sign in to comment.