/*
* @(#)ImageReaderSpi.java 1.41 03/12/19
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package javax.imageio.spi;
import java.io.IOException;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
/**
* The service provider interface (SPI) for ImageReader
s.
* For more information on service provider classes, see the class comment
* for the IIORegistry
class.
*
*
Each ImageReaderSpi
provides several types of information
* about the ImageReader
class with which it is associated.
*
*
The name of the vendor who defined the SPI class and a
* brief description of the class are available via the
* getVendorName
, getDescription
,
* and getVersion
methods.
* These methods may be internationalized to provide locale-specific
* output. These methods are intended mainly to provide short,
* human-readable information that might be used to organize a pop-up
* menu or other list.
*
*
Lists of format names, file suffixes, and MIME types associated
* with the service may be obtained by means of the
* getFormatNames
, getFileSuffixes
, and
* getMIMETypes
methods. These methods may be used to
* identify candidate ImageReader
s for decoding a
* particular file or stream based on manual format selection, file
* naming, or MIME associations (for example, when accessing a file
* over HTTP or as an email attachment).
*
*
A more reliable way to determine which ImageReader
s
* are likely to be able to parse a particular data stream is provided
* by the canDecodeInput
method. This methods allows the
* service provider to inspect the actual stream contents.
*
*
Finally, an instance of the ImageReader
class
* associated with this service provider may be obtained by calling
* the createReaderInstance
method. Any heavyweight
* initialization, such as the loading of native libraries or creation
* of large tables, should be deferred at least until the first
* invocation of this method.
*
* @see IIORegistry
* @see javax.imageio.ImageReader
*
* @version 0.5
*/
public abstract class ImageReaderSpi extends ImageReaderWriterSpi {
/**
* A single-element array, initially containing
* ImageInputStream.class
, to be returned from
* getInputTypes
.
*/
public static final Class[] STANDARD_INPUT_TYPE =
{ ImageInputStream.class };
/**
* An array of Class
objects to be returned from
* getInputTypes
, initially null
.
*/
protected Class[] inputTypes = null;
/**
* An array of strings to be returned from
* getImageWriterSpiNames
, initially
* null
.
*/
protected String[] writerSpiNames = null;
/**
* The Class
of the reader, initially
* null
.
*/
private Class readerClass = null;
/**
* Constructs a blank ImageReaderSpi
. It is up to
* the subclass to initialize instance variables and/or override
* method implementations in order to provide working versions of
* all methods.
*/
protected ImageReaderSpi() {
}
/**
* Constructs an ImageReaderSpi
with a given
* set of values.
*
* @param vendorName the vendor name, as a non-null
* String
.
* @param version a version identifier, as a non-null
* String
.
* @param names a non-null
array of
* String
s indicating the format names. At least one
* entry must be present.
* @param suffixes an array of String
s indicating the
* common file suffixes. If no suffixes are defined,
* null
should be supplied. An array of length 0
* will be normalized to null
.
* @param MIMETypes an array of String
s indicating
* the format's MIME types. If no MIME types are defined,
* null
should be supplied. An array of length 0
* will be normalized to null
.
* @param readerClassName the fully-qualified name of the
* associated ImageReader
class, as a
* non-null
String
.
* @param inputTypes a non-null
array of
* Class
objects of length at least 1 indicating the
* legal input types.
* @param writerSpiNames an array String
s naming the
* classes of all associated ImageWriter
s, or
* null
. An array of length 0 is normalized to
* null
.
* @param supportsStandardStreamMetadataFormat a
* boolean
that indicates whether a stream metadata
* object can use trees described by the standard metadata format.
* @param nativeStreamMetadataFormatName a
* String
, or null
, to be returned from
* getNativeStreamMetadataFormatName
.
* @param nativeStreamMetadataFormatClassName a
* String
, or null
, to be used to instantiate
* a metadata format object to be returned from
* getNativeStreamMetadataFormat
.
* @param extraStreamMetadataFormatNames an array of
* String
s, or null
, to be returned from
* getExtraStreamMetadataFormatNames
. An array of length
* 0 is normalized to null
.
* @param extraStreamMetadataFormatClassNames an array of
* String
s, or null
, to be used to instantiate
* a metadata format object to be returned from
* getStreamMetadataFormat
. An array of length
* 0 is normalized to null
.
* @param supportsStandardImageMetadataFormat a
* boolean
that indicates whether an image metadata
* object can use trees described by the standard metadata format.
* @param nativeImageMetadataFormatName a
* String
, or null
, to be returned from
* getNativeImageMetadataFormatName
.
* @param nativeImageMetadataFormatClassName a
* String
, or null
, to be used to instantiate
* a metadata format object to be returned from
* getNativeImageMetadataFormat
.
* @param extraImageMetadataFormatNames an array of
* String
s to be returned from
* getExtraImageMetadataFormatNames
. An array of length 0
* is normalized to null
.
* @param extraImageMetadataFormatClassNames an array of
* String
s, or null
, to be used to instantiate
* a metadata format object to be returned from
* getImageMetadataFormat
. An array of length
* 0 is normalized to null
.
*
* @exception IllegalArgumentException if vendorName
* is null
.
* @exception IllegalArgumentException if version
* is null
.
* @exception IllegalArgumentException if names
* is null
or has length 0.
* @exception IllegalArgumentException if readerClassName
* is null
.
* @exception IllegalArgumentException if inputTypes
* is null
or has length 0.
*/
public ImageReaderSpi(String vendorName,
String version,
String[] names,
String[] suffixes,
String[] MIMETypes,
String readerClassName,
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, readerClassName,
supportsStandardStreamMetadataFormat,
nativeStreamMetadataFormatName,
nativeStreamMetadataFormatClassName,
extraStreamMetadataFormatNames,
extraStreamMetadataFormatClassNames,
supportsStandardImageMetadataFormat,
nativeImageMetadataFormatName,
nativeImageMetadataFormatClassName,
extraImageMetadataFormatNames,
extraImageMetadataFormatClassNames);
if (inputTypes == null) {
throw new IllegalArgumentException
("inputTypes == null!");
}
if (inputTypes.length == 0) {
throw new IllegalArgumentException
("inputTypes.length == 0!");
}
this.inputTypes = (Class[])inputTypes.clone();
// If length == 0, leave it null
if (writerSpiNames != null && writerSpiNames.length > 0) {
this.writerSpiNames = (String[])writerSpiNames.clone();
}
}
/**
* Returns an array of Class
objects indicating what
* types of objects may be used as arguments to the reader's
* setInput
method.
*
*
For most readers, which only accept input from an
* ImageInputStream
, a single-element array
* containing ImageInputStream.class
should be
* returned.
*
* @return a non-null
array of
* Class
objects of length at least 1.
*/
public Class[] getInputTypes() {
return (Class[])inputTypes.clone();
}
/**
* Returns true
if the supplied source object appears
* to be of the format supported by this reader. Returning
* true
from this method does not guarantee that
* reading will succeed, only that there appears to be a
* reasonable chance of success based on a brief inspection of the
* stream contents. If the source is an
* ImageInputStream
, implementations will commonly
* check the first several bytes of the stream for a "magic
* number" associated with the format. Once actual reading has
* commenced, the reader may still indicate failure at any time
* prior to the completion of decoding.
*
*
It is important that the state of the object not be
* disturbed in order that other ImageReaderSpi
s can
* properly determine whether they are able to decode the object.
* In particular, if the source is an
* ImageInputStream
, a
* mark
/reset
pair should be used to
* preserve the stream position.
*
*
Formats such as "raw," which can potentially attempt
* to read nearly any stream, should return false
* in order to avoid being invoked in preference to a closer
* match.
*
*
If source
is not an instance of one of the
* classes returned by getInputTypes
, the method
* should simply return false
.
*
* @param source the object (typically an
* ImageInputStream
) to be decoded.
*
* @return true
if it is likely that this stream can
* be decoded.
*
* @exception IllegalArgumentException if source
is
* null
.
* @exception IOException if an I/O error occurs while reading the
* stream.
*/
public abstract boolean canDecodeInput(Object source) throws IOException;
/**
* Returns an instance of the ImageReader
* implementation associated with this service provider.
* The returned object will initially be in an initial state
* as if its reset
method had been called.
*
*
The default implementation simply returns
* createReaderInstance(null)
.
*
* @return an ImageReader
instance.
*
* @exception IOException if an error occurs during loading,
* or initialization of the reader class, or during instantiation
* or initialization of the reader object.
*/
public ImageReader createReaderInstance() throws IOException {
return createReaderInstance(null);
}
/**
* Returns an instance of the ImageReader
* implementation associated with this service provider.
* The returned object will initially be in an initial state
* as if its reset
method had been called.
*
*
An Object
may be supplied to the plug-in at
* construction time. The nature of the object is entirely
* plug-in specific.
*
*
Typically, a plug-in will implement this method using code
* such as return new MyImageReader(this)
.
*
* @param extension a plug-in specific extension object, which may
* be null
.
*
* @return an ImageReader
instance.
*
* @exception IOException if the attempt to instantiate
* the reader fails.
* @exception IllegalArgumentException if the
* ImageReader
's contructor throws an
* IllegalArgumentException
to indicate that the
* extension object is unsuitable.
*/
public abstract ImageReader createReaderInstance(Object extension)
throws IOException;
/**
* Returns true
if the ImageReader
object
* passed in is an instance of the ImageReader
* associated with this service provider.
*
*
The default implementation compares the fully-qualified
* class name of the reader
argument with the class
* name passed into the constructor. This method may be overridden
* if more sophisticated checking is required.
*
* @param reader an ImageReader
instance.
*
* @return true
if reader
is recognized.
*
* @exception IllegalArgumentException if reader
is
* null
.
*/
public boolean isOwnReader(ImageReader reader) {
if (reader == null) {
throw new IllegalArgumentException("reader == null!");
}
String name = reader.getClass().getName();
return name.equals(pluginClassName);
}
/**
* Returns an array of String
s containing the fully
* qualified names of all the ImageWriterSpi
classes
* that can understand the internal metadata representation used
* by the ImageReader
associated with this service
* provider, or null
if there are no such
* ImageWriter
s specified. If a
* non-null
value is returned, it must have non-zero
* length.
*
*
The first item in the array must be the name of the service
* provider for the "preferred" writer, as it will be used to
* instantiate the ImageWriter
returned by
* ImageIO.getImageWriter(ImageReader)
.
*
*
This mechanism may be used to obtain
* ImageWriters
that will understand the internal
* structure of non-pixel meta-data (see
* IIOTreeInfo
) generated by an
* ImageReader
. By obtaining this data from the
* ImageReader
and passing it on to one of the
* ImageWriters
obtained with this method, a client
* program can read an image, modify it in some way, and write it
* back out while preserving all meta-data, without having to
* understand anything about the internal structure of the
* meta-data, or even about the image format.
*
* @return an array of String
s of length at least 1
* containing names of ImageWriterSpi
, or
* null
.
*
* @see javax.imageio.ImageIO#getImageWriter(ImageReader)
*/
public String[] getImageWriterSpiNames() {
return writerSpiNames == null ?
null : (String[])writerSpiNames.clone();
}
}