/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cismap.commons.raster.wms.simple;
import edu.umd.cs.piccolo.PNode;
import org.apache.commons.httpclient.HttpClient;
import org.jdom.Attribute;
import org.jdom.CDATA;
import org.jdom.Element;
import java.util.Vector;
import de.cismet.cismap.commons.BoundingBox;
import de.cismet.cismap.commons.LayerInfoProvider;
import de.cismet.cismap.commons.RetrievalServiceLayer;
import de.cismet.cismap.commons.raster.wms.AbstractWMS;
import de.cismet.cismap.commons.rasterservice.ImageRetrieval;
import de.cismet.cismap.commons.rasterservice.MapService;
import de.cismet.cismap.commons.rasterservice.RasterMapService;
import de.cismet.cismap.commons.retrieval.RetrievalEvent;
import de.cismet.cismap.commons.wms.capabilities.Layer;
/**
* DOCUMENT ME!
*
* @author thorsten.hell@cismet.de
* @version $Revision$, $Date$
*/
public class SimpleWMS extends AbstractWMS implements MapService,
RasterMapService,
RetrievalServiceLayer,
LayerInfoProvider { // implements RasterService,RetrievalListener,ServiceLayer {
//~ Instance fields --------------------------------------------------------
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
private SimpleWmsGetMapUrl gmUrl;
private ImageRetrieval ir;
private PNode pNode;
private String name = "SimpleWMS"; // NOI18N
private HttpClient preferredClient = null;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new SimpleWMS object.
*
* @param s DOCUMENT ME!
*/
public SimpleWMS(final SimpleWMS s) {
this(s.gmUrl);
if ((BoundingBox)s.bb != null) {
bb = (BoundingBox)s.bb.clone();
}
enabled = s.enabled;
height = s.height;
layerPosition = s.layerPosition;
name = s.name;
// The cloned wms and the origin wms should not use the same pnode,
// because this would lead to problems, if the cloned layer and the origin layer are
// used in 2 different MappingComponents
// pNode = s.pNode;
translucency = s.translucency;
width = s.width;
ir = new ImageRetrieval(s);
listeners = new Vector();
listeners.addAll(s.listeners);
}
/**
* Creates a new instance of SimpleWMS.
*
* <p>p@aram gmUrl DOCUMENT ME!</p>
*
* @param gmUrl DOCUMENT ME!
*/
public SimpleWMS(final SimpleWmsGetMapUrl gmUrl) {
this.gmUrl = gmUrl;
}
/**
* Creates a new SimpleWMS object.
*
* @param object DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public SimpleWMS(final Element object) throws Exception {
final String urlTemplate = object.getTextTrim();
final SimpleWmsGetMapUrl url = new SimpleWmsGetMapUrl(urlTemplate);
gmUrl = url;
final Attribute layerPositionAttr = object.getAttribute("layerPosition"); // NOI18N
if (layerPositionAttr != null) {
try {
layerPosition = layerPositionAttr.getIntValue();
} catch (Exception e) {
}
}
final Attribute enabledAttr = object.getAttribute("enabled"); // NOI18N
if (enabledAttr != null) {
try {
enabled = enabledAttr.getBooleanValue();
} catch (Exception e) {
}
}
final Attribute nameAttr = object.getAttribute("name"); // NOI18N
if (nameAttr != null) {
try {
name = nameAttr.getValue();
} catch (Exception e) {
}
}
final Attribute visAttr = object.getAttribute("visible"); // NOI18N
if (visAttr != null) {
try {
visible = visAttr.getBooleanValue();
pNode.setVisible(visible);
} catch (Exception e) {
}
}
final Attribute translucencyAttr = object.getAttribute("translucency"); // NOI18N
if (translucencyAttr != null) {
try {
setTranslucency(translucencyAttr.getFloatValue());
} catch (Exception e) {
}
}
}
/**
* Creates a new SimpleWMS object.
*
* @param gmUrl DOCUMENT ME!
* @param layerPosition DOCUMENT ME!
* @param enabled DOCUMENT ME!
* @param canbeDisabled DOCUMENT ME!
* @param name DOCUMENT ME!
*/
public SimpleWMS(final SimpleWmsGetMapUrl gmUrl,
final int layerPosition,
final boolean enabled,
final boolean canbeDisabled,
final String name) {
this.gmUrl = gmUrl;
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Element getElement() {
final Element element = new Element("simpleWms"); // NOI18N
element.setAttribute("layerPosition", new Integer(layerPosition).toString()); // NOI18N
element.setAttribute("skip", "false"); // NOI18N
element.setAttribute("enabled", Boolean.toString(enabled));
element.setAttribute("visible", Boolean.toString(pNode.getVisible())); // NOI18N
element.setAttribute("name", name); // NOI18N
element.setAttribute("translucency", new Float(translucency).toString()); // NOI18N
final CDATA data = new CDATA(gmUrl.getUrlTemplate());
element.addContent(data);
return element;
}
@Override
public synchronized void retrieve(final boolean forced) {
if (log.isDebugEnabled()) {
log.debug("retrieve()"); // NOI18N
}
gmUrl.setHeight(height);
gmUrl.setWidth(width);
gmUrl.setX1(bb.getX1());
gmUrl.setY1(bb.getY1());
gmUrl.setX2(bb.getX2());
gmUrl.setY2(bb.getY2());
if ((ir != null) && ir.isAlive() && ir.getUrl().equals(gmUrl.toString()) && !forced) {
if (log.isDebugEnabled()) {
// mach nix
// mehrfachaufruf mit der gleichen url = unsinn
log.debug("multiple invocations with the same url = humbug"); // NOI18N
}
} else {
if ((ir != null) && ir.isAlive()) {
ir.youngerWMSCall();
ir.interrupt();
retrievalAborted(new RetrievalEvent());
}
ir = new ImageRetrieval(this);
ir.setPreferredHttpClient(preferredClient);
ir.setUrl(gmUrl.toString());
ir.setPayload(gmUrl.createPayload());
if (log.isDebugEnabled()) {
log.debug("ir.start();"); // NOI18N
}
ir.setPriority(Thread.NORM_PRIORITY);
ir.start();
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public SimpleWmsGetMapUrl getGmUrl() {
return gmUrl;
}
/**
* DOCUMENT ME!
*
* @param gmUrl DOCUMENT ME!
*/
public void setGmUrl(final SimpleWmsGetMapUrl gmUrl) {
this.gmUrl = gmUrl;
}
@Override
public void setPNode(final PNode imageObject) {
pNode = imageObject;
}
@Override
public PNode getPNode() {
return pNode;
}
@Override
public Object clone() {
return new SimpleWMS(this);
}
@Override
public String getName() {
return name;
}
@Override
public void setName(final String name) {
this.name = name;
}
@Override
public String toString() {
return getName();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public HttpClient getPreferredClient() {
return preferredClient;
}
/**
* DOCUMENT ME!
*
* @param preferredClient DOCUMENT ME!
*/
public void setPreferredClient(final HttpClient preferredClient) {
this.preferredClient = preferredClient;
}
@Override
public String getLayerURI() {
return null;
}
@Override
public String getServerURI() {
return gmUrl.getUrlTemplate();
}
@Override
public boolean isLayerQuerySelected() {
return false;
}
@Override
public void setLayerQuerySelected(final boolean selected) {
}
@Override
public boolean isQueryable() {
return false;
}
@Override
public Layer getLayerInformation() {
return null;
}
}