/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cismap.commons.rasterservice;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.ImageObserver;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.JComponent;
import de.cismet.cismap.commons.retrieval.RetrievalEvent;
import de.cismet.cismap.commons.retrieval.RetrievalListener;
import de.cismet.tools.gui.log4jquickconfig.Log4JQuickConfig;
/**
* DOCUMENT ME!
*
* @author thorsten.hell@cismet.de
* @version $Revision$, $Date$
*/
public class HTTPImageRetrieval extends Thread {
//~ Instance fields --------------------------------------------------------
Image image = null;
HttpClient client;
GetMethod method;
String url;
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
private RetrievalListener listener = null;
private ImageObserverInterceptor observer;
private ByteArrayOutputStream byteArrayOut = null;
private boolean youngerCall = false;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new instance of HTTPImageRetrieval.
*
* @param listener DOCUMENT ME!
*/
public HTTPImageRetrieval(final RetrievalListener listener) {
super("HTTPImageRetrieval");
this.listener = listener;
client = new HttpClient();
// client.getHostConfiguration().setProxy("www-proxy.htw-saarland.de", 3128);
if (log.isDebugEnabled()) {
log.debug("proxySet:" + System.getProperty("http.proxyHost")); // NOI18N
}
if (log.isDebugEnabled()) {
log.debug("ProxyHost:" + System.getProperty("http.proxyHost")); // NOI18N
}
if (log.isDebugEnabled()) {
log.debug("ProxyPort:" + System.getProperty("http.proxyPort")); // NOI18N
}
final String proxySet = System.getProperty("proxySet"); // NOI18N
if ((proxySet != null) && proxySet.equals("true")) { // NOI18N
if (log.isDebugEnabled()) {
log.debug("proxyIs Set"); // NOI18N
log.debug("ProxyHost:" + System.getProperty("http.proxyHost")); // NOI18N
}
if (log.isDebugEnabled()) {
log.debug("ProxyPort:" + System.getProperty("http.proxyPort")); // NOI18N
}
try {
client.getHostConfiguration()
.setProxy(System.getProperty("http.proxyHost"),
Integer.parseInt(System.getProperty("http.proxyPort"))); // NOI18N
} catch (Exception e) {
log.error("Problem while setting proxy", e); // NOI18N
}
} else {
if (log.isDebugEnabled()) {
log.debug("no proxyIs Set"); // NOI18N
}
}
}
//~ Methods ----------------------------------------------------------------
@Override
public void run() {
if (method != null) {
method.abort();
}
method = new GetMethod(url);
if (!method.isAborted()) {
try {
final int statusCode = client.executeMethod(method);
if (statusCode != -1) {
if (log.isDebugEnabled()) {
log.debug("reading: " + url); // NOI18N
}
final InputStream is = method.getResponseBodyAsStream();
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 (log.isDebugEnabled()) {
log.debug("creating image"); // NOI18N
}
// Image image =observer.createImage( (ImageProducer) o);
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.setRetrievedObject(image);
if (!youngerCall) {
listener.retrievalComplete(e);
if (log.isDebugEnabled()) {
log.debug("Retrieval complete"); // NOI18N
}
} else {
fireLoadingAborted();
}
method.releaseConnection();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 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;
}
/**
* DOCUMENT ME!
*/
public void endRetrieval() {
if (method != null) {
method.abort();
}
youngerCall = true;
}
/**
* DOCUMENT ME!
*/
public void fireLoadingAborted() {
log.info("Retrieval interrupted"); // NOI18N
if ((method != null) && !method.isAborted()) {
method.abort();
}
image = null;
observer = null;
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;
}
}
}