/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cismap.commons.retrieval;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.ImageObserver;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Vector;
import javax.swing.JComponent;
import de.cismet.tools.CismetThreadPool;
/**
* DOCUMENT ME!
*
* @author thorsten.hell@cismet.de
* @version $Revision$, $Date$
*/
@Deprecated
public class UniversalRetrieval extends AbstractRetrievalService implements RetrievalListener {
//~ Instance fields --------------------------------------------------------
String url = null;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new UniversalRetrieval object.
*
* @param url DOCUMENT ME!
*/
public UniversalRetrieval(final String url) {
this.url = url;
}
//~ Methods ----------------------------------------------------------------
/**
* Creates a new instance of UniversalRetrieval.
*
* @param args DOCUMENT ME!
*/
public static void main(final String[] args) {
final UniversalRetrieval ur = new UniversalRetrieval("http://www.google.de/intl/de_de/images/logo.gif"); // NOI18N
// UniversalRetrieval ur=new UniversalRetrieval("http://www.google.de"); UniversalRetrieval ur=new
// UniversalRetrieval("http://www2.demis.nl/WMS/wms.asp?WMS=WorldMap&WMTVER=1.0.0&request=capabilities");
ur.retrieve(false);
}
@Override
public void retrieve(final boolean forced) {
final RetrievalThread rt = new RetrievalThread();
CismetThreadPool.execute(rt);
}
@Override
public void retrievalStarted(final RetrievalEvent e) {
fireRetrievalStarted(e);
}
@Override
public void retrievalProgress(final RetrievalEvent e) {
fireRetrievalProgress(e);
}
@Override
public void retrievalError(final RetrievalEvent e) {
fireRetrievalProgress(e);
}
@Override
public void retrievalComplete(final RetrievalEvent e) {
fireRetrievalComplete(e);
}
@Override
public void retrievalAborted(final RetrievalEvent e) {
fireRetrievalAborted(e);
}
@Override
public Object clone() {
final UniversalRetrieval u = new UniversalRetrieval(url);
u.listeners = new Vector(listeners);
return u;
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
class RetrievalThread extends Thread {
//~ Instance fields ----------------------------------------------------
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
private ImageObserverInterceptor observer;
private RetrievalListener listener = null;
private ByteArrayOutputStream byteArrayOut = null;
private URLConnection uc = null;
private InputStream is = null;
private Image image = null;
private boolean youngerCall = false;
private String contentType = ""; // NOI18N
//~ Constructors -------------------------------------------------------
/**
* Creates a new RetrievalThread object.
*/
public RetrievalThread() {
super("RetrievalThread");
listener = UniversalRetrieval.this;
}
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*/
public void youngerCall() {
youngerCall = true;
}
@Override
public void run() {
try {
if (log.isDebugEnabled()) {
log.debug("start of ImageRetrieval"); // NOI18N
}
listener.retrievalStarted(new RetrievalEvent());
final URL u = new URL(url.toString());
if (log.isDebugEnabled()) {
log.debug("Retrieve: " + url.toString()); // NOI18N
}
uc = u.openConnection();
if (log.isDebugEnabled()) {
log.debug("contenttype: " + uc.getContentType()); // NOI18N
}
contentType = uc.getContentType();
uc.connect();
is = uc.getInputStream();
final BufferedInputStream in = new BufferedInputStream(is);
byteArrayOut = new ByteArrayOutputStream();
int c;
while ((c = in.read()) != -1) {
byteArrayOut.write(c);
if (youngerCall) {
fireLoadingAborted();
if (log.isDebugEnabled()) {
log.debug("interrupt during retrieval"); // NOI18N
}
return;
}
}
if (uc.getContentType().indexOf("image") != -1) { // NOI18N
observer = new ImageObserverInterceptor();
// Image image =Toolkit.getDefaultToolkit().getImage(is);
image = Toolkit.getDefaultToolkit().createImage(byteArrayOut.toByteArray());
observer.prepareImage(image, observer);
while ((observer.checkImage(image, observer) & observer.ALLBITS) != observer.ALLBITS) {
Thread.sleep(10);
if (youngerCall) {
fireLoadingAborted();
if (log.isDebugEnabled()) {
log.debug("interrupt during assembling"); // NOI18N
}
return;
}
}
final RetrievalEvent e = new RetrievalEvent();
e.setIsComplete(true);
e.setContentType(contentType);
e.setRetrievedObject(image);
if (!youngerCall) {
listener.retrievalComplete(e);
if (log.isDebugEnabled()) {
log.debug("Retrieval complete"); // NOI18N
}
} else {
fireLoadingAborted();
}
} else if (uc.getContentType().indexOf("text") != -1) { // NOI18N
final RetrievalEvent e = new RetrievalEvent();
e.setContentType(contentType);
e.setIsComplete(true);
e.setRetrievedObject(byteArrayOut.toString());
listener.retrievalComplete(e);
} else {
final RetrievalEvent e = new RetrievalEvent();
e.setIsComplete(true);
e.setContentType(contentType);
e.setRetrievedObject(byteArrayOut);
listener.retrievalComplete(e);
}
} catch (Exception e) {
log.error(byteArrayOut);
final RetrievalEvent re = new RetrievalEvent();
re.setIsComplete(false);
re.setContentType(contentType);
if ((e.getMessage() == null) || e.getMessage().equals("null")) { // NOI18N
try {
final String cause = e.getCause().getMessage();
re.setRetrievedObject(cause);
} catch (Exception ee) {
}
} else {
re.setRetrievedObject(e.getMessage());
}
listener.retrievalError(re);
log.error("Fehler beim Laden des Bildes ", e); // NOI18N
}
}
/**
* DOCUMENT ME!
*/
public void fireLoadingAborted() {
// RetrievalEvent e=new RetrievalEvent();
// listener.retrievalAborted(e);
// TODO nochmal anschauen
log.info("Retrieval interrupted"); // NOI18N
image = null;
observer = null;
if (is != null) {
try {
is.close();
} catch (IOException ioe) {
log.warn("Exception during premature closing of the inputstream", ioe); // NOI18N
}
}
System.gc();
}
//~ Inner Classes ------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class ImageObserverInterceptor extends JComponent {
//~ Methods --------------------------------------------------------
@Override
public boolean imageUpdate(final Image img,
final int infoflags,
final int x,
final int y,
final int width,
final int height) {
final boolean ret = super.imageUpdate(img, infoflags, x, y, width, height);
// log.debug("ImageUpdate");
// log.debug("y "+height);
// log.debug("img.getHeight"+img.getHeight(this));
if ((infoflags & ImageObserver.SOMEBITS) != 0) {
final RetrievalEvent e = new RetrievalEvent();
e.setPercentageDone((int)(y / (img.getHeight(this) - 1.0) * 100));
listener.retrievalProgress(e);
} else if ((infoflags & ImageObserver.ABORT) != 0) {
} else if ((infoflags & ImageObserver.ERROR) != 0) {
final RetrievalEvent e = new RetrievalEvent();
e.setHasErrors(true);
final String error = new String(byteArrayOut.toByteArray());
e.setRetrievedObject(error);
listener.retrievalError(e);
}
return ret;
}
}
}
}