/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.cismap.commons.rasterservice.java_iio; import java.awt.Image; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.event.IIOReadProgressListener; import javax.imageio.stream.ImageInputStream; import de.cismet.cismap.commons.retrieval.RetrievalEvent; import de.cismet.cismap.commons.retrieval.RetrievalListener; /** * DOCUMENT ME! * * @author thorsten.hell@cismet.de * @version $Revision$, $Date$ */ public class ImageRetrieval extends Thread implements IIOReadProgressListener { //~ Instance fields -------------------------------------------------------- Image image = null; ImageReader ir = null; private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass()); private String url; private RetrievalListener listener = null; // private ByteArrayOutputStream byteArrayOut=null; private boolean youngerCall = false; //~ Constructors ----------------------------------------------------------- /** * Creates a new instance of ImageRetrieval. * * @param listener DOCUMENT ME! */ public ImageRetrieval(final RetrievalListener listener) { super("ImageRetrieval"); this.listener = listener; } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! */ public void youngerWMSCall() { youngerCall = true; if (ir != null) { if (log.isDebugEnabled()) { log.debug("ir.abort();"); // NOI18N } ir.abort(); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getUrl() { return url; } /** * DOCUMENT ME! * * @param url DOCUMENT ME! */ public void setUrl(final String url) { this.url = url; } @Override public void run() { if (log.isDebugEnabled()) { log.debug("IR Thread started"); // NOI18N } image = null; ImageInputStream iis = null; try { final URL u = new URL(url.toString()); final URLConnection uc = u.openConnection(); final String mimeType = uc.getContentType(); uc.connect(); final InputStream is = uc.getInputStream(); iis = ImageIO.createImageInputStream(is); final Iterator it = ImageIO.getImageReadersByMIMEType(mimeType); // TODO: Hier kucken ob es \u00FCberhaupt einen Reader gibt if (it.hasNext()) { ir = (ImageReader)it.next(); ir.setInput(iis, true); ir.addIIOReadProgressListener(this); image = ir.read(0); if (!youngerCall) { final RetrievalEvent e = new RetrievalEvent(); e.setIsComplete(true); e.setRetrievedObject(image); listener.retrievalComplete(e); if (log.isDebugEnabled()) { log.debug("RetrievalComplete"); // NOI18N } } } else { // Fehler final BufferedInputStream in = new BufferedInputStream(is); final ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); int c; while ((c = in.read()) != -1) { byteArrayOut.write(c); if (youngerCall) { // fireLoadingAborted(); return; } } final RetrievalEvent e = new RetrievalEvent(); e.setHasErrors(true); final String error = new String(byteArrayOut.toByteArray()); e.setRetrievedObject(error); listener.retrievalError(e); } } catch (Exception e) { log.error("Error while loading the image.", e); // NOI18N } } @Override public void imageComplete(final ImageReader source) { } @Override public void imageProgress(final ImageReader source, final float percentageDone) { if (!youngerCall) { final RetrievalEvent e = new RetrievalEvent(); e.setPercentageDone((int)percentageDone); listener.retrievalProgress(e); } } @Override public void imageStarted(final ImageReader source, final int imageIndex) { } @Override public void readAborted(final ImageReader source) { } @Override public void sequenceComplete(final ImageReader source) { } @Override public void sequenceStarted(final ImageReader source, final int minIndex) { } @Override public void thumbnailComplete(final ImageReader source) { } @Override public void thumbnailProgress(final ImageReader source, final float percentageDone) { } @Override public void thumbnailStarted(final ImageReader source, final int imageIndex, final int thumbnailIndex) { } }