From 379530aab9a9848e59363d87dcbdb79c4842bfc3 Mon Sep 17 00:00:00 2001 From: Mark Hiner Date: Wed, 11 Dec 2013 13:04:50 -0600 Subject: [PATCH 1/5] Translator refactor: remove Metadata.CNAME The CNAME constant has been removed from io.scif.Metadata and all affected subclasses. Note that some subclasses did not define a CNAME, which highlights the confusion and complexity of using the static constant. As a whole, the @Attrs that were previously used for Translator discovery have been converted to API methods. The TranslatorService has been updated to use the new API. --- .../main/java/io/scif/DefaultTranslator.java | 18 ++- scifio/src/main/java/io/scif/Metadata.java | 11 -- scifio/src/main/java/io/scif/Translator.java | 22 +-- .../main/java/io/scif/formats/APNGFormat.java | 17 +- .../main/java/io/scif/formats/AVIFormat.java | 21 ++- .../main/java/io/scif/formats/BMPFormat.java | 4 - .../java/io/scif/formats/DICOMFormat.java | 4 - .../main/java/io/scif/formats/EPSFormat.java | 26 ++-- .../main/java/io/scif/formats/FITSFormat.java | 4 - .../main/java/io/scif/formats/FakeFormat.java | 23 ++- .../main/java/io/scif/formats/ICSFormat.java | 19 ++- .../java/io/scif/formats/ImageIOFormat.java | 22 +-- .../io/scif/formats/MicromanagerFormat.java | 26 ++-- .../io/scif/formats/MinimalTIFFFormat.java | 5 - .../main/java/io/scif/formats/NRRDFormat.java | 4 - .../main/java/io/scif/formats/OBFFormat.java | 4 - .../main/java/io/scif/formats/TIFFFormat.java | 20 +-- .../java/io/scif/formats/TIFFJAIFormat.java | 4 - .../io/scif/formats/qt/LegacyQTFormat.java | 21 +-- .../io/scif/formats/qt/NativeQTFormat.java | 21 +-- .../services/DefaultTranslatorService.java | 146 ++++++++++++++++-- .../io/scif/services/TranslatorService.java | 9 +- 22 files changed, 286 insertions(+), 165 deletions(-) diff --git a/scifio/src/main/java/io/scif/DefaultTranslator.java b/scifio/src/main/java/io/scif/DefaultTranslator.java index ea42830b83..d089e68038 100644 --- a/scifio/src/main/java/io/scif/DefaultTranslator.java +++ b/scifio/src/main/java/io/scif/DefaultTranslator.java @@ -39,7 +39,6 @@ import java.util.List; import org.scijava.Priority; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** @@ -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 { + // -- Translater API Methods -- + + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return io.scif.Metadata.class; + } + @Override protected void typedTranslate(final Metadata source, final Metadata dest) { final List metaList = source.getAll(); diff --git a/scifio/src/main/java/io/scif/Metadata.java b/scifio/src/main/java/io/scif/Metadata.java index db456fc5a2..9bea883192 100644 --- a/scifio/src/main/java/io/scif/Metadata.java +++ b/scifio/src/main/java/io/scif/Metadata.java @@ -59,17 +59,6 @@ public interface Metadata extends Serializable, HasFormat, HasSource, HasMetaTable { - // -- Static Constents -- - - /** - * String representation of this classes package-qualified name. - *

- * Necessary for dynamic use annotations. All Metadata implementations should - * override this constant. - *

- */ - public static final String CNAME = "io.scif.Metadata"; - // -- Metadata API -- /** diff --git a/scifio/src/main/java/io/scif/Translator.java b/scifio/src/main/java/io/scif/Translator.java index d876069eab..dd3794fefc 100644 --- a/scifio/src/main/java/io/scif/Translator.java +++ b/scifio/src/main/java/io/scif/Translator.java @@ -36,6 +36,8 @@ package io.scif; +import org.scijava.plugin.SingletonPlugin; + /** * Interface for all SCIFIO {@code Translators}. *

@@ -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 source(); + + /** + * @return The Metadata class accepted by this translator as output + */ + Class dest(); + /** * Uses the source {@code Metadata} to populate the destination * {@code Metadata} diff --git a/scifio/src/main/java/io/scif/formats/APNGFormat.java b/scifio/src/main/java/io/scif/formats/APNGFormat.java index 7055da0b84..d134bc9d63 100644 --- a/scifio/src/main/java/io/scif/formats/APNGFormat.java +++ b/scifio/src/main/java/io/scif/formats/APNGFormat.java @@ -78,7 +78,6 @@ import net.imglib2.meta.Axes; import org.scijava.Priority; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** @@ -119,7 +118,6 @@ public static class Metadata extends AbstractMetadata { // -- Constants -- public static final String DEFAULT_KEY = "separate default"; - public static final String CNAME = "io.scif.formats.APNGFormat$Metadata"; // -- Fields -- @@ -1028,16 +1026,23 @@ private void writeFooter() throws IOException { * used to write it can not be guaranteed valid. *

*/ - @Plugin(type = Translator.class, attrs = { - @Attr(name = APNGTranslator.SOURCE, value = io.scif.Metadata.CNAME), - @Attr(name = APNGTranslator.DEST, value = Metadata.CNAME) }, - priority = Priority.LOW_PRIORITY) + @Plugin(type = Translator.class, priority = Priority.LOW_PRIORITY) public static class APNGTranslator extends AbstractTranslator { // -- Translator API Methods -- + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return Metadata.class; + } + @Override public void typedTranslate(final io.scif.Metadata source, final Metadata dest) diff --git a/scifio/src/main/java/io/scif/formats/AVIFormat.java b/scifio/src/main/java/io/scif/formats/AVIFormat.java index 1a0d14982e..240461b484 100644 --- a/scifio/src/main/java/io/scif/formats/AVIFormat.java +++ b/scifio/src/main/java/io/scif/formats/AVIFormat.java @@ -71,7 +71,6 @@ import net.imglib2.meta.Axes; import org.scijava.Priority; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** @@ -165,9 +164,6 @@ public static class Metadata extends AbstractMetadata implements HasColorTable { - // -- Constants -- - public static final String CNAME = "io.scif.formats.AVIFormat$Metadata"; - // -- AVI Metadata -- /* Offset to each plane. */ @@ -1600,13 +1596,22 @@ private void initialize(final int imageIndex) throws IOException { /** * @author Mark Hiner */ - @Plugin(type = io.scif.Translator.class, attrs = { - @Attr(name = Translator.SOURCE, value = io.scif.Metadata.CNAME), - @Attr(name = Translator.DEST, value = Metadata.CNAME) }, - priority = Priority.LOW_PRIORITY) + @Plugin(type = io.scif.Translator.class, priority = Priority.LOW_PRIORITY) public static class Translator extends AbstractTranslator { + + // -- Translator API methods -- + + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return Metadata.class; + } @Override protected void typedTranslate(final io.scif.Metadata source, diff --git a/scifio/src/main/java/io/scif/formats/BMPFormat.java b/scifio/src/main/java/io/scif/formats/BMPFormat.java index ad98a1b2b2..f53b8714e1 100644 --- a/scifio/src/main/java/io/scif/formats/BMPFormat.java +++ b/scifio/src/main/java/io/scif/formats/BMPFormat.java @@ -104,10 +104,6 @@ public static class Metadata extends AbstractMetadata implements HasColorTable { - // -- Constants -- - - public static final String CNAME = "io.scif.formats.BMPFormat$Metadata"; - // -- Fields -- /** The palette for indexed color images. */ diff --git a/scifio/src/main/java/io/scif/formats/DICOMFormat.java b/scifio/src/main/java/io/scif/formats/DICOMFormat.java index 66a5c373c5..b9590d0270 100644 --- a/scifio/src/main/java/io/scif/formats/DICOMFormat.java +++ b/scifio/src/main/java/io/scif/formats/DICOMFormat.java @@ -731,10 +731,6 @@ public static class Metadata extends AbstractMetadata implements HasColorTable { - // -- Constants -- - - public static final String CNAME = "io.scif.formats.DICOMFormat$Metadata"; - // -- Fields -- byte[][] lut = null; diff --git a/scifio/src/main/java/io/scif/formats/EPSFormat.java b/scifio/src/main/java/io/scif/formats/EPSFormat.java index 0bab883296..c16e06b3c6 100644 --- a/scifio/src/main/java/io/scif/formats/EPSFormat.java +++ b/scifio/src/main/java/io/scif/formats/EPSFormat.java @@ -61,7 +61,6 @@ import net.imglib2.meta.Axes; import org.scijava.Priority; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** @@ -93,10 +92,6 @@ public String[] getSuffixes() { */ public static class Metadata extends AbstractMetadata { - // -- Constants -- - - public static final String CNAME = "io.scif.formats.EPSFormat$Metadata"; - // -- Fields -- /** Starting line of pixel data. */ @@ -597,9 +592,20 @@ private void writeHeader(final int imageIndex) throws IOException { * * @author Mark Hiner */ - @Plugin(type = Translator.class, attrs = { - @Attr(name = EPSTranslator.SOURCE, value = io.scif.Metadata.CNAME), - @Attr(name = EPSTranslator.DEST, value = Metadata.CNAME) }, - priority = Priority.LOW_PRIORITY) - public static class EPSTranslator extends DefaultTranslator {} + @Plugin(type = Translator.class, priority = Priority.LOW_PRIORITY) + public static class EPSTranslator extends DefaultTranslator { + + // -- Translator API Methods -- + + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return Metadata.class; + } + + } } diff --git a/scifio/src/main/java/io/scif/formats/FITSFormat.java b/scifio/src/main/java/io/scif/formats/FITSFormat.java index e02c916c1f..131add662c 100644 --- a/scifio/src/main/java/io/scif/formats/FITSFormat.java +++ b/scifio/src/main/java/io/scif/formats/FITSFormat.java @@ -84,10 +84,6 @@ public String[] getSuffixes() { */ public static class Metadata extends AbstractMetadata { - // -- Constants -- - - public static final String CNAME = "io.scif.formats.FITSFormat$Metadata"; - // -- Fields -- private long pixelOffset; diff --git a/scifio/src/main/java/io/scif/formats/FakeFormat.java b/scifio/src/main/java/io/scif/formats/FakeFormat.java index c31563b933..dde30a418a 100644 --- a/scifio/src/main/java/io/scif/formats/FakeFormat.java +++ b/scifio/src/main/java/io/scif/formats/FakeFormat.java @@ -51,14 +51,11 @@ import io.scif.Plane; import io.scif.Translator; import io.scif.common.DataTools; -import io.scif.io.IStreamAccess; import io.scif.io.Location; import io.scif.io.RandomAccessInputStream; -import io.scif.io.StreamHandle; import io.scif.util.FormatTools; import java.io.IOException; -import java.nio.ByteBuffer; import java.util.Map; import java.util.Random; @@ -70,7 +67,6 @@ import net.imglib2.meta.axis.DefaultLinearAxis; import org.scijava.Priority; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** @@ -141,10 +137,6 @@ public static class Metadata extends AbstractMetadata implements HasColorTable { - // -- Static Constants -- - - public static final String CNAME = "io.scif.formats.FakeFormat$Metadata"; - // -- Fields -- @Field @@ -585,16 +577,23 @@ private void openPlaneHelper(int imageIndex, long planeIndex, Metadata meta, Pla /** * Translator from {@link io.scif.Metadata} to FakeFormat$Metadata. */ - @Plugin(type = Translator.class, attrs = { - @Attr(name = FakeTranslator.SOURCE, value = io.scif.Metadata.CNAME), - @Attr(name = FakeTranslator.DEST, value = Metadata.CNAME) }, - priority = Priority.LOW_PRIORITY) + @Plugin(type = Translator.class, priority = Priority.LOW_PRIORITY) public static class FakeTranslator extends AbstractTranslator { // -- Translator API Methods -- + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return Metadata.class; + } + @Override public void typedTranslate(final io.scif.Metadata source, final Metadata dest) diff --git a/scifio/src/main/java/io/scif/formats/ICSFormat.java b/scifio/src/main/java/io/scif/formats/ICSFormat.java index 1fce298ae1..8bfd34b448 100644 --- a/scifio/src/main/java/io/scif/formats/ICSFormat.java +++ b/scifio/src/main/java/io/scif/formats/ICSFormat.java @@ -72,7 +72,6 @@ import net.imglib2.meta.CalibratedAxis; import org.scijava.Priority; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** @@ -104,9 +103,6 @@ public String[] getSuffixes() { */ public static class Metadata extends AbstractMetadata { - // -- Static Constants - public static final String CNAME = "io.scif.formats.ICSFormat$Metadata"; - // -- Fields -- /** @@ -2002,16 +1998,23 @@ private static void addKey(Map parent, String... keys) { * SCIFIO file format Translator for ICS Metadata objects to the SCIFIO Core * metadata type. */ - @Plugin(type = Translator.class, attrs = { - @Attr(name = ICSTranslator.SOURCE, value = io.scif.Metadata.CNAME), - @Attr(name = ICSTranslator.DEST, value = Metadata.CNAME) }, - priority = Priority.LOW_PRIORITY) + @Plugin(type = Translator.class, priority = Priority.LOW_PRIORITY) public static class ICSTranslator extends AbstractTranslator { // -- Translator API Methods -- + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return Metadata.class; + } + @Override public void typedTranslate(final io.scif.Metadata source, final Metadata dest) diff --git a/scifio/src/main/java/io/scif/formats/ImageIOFormat.java b/scifio/src/main/java/io/scif/formats/ImageIOFormat.java index 1af13cba87..51f901467a 100644 --- a/scifio/src/main/java/io/scif/formats/ImageIOFormat.java +++ b/scifio/src/main/java/io/scif/formats/ImageIOFormat.java @@ -61,7 +61,6 @@ import net.imglib2.meta.Axes; import org.scijava.Priority; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** @@ -79,10 +78,6 @@ public abstract class ImageIOFormat extends AbstractFormat { */ public static class Metadata extends AbstractMetadata { - // -- Constants -- - - public static final String CNAME = "io.scif.formats.ImageIOFormat$Metadata"; - // -- Fields -- private BufferedImage img; @@ -235,14 +230,23 @@ public int[] getPixelTypes(final String codec) { } } - @Plugin(type = Translator.class, attrs = { - @Attr(name = ImageIOTranslator.SOURCE, value = io.scif.Metadata.CNAME), - @Attr(name = ImageIOTranslator.DEST, value = Metadata.CNAME) }, - priority = Priority.LOW_PRIORITY) + @Plugin(type = Translator.class, priority = Priority.LOW_PRIORITY) public static class ImageIOTranslator extends AbstractTranslator { + // -- Translator API Methods -- + + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return Metadata.class; + } + @Override protected void typedTranslate(final io.scif.Metadata source, final Metadata dest) diff --git a/scifio/src/main/java/io/scif/formats/MicromanagerFormat.java b/scifio/src/main/java/io/scif/formats/MicromanagerFormat.java index 04a85c2712..58dcb9abdf 100644 --- a/scifio/src/main/java/io/scif/formats/MicromanagerFormat.java +++ b/scifio/src/main/java/io/scif/formats/MicromanagerFormat.java @@ -66,7 +66,6 @@ import net.imglib2.meta.Axes; import org.scijava.Priority; -import org.scijava.plugin.Attr; import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; import org.xml.sax.Attributes; @@ -110,11 +109,6 @@ public String[] getSuffixes() { */ public static class Metadata extends AbstractMetadata { - // -- Constants -- - - public static final String CNAME = - "io.scif.formats.MicromanagerFormat$Metadata"; - // -- Fields -- private Vector positions; @@ -847,13 +841,19 @@ private void setupReader(final int imageIndex) { * * @author Mark Hiner */ - @Plugin(type = Translator.class, - attrs = { - @Attr(name = MicromanagerTranslator.SOURCE, - value = io.scif.Metadata.CNAME), - @Attr(name = MicromanagerTranslator.DEST, value = Metadata.CNAME) }, - priority = Priority.LOW_PRIORITY) - public static class MicromanagerTranslator extends DefaultTranslator {} + @Plugin(type = Translator.class, priority = Priority.LOW_PRIORITY) + public static class MicromanagerTranslator extends DefaultTranslator { + + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return Metadata.class; + } + } // -- Helper classes -- diff --git a/scifio/src/main/java/io/scif/formats/MinimalTIFFFormat.java b/scifio/src/main/java/io/scif/formats/MinimalTIFFFormat.java index 814531eac8..edb6e83eeb 100644 --- a/scifio/src/main/java/io/scif/formats/MinimalTIFFFormat.java +++ b/scifio/src/main/java/io/scif/formats/MinimalTIFFFormat.java @@ -132,11 +132,6 @@ public static class Metadata extends AbstractMetadata implements /** Codec options to use when decoding JPEG 2000 data. */ private JPEG2000CodecOptions j2kCodecOptions; - // -- Constants -- - - public static final String CNAME = - "io.scif.formats.MinimalTiffFormat$Metadata"; - // -- MinimalTIFFMetadata getters and setters -- public IFDList getIfds() { diff --git a/scifio/src/main/java/io/scif/formats/NRRDFormat.java b/scifio/src/main/java/io/scif/formats/NRRDFormat.java index f257e3c96f..74082893c9 100644 --- a/scifio/src/main/java/io/scif/formats/NRRDFormat.java +++ b/scifio/src/main/java/io/scif/formats/NRRDFormat.java @@ -86,10 +86,6 @@ public String[] getSuffixes() { */ public static class Metadata extends AbstractMetadata { - // -- Constants -- - - public static final String CNAME = "io.scif.formats.NRRDFormat$Metadata"; - // -- Fields -- /** Name of data file, if the current extension is 'nhdr'. */ diff --git a/scifio/src/main/java/io/scif/formats/OBFFormat.java b/scifio/src/main/java/io/scif/formats/OBFFormat.java index a91b4b71d3..bab2fbc0c2 100644 --- a/scifio/src/main/java/io/scif/formats/OBFFormat.java +++ b/scifio/src/main/java/io/scif/formats/OBFFormat.java @@ -85,10 +85,6 @@ public String[] getSuffixes() { */ public static class Metadata extends AbstractMetadata { - // -- Constants -- - - public static final String CNAME = "io.scif.formats.OBFFormat$Metadata"; - // -- Fields -- private Frame currentInflatedFrame = new Frame(); diff --git a/scifio/src/main/java/io/scif/formats/TIFFFormat.java b/scifio/src/main/java/io/scif/formats/TIFFFormat.java index 4112141ea4..1a5b3a2a3d 100644 --- a/scifio/src/main/java/io/scif/formats/TIFFFormat.java +++ b/scifio/src/main/java/io/scif/formats/TIFFFormat.java @@ -75,7 +75,6 @@ import net.imglib2.meta.Axes; import net.imglib2.meta.CalibratedAxis; -import org.scijava.plugin.Attr; import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; @@ -128,10 +127,6 @@ public static class Metadata extends MinimalTIFFFormat.Metadata { private Double timeIncrement; private Integer xOrigin, yOrigin; - // -- Constants -- - - public static final String CNAME = "io.scif.formats.TIFFFormat$Metadata"; - // -- TIFFMetadata getters and setters -- public String getCompanionFile() { @@ -1526,16 +1521,23 @@ private void setupTiffSaver(final int imageIndex) throws IOException { * used to write it can not be guaranteed valid. *

*/ - @Plugin(type = Translator.class, attrs = { - @Attr(name = TIFFTranslator.SOURCE, value = io.scif.Metadata.CNAME), - @Attr(name = TIFFTranslator.DEST, value = Metadata.CNAME) }, - priority = TIFFFormat.PRIORITY) + @Plugin(type = Translator.class, priority = TIFFFormat.PRIORITY) public static class TIFFTranslator extends AbstractTranslator { // -- Translator API Methods -- + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return Metadata.class; + } + @Override public void typedTranslate(final io.scif.Metadata source, final Metadata dest) diff --git a/scifio/src/main/java/io/scif/formats/TIFFJAIFormat.java b/scifio/src/main/java/io/scif/formats/TIFFJAIFormat.java index 6b252c6ced..9da293f996 100644 --- a/scifio/src/main/java/io/scif/formats/TIFFJAIFormat.java +++ b/scifio/src/main/java/io/scif/formats/TIFFJAIFormat.java @@ -105,10 +105,6 @@ public static class Metadata extends AbstractMetadata { private int numPages; - // -- Constants -- - - public static final String CNAME = "io.scif.formats.TIFFJAIFormat$Metadata"; - // -- TIFFJAIMetadata getters and setters -- public ReflectedUniverse universe() { diff --git a/scifio/src/main/java/io/scif/formats/qt/LegacyQTFormat.java b/scifio/src/main/java/io/scif/formats/qt/LegacyQTFormat.java index d8a173a075..903bdbbc66 100644 --- a/scifio/src/main/java/io/scif/formats/qt/LegacyQTFormat.java +++ b/scifio/src/main/java/io/scif/formats/qt/LegacyQTFormat.java @@ -68,7 +68,6 @@ import org.scijava.Priority; import org.scijava.log.LogService; -import org.scijava.plugin.Attr; import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; @@ -100,11 +99,6 @@ public String[] getSuffixes() { */ public static class Metadata extends AbstractMetadata { - // -- Constants -- - - public static final String CNAME = - "io.scif.formats.qt.LegacyQTFormat$Metadata"; - // -- Fields -- @Parameter @@ -580,10 +574,7 @@ public void close() throws IOException { /** * @author Mark Hiner */ - @Plugin(type = Translator.class, attrs = { - @Attr(name = LegacyQTTranslator.SOURCE, value = io.scif.Metadata.CNAME), - @Attr(name = LegacyQTTranslator.DEST, value = Metadata.CNAME) }, - priority = Priority.LOW_PRIORITY) + @Plugin(type = Translator.class, priority = Priority.LOW_PRIORITY) public static class LegacyQTTranslator extends AbstractTranslator { @@ -596,6 +587,16 @@ public static class LegacyQTTranslator extends // -- Translator API Methods -- + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return Metadata.class; + } + @Override public void typedTranslate(final io.scif.Metadata source, final Metadata dest) diff --git a/scifio/src/main/java/io/scif/formats/qt/NativeQTFormat.java b/scifio/src/main/java/io/scif/formats/qt/NativeQTFormat.java index 3375d2abe1..d94c463244 100644 --- a/scifio/src/main/java/io/scif/formats/qt/NativeQTFormat.java +++ b/scifio/src/main/java/io/scif/formats/qt/NativeQTFormat.java @@ -74,7 +74,6 @@ import org.scijava.Priority; import org.scijava.log.LogService; -import org.scijava.plugin.Attr; import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; @@ -115,11 +114,6 @@ public String[] getSuffixes() { */ public static class Metadata extends AbstractMetadata { - // -- Constants -- - - public static final String CNAME = - "io.scif.formats.qt.NativeQTFormat$Metadata"; - // -- Fields -- /** Offset to start of pixel data. */ @@ -1234,16 +1228,23 @@ private void writeAtom(final int length, final String type) /** * @author Mark Hiner */ - @Plugin(type = Translator.class, attrs = { - @Attr(name = NativeQTTranslator.SOURCE, value = io.scif.Metadata.CNAME), - @Attr(name = NativeQTTranslator.DEST, value = Metadata.CNAME) }, - priority = Priority.LOW_PRIORITY) + @Plugin(type = Translator.class, priority = Priority.LOW_PRIORITY) public static class NativeQTTranslator extends AbstractTranslator { // -- Translator API Methods -- + @Override + public Class source() { + return io.scif.Metadata.class; + } + + @Override + public Class dest() { + return Metadata.class; + } + @Override public void typedTranslate(final io.scif.Metadata source, final Metadata dest) diff --git a/scifio/src/main/java/io/scif/services/DefaultTranslatorService.java b/scifio/src/main/java/io/scif/services/DefaultTranslatorService.java index 97c6fb1688..c27e25a0a5 100644 --- a/scifio/src/main/java/io/scif/services/DefaultTranslatorService.java +++ b/scifio/src/main/java/io/scif/services/DefaultTranslatorService.java @@ -42,20 +42,27 @@ import java.util.HashMap; import java.util.Map; -import org.scijava.plugin.Parameter; +import org.scijava.plugin.AbstractSingletonService; import org.scijava.plugin.Plugin; -import org.scijava.service.AbstractService; import org.scijava.service.Service; +/** + * Default {@link TranslatorService} implementation. If a false exact flag is + * passed to {@link #findTranslator(Metadata, Metadata, boolean)} and an exact + * translator can not be found, this service will first try to match the + * destination type, then source type, then will accept any generic + * {@link Metadata} translator. + * + * @author Mark Hiner + */ @Plugin(type = Service.class) -public class DefaultTranslatorService extends AbstractService implements - TranslatorService +public class DefaultTranslatorService extends + AbstractSingletonService implements TranslatorService { - // -- Parameters -- + // -- Fields -- - @Parameter - private PluginAttributeService attributeService; + Map, Map, Translator>> sourceToDestMap; // -- TranslatorService API Methods -- @@ -67,15 +74,17 @@ public Translator findTranslator(final Metadata source, final Metadata dest, } @Override - public Translator findTranslator(final Class source, final Class dest, - final boolean exact) + public Translator findTranslator(final Class source, + final Class dest, final boolean exact) { - final Map kvPairs = new HashMap(); - kvPairs.put(Translator.SOURCE, source.getName()); - kvPairs.put(Translator.DEST, dest.getName()); + Translator t = lookup(source, dest); - final Translator t = - attributeService.createInstance(Translator.class, kvPairs, null, exact); + // Try to match the destination exactly + t = lookup(t, exact, io.scif.Metadata.class, dest); + // Try to match the source exactly + t = lookup(t, exact, source, io.scif.Metadata.class); + // Take any translator + t = lookup(t, exact, io.scif.Metadata.class, io.scif.Metadata.class); return t; } @@ -92,4 +101,113 @@ public boolean translate(final Metadata source, final Metadata dest, return true; } + + // -- SingletonService API -- + + @Override + public Class getPluginType() { + return Translator.class; + } + + // -- Service API Methods -- + + // -- Helper Methods -- + + /** + * @param source - Source class to match + * @param dest - Destination class to match + * @return - Translator capable of translating between the given source and + * destination + */ + private Translator lookup(Class source, + Class dest) + { + if (sourceToDestMap == null) { + synchronized (this) { + if (sourceToDestMap == null) { + createTranslatorMap(); + } + } + } + + // Just look up the translator to try and find an exact match + Map, Translator> destMap = + sourceToDestMap.get(source); + + if (destMap != null) { + return destMap.get(dest); + } + + return null; + } + + /** + * @param t - If t is null, will attempt to find a suitable translator (in + * priority order) + * @param exact - If true, will skip the translator search and return t + * @param source - Source class to match + * @param dest - Destination class to match + * @return - Translator capable of translating between the given source and + * destination + */ + private Translator lookup(Translator t, boolean exact, + Class source, Class dest) + { + if (t == null && !exact) { + // Loop over the translators in priority order to see if we have a + // suitable candidate + for (int i = 0; i < getInstances().size() && t == null; i++) { + Translator translator = getInstances().get(i); + if (translator.source().isAssignableFrom(source) && + translator.dest().isAssignableFrom(dest)) + { + t = translator; + } + } + } + + return t; + } + + /** + * Create a nested mapping to all known translators. Allows for lazy + * instantiation. + */ + private void createTranslatorMap() { + sourceToDestMap = + new HashMap, Map, Translator>>(); + for (Translator translator : getInstances()) { + addToMap(translator.source(), translator.dest(), sourceToDestMap, + translator); + } + } + + /** + * Creates a nested mapping of key1 : (key 2 : translator). Creates + * intermediate map if it doesn't already exist. + * + * @param key1 - key to first-level (outer) map + * @param key2 - key to second-level (inner) map + * @param map - first-level (outer) map + * @param translator - value for second-level (inner) map + */ + private + void + addToMap( + Class key1, + Class key2, + Map, Map, Translator>> map, + Translator translator) + { + Map, Translator> innerMap = map.get(key1); + + // Create the map if it doesn't already exist + if (innerMap == null) { + innerMap = new HashMap, Translator>(); + map.put(key1, innerMap); + } + + // Create our mapping + innerMap.put(key2, translator); + } } diff --git a/scifio/src/main/java/io/scif/services/TranslatorService.java b/scifio/src/main/java/io/scif/services/TranslatorService.java index aaaba0ed7f..7abfaba912 100644 --- a/scifio/src/main/java/io/scif/services/TranslatorService.java +++ b/scifio/src/main/java/io/scif/services/TranslatorService.java @@ -40,6 +40,8 @@ import io.scif.SCIFIOService; import io.scif.Translator; +import org.scijava.plugin.SingletonService; + /** * Collection of methods for creating and using appropriate Translators to * convert between Metadata types. @@ -47,7 +49,9 @@ * @see io.scif.Translator * @author Mark Hiner */ -public interface TranslatorService extends SCIFIOService { +public interface TranslatorService extends SCIFIOService, + SingletonService +{ /** * Returns a translator capable of translating from the source Metadata to the @@ -73,7 +77,8 @@ public interface TranslatorService extends SCIFIOService { * @return Translator whose translate method will accept these Metadata * instances */ - Translator findTranslator(Class source, Class dest, boolean exact); + Translator findTranslator(Class source, + Class dest, boolean exact); /** * Convenience method to immediately translate from the source Metadata to the From 12c6529faa100bc3c17758099e47440e7acddd8e Mon Sep 17 00:00:00 2001 From: Mark Hiner Date: Wed, 11 Dec 2013 14:20:36 -0600 Subject: [PATCH 2/5] Removed PluginAttributeService This service was created to facilitate Translator discovery via annotation. It is no longer required as translators are now discovered by API, and this functionality probably could have been implemented just by using the PluginInfo API anyway. --- .../DefaultPluginAttributeService.java | 167 ------------------ .../scif/services/PluginAttributeService.java | 102 ----------- 2 files changed, 269 deletions(-) delete mode 100644 scifio/src/main/java/io/scif/services/DefaultPluginAttributeService.java delete mode 100644 scifio/src/main/java/io/scif/services/PluginAttributeService.java diff --git a/scifio/src/main/java/io/scif/services/DefaultPluginAttributeService.java b/scifio/src/main/java/io/scif/services/DefaultPluginAttributeService.java deleted file mode 100644 index d56d217177..0000000000 --- a/scifio/src/main/java/io/scif/services/DefaultPluginAttributeService.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * #%L - * SCIFIO library for reading and converting scientific file formats. - * %% - * Copyright (C) 2011 - 2013 Open Microscopy Environment: - * - Board of Regents of the University of Wisconsin-Madison - * - Glencoe Software, Inc. - * - University of Dundee - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are - * those of the authors and should not be interpreted as representing official - * policies, either expressed or implied, of any organization. - * #L% - */ - -package io.scif.services; - -import io.scif.SCIFIOPlugin; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.scijava.log.LogService; -import org.scijava.plugin.Parameter; -import org.scijava.plugin.Plugin; -import org.scijava.plugin.PluginInfo; -import org.scijava.plugin.PluginService; -import org.scijava.service.AbstractService; -import org.scijava.service.Service; -import org.scijava.util.ClassUtils; - -/** - * Default {@link io.scif.services.PluginAttributeService} implementation. - * - * @author Mark Hiner - */ -@Plugin(type = Service.class) -public class DefaultPluginAttributeService extends AbstractService implements - PluginAttributeService -{ - - // -- Parameters -- - - @Parameter - private PluginService pluginService; - - @Parameter - private LogService logService; - - @Override - public PT createInstance(final Class type, - final Map andPairs, final Map orPairs) - { - return createInstance(type, andPairs, orPairs, false); - } - - @Override - public PT createInstance(final Class type, - final Map andPairs, final Map orPairs, - final boolean exact) - { - final PluginInfo plugin = getPlugin(type, andPairs, orPairs, exact); - - return plugin == null ? null : pluginService.createInstance(plugin); - } - - @Override - public PluginInfo getPlugin( - final Class type, final Map andPairs, - final Map orPairs, final boolean exact) - { - final List> pluginList = - getPluginsOfType(type, andPairs, orPairs, exact); - return pluginList.size() > 0 ? pluginList.get(0) : null; - } - - @Override - public List> getPluginsOfType( - final Class type, final Map andPairs, - final Map orPairs, final boolean exact) - { - // Get the unfiltered plugin list - final List> plugins = pluginService.getPluginsOfType(type); - - // The list of filtered plugins we will return. - final List> filteredPlugins = - new ArrayList>(); - - // loop through the unfiltered list, checking the "AND" and "OR" - // parameters - for (final PluginInfo info : plugins) { - // If true, we will add this PluginInfo to our filtered list. - boolean valid = true; - - // Checking "OR" key,value pairs. Just one @Attr needs to match - // an entry on this list. - if (orPairs != null) { - boolean matchedOr = false; - - final Iterator keyIter = orPairs.keySet().iterator(); - - while (!matchedOr && keyIter.hasNext()) { - final String key = keyIter.next(); - - final Class c1 = ClassUtils.loadClass(orPairs.get(key)); - final Class c2 = ClassUtils.loadClass(info.get(key)); - if (c1 == null || c2 == null) { - throw new IllegalArgumentException( - "Class name attribute was invalid or not found."); - } - - if (exact ? c2.equals(c1) : c2.isAssignableFrom(c1)) matchedOr = true; - } - - if (!matchedOr) valid = false; - } - - // Checking "AND" key,value pairs. All entries in this list - // must have a matching @Attr, or this plugin will be filtered out. - if (andPairs != null) { - final Iterator keyIter = andPairs.keySet().iterator(); - - while (valid && keyIter.hasNext()) { - final String key = keyIter.next(); - - final Class c1 = ClassUtils.loadClass(andPairs.get(key)); - final Class c2 = ClassUtils.loadClass(info.get(key)); - if (c1 == null || c2 == null) { - logService.debug("No class found: " + (c1 == null ? c1 + " " : "") + - (c2 == null ? c2 + " " : "")); - valid = false; - } - - if (valid && !(exact ? c2.equals(c1) : c2.isAssignableFrom(c1))) valid = false; - } - } - - if (valid) filteredPlugins.add(info); - } - - return filteredPlugins; - } - -} diff --git a/scifio/src/main/java/io/scif/services/PluginAttributeService.java b/scifio/src/main/java/io/scif/services/PluginAttributeService.java deleted file mode 100644 index 84d667cee0..0000000000 --- a/scifio/src/main/java/io/scif/services/PluginAttributeService.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * #%L - * SCIFIO library for reading and converting scientific file formats. - * %% - * Copyright (C) 2011 - 2013 Open Microscopy Environment: - * - Board of Regents of the University of Wisconsin-Madison - * - Glencoe Software, Inc. - * - University of Dundee - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are - * those of the authors and should not be interpreted as representing official - * policies, either expressed or implied, of any organization. - * #L% - */ - -package io.scif.services; - -import io.scif.SCIFIOPlugin; -import io.scif.SCIFIOService; - -import java.util.List; -import java.util.Map; - -import org.scijava.plugin.PluginInfo; - -/** - * Service for finding plugins with particular attribute values. - *

- * In each method signature, plugins will be returned if they are annotated with - * {@link org.scijava.plugin.Attr}'s matching all key,value pairs in - * {@code andPairs}, and at least one of any key, value pairs in {@code orPairs} - * . - *

- *

- * NB: attributes are assumed to be classes, and "matching" is equivalent to - * passing an "isAssignableFrom" test. So it is possible to have multiple - * "matches", in the case of both specific and general attribute types. - * Typically you should set plugins with specific parameters to have higher - * priority than those with general parameters, so they are checked first. - *

- * - * @author Mark Hiner - */ -public interface PluginAttributeService extends SCIFIOService { - - /** - * As {@link org.scijava.plugin.PluginService#createInstancesOfType(Class)} - * but with key,value pair parameters to allow for filtering based on - * {@code Attr} annotation. Returns the first possible match. - */ - PT createInstance(Class type, - Map andPairs, Map orPairs); - - /** - * As {@link org.scijava.plugin.PluginService#createInstancesOfType(Class)} - * but with key,value pair parameters to allow for filtering based on - * {@code Attr} annotation. Returns the first possible match if exact == - * false, or the first specific match if exact == true. - */ - PT createInstance(Class type, - Map andPairs, Map orPairs, boolean exact); - - /** - * As {@link org.scijava.plugin.PluginService#getPlugin(Class)} but with - * key,value pair parameters to allow for filtering based on {@code Attr} - * annotation. Returns the first possible match if exact == false, or the - * first specific match if exact == true. - */ - PluginInfo getPlugin(Class type, - Map andPairs, Map orPairs, boolean exact); - - /** - * As {@link org.scijava.plugin.PluginService#getPluginsOfType(Class)} but - * with key,value pair parameters to allow for filtering based on {@code Attr} - * annotation. Returns all possible match if exact == false, or all specific - * matches if exact == true. - */ - List> getPluginsOfType( - Class type, Map andPairs, Map orPairs, - boolean exact); -} From d58ef73478b59194c210853f102fc438a8048dbd Mon Sep 17 00:00:00 2001 From: Mark Hiner Date: Wed, 11 Dec 2013 14:25:59 -0600 Subject: [PATCH 3/5] MetadataWrapper: removed unnecessary interface No need to extend SCIFIOPlugin, as it's already a superinterface of Metadata. --- scifio/src/main/java/io/scif/filters/MetadataWrapper.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scifio/src/main/java/io/scif/filters/MetadataWrapper.java b/scifio/src/main/java/io/scif/filters/MetadataWrapper.java index 86b6a35b2a..d50109e083 100644 --- a/scifio/src/main/java/io/scif/filters/MetadataWrapper.java +++ b/scifio/src/main/java/io/scif/filters/MetadataWrapper.java @@ -39,7 +39,6 @@ import io.scif.ImageMetadata; import io.scif.MetaTable; import io.scif.Metadata; -import io.scif.SCIFIOPlugin; /** * Wrapper for {@link io.scif.Metadata}. Used to create defensive copies of @@ -62,7 +61,7 @@ * @author Mark Hiner * @see io.scif.filters.AbstractReaderFilter */ -public interface MetadataWrapper extends Metadata, SCIFIOPlugin { +public interface MetadataWrapper extends Metadata { public static final String METADATA_KEY = "Metadata Wrapper"; public static final String METADATA_VALUE = "java.lang.Object"; From e750b2b049be6b24c37b819c7800d5401d72331b Mon Sep 17 00:00:00 2001 From: Mark Hiner Date: Wed, 11 Dec 2013 15:32:03 -0600 Subject: [PATCH 4/5] Filters: remove @Attr annotation usage The Filter implementation was heavily relying on the @Attr addition to the @Plugin annotation to define the filter target, priority and default enabled status. This was extremely verbose and confusing, and complicated the logic of Filter enabling and construction. By converting the @Attr to API use, via new enabledDefault() and target() methods, and overriding getPriority to return a fixed value, the Filter logic has been greatly simplified. Updated the FilterTest and filter usage as needed. --- .../java/io/scif/filters/AbstractFilter.java | 5 + .../io/scif/filters/AbstractReaderFilter.java | 5 + .../java/io/scif/filters/ChannelFiller.java | 18 ++-- .../io/scif/filters/DimensionSwapper.java | 19 ++-- .../java/io/scif/filters/FileStitcher.java | 17 ++-- .../src/main/java/io/scif/filters/Filter.java | 14 ++- .../java/io/scif/filters/MasterFilter.java | 9 +- .../io/scif/filters/MasterFilterHelper.java | 95 ++++++------------- .../java/io/scif/filters/MinMaxFilter.java | 9 +- .../java/io/scif/filters/PlaneSeparator.java | 20 ++-- .../java/io/scif/filters/ReaderFilter.java | 4 - .../src/main/java/io/scif/img/ImgOpener.java | 12 +-- .../io/scif/filters/utests/FilterTest.java | 46 +++------ .../tools/commands/AbstractReaderCommand.java | 14 +-- 14 files changed, 100 insertions(+), 187 deletions(-) diff --git a/scifio/src/main/java/io/scif/filters/AbstractFilter.java b/scifio/src/main/java/io/scif/filters/AbstractFilter.java index 8f3814b54a..0d6e802dbe 100644 --- a/scifio/src/main/java/io/scif/filters/AbstractFilter.java +++ b/scifio/src/main/java/io/scif/filters/AbstractFilter.java @@ -76,6 +76,11 @@ public AbstractFilter(final Class parentClass) { // -- Filter API Methods -- + @Override + public boolean enabledDefault() { + return false; + } + @Override public T getParent() { return parent; diff --git a/scifio/src/main/java/io/scif/filters/AbstractReaderFilter.java b/scifio/src/main/java/io/scif/filters/AbstractReaderFilter.java index c1c59eb21a..c9e1f256ad 100644 --- a/scifio/src/main/java/io/scif/filters/AbstractReaderFilter.java +++ b/scifio/src/main/java/io/scif/filters/AbstractReaderFilter.java @@ -140,6 +140,11 @@ 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); diff --git a/scifio/src/main/java/io/scif/filters/ChannelFiller.java b/scifio/src/main/java/io/scif/filters/ChannelFiller.java index 235be3fe79..97df8e70e9 100644 --- a/scifio/src/main/java/io/scif/filters/ChannelFiller.java +++ b/scifio/src/main/java/io/scif/filters/ChannelFiller.java @@ -48,7 +48,6 @@ import net.imglib2.display.ColorTable; import net.imglib2.meta.Axes; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** @@ -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 -- /** @@ -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 -- /** diff --git a/scifio/src/main/java/io/scif/filters/DimensionSwapper.java b/scifio/src/main/java/io/scif/filters/DimensionSwapper.java index ef20f3db78..805554d906 100644 --- a/scifio/src/main/java/io/scif/filters/DimensionSwapper.java +++ b/scifio/src/main/java/io/scif/filters/DimensionSwapper.java @@ -48,7 +48,6 @@ import net.imglib2.meta.AxisType; import net.imglib2.meta.CalibratedAxis; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** @@ -56,18 +55,9 @@ * 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 inputOrder; @@ -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 */ diff --git a/scifio/src/main/java/io/scif/filters/FileStitcher.java b/scifio/src/main/java/io/scif/filters/FileStitcher.java index c3f0d1306c..78cc41b7ba 100644 --- a/scifio/src/main/java/io/scif/filters/FileStitcher.java +++ b/scifio/src/main/java/io/scif/filters/FileStitcher.java @@ -55,7 +55,6 @@ import net.imglib2.meta.Axes; -import org.scijava.plugin.Attr; import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; @@ -63,16 +62,9 @@ * Logic to stitch together files with similar names. Assumes that all files * have the same characteristics (e.g., dimensions). */ -@Plugin(type = Filter.class, priority = FileStitcher.PRIORITY, attrs = { - @Attr(name = FileStitcher.FILTER_KEY, value = FileStitcher.FILTER_VALUE), - @Attr(name = FileStitcher.ENABLED_KEY, value = FileStitcher.ENABLED_VAULE) }) +@Plugin(type = Filter.class) public class FileStitcher extends AbstractReaderFilter { - // -- Constants -- - - public static final double PRIORITY = 3.0; - public static final String FILTER_VALUE = "io.scif.Reader"; - // -- Fields -- @Parameter @@ -415,6 +407,13 @@ public Reader[] getUnderlyingReaders() { return readers; } + // -- Prioritized API -- + + @Override + public double getPriority() { + return 3.0; + } + // -- Internal FormatReader API methods -- /** diff --git a/scifio/src/main/java/io/scif/filters/Filter.java b/scifio/src/main/java/io/scif/filters/Filter.java index 3f0fbefe72..d2b092e224 100644 --- a/scifio/src/main/java/io/scif/filters/Filter.java +++ b/scifio/src/main/java/io/scif/filters/Filter.java @@ -54,10 +54,16 @@ */ public interface Filter extends SCIFIOPlugin { - public static final String FILTER_KEY = "Filters"; - public static final String FILTER_VALUE = "java.lang.Object"; - public static final String ENABLED_KEY = "Enabled by default"; - public static final String ENABLED_VAULE = "false"; + /** + * @return The target type operated on by this filter + */ + Class target(); + + /** + * @return True iff this filter should be enabled by default (e.g. whenever a + * ReaderFilter is constructed) + */ + boolean enabledDefault(); /** * Sets the object which this filter augments. diff --git a/scifio/src/main/java/io/scif/filters/MasterFilter.java b/scifio/src/main/java/io/scif/filters/MasterFilter.java index edbafe03d9..997f7a3e2b 100644 --- a/scifio/src/main/java/io/scif/filters/MasterFilter.java +++ b/scifio/src/main/java/io/scif/filters/MasterFilter.java @@ -39,7 +39,6 @@ import java.util.Set; import org.scijava.Contextual; -import org.scijava.InstantiableException; /** * An entry point for toggling and configuring {@link Filter}s. @@ -83,10 +82,8 @@ public interface MasterFilter extends Filter { * * @param filterClass - The type of filter to enable * @return The enabled filter - * @throws InstantiableException */ - F enable(Class filterClass) - throws InstantiableException; + F enable(Class filterClass); /** * Removes the specified filter from the filter stack, if present. Clears any @@ -94,10 +91,8 @@ F enable(Class filterClass) * * @param filterClass - The type of filter to disable * @return true if the desired filter was disabled - * @throws InstantiableException */ - boolean disable(Class filterClass) - throws InstantiableException; + boolean disable(Class filterClass); /** * Returns a list of all filter classes this MasterFilter can enable/disable. diff --git a/scifio/src/main/java/io/scif/filters/MasterFilterHelper.java b/scifio/src/main/java/io/scif/filters/MasterFilterHelper.java index 381d486bba..cbe22dd3ee 100644 --- a/scifio/src/main/java/io/scif/filters/MasterFilterHelper.java +++ b/scifio/src/main/java/io/scif/filters/MasterFilterHelper.java @@ -43,10 +43,9 @@ import java.util.TreeSet; import org.scijava.Contextual; -import org.scijava.InstantiableException; +import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; -import org.scijava.plugin.PluginInfo; -import org.scijava.util.ClassUtils; +import org.scijava.plugin.PluginService; /** * Helper class for {@link io.scif.filters.MasterFilter} implementations. Takes @@ -82,14 +81,17 @@ public class MasterFilterHelper extends AbstractFilter implements MasterFilter { + // -- Parameters -- + + @Parameter + private PluginService pluginService; + + // -- Fields -- + // The non-filter object ultimately delegated to private final T tail; - // PluginInfo map allows lazy instantiation of individual plugins - private final HashMap, PluginInfo> refMap = - new HashMap, PluginInfo>(); - - // Instance map to maintain singletons of created plugins + // Instance map to maintain singletons of matching plugins private final HashMap, Filter> instanceMap = new HashMap, Filter>(); @@ -107,39 +109,16 @@ public MasterFilterHelper(final T wrapped, setParent(tail); setContext(wrapped.getContext()); - final List> filterInfos = - getContext().getPluginIndex().getPlugins(Filter.class); + + final List filters = + pluginService.createInstancesOfType(Filter.class); // check for matching filter types - for (final PluginInfo info : filterInfos) { - final String filterClassName = info.get(FILTER_KEY); - - if (filterClassName != null) { - final Class filterClass = ClassUtils.loadClass(filterClassName); - if (filterClass == null) { - log().error("Failed to find filter: " + filterClassName); - continue; - } - if (filterClass.isAssignableFrom(wrapped.getClass())) { - final Class c; - try { - c = info.loadClass(); - } - catch (final InstantiableException e) { - log().error("Failed to load filter: " + info.getClassName(), e); - continue; - } - refMap.put(c, info); - final String defaultEnabled = info.get(ENABLED_KEY); - if (Boolean.valueOf(defaultEnabled)) { - try { - enable(info.getPluginClass()); - } - catch (final InstantiableException e) { - log().error("Failed to enable filter: " + info.getPluginClass(), - e); - } - } + for (final Filter filter : filters) { + if (filter.target().isAssignableFrom(wrappedClass)) { + instanceMap.put(filter.getClass(), filter); + if (filter.enabledDefault()) { + enable(filter.getClass()); } } } @@ -149,10 +128,9 @@ public MasterFilterHelper(final T wrapped, @Override public F enable(final Class filterClass) - throws InstantiableException { @SuppressWarnings("unchecked") - final F filter = (F) getFilter(filterClass); + final F filter = (F) instanceMap.get(filterClass); if (filter != null) { enabled.add(filter); @@ -164,9 +142,8 @@ public F enable(final Class filterClass) @Override public boolean disable(final Class filterClass) - throws InstantiableException { - final Filter filter = getFilter(filterClass); + final Filter filter = instanceMap.get(filterClass); boolean disabled = false; if (filter != null) { @@ -186,6 +163,12 @@ public T getTail() { // -- Filter API Methods -- + @Override + public Class target() { + // Helper class doesn't need a target + return null; + } + @Override public void reset() { super.reset(); @@ -195,32 +178,11 @@ public void reset() { @Override public Set> getFilterClasses() { - return refMap.keySet(); + return instanceMap.keySet(); } // -- Helper Methods -- - // Helper method to check instanceMap first. If instanceMap is empty, create a - // new instance - // and set its priority. - private Filter getFilter(final Class filterClass) - throws InstantiableException - { - Filter filter = instanceMap.get(filterClass); - - if (filter != null) return filter; - - final PluginInfo item = refMap.get(filterClass); - if (item != null) { - filter = item.createInstance(); - filter.setPriority(item.getPriority()); - // NB: didn't set context as parents aren't set yet - instanceMap.put(filterClass, filter); - } - - return filter; - } - /* * Re-generates the hierarchical wrappings between each * enabled filter, based on their ordering per @@ -230,8 +192,7 @@ private void updateParents() { if (enabled.isEmpty()) setParent(tail); else { // need to wrap in reverse order to prevent changing the state of a - // parent's - // wrapped object + // parent's wrapped object final Iterator filterIterator = enabled.descendingIterator(); Filter currentFilter = filterIterator.next(); currentFilter.setParent(tail); diff --git a/scifio/src/main/java/io/scif/filters/MinMaxFilter.java b/scifio/src/main/java/io/scif/filters/MinMaxFilter.java index c96e3cce59..a5799a5177 100644 --- a/scifio/src/main/java/io/scif/filters/MinMaxFilter.java +++ b/scifio/src/main/java/io/scif/filters/MinMaxFilter.java @@ -48,21 +48,14 @@ import net.imglib2.meta.Axes; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** * Logic to compute minimum and maximum values for each channel. */ -@Plugin(type = Filter.class, attrs = { - @Attr(name = MinMaxFilter.FILTER_KEY, value = MinMaxFilter.FILTER_VALUE), - @Attr(name = MinMaxFilter.ENABLED_KEY, value = MinMaxFilter.ENABLED_VAULE) }) +@Plugin(type = Filter.class) public class MinMaxFilter extends AbstractReaderFilter { - // -- Constants -- - - public static final String FILTER_VALUE = "io.scif.Reader"; - // -- Fields -- /** Min values for each channel. */ diff --git a/scifio/src/main/java/io/scif/filters/PlaneSeparator.java b/scifio/src/main/java/io/scif/filters/PlaneSeparator.java index 869dcf006d..bf629c456f 100644 --- a/scifio/src/main/java/io/scif/filters/PlaneSeparator.java +++ b/scifio/src/main/java/io/scif/filters/PlaneSeparator.java @@ -53,25 +53,14 @@ import net.imglib2.meta.AxisType; import net.imglib2.meta.CalibratedAxis; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** * Logic to automatically separate the channels in a file. */ -@Plugin(type = Filter.class, priority = PlaneSeparator.PRIORITY, - attrs = { - @Attr(name = PlaneSeparator.FILTER_KEY, - value = PlaneSeparator.FILTER_VALUE), - @Attr(name = PlaneSeparator.ENABLED_KEY, - value = PlaneSeparator.ENABLED_VAULE) }) +@Plugin(type = Filter.class) public class PlaneSeparator extends AbstractReaderFilter { - // -- Constants -- - - public static final double PRIORITY = 2.0; - public static final String FILTER_VALUE = "io.scif.Reader"; - // -- Fields -- /** Last plane opened. */ @@ -367,6 +356,13 @@ public void close(final boolean fileOnly) throws IOException { } } + // -- Prioritized API -- + + @Override + public double getPriority() { + return 2.0; + } + // -- Helper Methods -- /** diff --git a/scifio/src/main/java/io/scif/filters/ReaderFilter.java b/scifio/src/main/java/io/scif/filters/ReaderFilter.java index f22b290485..6f874899dc 100644 --- a/scifio/src/main/java/io/scif/filters/ReaderFilter.java +++ b/scifio/src/main/java/io/scif/filters/ReaderFilter.java @@ -41,8 +41,6 @@ import java.util.Set; -import org.scijava.InstantiableException; - /** * {@link io.scif.filters.MasterFilter} for wrapping {@link io.scif.Reader} * components. @@ -71,14 +69,12 @@ public ReaderFilter(final Reader r) { @Override public F enable(final Class filterClass) - throws InstantiableException { return fHelper.enable(filterClass); } @Override public boolean disable(final Class filterClass) - throws InstantiableException { return fHelper.disable(filterClass); } diff --git a/scifio/src/main/java/io/scif/img/ImgOpener.java b/scifio/src/main/java/io/scif/img/ImgOpener.java index 419146b2f2..68134b5323 100644 --- a/scifio/src/main/java/io/scif/img/ImgOpener.java +++ b/scifio/src/main/java/io/scif/img/ImgOpener.java @@ -70,7 +70,6 @@ import net.imglib2.type.numeric.RealType; import org.scijava.Context; -import org.scijava.InstantiableException; import org.scijava.app.StatusService; import org.scijava.plugin.Parameter; @@ -375,9 +374,6 @@ private Reader createReader(final String source, final ImgOptions imgOptions) catch (final IOException e) { throw new ImgIOException(e); } - catch (final InstantiableException e) { - throw new ImgIOException(e); - } return r; } @@ -634,13 +630,7 @@ private void populateMinMax(final Reader r, final ImgPlus imgPlus, final int sizeC = (int) r.getMetadata().get(imageIndex).getAxisLength(Axes.CHANNEL); final ReaderFilter rf = (ReaderFilter) r; - MinMaxFilter minMax = null; - try { - minMax = rf.enable(MinMaxFilter.class); - } - catch (final InstantiableException e) { - throw new FormatException(e); - } + MinMaxFilter minMax = rf.enable(MinMaxFilter.class); for (int c = 0; c < sizeC; c++) { final Double min = minMax.getChannelKnownMinimum(imageIndex, c); final Double max = minMax.getChannelKnownMaximum(imageIndex, c); diff --git a/scifio/src/test/java/io/scif/filters/utests/FilterTest.java b/scifio/src/test/java/io/scif/filters/utests/FilterTest.java index 061dad0d83..dd342e0b7c 100644 --- a/scifio/src/test/java/io/scif/filters/utests/FilterTest.java +++ b/scifio/src/test/java/io/scif/filters/utests/FilterTest.java @@ -36,14 +36,14 @@ package io.scif.filters.utests; -import static org.testng.AssertJUnit.assertTrue; import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertTrue; import io.scif.FormatException; import io.scif.Reader; import io.scif.SCIFIO; import io.scif.filters.AbstractReaderFilter; -import io.scif.filters.PlaneSeparator; import io.scif.filters.Filter; +import io.scif.filters.PlaneSeparator; import io.scif.filters.ReaderFilter; import java.io.IOException; @@ -51,9 +51,6 @@ import net.imglib2.meta.Axes; import org.scijava.Context; -import org.scijava.InstantiableException; -import org.scijava.plugin.Attr; -import org.scijava.plugin.Plugin; import org.scijava.plugin.PluginInfo; import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; @@ -82,11 +79,9 @@ private SCIFIO makeSCIFIO() { Context ctx = scifio.getContext(); PluginInfo enabledInfo = - new PluginInfo(EnabledFilter.class, Filter.class, - (Plugin) EnabledFilter.class.getAnnotations()[0]); + new PluginInfo(EnabledFilter.class, Filter.class); PluginInfo disabledInfo = - new PluginInfo(DisabledFilter.class, Filter.class, - (Plugin) DisabledFilter.class.getAnnotations()[0]); + new PluginInfo(DisabledFilter.class, Filter.class); ctx.getPluginIndex().add(enabledInfo); ctx.getPluginIndex().add(disabledInfo); @@ -106,12 +101,7 @@ public void testSetSource() throws FormatException, IOException { readerFilter = scifio.initializer().initializeReader(id, true); - try { ((ReaderFilter) readerFilter).enable(PlaneSeparator.class); - } - catch (InstantiableException e) { - throw new FormatException(e); - } long x = readerFilter.getMetadata().get(0).getAxisLength(Axes.X); long y = readerFilter.getMetadata().get(0).getAxisLength(Axes.Y); @@ -124,7 +114,6 @@ public void testSetSource() throws FormatException, IOException { y = readerFilter.getMetadata().get(0).getAxisLength(Axes.Y); assertEquals(256, x); assertEquals(128, y); - } @Test @@ -151,8 +140,7 @@ public void testDefaultEnabled() throws FormatException, IOException { } @Test - public void testFilterOrder() throws FormatException, IOException, - InstantiableException + public void testFilterOrder() throws FormatException, IOException { readerFilter = scifio.initializer().initializeReader(id); @@ -182,28 +170,20 @@ public void testFilterOrder() throws FormatException, IOException, } // Sample plugin class known to be enabled by default - @Plugin( - type = Filter.class, - attrs = { - @Attr(name = EnabledFilter.FILTER_KEY, value = EnabledFilter.FILTER_VALUE), - @Attr(name = EnabledFilter.ENABLED_KEY, - value = EnabledFilter.ENABLED_VAULE) }) public static class EnabledFilter extends AbstractReaderFilter { - public static final String FILTER_VALUE = "io.scif.Reader"; - public static final String ENABLED_VAULE = "true"; + @Override + public boolean enabledDefault() { + return true; + } } // Sample plugin class known to be disabled by default - @Plugin(type = Filter.class, - attrs = { - @Attr(name = DisabledFilter.FILTER_KEY, - value = DisabledFilter.FILTER_VALUE), - @Attr(name = DisabledFilter.ENABLED_KEY, - value = DisabledFilter.ENABLED_VAULE) }) public static class DisabledFilter extends AbstractReaderFilter { - public static final String FILTER_VALUE = "io.scif.Reader"; - public static final String ENABLED_VAULE = "false"; + @Override + public boolean enabledDefault() { + return false; + } } } diff --git a/tools/src/main/java/io/scif/tools/commands/AbstractReaderCommand.java b/tools/src/main/java/io/scif/tools/commands/AbstractReaderCommand.java index 8a659af75e..4f25b51d7e 100644 --- a/tools/src/main/java/io/scif/tools/commands/AbstractReaderCommand.java +++ b/tools/src/main/java/io/scif/tools/commands/AbstractReaderCommand.java @@ -61,7 +61,6 @@ import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.Option; -import org.scijava.InstantiableException; import org.scijava.plugin.Parameter; /** @@ -153,15 +152,10 @@ protected ReaderFilter makeReader(String path) throws CmdLineException { } // Enable filters - try { - if (stitch) reader.enable(FileStitcher.class); - if (separate) reader.enable(PlaneSeparator.class); - if (expand) reader.enable(ChannelFiller.class); - if (autoscale) reader.enable(MinMaxFilter.class); - } - catch (InstantiableException e) { - throw new CmdLineException(null, e.getMessage()); - } + if (stitch) reader.enable(FileStitcher.class); + if (separate) reader.enable(PlaneSeparator.class); + if (expand) reader.enable(ChannelFiller.class); + if (autoscale) reader.enable(MinMaxFilter.class); // Set reader configuration reader.setGroupFiles(!nogroup); From be672199c9929a7634c9ef88b3e9098eb49852ad Mon Sep 17 00:00:00 2001 From: Mark Hiner Date: Wed, 11 Dec 2013 16:05:12 -0600 Subject: [PATCH 5/5] MetadataWrapper: remove plugin annotations All ReaderFilters define the Metadata they are bound to in their constructor. There is really no reason to be trying to dynamically discover these. The Filter should be the unit of discovery, with any accessory classes bound by their use. This also removes the messy @Attr use in several MetadataWrapper implementations. The AbstractReaderFilter#setParent method has been updated to use the known metadata class (if available) to create a new MetadataWrapper and wrap the parent metadata. This logic is significantly simplified. --- .../io/scif/filters/AbstractReaderFilter.java | 54 ++++++++----------- .../scif/filters/ChannelFillerMetadata.java | 26 +++------ .../filters/DimensionSwapperMetadata.java | 30 +++-------- .../java/io/scif/filters/MetadataWrapper.java | 9 ++-- .../scif/filters/PlaneSeparatorMetadata.java | 17 +++--- 5 files changed, 47 insertions(+), 89 deletions(-) diff --git a/scifio/src/main/java/io/scif/filters/AbstractReaderFilter.java b/scifio/src/main/java/io/scif/filters/AbstractReaderFilter.java index c9e1f256ad..6eb0d1896c 100644 --- a/scifio/src/main/java/io/scif/filters/AbstractReaderFilter.java +++ b/scifio/src/main/java/io/scif/filters/AbstractReaderFilter.java @@ -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 @@ -82,7 +79,7 @@ public abstract class AbstractReaderFilter extends AbstractFilter /* Need to wrap each Reader's Metadata separately */ private Metadata wrappedMeta = null; - private final Class metaClass; + private final Class metaClass; @Parameter private PluginService pluginService; @@ -93,7 +90,8 @@ public AbstractReaderFilter() { this(null); } - public AbstractReaderFilter(final Class metaClass) { + public AbstractReaderFilter(final Class metaClass) + { super(Reader.class); this.metaClass = metaClass; } @@ -151,36 +149,26 @@ public void setParent(final Object 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> wrapperInfos = - getContext().getPluginIndex().getPlugins(MetadataWrapper.class); - - // look for a compatible MetadataWrapper class - for (final PluginInfo 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 diff --git a/scifio/src/main/java/io/scif/filters/ChannelFillerMetadata.java b/scifio/src/main/java/io/scif/filters/ChannelFillerMetadata.java index c53e82ede1..0cb4e814e1 100644 --- a/scifio/src/main/java/io/scif/filters/ChannelFillerMetadata.java +++ b/scifio/src/main/java/io/scif/filters/ChannelFillerMetadata.java @@ -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 @@ -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 @@ -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() { @@ -163,4 +144,11 @@ public void populateImageMetadata() { add(iMeta, false); } } + + // -- MetadataWrapper API -- + + @Override + public Class filterType() { + return io.scif.filters.ChannelFiller.class; + } } diff --git a/scifio/src/main/java/io/scif/filters/DimensionSwapperMetadata.java b/scifio/src/main/java/io/scif/filters/DimensionSwapperMetadata.java index 58e99406e0..7db65f8f1d 100644 --- a/scifio/src/main/java/io/scif/filters/DimensionSwapperMetadata.java +++ b/scifio/src/main/java/io/scif/filters/DimensionSwapperMetadata.java @@ -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}. @@ -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[] outputOrder; - // -- Constructors -- - - public DimensionSwapperMetadata() { - this(null); - } - - public DimensionSwapperMetadata(final Metadata metadata) { - super(metadata); - } - // -- DimensionSwapperMetadata API -- /** @@ -99,4 +76,11 @@ public List[] getOutputOrder() { public void setOutputOrder(final List[] outputOrder) { this.outputOrder = outputOrder; } + + // -- MetadataWrapper API -- + + @Override + public Class filterType() { + return io.scif.filters.DimensionSwapper.class; + } } diff --git a/scifio/src/main/java/io/scif/filters/MetadataWrapper.java b/scifio/src/main/java/io/scif/filters/MetadataWrapper.java index d50109e083..27f8918aa3 100644 --- a/scifio/src/main/java/io/scif/filters/MetadataWrapper.java +++ b/scifio/src/main/java/io/scif/filters/MetadataWrapper.java @@ -63,9 +63,6 @@ */ public interface MetadataWrapper extends Metadata { - public static final String METADATA_KEY = "Metadata Wrapper"; - public static final String METADATA_VALUE = "java.lang.Object"; - /** * @return The {@code Metadata} used for delegation by this wrapper. */ @@ -79,6 +76,12 @@ public interface MetadataWrapper extends Metadata { */ void wrap(Metadata meta); + /** + * @return The class of the {@link Filter} this MetadataWrapper is compatible + * with. + */ + Class filterType(); + // -- Setter Methods with passUp flag -- void setTable(final MetaTable table, final boolean passUp); diff --git a/scifio/src/main/java/io/scif/filters/PlaneSeparatorMetadata.java b/scifio/src/main/java/io/scif/filters/PlaneSeparatorMetadata.java index db3c3e92c7..51a4053a0c 100644 --- a/scifio/src/main/java/io/scif/filters/PlaneSeparatorMetadata.java +++ b/scifio/src/main/java/io/scif/filters/PlaneSeparatorMetadata.java @@ -45,7 +45,6 @@ import net.imglib2.meta.AxisType; -import org.scijava.plugin.Attr; import org.scijava.plugin.Plugin; /** @@ -56,23 +55,14 @@ * @see io.scif.filters.PlaneSeparator * @author Mark Hiner */ -@Plugin(type = MetadataWrapper.class, attrs = { @Attr( - name = PlaneSeparatorMetadata.METADATA_KEY, - value = PlaneSeparatorMetadata.METADATA_VALUE) }) +@Plugin(type = MetadataWrapper.class) public class PlaneSeparatorMetadata extends AbstractMetadataWrapper { - // -- Constants -- - - public static final String METADATA_VALUE = - "io.scif.filters.PlaneSeparator"; - // -- Fields -- /** List of Axes to separate. */ private Set splitTypes = new HashSet(); - // -- Constructors -- - // -- PlanarAxisSeparatorMetadata API Methods -- /** Returns the number of axes being separated. */ @@ -108,6 +98,11 @@ public void wrap(final Metadata meta) { super.wrap(meta); } + @Override + public Class filterType() { + return io.scif.filters.PlaneSeparator.class; + } + // -- Metadata API Methods -- @Override