/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.cismap.commons.rasterservice; import com.google.common.io.ByteStreams; import org.apache.commons.httpclient.HttpClient; import org.openide.util.Exceptions; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javax.imageio.ImageIO; import de.cismet.cismap.commons.retrieval.RetrievalEvent; import de.cismet.cismap.commons.retrieval.RetrievalListener; import de.cismet.cismap.commons.wms.capabilities.WMSCapabilities; import de.cismet.commons.security.AccessHandler.ACCESS_METHODS; import de.cismet.security.WebAccessManager; /** * DOCUMENT ME! * * @author thorsten.hell@cismet.de * @version $Revision$, $Date$ */ public class ImageRetrieval extends Thread { //~ Instance fields -------------------------------------------------------- BufferedInputStream in = null; private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass()); private String url; private RetrievalListener listener = null; private WMSCapabilities cap; private HttpClient preferredHttpClient; private volatile boolean youngerCall = false; private String payload; //~ 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; } @Override public void interrupt() { super.interrupt(); if (log.isDebugEnabled()) { log.debug("interrupt()", new Exception("interrupt")); // NOI18N } if (in != null) { if (log.isDebugEnabled()) { log.info("in!=null"); // NOI18N try { in.close(); } catch (IOException ex) { Exceptions.printStackTrace(ex); } } } } @Override public void run() { try { if (log.isDebugEnabled()) { log.debug("start of ImageRetrieval: " + url); // NOI18N } listener.retrievalStarted(new RetrievalEvent()); if (cap != null) { if (log.isDebugEnabled()) { log.debug("Retrieve: " + url.toString() + " WMSCapability: " + cap.getLayer().getTitle()); // NOI18N } } else { if (log.isDebugEnabled()) { log.debug("Retrieve: " + url.toString()); // NOI18N } } final String urlBase; final String requestParameter; final ACCESS_METHODS method; if (payload == null) { // assume GET request int indexOfCharacter = 0; if ((indexOfCharacter = url.indexOf('?')) != -1) { urlBase = url.substring(0, indexOfCharacter); if ((indexOfCharacter + 1) < url.length()) { requestParameter = url.substring(indexOfCharacter + 1, url.length()); } else { requestParameter = ""; // NOI18N } } else { urlBase = url; requestParameter = ""; // NOI18N } method = ACCESS_METHODS.GET_REQUEST; } else { // assume POST request urlBase = url; requestParameter = payload; method = ACCESS_METHODS.POST_REQUEST; if (log.isDebugEnabled()) { log.debug("POST payload: " + payload); // NOI18N } } final InputStream is = WebAccessManager.getInstance().doRequest( new URL(urlBase), requestParameter, method); final byte[] bs = ByteStreams.toByteArray(is); in = new BufferedInputStream(new ByteArrayInputStream(bs)); final RetrievalEvent e = new RetrievalEvent(); if (!youngerCall && !isInterrupted()) { e.setRetrievedObject(ImageIO.read(in)); if (e.getRetrievedObject() == null) { e.setRetrievedObject(org.apache.commons.io.IOUtils.toString(new ByteArrayInputStream(bs))); e.setHasErrors(true); } } e.setIsComplete(true); if (!youngerCall && !isInterrupted()) { listener.retrievalComplete(e); if (log.isDebugEnabled()) { log.debug("Retrieval complete of " + e.getRetrievalService()); // NOI18N } } else { if (!youngerCall) { fireLoadingAborted(); } } } catch (Exception e) { log.error("Error in ImageRetrieval", e); // NOI18N final RetrievalEvent re = new RetrievalEvent(); re.setIsComplete(false); 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()); re.setErrorType(RetrievalEvent.CLIENTERROR); } listener.retrievalError(re); log.error("Error while loading the image", e); // NOI18N } finally { if (in != null) { try { in.close(); } catch (IOException ex) { log.warn(ex, ex); } } } } /** * DOCUMENT ME! */ public void fireLoadingAborted() { // TODO nochmal anschauen log.info("Retrieval interrupted"); // NOI18N if (listener != null) { final RetrievalEvent e = new RetrievalEvent(); e.setIsComplete(false); listener.retrievalAborted(e); } } /** * 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! * * @return DOCUMENT ME! */ public String getPayload() { return payload; } /** * DOCUMENT ME! * * @param payload DOCUMENT ME! */ public void setPayload(final String payload) { this.payload = payload; } /** * new. * * @param cap DOCUMENT ME! */ public void setWMSCapabilities(final WMSCapabilities cap) { this.cap = cap; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public HttpClient getPreferredHttpClient() { return preferredHttpClient; } /** * DOCUMENT ME! * * @param preferredHttpClient DOCUMENT ME! */ public void setPreferredHttpClient(final HttpClient preferredHttpClient) { this.preferredHttpClient = preferredHttpClient; } }