diff options
Diffstat (limited to 'awt/javax/imageio/spi')
-rw-r--r-- | awt/javax/imageio/spi/IIORegistry.java | 115 | ||||
-rw-r--r-- | awt/javax/imageio/spi/IIOServiceProvider.java | 105 | ||||
-rw-r--r-- | awt/javax/imageio/spi/ImageInputStreamSpi.java | 131 | ||||
-rw-r--r-- | awt/javax/imageio/spi/ImageOutputStreamSpi.java | 132 | ||||
-rw-r--r-- | awt/javax/imageio/spi/ImageReaderSpi.java | 204 | ||||
-rw-r--r-- | awt/javax/imageio/spi/ImageReaderWriterSpi.java | 344 | ||||
-rw-r--r-- | awt/javax/imageio/spi/ImageTranscoderSpi.java | 76 | ||||
-rw-r--r-- | awt/javax/imageio/spi/ImageWriterSpi.java | 227 | ||||
-rw-r--r-- | awt/javax/imageio/spi/RegisterableService.java | 54 | ||||
-rw-r--r-- | awt/javax/imageio/spi/ServiceRegistry.java | 552 | ||||
-rw-r--r-- | awt/javax/imageio/spi/package.html | 8 |
11 files changed, 1948 insertions, 0 deletions
diff --git a/awt/javax/imageio/spi/IIORegistry.java b/awt/javax/imageio/spi/IIORegistry.java new file mode 100644 index 0000000..01ddeaa --- /dev/null +++ b/awt/javax/imageio/spi/IIORegistry.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Rustem V. Rafikov + * @version $Revision: 1.3 $ + */ + +package javax.imageio.spi; + +import java.util.Arrays; + +import org.apache.harmony.x.imageio.plugins.jpeg.JPEGImageReaderSpi; +import org.apache.harmony.x.imageio.plugins.jpeg.JPEGImageWriterSpi; +import org.apache.harmony.x.imageio.plugins.png.PNGImageReaderSpi; +import org.apache.harmony.x.imageio.plugins.png.PNGImageWriterSpi; +import org.apache.harmony.x.imageio.spi.FileIISSpi; +import org.apache.harmony.x.imageio.spi.FileIOSSpi; +import org.apache.harmony.x.imageio.spi.InputStreamIISSpi; +import org.apache.harmony.x.imageio.spi.OutputStreamIOSSpi; +import org.apache.harmony.x.imageio.spi.RAFIISSpi; +import org.apache.harmony.x.imageio.spi.RAFIOSSpi; + +/* + * @author Rustem V. Rafikov, Viskov Nikolay + * @version $Revision: 1.3 $ + */ + +/** + * The IIORegistry class registers service provider instances (SPI). Service + * provider instances are recognized by specific meta-information in the JAR + * files containing them. The JAR files with SPI classes are loaded from the + * application class path. + * + * @since Android 1.0 + */ +public final class IIORegistry extends ServiceRegistry { + + /** + * The instance. + */ + private static IIORegistry instance; + + /** + * The Constant CATEGORIES. + */ + private static final Class[] CATEGORIES = new Class[] { + javax.imageio.spi.ImageWriterSpi.class, javax.imageio.spi.ImageReaderSpi.class, + javax.imageio.spi.ImageInputStreamSpi.class, + // javax.imageio.spi.ImageTranscoderSpi.class, + javax.imageio.spi.ImageOutputStreamSpi.class + }; + + /** + * Instantiates a new IIO registry. + */ + private IIORegistry() { + super(Arrays.<Class<?>> asList(CATEGORIES).iterator()); + registerBuiltinSpis(); + registerApplicationClasspathSpis(); + } + + /** + * Register built-in SPIs. + */ + private void registerBuiltinSpis() { + registerServiceProvider(new JPEGImageWriterSpi()); + registerServiceProvider(new JPEGImageReaderSpi()); + registerServiceProvider(new PNGImageReaderSpi()); + registerServiceProvider(new PNGImageWriterSpi()); + registerServiceProvider(new FileIOSSpi()); + registerServiceProvider(new FileIISSpi()); + registerServiceProvider(new RAFIOSSpi()); + registerServiceProvider(new RAFIISSpi()); + registerServiceProvider(new OutputStreamIOSSpi()); + registerServiceProvider(new InputStreamIISSpi()); + // -- TODO implement + } + + /** + * Gets the default IIORegistry instance. + * + * @return the default IIORegistry instance. + */ + public static IIORegistry getDefaultInstance() { + // TODO implement own instance for each ThreadGroup (see also + // ThreadLocal) + synchronized (IIORegistry.class) { + if (instance == null) { + instance = new IIORegistry(); + } + return instance; + } + } + + /** + * Registers all service providers from the application class path. + */ + public void registerApplicationClasspathSpis() { + // -- TODO implement for non-builtin plugins + } +} diff --git a/awt/javax/imageio/spi/IIOServiceProvider.java b/awt/javax/imageio/spi/IIOServiceProvider.java new file mode 100644 index 0000000..e947677 --- /dev/null +++ b/awt/javax/imageio/spi/IIOServiceProvider.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Rustem V. Rafikov + * @version $Revision: 1.3 $ + */ + +package javax.imageio.spi; + +import java.util.Locale; + +/** + * The IIOServiceProvider abstract class provides base functionality for ImageIO + * service provider interfaces (SPIs). + * + * @since Android 1.0 + */ +public abstract class IIOServiceProvider implements RegisterableService { + + /** + * The vendor name of this service provider. + */ + protected String vendorName; + + /** + * The version of this service provider. + */ + protected String version; + + /** + * Instantiates a new IIOServiceProvider. + * + * @param vendorName + * the vendor name of service provider. + * @param version + * the version of service provider. + */ + public IIOServiceProvider(String vendorName, String version) { + if (vendorName == null) { + throw new NullPointerException("vendor name cannot be NULL"); + } + if (version == null) { + throw new NullPointerException("version name cannot be NULL"); + } + this.vendorName = vendorName; + this.version = version; + } + + /** + * Instantiates a new IIOServiceProvider. + */ + public IIOServiceProvider() { + throw new UnsupportedOperationException("Not supported yet"); + } + + public void onRegistration(ServiceRegistry registry, Class<?> category) { + // the default impl. does nothing + } + + public void onDeregistration(ServiceRegistry registry, Class<?> category) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Gets the vendor name of this service provider. + * + * @return the vendor name of this service provider. + */ + public String getVendorName() { + return vendorName; + } + + /** + * Gets the version of this service provider. + * + * @return the version of this service provider. + */ + public String getVersion() { + return version; + } + + /** + * Gets a description of this service provider. The result string should be + * localized for the specified Locale. + * + * @param locale + * the specified Locale. + * @return the description of this service provider. + */ + public abstract String getDescription(Locale locale); +} diff --git a/awt/javax/imageio/spi/ImageInputStreamSpi.java b/awt/javax/imageio/spi/ImageInputStreamSpi.java new file mode 100644 index 0000000..fc859a8 --- /dev/null +++ b/awt/javax/imageio/spi/ImageInputStreamSpi.java @@ -0,0 +1,131 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Rustem V. Rafikov + * @version $Revision: 1.3 $ + */ + +package javax.imageio.spi; + +import java.io.File; +import java.io.IOException; +import javax.imageio.stream.ImageInputStream; + +/** + * The ImageInputStreamSpi abstract class is a service provider interface (SPI) + * for ImageInputStreams. + * + * @since Android 1.0 + */ +public abstract class ImageInputStreamSpi extends IIOServiceProvider implements RegisterableService { + + /** + * The input class. + */ + protected Class<?> inputClass; + + /** + * Instantiates a new ImageInputStreamSpi. + */ + protected ImageInputStreamSpi() { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Instantiates a new ImageInputStreamSpi. + * + * @param vendorName + * the vendor name. + * @param version + * the version. + * @param inputClass + * the input class. + */ + public ImageInputStreamSpi(String vendorName, String version, Class<?> inputClass) { + super(vendorName, version); + this.inputClass = inputClass; + } + + /** + * Gets an input Class object that represents class or interface that must + * be implemented by an input source. + * + * @return the input class. + */ + public Class<?> getInputClass() { + return inputClass; + } + + /** + * Returns true if the ImageInputStream can use a cache file. If this method + * returns false, the value of the useCache parameter of + * createInputStreamInstance will be ignored. The default implementation + * returns false. + * + * @return true, if the ImageInputStream can use a cache file, false + * otherwise. + */ + public boolean canUseCacheFile() { + return false; // -- def + } + + /** + * Returns true if the ImageInputStream implementation requires the use of a + * cache file. The default implementation returns false. + * + * @return true, if the ImageInputStream implementation requires the use of + * a cache file, false otherwise. + */ + public boolean needsCacheFile() { + return false; // def + } + + /** + * Creates the ImageInputStream associated with this service provider. The + * input object should be an instance of the class returned by the + * getInputClass method. This method uses the specified directory for the + * cache file if the useCache parameter is true. + * + * @param input + * the input Object. + * @param useCache + * the flag indicating if a cache file is needed or not. + * @param cacheDir + * the cache directory. + * @return the ImageInputStream. + * @throws IOException + * if an I/O exception has occurred. + */ + public abstract ImageInputStream createInputStreamInstance(Object input, boolean useCache, + File cacheDir) throws IOException; + + /** + * Creates the ImageInputStream associated with this service provider. The + * input object should be an instance of the class returned by getInputClass + * method. This method uses the default system directory for the cache file, + * if it is needed. + * + * @param input + * the input Object. + * @return the ImageInputStream. + * @throws IOException + * if an I/O exception has occurred. + */ + public ImageInputStream createInputStreamInstance(Object input) throws IOException { + return createInputStreamInstance(input, true, null); + } +} diff --git a/awt/javax/imageio/spi/ImageOutputStreamSpi.java b/awt/javax/imageio/spi/ImageOutputStreamSpi.java new file mode 100644 index 0000000..b7a9a5c --- /dev/null +++ b/awt/javax/imageio/spi/ImageOutputStreamSpi.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Rustem V. Rafikov + * @version $Revision: 1.3 $ + */ + +package javax.imageio.spi; + +import javax.imageio.stream.ImageOutputStream; +import java.io.IOException; +import java.io.File; + +/** + * The ImageOutputStreamSpi abstract class is a service provider interface (SPI) + * for ImageOutputStreams. + * + * @since Android 1.0 + */ +public abstract class ImageOutputStreamSpi extends IIOServiceProvider implements + RegisterableService { + + /** + * The output class. + */ + protected Class<?> outputClass; + + /** + * Instantiates a new ImageOutputStreamSpi. + */ + protected ImageOutputStreamSpi() { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Instantiates a new ImageOutputStreamSpi. + * + * @param vendorName + * the vendor name. + * @param version + * the version. + * @param outputClass + * the output class. + */ + public ImageOutputStreamSpi(String vendorName, String version, Class<?> outputClass) { + super(vendorName, version); + this.outputClass = outputClass; + } + + /** + * Gets an output Class object that represents the class or interface that + * must be implemented by an output source. + * + * @return the output class. + */ + public Class<?> getOutputClass() { + return outputClass; + } + + /** + * Returns true if the ImageOutputStream can use a cache file. If this + * method returns false, the value of the useCache parameter of + * createOutputStreamInstance will be ignored. The default implementation + * returns false. + * + * @return true, if the ImageOutputStream can use a cache file, false + * otherwise. + */ + public boolean canUseCacheFile() { + return false; // def + } + + /** + * Returns true if the ImageOutputStream implementation requires the use of + * a cache file. The default implementation returns false. + * + * @return true, if the ImageOutputStream implementation requires the use of + * a cache file, false otherwise. + */ + public boolean needsCacheFile() { + return false; // def + } + + /** + * Creates the ImageOutputStream associated with this service provider. The + * output object should be an instance of the class returned by + * getOutputClass method. This method uses the default system directory for + * the cache file, if it is needed. + * + * @param output + * the output Object. + * @return the ImageOutputStream. + * @throws IOException + * if an I/O exception has occurred. + */ + public ImageOutputStream createOutputStreamInstance(Object output) throws IOException { + return createOutputStreamInstance(output, true, null); + } + + /** + * Creates the ImageOutputStream associated with this service provider. The + * output object should be an instance of the class returned by + * getInputClass method. This method uses the specified directory for the + * cache file, if the useCache parameter is true. + * + * @param output + * the output Object. + * @param useCache + * the flag indicating if cache file is needed or not. + * @param cacheDir + * the cache directory. + * @return the ImageOutputStream. + * @throws IOException + * if an I/O exception has occurred. + */ + public abstract ImageOutputStream createOutputStreamInstance(Object output, boolean useCache, + File cacheDir) throws IOException; +} diff --git a/awt/javax/imageio/spi/ImageReaderSpi.java b/awt/javax/imageio/spi/ImageReaderSpi.java new file mode 100644 index 0000000..0528d25 --- /dev/null +++ b/awt/javax/imageio/spi/ImageReaderSpi.java @@ -0,0 +1,204 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Rustem V. Rafikov + * @version $Revision: 1.3 $ + */ + +package javax.imageio.spi; + +import javax.imageio.stream.ImageInputStream; +import javax.imageio.ImageReader; +import java.io.IOException; + +/** + * The ImageReaderSpi abstract class is a service provider interface (SPI) for + * ImageReaders. + * + * @since Android 1.0 + */ +public abstract class ImageReaderSpi extends ImageReaderWriterSpi { + + /** + * The STANDARD_INPUT_TYPE contains ImageInputStream.class. + */ + public static final Class[] STANDARD_INPUT_TYPE = new Class[] { + ImageInputStream.class + }; + + /** + * The input types. + */ + protected Class[] inputTypes; + + /** + * The writer SPI names. + */ + protected String[] writerSpiNames; + + /** + * Instantiates a new ImageReaderSpi. + */ + protected ImageReaderSpi() { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Instantiates a new ImageReaderSpi. + * + * @param vendorName + * the vendor name. + * @param version + * the version. + * @param names + * the format names. + * @param suffixes + * the array of strings representing the file suffixes. + * @param MIMETypes + * the an array of strings representing MIME types. + * @param pluginClassName + * the plug-in class name. + * @param inputTypes + * the input types. + * @param writerSpiNames + * the array of strings with class names of all associated + * ImageWriters. + * @param supportsStandardStreamMetadataFormat + * the value indicating if stream metadata can be described by + * standard metadata format. + * @param nativeStreamMetadataFormatName + * the native stream metadata format name, returned by + * getNativeStreamMetadataFormatName. + * @param nativeStreamMetadataFormatClassName + * the native stream metadata format class name, returned by + * getNativeStreamMetadataFormat. + * @param extraStreamMetadataFormatNames + * the extra stream metadata format names, returned by + * getExtraStreamMetadataFormatNames. + * @param extraStreamMetadataFormatClassNames + * the extra stream metadata format class names, returned by + * getStreamMetadataFormat. + * @param supportsStandardImageMetadataFormat + * the value indicating if image metadata can be described by + * standard metadata format. + * @param nativeImageMetadataFormatName + * the native image metadata format name, returned by + * getNativeImageMetadataFormatName. + * @param nativeImageMetadataFormatClassName + * the native image metadata format class name, returned by + * getNativeImageMetadataFormat. + * @param extraImageMetadataFormatNames + * the extra image metadata format names, returned by + * getExtraImageMetadataFormatNames. + * @param extraImageMetadataFormatClassNames + * the extra image metadata format class names, returned by + * getImageMetadataFormat. + */ + public ImageReaderSpi(String vendorName, String version, String[] names, String[] suffixes, + String[] MIMETypes, String pluginClassName, Class[] inputTypes, + String[] writerSpiNames, boolean supportsStandardStreamMetadataFormat, + String nativeStreamMetadataFormatName, String nativeStreamMetadataFormatClassName, + String[] extraStreamMetadataFormatNames, String[] extraStreamMetadataFormatClassNames, + boolean supportsStandardImageMetadataFormat, String nativeImageMetadataFormatName, + String nativeImageMetadataFormatClassName, String[] extraImageMetadataFormatNames, + String[] extraImageMetadataFormatClassNames) { + super(vendorName, version, names, suffixes, MIMETypes, pluginClassName, + supportsStandardStreamMetadataFormat, nativeStreamMetadataFormatName, + nativeStreamMetadataFormatClassName, extraStreamMetadataFormatNames, + extraStreamMetadataFormatClassNames, supportsStandardImageMetadataFormat, + nativeImageMetadataFormatName, nativeImageMetadataFormatClassName, + extraImageMetadataFormatNames, extraImageMetadataFormatClassNames); + + if (inputTypes == null || inputTypes.length == 0) { + throw new NullPointerException("input types array cannot be NULL or empty"); + } + this.inputTypes = inputTypes; + this.writerSpiNames = writerSpiNames; + } + + /** + * Gets an array of Class objects whose types can be used as input for this + * reader. + * + * @return the input types. + */ + public Class[] getInputTypes() { + return inputTypes; + } + + /** + * Returns true if the format of source object is supported by this reader. + * + * @param source + * the source object to be decoded (for example an + * ImageInputStream). + * @return true, if the format of source object is supported by this reader, + * false otherwise. + * @throws IOException + * if an I/O exception has occurred. + */ + public abstract boolean canDecodeInput(Object source) throws IOException; + + /** + * Returns an instance of the ImageReader implementation for this service + * provider. + * + * @return the ImageReader. + * @throws IOException + * if an I/O exception has occurred. + */ + public ImageReader createReaderInstance() throws IOException { + return createReaderInstance(null); + } + + /** + * Returns an instance of the ImageReader implementation for this service + * provider. + * + * @param extension + * the a plug-in specific extension object, or null. + * @return the ImageReader. + * @throws IOException + * if an I/O exception has occurred. + */ + public abstract ImageReader createReaderInstance(Object extension) throws IOException; + + /** + * Checks whether or not the specified ImageReader object is an instance of + * the ImageReader associated with this service provider or not. + * + * @param reader + * the ImageReader. + * @return true, if the specified ImageReader object is an instance of the + * ImageReader associated with this service provider, false + * otherwise. + */ + public boolean isOwnReader(ImageReader reader) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Gets an array of strings with names of the ImageWriterSpi classes that + * support the internal metadata representation used by the ImageReader of + * this service provider, or null if there are no such ImageWriters. + * + * @return the array of strings with names of the ImageWriterSpi classes. + */ + public String[] getImageWriterSpiNames() { + throw new UnsupportedOperationException("Not supported yet"); + } +} diff --git a/awt/javax/imageio/spi/ImageReaderWriterSpi.java b/awt/javax/imageio/spi/ImageReaderWriterSpi.java new file mode 100644 index 0000000..9ca08b5 --- /dev/null +++ b/awt/javax/imageio/spi/ImageReaderWriterSpi.java @@ -0,0 +1,344 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Rustem V. Rafikov + * @version $Revision: 1.3 $ + */ + +package javax.imageio.spi; + +import org.apache.harmony.x.imageio.metadata.IIOMetadataUtils; + +import javax.imageio.metadata.IIOMetadataFormat; + +/** + * The ImageReaderWriterSpi class is a superclass for the ImageReaderSpi and + * ImageWriterSpi SPIs. + * + * @since Android 1.0 + */ +public abstract class ImageReaderWriterSpi extends IIOServiceProvider implements + RegisterableService { + + /** + * The names. + */ + protected String[] names; + + /** + * The suffixes. + */ + protected String[] suffixes; + + /** + * The MIME types. + */ + protected String[] MIMETypes; + + /** + * The plug-in class name. + */ + protected String pluginClassName; + + /** + * Whether the reader/writer supports standard stream metadata format. + */ + protected boolean supportsStandardStreamMetadataFormat; + + /** + * The native stream metadata format name. + */ + protected String nativeStreamMetadataFormatName; + + /** + * The native stream metadata format class name. + */ + protected String nativeStreamMetadataFormatClassName; + + /** + * The extra stream metadata format names. + */ + protected String[] extraStreamMetadataFormatNames; + + /** + * The extra stream metadata format class names. + */ + protected String[] extraStreamMetadataFormatClassNames; + + /** + * Whether the reader/writer supports standard image metadata format. + */ + protected boolean supportsStandardImageMetadataFormat; + + /** + * The native image metadata format name. + */ + protected String nativeImageMetadataFormatName; + + /** + * The native image metadata format class name. + */ + protected String nativeImageMetadataFormatClassName; + + /** + * The extra image metadata format names. + */ + protected String[] extraImageMetadataFormatNames; + + /** + * The extra image metadata format class names. + */ + protected String[] extraImageMetadataFormatClassNames; + + /** + * Instantiates a new ImageReaderWriterSpi. + * + * @param vendorName + * the vendor name. + * @param version + * the version. + * @param names + * the format names. + * @param suffixes + * the array of strings representing the file suffixes. + * @param MIMETypes + * the an array of strings representing MIME types. + * @param pluginClassName + * the plug-in class name. + * @param supportsStandardStreamMetadataFormat + * the value indicating if stream metadata can be described by + * standard metadata format. + * @param nativeStreamMetadataFormatName + * the native stream metadata format name, returned by + * getNativeStreamMetadataFormatName. + * @param nativeStreamMetadataFormatClassName + * the native stream metadata format class name, returned by + * getNativeStreamMetadataFormat. + * @param extraStreamMetadataFormatNames + * the extra stream metadata format names, returned by + * getExtraStreamMetadataFormatNames. + * @param extraStreamMetadataFormatClassNames + * the extra stream metadata format class names, returned by + * getStreamMetadataFormat. + * @param supportsStandardImageMetadataFormat + * the value indicating if image metadata can be described by + * standard metadata format. + * @param nativeImageMetadataFormatName + * the native image metadata format name, returned by + * getNativeImageMetadataFormatName. + * @param nativeImageMetadataFormatClassName + * the native image metadata format class name, returned by + * getNativeImageMetadataFormat. + * @param extraImageMetadataFormatNames + * the extra image metadata format names, returned by + * getExtraImageMetadataFormatNames. + * @param extraImageMetadataFormatClassNames + * the extra image metadata format class names, returned by + * getImageMetadataFormat. + */ + public ImageReaderWriterSpi(String vendorName, String version, String[] names, + String[] suffixes, String[] MIMETypes, String pluginClassName, + boolean supportsStandardStreamMetadataFormat, String nativeStreamMetadataFormatName, + String nativeStreamMetadataFormatClassName, String[] extraStreamMetadataFormatNames, + String[] extraStreamMetadataFormatClassNames, + boolean supportsStandardImageMetadataFormat, String nativeImageMetadataFormatName, + String nativeImageMetadataFormatClassName, String[] extraImageMetadataFormatNames, + String[] extraImageMetadataFormatClassNames) { + super(vendorName, version); + + if (names == null || names.length == 0) { + throw new NullPointerException("format names array cannot be NULL or empty"); + } + + if (pluginClassName == null) { + throw new NullPointerException("Plugin class name cannot be NULL"); + } + + // We clone all the arrays to be consistent with the fact that + // some methods of this class must return clones of the arrays + // as it is stated in the spec. + this.names = names.clone(); + this.suffixes = suffixes == null ? null : suffixes.clone(); + this.MIMETypes = MIMETypes == null ? null : MIMETypes.clone(); + this.pluginClassName = pluginClassName; + this.supportsStandardStreamMetadataFormat = supportsStandardStreamMetadataFormat; + this.nativeStreamMetadataFormatName = nativeStreamMetadataFormatName; + this.nativeStreamMetadataFormatClassName = nativeStreamMetadataFormatClassName; + + this.extraStreamMetadataFormatNames = extraStreamMetadataFormatNames == null ? null + : extraStreamMetadataFormatNames.clone(); + + this.extraStreamMetadataFormatClassNames = extraStreamMetadataFormatClassNames == null ? null + : extraStreamMetadataFormatClassNames.clone(); + + this.supportsStandardImageMetadataFormat = supportsStandardImageMetadataFormat; + this.nativeImageMetadataFormatName = nativeImageMetadataFormatName; + this.nativeImageMetadataFormatClassName = nativeImageMetadataFormatClassName; + + this.extraImageMetadataFormatNames = extraImageMetadataFormatNames == null ? null + : extraImageMetadataFormatNames.clone(); + + this.extraImageMetadataFormatClassNames = extraImageMetadataFormatClassNames == null ? null + : extraImageMetadataFormatClassNames.clone(); + } + + /** + * Instantiates a new ImageReaderWriterSpi. + */ + public ImageReaderWriterSpi() { + } + + /** + * Gets an array of strings representing names of the formats that can be + * used by the ImageReader or ImageWriter implementation associated with + * this service provider. + * + * @return the array of supported format names. + */ + public String[] getFormatNames() { + return names.clone(); + } + + /** + * Gets an array of strings representing file suffixes associated with the + * formats that can be used by the ImageReader or ImageWriter implementation + * of this service provider. + * + * @return the array of file suffixes. + */ + public String[] getFileSuffixes() { + return suffixes == null ? null : suffixes.clone(); + } + + /** + * Gets an array of strings with the names of additional formats of the + * image metadata objects produced or consumed by this plug-in. + * + * @return the array of extra image metadata format names. + */ + public String[] getExtraImageMetadataFormatNames() { + return extraImageMetadataFormatNames == null ? null : extraImageMetadataFormatNames.clone(); + } + + /** + * Gets an array of strings with the names of additional formats of the + * stream metadata objects produced or consumed by this plug-in. + * + * @return the array of extra stream metadata format names. + */ + public String[] getExtraStreamMetadataFormatNames() { + return extraStreamMetadataFormatNames == null ? null : extraStreamMetadataFormatNames + .clone(); + } + + /** + * Gets an IIOMetadataFormat object for the specified image metadata format + * name. + * + * @param formatName + * the format name. + * @return the IIOMetadataFormat, or null. + */ + public IIOMetadataFormat getImageMetadataFormat(String formatName) { + return IIOMetadataUtils.instantiateMetadataFormat(formatName, + supportsStandardImageMetadataFormat, nativeImageMetadataFormatName, + nativeImageMetadataFormatClassName, extraImageMetadataFormatNames, + extraImageMetadataFormatClassNames); + } + + /** + * Gets an IIOMetadataFormat object for the specified stream metadata format + * name. + * + * @param formatName + * the format name. + * @return the IIOMetadataFormat, or null. + */ + public IIOMetadataFormat getStreamMetadataFormat(String formatName) { + return IIOMetadataUtils.instantiateMetadataFormat(formatName, + supportsStandardStreamMetadataFormat, nativeStreamMetadataFormatName, + nativeStreamMetadataFormatClassName, extraStreamMetadataFormatNames, + extraStreamMetadataFormatClassNames); + } + + /** + * Gets an array of strings representing the MIME types of the formats that + * are supported by the ImageReader or ImageWriter implementation of this + * service provider. + * + * @return the array MIME types. + */ + public String[] getMIMETypes() { + return MIMETypes == null ? null : MIMETypes.clone(); + } + + /** + * Gets the name of the native image metadata format for this reader/writer, + * which allows for lossless encoding or decoding of the image metadata with + * the format. + * + * @return the string with native image metadata format name, or null. + */ + public String getNativeImageMetadataFormatName() { + return nativeImageMetadataFormatName; + } + + /** + * Gets the name of the native stream metadata format for this + * reader/writer, which allows for lossless encoding or decoding of the + * stream metadata with the format. + * + * @return the string with native stream metadata format name, or null. + */ + public String getNativeStreamMetadataFormatName() { + return nativeStreamMetadataFormatName; + } + + /** + * Gets the class name of the ImageReader or ImageWriter associated with + * this service provider. + * + * @return the class name. + */ + public String getPluginClassName() { + return pluginClassName; + } + + /** + * Checks if the standard metadata format is supported by the getAsTree and + * setFromTree methods for the image metadata objects produced or consumed + * by this reader or writer. + * + * @return true, if standard image metadata format is supported, false + * otherwise. + */ + public boolean isStandardImageMetadataFormatSupported() { + return supportsStandardImageMetadataFormat; + } + + /** + * Checks if the standard metadata format is supported by the getAsTree and + * setFromTree methods for the stream metadata objects produced or consumed + * by this reader or writer. + * + * @return true, if standard stream metadata format is supported, false + * otherwise. + */ + public boolean isStandardStreamMetadataFormatSupported() { + return supportsStandardStreamMetadataFormat; + } +} diff --git a/awt/javax/imageio/spi/ImageTranscoderSpi.java b/awt/javax/imageio/spi/ImageTranscoderSpi.java new file mode 100644 index 0000000..742af19 --- /dev/null +++ b/awt/javax/imageio/spi/ImageTranscoderSpi.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Rustem V. Rafikov + * @version $Revision: 1.3 $ + */ + +package javax.imageio.spi; + +import javax.imageio.ImageTranscoder; + +/** + * The ImageTranscoderSpi class is a service provider interface (SPI) for + * ImageTranscoders. + * + * @since Android 1.0 + */ +public abstract class ImageTranscoderSpi extends IIOServiceProvider implements RegisterableService { + + /** + * Instantiates a new ImageTranscoderSpi. + */ + protected ImageTranscoderSpi() { + } + + /** + * Instantiates a new ImageTranscoderSpi with the specified vendor name and + * version. + * + * @param vendorName + * the vendor name. + * @param version + * the version. + */ + public ImageTranscoderSpi(String vendorName, String version) { + super(vendorName, version); + } + + /** + * Gets the class name of an ImageReaderSpi that produces IIOMetadata + * objects that can be used as input to this transcoder. + * + * @return the class name of an ImageReaderSpi. + */ + public abstract String getReaderServiceProviderName(); + + /** + * Gets the class name of an ImageWriterSpi that produces IIOMetadata + * objects that can be used as input to this transcoder. + * + * @return the class name of an ImageWriterSpi. + */ + public abstract String getWriterServiceProviderName(); + + /** + * Creates an instance of the ImageTranscoder associated with this service + * provider. + * + * @return the ImageTranscoder instance. + */ + public abstract ImageTranscoder createTranscoderInstance(); +} diff --git a/awt/javax/imageio/spi/ImageWriterSpi.java b/awt/javax/imageio/spi/ImageWriterSpi.java new file mode 100644 index 0000000..bf25455 --- /dev/null +++ b/awt/javax/imageio/spi/ImageWriterSpi.java @@ -0,0 +1,227 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Rustem V. Rafikov + * @version $Revision: 1.3 $ + */ + +package javax.imageio.spi; + +import javax.imageio.stream.ImageInputStream; +import javax.imageio.ImageTypeSpecifier; +import javax.imageio.ImageWriter; +import java.awt.image.RenderedImage; +import java.io.IOException; + +/** + * The ImageWriterSpi abstract class is a service provider interface (SPI) for + * ImageWriters. + * + * @since Android 1.0 + */ +public abstract class ImageWriterSpi extends ImageReaderWriterSpi { + + /** + * The STANDARD_OUTPUT_TYPE contains ImageInputStream.class. + */ + public static final Class[] STANDARD_OUTPUT_TYPE = new Class[] { + ImageInputStream.class + }; + + /** + * The output types. + */ + protected Class[] outputTypes; + + /** + * The reader SPI names. + */ + protected String[] readerSpiNames; + + /** + * Instantiates a new ImageWriterSpi. + */ + protected ImageWriterSpi() { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Instantiates a new ImageWriterSpi with the specified parameters. + * + * @param vendorName + * the vendor name. + * @param version + * the version. + * @param names + * the format names. + * @param suffixes + * the array of strings representing the file suffixes. + * @param MIMETypes + * the an array of strings representing MIME types. + * @param pluginClassName + * the plug-in class name. + * @param outputTypes + * the output types. + * @param readerSpiNames + * the array of strings with class names of all associated + * ImageReaders. + * @param supportsStandardStreamMetadataFormat + * the value indicating if stream metadata can be described by + * standard metadata format. + * @param nativeStreamMetadataFormatName + * the native stream metadata format name, returned by + * getNativeStreamMetadataFormatName. + * @param nativeStreamMetadataFormatClassName + * the native stream metadata format class name, returned by + * getNativeStreamMetadataFormat. + * @param extraStreamMetadataFormatNames + * the extra stream metadata format names, returned by + * getExtraStreamMetadataFormatNames. + * @param extraStreamMetadataFormatClassNames + * the extra stream metadata format class names, returned by + * getStreamMetadataFormat. + * @param supportsStandardImageMetadataFormat + * the value indicating if image metadata can be described by + * standard metadata format. + * @param nativeImageMetadataFormatName + * the native image metadata format name, returned by + * getNativeImageMetadataFormatName. + * @param nativeImageMetadataFormatClassName + * the native image metadata format class name, returned by + * getNativeImageMetadataFormat. + * @param extraImageMetadataFormatNames + * the extra image metadata format names, returned by + * getExtraImageMetadataFormatNames. + * @param extraImageMetadataFormatClassNames + * the extra image metadata format class names, returned by + * getImageMetadataFormat. + */ + public ImageWriterSpi(String vendorName, String version, String[] names, String[] suffixes, + String[] MIMETypes, String pluginClassName, Class[] outputTypes, + String[] readerSpiNames, boolean supportsStandardStreamMetadataFormat, + String nativeStreamMetadataFormatName, String nativeStreamMetadataFormatClassName, + String[] extraStreamMetadataFormatNames, String[] extraStreamMetadataFormatClassNames, + boolean supportsStandardImageMetadataFormat, String nativeImageMetadataFormatName, + String nativeImageMetadataFormatClassName, String[] extraImageMetadataFormatNames, + String[] extraImageMetadataFormatClassNames) { + super(vendorName, version, names, suffixes, MIMETypes, pluginClassName, + supportsStandardStreamMetadataFormat, nativeStreamMetadataFormatName, + nativeStreamMetadataFormatClassName, extraStreamMetadataFormatNames, + extraStreamMetadataFormatClassNames, supportsStandardImageMetadataFormat, + nativeImageMetadataFormatName, nativeImageMetadataFormatClassName, + extraImageMetadataFormatNames, extraImageMetadataFormatClassNames); + + if (outputTypes == null || outputTypes.length == 0) { + throw new NullPointerException("output types array cannot be NULL or empty"); + } + + this.outputTypes = outputTypes; + this.readerSpiNames = readerSpiNames; + } + + /** + * Returns true if the format of the writer's output is lossless. The + * default implementation returns true. + * + * @return true, if a format is lossless, false otherwise. + */ + public boolean isFormatLossless() { + return true; + } + + /** + * Gets an array of Class objects whose types can be used as output for this + * writer. + * + * @return the output types. + */ + public Class[] getOutputTypes() { + return outputTypes; + } + + /** + * Checks whether or not the ImageWriter implementation associated with this + * service provider can encode an image with the specified type. + * + * @param type + * the ImageTypeSpecifier. + * @return true, if an image with the specified type can be encoded, false + * otherwise. + */ + public abstract boolean canEncodeImage(ImageTypeSpecifier type); + + /** + * Checks whether or not the ImageWriter implementation associated with this + * service provider can encode the specified RenderedImage. + * + * @param im + * the RenderedImage. + * @return true, if RenderedImage can be encoded, false otherwise. + */ + public boolean canEncodeImage(RenderedImage im) { + return canEncodeImage(ImageTypeSpecifier.createFromRenderedImage(im)); + } + + /** + * Returns an instance of the ImageWriter implementation for this service + * provider. + * + * @return the ImageWriter. + * @throws IOException + * if an I/O exception has occurred. + */ + public ImageWriter createWriterInstance() throws IOException { + return createWriterInstance(null); + } + + /** + * Returns an instance of the ImageWriter implementation for this service + * provider. + * + * @param extension + * the a plug-in specific extension object, or null. + * @return the ImageWriter. + * @throws IOException + * if an I/O exception has occurred. + */ + public abstract ImageWriter createWriterInstance(Object extension) throws IOException; + + /** + * Checks whether or not the specified ImageWriter object is an instance of + * the ImageWriter associated with this service provider or not. + * + * @param writer + * the ImageWriter. + * @return true, if the specified ImageWriter object is an instance of the + * ImageWriter associated with this service provider, false + * otherwise. + */ + public boolean isOwnWriter(ImageWriter writer) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Gets an array of strings with names of the ImageReaderSpi classes that + * support the internal metadata representation used by the ImageWriter of + * this service provider, or null if there are no such ImageReaders. + * + * @return the array of strings with names of the ImageWriterSpi classes. + */ + public String[] getImageReaderSpiNames() { + return readerSpiNames; + } +} diff --git a/awt/javax/imageio/spi/RegisterableService.java b/awt/javax/imageio/spi/RegisterableService.java new file mode 100644 index 0000000..ae2f4d3 --- /dev/null +++ b/awt/javax/imageio/spi/RegisterableService.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Rustem V. Rafikov + * @version $Revision: 1.3 $ + */ + +package javax.imageio.spi; + +/** + * The RegisterableService interface provides service provider objects that can + * be registered by a ServiceRegistry, and notifications that registration and + * deregistration have been performed. + * + * @since Android 1.0 + */ +public interface RegisterableService { + + /** + * This method is called when the object which implements this interface is + * registered to the specified category of the specified registry. + * + * @param registry + * the ServiceRegistry to be registered. + * @param category + * the class representing a category. + */ + void onRegistration(ServiceRegistry registry, Class<?> category); + + /** + * This method is called when the object which implements this interface is + * deregistered to the specified category of the specified registry. + * + * @param registry + * the ServiceRegistry to be registered. + * @param category + * the class representing a category. + */ + void onDeregistration(ServiceRegistry registry, Class<?> category); +} diff --git a/awt/javax/imageio/spi/ServiceRegistry.java b/awt/javax/imageio/spi/ServiceRegistry.java new file mode 100644 index 0000000..79b02a3 --- /dev/null +++ b/awt/javax/imageio/spi/ServiceRegistry.java @@ -0,0 +1,552 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Rustem V. Rafikov + * @version $Revision: 1.3 $ + */ + +package javax.imageio.spi; + +import java.util.*; +import java.util.Map.Entry; + +/** + * The ServiceRegistry class provides ability to register, deregister, look up + * and obtain service provider instances (SPIs). A service means a set of + * interfaces and classes, and a service provider is an implementation of a + * service. Service providers can be associated with one or more categories. + * Each category is defined by a class or interface. Only a single instance of a + * each class is allowed to be registered as a category. + * + * @since Android 1.0 + */ +public class ServiceRegistry { + + /** + * The categories. + */ + CategoriesMap categories = new CategoriesMap(this); + + /** + * Instantiates a new ServiceRegistry with the specified categories. + * + * @param categoriesIterator + * an Iterator of Class objects for defining of categories. + */ + public ServiceRegistry(Iterator<Class<?>> categoriesIterator) { + if (null == categoriesIterator) { + throw new IllegalArgumentException("categories iterator should not be NULL"); + } + while (categoriesIterator.hasNext()) { + Class<?> c = categoriesIterator.next(); + categories.addCategory(c); + } + } + + /** + * Looks up and instantiates the available providers of this service using + * the specified class loader. + * + * @param providerClass + * the Class object of the provider to be looked up. + * @param loader + * the class loader to be used. + * @return the iterator of providers objects for this service. + */ + public static <T> Iterator<T> lookupProviders(Class<T> providerClass, ClassLoader loader) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Looks up and instantiates the available providers of this service using + * the context class loader. + * + * @param providerClass + * the Class object of the provider to be looked up. + * @return the iterator of providers objects for this service. + */ + public static <T> Iterator<T> lookupProviders(Class<T> providerClass) { + return lookupProviders(providerClass, Thread.currentThread().getContextClassLoader()); + } + + /** + * Registers the specified service provider object in the specified + * categories. + * + * @param provider + * the specified provider to be registered. + * @param category + * the category. + * @return true, if no provider of the same class is registered in this + * category, false otherwise. + */ + public <T> boolean registerServiceProvider(T provider, Class<T> category) { + return categories.addProvider(provider, category); + } + + /** + * Registers a list of service providers. + * + * @param providers + * the list of service providers. + */ + public void registerServiceProviders(Iterator<?> providers) { + for (Iterator<?> iterator = providers; iterator.hasNext();) { + categories.addProvider(iterator.next(), null); + } + } + + /** + * Registers the specified service provider object in all categories. + * + * @param provider + * the service provider. + */ + public void registerServiceProvider(Object provider) { + categories.addProvider(provider, null); + } + + /** + * Deregisters the specifies service provider from the specified category. + * + * @param provider + * the service provider to be deregistered. + * @param category + * the specified category. + * @return true, if the provider was already registered in the specified + * category, false otherwise. + */ + public <T> boolean deregisterServiceProvider(T provider, Class<T> category) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Deregisters the specified service provider from all categories. + * + * @param provider + * the specified service provider. + */ + public void deregisterServiceProvider(Object provider) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Gets an Iterator of registered service providers in the specified + * category which satisfy the specified Filter. The useOrdering parameter + * indicates whether the iterator will return all of the server provider + * objects in a set order. + * + * @param category + * the specified category. + * @param filter + * the specified filter. + * @param useOrdering + * the flag indicating that providers are ordered in the returned + * Iterator. + * @return the iterator of registered service providers. + */ + @SuppressWarnings("unchecked") + public <T> Iterator<T> getServiceProviders(Class<T> category, Filter filter, boolean useOrdering) { + return new FilteredIterator<T>(filter, (Iterator<T>)categories.getProviders(category, + useOrdering)); + } + + /** + * Gets an Iterator of all registered service providers in the specified + * category. The useOrdering parameter indicates whether the iterator will + * return all of the server provider objects in a set order. + * + * @param category + * the specified category. + * @param useOrdering + * the flag indicating that providers are ordered in the returned + * Iterator. + * @return the Iterator of service providers. + */ + @SuppressWarnings("unchecked") + public <T> Iterator<T> getServiceProviders(Class<T> category, boolean useOrdering) { + return (Iterator<T>)categories.getProviders(category, useOrdering); + } + + /** + * Gets the registered service provider object that has the specified class + * type. + * + * @param providerClass + * the specified provider class. + * @return the service provider object. + */ + public <T> T getServiceProviderByClass(Class<T> providerClass) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Sets an ordering between two service provider objects within the + * specified category. + * + * @param category + * the specified category. + * @param firstProvider + * the first provider. + * @param secondProvider + * the second provider. + * @return true, if a previously unset order was set. + */ + public <T> boolean setOrdering(Class<T> category, T firstProvider, T secondProvider) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Unsets an ordering between two service provider objects within the + * specified category. + * + * @param category + * the specified category. + * @param firstProvider + * the first provider. + * @param secondProvider + * the second provider. + * @return true, if a previously unset order was removed. + */ + public <T> boolean unsetOrdering(Class<T> category, T firstProvider, T secondProvider) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Deregisters all providers from the specified category. + * + * @param category + * the specified category. + */ + public void deregisterAll(Class<?> category) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Deregister all providers from all categories. + */ + public void deregisterAll() { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Finalizes this object. + * + * @throws Throwable + * if an error occurs during finalization. + */ + @Override + public void finalize() throws Throwable { + // TODO uncomment when deregisterAll is implemented + // deregisterAll(); + } + + /** + * Checks whether the specified provider has been already registered. + * + * @param provider + * the provider to be checked. + * @return true, if the specified provider has been already registered, + * false otherwise. + */ + public boolean contains(Object provider) { + throw new UnsupportedOperationException("Not supported yet"); + } + + /** + * Gets an iterator of Class objects representing the current categories. + * + * @return the Iterator of Class objects. + */ + public Iterator<Class<?>> getCategories() { + return categories.list(); + } + + /** + * The ServiceRegistry.Filter interface is used by + * ServiceRegistry.getServiceProviders to filter providers according to the + * specified criterion. + * + * @since Android 1.0 + */ + public static interface Filter { + + /** + * Returns true if the specified provider satisfies the criterion of + * this Filter. + * + * @param provider + * the provider. + * @return true, if the specified provider satisfies the criterion of + * this Filter, false otherwise. + */ + boolean filter(Object provider); + } + + /** + * The Class CategoriesMap. + */ + private static class CategoriesMap { + + /** + * The categories. + */ + Map<Class<?>, ProvidersMap> categories = new HashMap<Class<?>, ProvidersMap>(); + + /** + * The registry. + */ + ServiceRegistry registry; + + /** + * Instantiates a new categories map. + * + * @param registry + * the registry. + */ + public CategoriesMap(ServiceRegistry registry) { + this.registry = registry; + } + + // -- TODO: useOrdering + /** + * Gets the providers. + * + * @param category + * the category. + * @param useOrdering + * the use ordering. + * @return the providers. + */ + Iterator<?> getProviders(Class<?> category, boolean useOrdering) { + ProvidersMap providers = categories.get(category); + if (null == providers) { + throw new IllegalArgumentException("Unknown category: " + category); + } + return providers.getProviders(useOrdering); + } + + /** + * List. + * + * @return the iterator< class<?>>. + */ + Iterator<Class<?>> list() { + return categories.keySet().iterator(); + } + + /** + * Adds the category. + * + * @param category + * the category. + */ + void addCategory(Class<?> category) { + categories.put(category, new ProvidersMap()); + } + + /** + * Adds a provider to the category. If <code>category</code> is + * <code>null</code> then the provider will be added to all categories + * which the provider is assignable from. + * + * @param provider + * provider to add. + * @param category + * category to add provider to. + * @return true, if there were such provider in some category. + */ + boolean addProvider(Object provider, Class<?> category) { + if (provider == null) { + throw new IllegalArgumentException("provider should be != NULL"); + } + + boolean rt; + if (category == null) { + rt = findAndAdd(provider); + } else { + rt = addToNamed(provider, category); + } + + if (provider instanceof RegisterableService) { + ((RegisterableService)provider).onRegistration(registry, category); + } + + return rt; + } + + /** + * Adds the to named. + * + * @param provider + * the provider. + * @param category + * the category. + * @return true, if successful. + */ + private boolean addToNamed(Object provider, Class<?> category) { + Object obj = categories.get(category); + + if (null == obj) { + throw new IllegalArgumentException("Unknown category: " + category); + } + + return ((ProvidersMap)obj).addProvider(provider); + } + + /** + * Find and add. + * + * @param provider + * the provider. + * @return true, if successful. + */ + private boolean findAndAdd(Object provider) { + boolean rt = false; + for (Entry<Class<?>, ProvidersMap> e : categories.entrySet()) { + if (e.getKey().isAssignableFrom(provider.getClass())) { + rt |= e.getValue().addProvider(provider); + } + } + return rt; + } + } + + /** + * The Class ProvidersMap. + */ + private static class ProvidersMap { + // -- TODO: providers ordering support + + /** + * The providers. + */ + Map<Class<?>, Object> providers = new HashMap<Class<?>, Object>(); + + /** + * Adds the provider. + * + * @param provider + * the provider. + * @return true, if successful. + */ + boolean addProvider(Object provider) { + return providers.put(provider.getClass(), provider) != null; + } + + /** + * Gets the provider classes. + * + * @return the provider classes. + */ + Iterator<Class<?>> getProviderClasses() { + return providers.keySet().iterator(); + } + + // -- TODO ordering + /** + * Gets the providers. + * + * @param userOrdering + * the user ordering. + * @return the providers. + */ + Iterator<?> getProviders(boolean userOrdering) { + return providers.values().iterator(); + } + } + + /** + * The Class FilteredIterator. + */ + private static class FilteredIterator<E> implements Iterator<E> { + + /** + * The filter. + */ + private Filter filter; + + /** + * The backend. + */ + private Iterator<E> backend; + + /** + * The next obj. + */ + private E nextObj; + + /** + * Instantiates a new filtered iterator. + * + * @param filter + * the filter. + * @param backend + * the backend. + */ + public FilteredIterator(Filter filter, Iterator<E> backend) { + this.filter = filter; + this.backend = backend; + findNext(); + } + + /** + * Next. + * + * @return the e. + */ + public E next() { + if (nextObj == null) { + throw new NoSuchElementException(); + } + E tmp = nextObj; + findNext(); + return tmp; + } + + /** + * Checks for next. + * + * @return true, if successful. + */ + public boolean hasNext() { + return nextObj != null; + } + + /** + * Removes the. + */ + public void remove() { + throw new UnsupportedOperationException(); + } + + /** + * Sets nextObj to a next provider matching the criterion given by the + * filter. + */ + private void findNext() { + nextObj = null; + while (backend.hasNext()) { + E o = backend.next(); + if (filter.filter(o)) { + nextObj = o; + return; + } + } + } + } +} diff --git a/awt/javax/imageio/spi/package.html b/awt/javax/imageio/spi/package.html new file mode 100644 index 0000000..18ceff4 --- /dev/null +++ b/awt/javax/imageio/spi/package.html @@ -0,0 +1,8 @@ +<html> + <body> + <p> + This package provides several Service Provider Interface (SPI) classes for readers, writers, transcoders and streams to handle images. + </p> + @since Android 1.0 + </body> +</html> |