e0441a5bfb
libjava/ 2008-06-28 Matthias Klose <doko@ubuntu.com> Import GNU Classpath (classpath-0_97_2-release). * Regenerate class and header files. * Regenerate auto* files. * gcj/javaprims.h: Define jobjectRefType. * jni.cc (_Jv_JNI_GetObjectRefType): New (stub only). (_Jv_JNIFunctions): Initialize GetObjectRefType. * gnu/classpath/jdwp/VMVirtualMachine.java, java/security/VMSecureRandom.java: Merge from classpath. * HACKING: Fix typo. * ChangeLog-2007: New file. * configure.ac: Set JAVAC, pass --disable-regen-headers to classpath. libjava/classpath/ 2008-06-28 Matthias Klose <doko@ubuntu.com> * m4/ac_prog_javac.m4: Disable check for JAVAC, when not configured with --enable-java-maintainer-mode. * aclocal.m4, configure: Regenerate. * native/jni/gstreamer-peer/Makefile.am: Do not link with libclasspathnative. * native/jni/gstreamer-peer/Makefile.in: Regenerate. * tools/Makefile.am, lib/Makefile.am: Use JAVAC for setting JCOMPILER, drop flags not understood by gcj. From-SVN: r137223
1391 lines
44 KiB
Java
1391 lines
44 KiB
Java
/* ImageWriter.java -- Encodes raster images.
|
|
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Classpath.
|
|
|
|
GNU Classpath is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
GNU Classpath is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GNU Classpath; see the file COPYING. If not, write to the
|
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301 USA.
|
|
|
|
Linking this library statically or dynamically with other modules is
|
|
making a combined work based on this library. Thus, the terms and
|
|
conditions of the GNU General Public License cover the whole
|
|
combination.
|
|
|
|
As a special exception, the copyright holders of this library give you
|
|
permission to link this library with independent modules to produce an
|
|
executable, regardless of the license terms of these independent
|
|
modules, and to copy and distribute the resulting executable under
|
|
terms of your choice, provided that you also meet, for each linked
|
|
independent module, the terms and conditions of the license of that
|
|
module. An independent module is a module which is not derived from
|
|
or based on this library. If you modify this library, you may extend
|
|
this exception to your version of the library, but you are not
|
|
obligated to do so. If you do not wish to do so, delete this
|
|
exception statement from your version. */
|
|
|
|
|
|
package javax.imageio;
|
|
|
|
import java.awt.Dimension;
|
|
import java.awt.Rectangle;
|
|
import java.awt.image.BufferedImage;
|
|
import java.awt.image.Raster;
|
|
import java.awt.image.RenderedImage;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.Locale;
|
|
import java.util.ResourceBundle;
|
|
import java.util.MissingResourceException;
|
|
|
|
import javax.imageio.event.IIOWriteProgressListener;
|
|
import javax.imageio.event.IIOWriteWarningListener;
|
|
import javax.imageio.metadata.IIOMetadata;
|
|
|
|
import javax.imageio.spi.ImageWriterSpi;
|
|
|
|
/**
|
|
* A class for encoding images within the ImageIO framework.
|
|
*
|
|
* An ImageWriter for a given format is instantiated by an
|
|
* ImageWriterSpi for that format. ImageWriterSpis are registered
|
|
* with the IIORegistry.
|
|
*
|
|
* The ImageWriter API supports writing animated images that may have
|
|
* multiple frames; to support such images many methods take an index
|
|
* parameter.
|
|
*
|
|
* Images may also be written in multiple passes, where each
|
|
* successive pass increases the level of detail in the destination
|
|
* image.
|
|
*/
|
|
public abstract class ImageWriter
|
|
implements ImageTranscoder
|
|
{
|
|
private boolean aborted;
|
|
|
|
/**
|
|
* All locales available for localization of warning messages, or
|
|
* null if localization is not supported.
|
|
*/
|
|
protected Locale[] availableLocales = null;
|
|
|
|
/**
|
|
* The current locale used to localize warning messages, or null if
|
|
* no locale has been set.
|
|
*/
|
|
protected Locale locale = null;
|
|
|
|
/**
|
|
* The image writer SPI that instantiated this writer.
|
|
*/
|
|
protected ImageWriterSpi originatingProvider = null;
|
|
|
|
/**
|
|
* An ImageInputStream to which image data is written.
|
|
*/
|
|
protected Object output = null;
|
|
|
|
/**
|
|
* A list of installed progress listeners. Initially null, meaning
|
|
* no installed listeners.
|
|
*/
|
|
protected List<IIOWriteProgressListener> progressListeners = null;
|
|
|
|
/**
|
|
* A list of installed warning listeners. Initially null, meaning
|
|
* no installed listeners.
|
|
*/
|
|
protected List<IIOWriteWarningListener> warningListeners = null;
|
|
|
|
/**
|
|
* A list of warning locales corresponding with the list of
|
|
* installed warning listeners. Initially null, meaning no locales.
|
|
*/
|
|
protected List<Locale> warningLocales = null;
|
|
|
|
/**
|
|
* Construct an image writer.
|
|
*
|
|
* @param originatingProvider the provider that is constructing this
|
|
* image writer, or null
|
|
*/
|
|
protected ImageWriter(ImageWriterSpi originatingProvider)
|
|
{
|
|
this.originatingProvider = originatingProvider;
|
|
}
|
|
|
|
/**
|
|
* Throw an IllegalStateException if output is null.
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
*/
|
|
private void checkOutputSet()
|
|
{
|
|
if (output == null)
|
|
throw new IllegalStateException("no output set");
|
|
}
|
|
|
|
/**
|
|
* Request that writing be aborted. The unwritten portions of the
|
|
* destination image will be undefined.
|
|
*
|
|
* Writers should clear the abort flag before starting a write
|
|
* operation, then poll it periodically during the write operation.
|
|
*/
|
|
public void abort()
|
|
{
|
|
aborted = true;
|
|
}
|
|
|
|
/**
|
|
* Check if the abort flag is set.
|
|
*
|
|
* @return true if the current write operation should be aborted,
|
|
* false otherwise
|
|
*/
|
|
protected boolean abortRequested()
|
|
{
|
|
return aborted;
|
|
}
|
|
|
|
/**
|
|
* Install a write progress listener. This method will return
|
|
* immediately if listener is null.
|
|
*
|
|
* @param listener a write progress listener or null
|
|
*/
|
|
public void addIIOWriteProgressListener(IIOWriteProgressListener listener)
|
|
{
|
|
if (listener == null)
|
|
return;
|
|
if (progressListeners == null)
|
|
progressListeners = new ArrayList ();
|
|
progressListeners.add(listener);
|
|
}
|
|
|
|
/**
|
|
* Install a write warning listener. This method will return
|
|
* immediately if listener is null. Warning messages sent to this
|
|
* listener will be localized using the current locale. If the
|
|
* current locale is null then this writer will select a sensible
|
|
* default.
|
|
*
|
|
* @param listener a write warning listener
|
|
*/
|
|
public void addIIOWriteWarningListener (IIOWriteWarningListener listener)
|
|
{
|
|
if (listener == null)
|
|
return;
|
|
if (warningListeners == null)
|
|
warningListeners = new ArrayList ();
|
|
warningListeners.add(listener);
|
|
}
|
|
|
|
/**
|
|
* Check whether a new empty image can be inserted at the given
|
|
* frame index. Pixel values may be filled in later using the
|
|
* replacePixels methods. Indices greater than the insertion index
|
|
* will be incremented. If imageIndex is -1, the image will be
|
|
* appended at the end of the current image list.
|
|
*
|
|
* @param imageIndex the frame index
|
|
*
|
|
* @return true if an empty image can be inserted at imageIndex,
|
|
* false otherwise
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than
|
|
* -1 or greater than the last index in the current image list
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public boolean canInsertEmpty(int imageIndex)
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check whether an image can be inserted at the given frame index.
|
|
* Indices greater than the insertion index will be incremented. If
|
|
* imageIndex is -1, the image will be appended at the end of the
|
|
* current image list.
|
|
*
|
|
* @param imageIndex the frame index
|
|
*
|
|
* @return true if an image can be inserted at imageIndex, false
|
|
* otherwise
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than
|
|
* -1 or greater than the last index in the current image list
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public boolean canInsertImage(int imageIndex)
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check whether an image can be removed from the given frame index.
|
|
* Indices greater than the removal index will be decremented.
|
|
*
|
|
* @param imageIndex the frame index
|
|
*
|
|
* @return true if an image can be removed from imageIndex, false
|
|
* otherwise
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than 0
|
|
* or greater than the last index in the current image list
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public boolean canRemoveImage(int imageIndex)
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check whether the metadata associated the image at the given
|
|
* frame index can be replaced.
|
|
*
|
|
* @param imageIndex the frame index
|
|
*
|
|
* @return true if the metadata associated with the image at
|
|
* imageIndex can be replaced, false otherwise
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than 0
|
|
* or greater than the last index in the current image list
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public boolean canReplaceImageMetadata(int imageIndex)
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check whether the pixels within the image at the given index can
|
|
* be replaced.
|
|
*
|
|
* @param imageIndex the frame index
|
|
*
|
|
* @return true if the pixels in the image at imageIndex can be
|
|
* replaced, false otherwise
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than 0
|
|
* or greater than the last index in the current image list
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public boolean canReplacePixels(int imageIndex)
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check whether the metadata associated the entire image stream can
|
|
* be replaced.
|
|
*
|
|
* @return true if the stream metadata can be replaced, false
|
|
* otherwise
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public boolean canReplaceStreamMetadata()
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check whether an entire empty image, including empty metadata and
|
|
* empty thumbnails, can be written to the output stream, leaving
|
|
* pixel values to be filled in later using the replacePixels
|
|
* methods.
|
|
*
|
|
* @return true if an entire empty image can be written before its
|
|
* contents are filled in, false otherwise
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public boolean canWriteEmpty()
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if IIOImages containing raster data are supported.
|
|
*
|
|
* @return true if raster IIOImages are supported, false otherwise
|
|
*/
|
|
public boolean canWriteRasters()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if an image can be appended at the end of the current list
|
|
* of images even if prior images have already been written.
|
|
*
|
|
* @return true if sequences of images can be written, false
|
|
* otherwise
|
|
*/
|
|
public boolean canWriteSequence()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Clear the abort flag.
|
|
*/
|
|
protected void clearAbortRequest()
|
|
{
|
|
aborted = false;
|
|
}
|
|
|
|
/**
|
|
* Convert IIOMetadata from an input reader format, returning an
|
|
* IIOMetadata suitable for use by an image writer.
|
|
*
|
|
* The ImageTypeSpecifier specifies the destination image type.
|
|
*
|
|
* An optional ImageWriteParam argument is available in case the
|
|
* image writing parameters affect the metadata conversion.
|
|
*
|
|
* @param inData the metadata coming from an image reader
|
|
* @param imageType the output image type of the writer
|
|
* @param param the image writing parameters or null
|
|
*
|
|
* @return the converted metadata that should be used by the image
|
|
* writer, or null if this ImageTranscoder has no knowledge of the
|
|
* input metadata
|
|
*
|
|
* @exception IllegalArgumentException if either inData or imageType
|
|
* is null
|
|
*/
|
|
public abstract IIOMetadata convertImageMetadata (IIOMetadata inData,
|
|
ImageTypeSpecifier imageType,
|
|
ImageWriteParam param);
|
|
|
|
/**
|
|
* Convert IIOMetadata from an input stream format, returning an
|
|
* IIOMetadata suitable for use by an image writer.
|
|
*
|
|
* An optional ImageWriteParam argument is available in case the
|
|
* image writing parameters affect the metadata conversion.
|
|
*
|
|
* @param inData the metadata coming from an input image stream
|
|
* @param param the image writing parameters or null
|
|
*
|
|
* @return the converted metadata that should be used by the image
|
|
* writer, or null if this ImageTranscoder has no knowledge of the
|
|
* input metadata
|
|
*
|
|
* @exception IllegalArgumentException if inData is null
|
|
*/
|
|
public abstract IIOMetadata convertStreamMetadata (IIOMetadata inData,
|
|
ImageWriteParam param);
|
|
|
|
/**
|
|
* Releases any resources allocated to this object. Subsequent
|
|
* calls to methods on this object will produce undefined results.
|
|
*
|
|
* The default implementation does nothing; subclasses should use
|
|
* this method ensure that native resources are released.
|
|
*/
|
|
public void dispose()
|
|
{
|
|
// The default implementation is empty. Subclasses have to overwrite it.
|
|
}
|
|
|
|
/**
|
|
* Retrieve the available locales. Return null if no locales are
|
|
* available or a clone of availableLocales.
|
|
*
|
|
* @return an array of locales or null
|
|
*/
|
|
public Locale[] getAvailableLocales()
|
|
{
|
|
return availableLocales;
|
|
}
|
|
|
|
/**
|
|
* Get a metadata object appropriate for encoding an image specified
|
|
* by the given image type specifier and optional image write
|
|
* parameters.
|
|
*
|
|
* @param imageType an image type specifier
|
|
* @param param image writing parameters, or null
|
|
*
|
|
* @return a metadata object appropriate for encoding an image of
|
|
* the given type with the given parameters
|
|
*/
|
|
public abstract IIOMetadata getDefaultImageMetadata (ImageTypeSpecifier imageType, ImageWriteParam param);
|
|
|
|
/**
|
|
* Get a metadata object appropriate for encoding the default image
|
|
* type handled by this writer, optionally considering image write
|
|
* parameters.
|
|
*
|
|
* @param param image writing parameters, or null
|
|
*
|
|
* @return a metadata object appropriate for encoding an image of
|
|
* the default type with the given parameters
|
|
*/
|
|
public abstract IIOMetadata getDefaultStreamMetadata (ImageWriteParam param);
|
|
|
|
/**
|
|
* Retrieve the default write parameters for this writer's image
|
|
* format.
|
|
*
|
|
* The default implementation returns new ImageWriteParam().
|
|
*
|
|
* @return image writing parameters
|
|
*/
|
|
public ImageWriteParam getDefaultWriteParam()
|
|
{
|
|
return new ImageWriteParam(getLocale());
|
|
}
|
|
|
|
/**
|
|
* Get this writer's locale. null is returned if the locale has not
|
|
* been set.
|
|
*
|
|
* @return this writer's locale, or null
|
|
*/
|
|
public Locale getLocale()
|
|
{
|
|
return locale;
|
|
}
|
|
|
|
/**
|
|
* Get the number of thumbnails supported by this image writer,
|
|
* based on the given image type, image writing parameters, and
|
|
* stream and image metadata. The image writing parameters are
|
|
* optional, in case they affect the number of thumbnails supported.
|
|
*
|
|
* @param imageType an image type specifier, or null
|
|
* @param param image writing parameters, or null
|
|
* @param streamMetadata the metadata associated with this stream,
|
|
* or null
|
|
* @param imageMetadata the metadata associated with this image, or
|
|
* null
|
|
*
|
|
* @return the number of thumbnails that this writer supports
|
|
* writing or -1 if the given information is insufficient
|
|
*/
|
|
public int getNumThumbnailsSupported (ImageTypeSpecifier imageType,
|
|
ImageWriteParam param,
|
|
IIOMetadata streamMetadata,
|
|
IIOMetadata imageMetadata)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Get the ImageWriterSpi that created this writer or null.
|
|
*
|
|
* @return an ImageWriterSpi, or null
|
|
*/
|
|
public ImageWriterSpi getOriginatingProvider()
|
|
{
|
|
return originatingProvider;
|
|
}
|
|
|
|
/**
|
|
* Get this reader's image output destination. null is returned if
|
|
* the image destination has not been set.
|
|
*
|
|
* @return an image output destination object, or null
|
|
*/
|
|
public Object getOutput()
|
|
{
|
|
return output;
|
|
}
|
|
|
|
/**
|
|
* Get the preferred sizes for thumbnails based on the given image
|
|
* type, image writing parameters, and stream and image metadata.
|
|
* The preferred sizes are returned in pairs of dimension values;
|
|
* the first value in the array is a dimension object representing
|
|
* the minimum thumbnail size, the second value is a dimension
|
|
* object representing a maximum thumbnail size. The writer can
|
|
* select a size within the range given by each pair, or it can
|
|
* ignore these size hints.
|
|
*
|
|
* @param imageType an image type specifier, or null
|
|
* @param param image writing parameters, or null
|
|
* @param streamMetadata the metadata associated with this stream,
|
|
* or null
|
|
* @param imageMetadata the metadata associated with this image, or
|
|
* null
|
|
*
|
|
* @return an array of dimension pairs whose length is a multiple of
|
|
* 2, or null if there is no preferred size (any size is allowed) or
|
|
* if the size is unknown (insufficient information was provided)
|
|
*/
|
|
public Dimension[] getPreferredThumbnailSizes (ImageTypeSpecifier imageType,
|
|
ImageWriteParam param,
|
|
IIOMetadata streamMetadata,
|
|
IIOMetadata imageMetadata)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Notifies all installed write progress listeners that image
|
|
* loading has completed by calling their imageComplete methods.
|
|
*/
|
|
protected void processImageComplete()
|
|
{
|
|
if (progressListeners != null)
|
|
{
|
|
Iterator it = progressListeners.iterator();
|
|
|
|
while (it.hasNext())
|
|
{
|
|
IIOWriteProgressListener listener =
|
|
(IIOWriteProgressListener) it.next();
|
|
listener.imageComplete(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Notifies all installed write progress listeners that a certain
|
|
* percentage of the image has been loaded, by calling their
|
|
* imageProgress methods.
|
|
*
|
|
* @param percentageDone the percentage of image data that has been
|
|
* loaded
|
|
*/
|
|
protected void processImageProgress(float percentageDone)
|
|
{
|
|
if (progressListeners != null)
|
|
{
|
|
Iterator it = progressListeners.iterator();
|
|
|
|
while (it.hasNext())
|
|
{
|
|
IIOWriteProgressListener listener =
|
|
(IIOWriteProgressListener) it.next();
|
|
listener.imageProgress(this, percentageDone);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Notifies all installed write progress listeners, by calling their
|
|
* imageStarted methods, that image loading has started on the given
|
|
* image.
|
|
*
|
|
* @param imageIndex the frame index of the image that has started
|
|
* loading
|
|
*/
|
|
protected void processImageStarted(int imageIndex)
|
|
{
|
|
if (progressListeners != null)
|
|
{
|
|
Iterator it = progressListeners.iterator();
|
|
|
|
while (it.hasNext())
|
|
{
|
|
IIOWriteProgressListener listener =
|
|
(IIOWriteProgressListener) it.next();
|
|
listener.imageStarted(this, imageIndex);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Notifies all installed write progress listeners, by calling their
|
|
* thumbnailComplete methods, that a thumbnail has completed
|
|
* loading.
|
|
*/
|
|
protected void processThumbnailComplete()
|
|
{
|
|
if (progressListeners != null)
|
|
{
|
|
Iterator it = progressListeners.iterator();
|
|
|
|
while (it.hasNext())
|
|
{
|
|
IIOWriteProgressListener listener =
|
|
(IIOWriteProgressListener) it.next();
|
|
listener.thumbnailComplete(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Notifies all installed write progress listeners that a certain
|
|
* percentage of a thumbnail has been loaded, by calling their
|
|
* thumbnailProgress methods.
|
|
*
|
|
* @param percentageDone the percentage of thumbnail data that has
|
|
* been loaded
|
|
*/
|
|
protected void processThumbnailProgress(float percentageDone)
|
|
{
|
|
if (progressListeners != null)
|
|
{
|
|
Iterator it = progressListeners.iterator();
|
|
|
|
while (it.hasNext())
|
|
{
|
|
IIOWriteProgressListener listener =
|
|
(IIOWriteProgressListener) it.next();
|
|
listener.thumbnailProgress(this, percentageDone);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Notifies all installed write progress listeners, by calling their
|
|
* imageStarted methods, that thumbnail loading has started on the
|
|
* given thumbnail of the given image.
|
|
*
|
|
* @param imageIndex the frame index of the image one of who's
|
|
* thumbnails has started loading
|
|
* @param thumbnailIndex the index of the thumbnail that has started
|
|
* loading
|
|
*/
|
|
protected void processThumbnailStarted(int imageIndex, int thumbnailIndex)
|
|
{
|
|
if (progressListeners != null)
|
|
{
|
|
Iterator it = progressListeners.iterator();
|
|
|
|
while (it.hasNext())
|
|
{
|
|
IIOWriteProgressListener listener =
|
|
(IIOWriteProgressListener) it.next();
|
|
listener.thumbnailStarted(this, imageIndex, thumbnailIndex);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Notifies all installed warning listeners, by calling their
|
|
* warningOccurred methods, that a warning message has been raised.
|
|
*
|
|
* @param imageIndex the index of the image that was being written
|
|
* when the warning was raised
|
|
* @param warning the warning message
|
|
*
|
|
* @exception IllegalArgumentException if warning is null
|
|
*/
|
|
protected void processWarningOccurred(int imageIndex, String warning)
|
|
{
|
|
if (warningListeners != null)
|
|
{
|
|
Iterator it = warningListeners.iterator();
|
|
|
|
while (it.hasNext())
|
|
{
|
|
IIOWriteWarningListener listener =
|
|
(IIOWriteWarningListener) it.next();
|
|
listener.warningOccurred(this, imageIndex, warning);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Notify all installed warning listeners, by calling their
|
|
* warningOccurred methods, that a warning message has been raised.
|
|
* The warning message is retrieved from a resource bundle, using
|
|
* the given basename and keyword.
|
|
*
|
|
* @param imageIndex the index of the image that was being written
|
|
* when the warning was raised
|
|
* @param baseName the basename of the resource from which to
|
|
* retrieve the warning message
|
|
* @param keyword the keyword used to retrieve the warning from the
|
|
* resource bundle
|
|
*
|
|
* @exception IllegalArgumentException if either baseName or keyword
|
|
* is null
|
|
* @exception IllegalArgumentException if no resource bundle is
|
|
* found using baseName
|
|
* @exception IllegalArgumentException if the given keyword produces
|
|
* no results from the resource bundle
|
|
* @exception IllegalArgumentException if the retrieved object is
|
|
* not a String
|
|
*/
|
|
protected void processWarningOccurred(int imageIndex,
|
|
String baseName,
|
|
String keyword)
|
|
{
|
|
if (baseName == null || keyword == null)
|
|
throw new IllegalArgumentException ("null argument");
|
|
|
|
ResourceBundle b = null;
|
|
|
|
try
|
|
{
|
|
b = ResourceBundle.getBundle(baseName, getLocale());
|
|
}
|
|
catch (MissingResourceException e)
|
|
{
|
|
throw new IllegalArgumentException ("no resource bundle found");
|
|
}
|
|
|
|
Object str = null;
|
|
|
|
try
|
|
{
|
|
str = b.getObject(keyword);
|
|
}
|
|
catch (MissingResourceException e)
|
|
{
|
|
throw new IllegalArgumentException ("no results found for keyword");
|
|
}
|
|
|
|
if (! (str instanceof String))
|
|
throw new IllegalArgumentException ("retrieved object not a String");
|
|
|
|
String warning = (String) str;
|
|
|
|
if (warningListeners != null)
|
|
{
|
|
Iterator it = warningListeners.iterator();
|
|
|
|
while (it.hasNext())
|
|
{
|
|
IIOWriteWarningListener listener =
|
|
(IIOWriteWarningListener) it.next();
|
|
listener.warningOccurred(this, imageIndex, warning);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Notifies all installed write progress listeners that image
|
|
* loading has been aborted by calling their writeAborted methods.
|
|
*/
|
|
protected void processWriteAborted()
|
|
{
|
|
if (progressListeners != null)
|
|
{
|
|
Iterator it = progressListeners.iterator();
|
|
|
|
while (it.hasNext())
|
|
{
|
|
IIOWriteProgressListener listener =
|
|
(IIOWriteProgressListener) it.next();
|
|
listener.writeAborted(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Uninstall all write progress listeners.
|
|
*/
|
|
public void removeAllIIOWriteProgressListeners()
|
|
{
|
|
if (progressListeners != null)
|
|
{
|
|
progressListeners.clear();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Uninstall all write warning listeners.
|
|
*/
|
|
public void removeAllIIOWriteWarningListeners()
|
|
{
|
|
if (progressListeners != null)
|
|
{
|
|
progressListeners.clear();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Uninstall the given write progress listener.
|
|
*
|
|
* @param listener the listener to remove
|
|
*/
|
|
public void removeIIOWriteProgressListener (IIOWriteProgressListener listener)
|
|
{
|
|
if (listener == null)
|
|
return;
|
|
if (progressListeners != null)
|
|
{
|
|
progressListeners.remove(listener);
|
|
}
|
|
}
|
|
/**
|
|
* Uninstall the given write warning listener.
|
|
*
|
|
* @param listener the listener to remove
|
|
*/
|
|
public void removeIIOWriteWarningListener (IIOWriteWarningListener listener)
|
|
{
|
|
if (listener == null)
|
|
return;
|
|
if (warningListeners != null)
|
|
{
|
|
warningListeners.remove(listener);
|
|
}
|
|
}
|
|
/**
|
|
* Reset this writer's internal state.
|
|
*/
|
|
public void reset()
|
|
{
|
|
setOutput(null);
|
|
setLocale(null);
|
|
removeAllIIOWriteWarningListeners();
|
|
removeAllIIOWriteProgressListeners();
|
|
clearAbortRequest();
|
|
}
|
|
|
|
/**
|
|
* Set the current locale or use the default locale.
|
|
*
|
|
* @param locale the locale to set, or null
|
|
*/
|
|
public void setLocale(Locale locale)
|
|
{
|
|
if (locale != null)
|
|
{
|
|
// Check if its a valid locale.
|
|
boolean found = false;
|
|
|
|
if (availableLocales != null)
|
|
for (int i = availableLocales.length - 1; i >= 0; --i)
|
|
if (availableLocales[i].equals(locale))
|
|
found = true;
|
|
|
|
if (! found)
|
|
throw new IllegalArgumentException("looale not available");
|
|
}
|
|
|
|
this.locale = locale;
|
|
}
|
|
|
|
/**
|
|
* Set the output destination of the given object. The output
|
|
* destination must be set before many methods can be called on this
|
|
* writer. (see all ImageWriter methods that throw
|
|
* IllegalStateException). If input is null then the current input
|
|
* source will be removed.
|
|
*
|
|
* @param output the output destination object
|
|
*
|
|
* @exception IllegalArgumentException if input is not a valid input
|
|
* source for this writer and is not an ImageInputStream
|
|
*/
|
|
public void setOutput(Object output)
|
|
{
|
|
if (output != null)
|
|
{
|
|
// Check if its a valid output object.
|
|
boolean found = false;
|
|
Class[] types = null;
|
|
|
|
if (originatingProvider != null)
|
|
types = originatingProvider.getOutputTypes();
|
|
|
|
if (types != null)
|
|
for (int i = types.length - 1; i >= 0; --i)
|
|
if (types[i].isInstance(output))
|
|
found = true;
|
|
|
|
if (! found)
|
|
throw new IllegalArgumentException("output type not available");
|
|
}
|
|
|
|
this.output = output;
|
|
}
|
|
|
|
/**
|
|
* Write an image stream, including thumbnails and metadata to the
|
|
* output stream. The output must have been set prior to this
|
|
* method being called. Metadata associated with the stream may be
|
|
* supplied, or it can be left null. IIOImage may contain raster
|
|
* data if this writer supports rasters, or it will contain a
|
|
* rendered image. Thumbnails are resized if need be. Image
|
|
* writing parameters may be specified to affect writing, or may be
|
|
* left null.
|
|
*
|
|
* @param streamMetadata metadata associated with this stream, or
|
|
* null
|
|
* @param image an IIOImage containing image data, metadata and
|
|
* thumbnails to be written
|
|
* @param param image writing parameters, or null
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if image contains raster
|
|
* data but this writer does not support rasters
|
|
* @exception IllegalArgumentException if image is null
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public abstract void write (IIOMetadata streamMetadata, IIOImage image, ImageWriteParam param)
|
|
throws IOException;
|
|
|
|
/**
|
|
* Complete inserting an empty image in the output stream.
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if inserting empty
|
|
* images is not supported
|
|
* @exception IllegalArgumentException if a call to
|
|
* prepareInsertEmpty was not called previous to this method being
|
|
* called (a sequence of prepareInsertEmpty calls must be terminated
|
|
* by a call to endInsertEmpty)
|
|
* @exception IllegalArgumentException if prepareWriteEmpty was
|
|
* called before this method being called (without a terminating
|
|
* call to endWriteEmpty)
|
|
* @exception IllegalArgumentException if prepareReplacePixels was
|
|
* called before this method being called (without a terminating
|
|
* call to endReplacePixels)
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void endInsertEmpty ()
|
|
throws IOException
|
|
{
|
|
if (!canInsertEmpty(0))
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Complete replacing pixels in an image in the output stream.
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if replacing pixels is
|
|
* not supported by this writer
|
|
* @exception IllegalArgumentException if prepareReplacePixels was
|
|
* not called before this method being called
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void endReplacePixels ()
|
|
throws IOException
|
|
{
|
|
if (!canReplacePixels(0))
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Complete writing an empty image to the image output stream.
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if writing empty images
|
|
* is not supported
|
|
* @exception IllegalArgumentException if a call to
|
|
* prepareWriteEmpty was not called previous to this method being
|
|
* called (a sequence of prepareWriteEmpty calls must be terminated
|
|
* by a call to endWriteEmpty)
|
|
* @exception IllegalArgumentException if prepareInsertEmpty was
|
|
* called before this method being called (without a terminating
|
|
* call to endInsertEmpty)
|
|
* @exception IllegalArgumentException if prepareReplacePixels was
|
|
* called before this method being called (without a terminating
|
|
* call to endReplacePixels)
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void endWriteEmpty ()
|
|
throws IOException
|
|
{
|
|
if (!canWriteEmpty())
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Complete writing a sequence of images to the output stream. This
|
|
* method may patch header data and write out footer data.
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception IllegalStateException if prepareWriteSequence has not
|
|
* been called
|
|
* @exception UnsupportedOperationException if writing a sequence of
|
|
* images is not supported
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void endWriteSequence ()
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
if (!canWriteSequence())
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Start inserting an empty image in the image output stream. All
|
|
* indices after the specified index are incremented. An index of
|
|
* -1 implies that the empty image should be appended to the end of
|
|
* the current image list.
|
|
*
|
|
* The insertion that this method call starts is not complete until
|
|
* endInsertEmpty is called. prepareInsertEmpty cannot be called
|
|
* again until endInsertEmpty is called and calls to
|
|
* prepareWriteEmpty and prepareInsertEmpty may not be intersperced.
|
|
*
|
|
* @param imageIndex the image index
|
|
* @param imageType the image type specifier
|
|
* @param width the image width
|
|
* @param height the image height
|
|
* @param imageMetadata the image metadata, or null
|
|
* @param thumbnails a list of thumbnails, or null
|
|
* @param param image write parameters, or null
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if inserting empty
|
|
* images is not supported
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than
|
|
* -1 or greater than the last index in the current image list
|
|
* @exception IllegalStateException if a previous call to
|
|
* prepareInsertEmpty was made (without a terminating call to
|
|
* endInsertEmpty)
|
|
* @exception IllegalStateException if a previous call to
|
|
* prepareWriteEmpty was made (without a terminating call to
|
|
* endWriteEmpty)
|
|
* @exception IllegalArgumentException if imageType is null or
|
|
* thumbnails contain non-BufferedImage objects
|
|
* @exception IllegalArgumentException if either width or height is
|
|
* less than 1
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void prepareInsertEmpty (int imageIndex, ImageTypeSpecifier imageType,
|
|
int width, int height,
|
|
IIOMetadata imageMetadata,
|
|
List<? extends BufferedImage> thumbnails,
|
|
ImageWriteParam param)
|
|
throws IOException
|
|
{
|
|
if (!canInsertEmpty(imageIndex))
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Start the replacement of pixels within an image in the output
|
|
* stream. Output pixels will be clipped to lie within region.
|
|
*
|
|
* @param imageIndex the index of the image in which pixels are
|
|
* being replaced
|
|
* @param region the rectangle to which to limit pixel replacement
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if replacing pixels is
|
|
* not supported
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than 0
|
|
* or greater than the last index in the current image list
|
|
* @exception IllegalStateException if a previous call to
|
|
* prepareReplacePixels was made (without a terminating call to
|
|
* endReplacePixels)
|
|
* @exception IllegalArgumentException if either region.width or
|
|
* region.height is less than 1, or if region is null
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void prepareReplacePixels (int imageIndex, Rectangle region)
|
|
throws IOException
|
|
{
|
|
if (canReplacePixels(imageIndex))
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Start writing an empty image to the end of the image output
|
|
* stream.
|
|
*
|
|
* The writing that this method call starts is not complete until
|
|
* endWriteEmpty is called. prepareWritetEmpty cannot be called
|
|
* again until endWriteEmpty is called and calls to
|
|
* prepareWriteEmpty and prepareInsertEmpty may not be intersperced.
|
|
*
|
|
* @param streamMetadata metadata associated with the stream, or null
|
|
* @param imageType the image type specifier
|
|
* @param width the image width
|
|
* @param height the image height
|
|
* @param imageMetadata the image metadata, or null
|
|
* @param thumbnails a list of thumbnails, or null
|
|
* @param param image write parameters, or null
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if writing empty images
|
|
* is not supported
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than
|
|
* -1 or greater than the last index in the current image list
|
|
* @exception IllegalStateException if a previous call to
|
|
* prepareInsertEmpty was made (without a terminating call to
|
|
* endInsertEmpty)
|
|
* @exception IllegalStateException if a previous call to
|
|
* prepareWriteEmpty was made (without a terminating call to
|
|
* endWriteEmpty)
|
|
* @exception IllegalArgumentException if imageType is null or
|
|
* thumbnails contain non-BufferedImage objects
|
|
* @exception IllegalArgumentException if either width or height is
|
|
* less than 1
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void prepareWriteEmpty (IIOMetadata streamMetadata,
|
|
ImageTypeSpecifier imageType,
|
|
int width, int height,
|
|
IIOMetadata imageMetadata,
|
|
List<? extends BufferedImage> thumbnails,
|
|
ImageWriteParam param)
|
|
throws IOException
|
|
{
|
|
if (!canWriteEmpty())
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Start the writing of a sequence of images.
|
|
*
|
|
* @param streamMetadata the stream metadata, or null
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if writing sequences of
|
|
* images is not supported
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void prepareWriteSequence (IIOMetadata streamMetadata)
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
if (!canWriteSequence())
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Remove the image at the specified index from the output stream.
|
|
*
|
|
* @param imageIndex the frame index from which to remove the image
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if removing this image
|
|
* is not supported
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than 0
|
|
* or greater than the last index in the current image list
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void removeImage (int imageIndex)
|
|
throws IOException
|
|
{
|
|
if (!canRemoveImage(imageIndex))
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Replace the metadata associated with the image at the given
|
|
* index.
|
|
*
|
|
* @param imageIndex the index of the image whose metadata should be
|
|
* replaced
|
|
* @param imageMetadata the metadata, or null
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if replacing this
|
|
* image's metadata is not supported
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than 0
|
|
* or greater than the last index in the current image list
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void replaceImageMetadata (int imageIndex, IIOMetadata imageMetadata)
|
|
throws IOException
|
|
{
|
|
if (!canReplaceImageMetadata(imageIndex))
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Replace a region of an image in the output stream with a portion
|
|
* of the given rendered image. The image data must be of the same
|
|
* type as that in the output stream. The destination region is
|
|
* given by the image writing parameters and the source region is
|
|
* the one given to prepareReplacePixels.
|
|
*
|
|
* @param image the rendered image with which to overwrite the image
|
|
* region in the stream
|
|
* @param param the image writing parameters
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if replacing pixels is
|
|
* not supported
|
|
* @exception IllegalStateException if prepareReplacePixels was not
|
|
* called before this method was called
|
|
* @exception IllegalArgumentException if image is null or if param
|
|
* is null or if the overlap of the source and destination regions
|
|
* contains no pixels or if the image types differ and no conversion
|
|
* is possible
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void replacePixels (RenderedImage image,
|
|
ImageWriteParam param)
|
|
throws IOException
|
|
{
|
|
if (!canReplacePixels(0))
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Replace a region of an image in the output stream with a portion
|
|
* of the given raster data. The image data must be of the same
|
|
* type as that in the output stream. The destination region is
|
|
* given by the image writing parameters and the source region is
|
|
* the one given to prepareReplacePixels.
|
|
*
|
|
* @param raster the raster data with which to overwrite the image
|
|
* region in the stream
|
|
* @param param the image writing parameters
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if replacing pixels is
|
|
* not supported
|
|
* @exception IllegalStateException if prepareReplacePixels was not
|
|
* called before this method was called
|
|
* @exception UnsupportedOperationException if raster data is not
|
|
* supported
|
|
* @exception IllegalArgumentException if raster is null or if param
|
|
* is null or if the overlap of the source and destination regions
|
|
* contains no pixels or if the image types differ and no conversion
|
|
* is possible
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void replacePixels (Raster raster, ImageWriteParam param)
|
|
throws IOException
|
|
{
|
|
if (!canReplacePixels(0))
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Replace the metadata associated with this image stream.
|
|
*
|
|
* @param streamMetadata the stream metadata, or null
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if replacing the stream
|
|
* metadata is not supported
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void replaceStreamMetadata (IIOMetadata streamMetadata)
|
|
throws IOException
|
|
{
|
|
if (!canReplaceStreamMetadata())
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Write a rendered image to the output stream.
|
|
*
|
|
* @param image a rendered image containing image data to be written
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception IllegalArgumentException if image is null
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void write (RenderedImage image)
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
write (null, new IIOImage(image, null, null), null);
|
|
}
|
|
|
|
/**
|
|
* Write a image data, metadata and thumbnails to the output stream.
|
|
*
|
|
* @param image image data, metadata and thumbnails to be written
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if image contains raster
|
|
* data but this writer does not support rasters
|
|
* @exception IllegalArgumentException if image is null
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void write (IIOImage image)
|
|
throws IOException
|
|
{
|
|
checkOutputSet();
|
|
write (null, image, null);
|
|
}
|
|
|
|
/**
|
|
* Insert an image into the output stream. Indices greater than the
|
|
* specified index are incremented accordingly. Specifying an index
|
|
* of -1 causes the image to be appended at the end of the current
|
|
* image list.
|
|
*
|
|
* @param imageIndex the frame index at which to insert the image
|
|
* @param image the image data, metadata and thumbnails to be
|
|
* inserted
|
|
* @param param image write parameters, or null
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if image insertion is
|
|
* not supported
|
|
* @exception IllegalArgumentException if image is null
|
|
* @exception IndexOutOfBoundsException if imageIndex is less than
|
|
* -1 or greater than the last index in the current image list
|
|
* @exception UnsupportedOperationException if image contains raster
|
|
* data but this writer does not support rasters
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void writeInsert (int imageIndex, IIOImage image, ImageWriteParam param)
|
|
throws IOException
|
|
{
|
|
if (!canInsertImage(imageIndex))
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
/**
|
|
* Write a sequence of images, including thumbnails and metadata, to
|
|
* the output stream. The output must have been set prior to this
|
|
* method being called. Metadata associated with the stream may be
|
|
* supplied, or it can be left null. IIOImage may contain raster
|
|
* data if this writer supports rasters, or it will contain a
|
|
* rendered image. Thumbnails are resized if need be. Image
|
|
* writing parameters may be specified to affect writing, or may be
|
|
* left null.
|
|
*
|
|
* @param streamMetadata metadata associated with this stream, or
|
|
* null
|
|
* @param image an IIOImage containing image data, metadata and
|
|
* thumbnails to be written
|
|
* @param param image writing parameters, or null
|
|
*
|
|
* @exception IllegalStateException if output is null
|
|
* @exception UnsupportedOperationException if writing sequences of
|
|
* images is not supported
|
|
* @exception IllegalArgumentException if image is null
|
|
* @exception UnsupportedOperationException if image contains raster
|
|
* data but this writer does not support rasters
|
|
* @exception IOException if a write error occurs
|
|
*/
|
|
public void writeToSequence (IIOImage image, ImageWriteParam param)
|
|
throws IOException
|
|
{
|
|
if (!canWriteSequence())
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
}
|