/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.cismap.commons.gui.layerwidget;
import com.vividsolutions.jts.geom.Geometry;
import org.apache.log4j.Logger;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import javax.swing.SwingWorker;
import javax.swing.tree.TreePath;
import de.cismet.cismap.commons.CrsTransformer;
import de.cismet.cismap.commons.RetrievalServiceLayer;
import de.cismet.cismap.commons.XBoundingBox;
import de.cismet.cismap.commons.featureservice.AbstractFeatureService;
import de.cismet.cismap.commons.featureservice.GMLFeatureService;
import de.cismet.cismap.commons.featureservice.JDBCFeatureService;
import de.cismet.cismap.commons.featureservice.ShapeFileFeatureService;
import de.cismet.cismap.commons.featureservice.WebFeatureService;
import de.cismet.cismap.commons.featureservice.factory.AbstractFeatureFactory;
import de.cismet.cismap.commons.featureservice.factory.GMLFeatureFactory;
import de.cismet.cismap.commons.featureservice.factory.JDBCFeatureFactory;
import de.cismet.cismap.commons.featureservice.factory.ShapeFeatureFactory;
import de.cismet.cismap.commons.gui.capabilitywidget.CapabilityWidget;
import de.cismet.cismap.commons.interaction.CismapBroker;
import de.cismet.cismap.commons.raster.wms.SlidableWMSServiceLayerGroup;
import de.cismet.cismap.commons.raster.wms.WMSServiceLayer;
import de.cismet.cismap.commons.raster.wms.simple.SimpleWMS;
import de.cismet.cismap.commons.rasterservice.ImageRasterService;
import de.cismet.cismap.commons.wms.capabilities.Envelope;
import de.cismet.cismap.commons.wms.capabilities.Layer;
import de.cismet.cismap.commons.wms.capabilities.WMSCapabilities;
/**
* DOCUMENT ME!
*
* @author therter
* @version $Revision$, $Date$
*/
public class ZoomToLayerWorker extends SwingWorker<Geometry, Geometry> {
//~ Static fields/initializers ---------------------------------------------
private static final Logger LOG = Logger.getLogger(ZoomToLayerWorker.class);
//~ Instance fields --------------------------------------------------------
private TreePath[] tps;
/** buffer in percent.* */
private int buffer = 0;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new ZoomToLayerWorker object.
*
* @param tps DOCUMENT ME!
*/
public ZoomToLayerWorker(final TreePath[] tps) {
this(tps, 0);
}
/**
* Creates a new ZoomToLayerWorker object.
*
* @param tps DOCUMENT ME!
* @param buffer DOCUMENT ME!
*/
public ZoomToLayerWorker(final TreePath[] tps, final int buffer) {
final List<TreePath> tpl = new ArrayList<TreePath>();
this.buffer = buffer;
for (final TreePath tmp : tps) {
final Object layer = tmp.getLastPathComponent();
if (layer instanceof LayerCollection) {
tpl.addAll(getAllServices(tmp.getParentPath(), (LayerCollection)layer));
} else {
tpl.add(tmp);
}
}
this.tps = tpl.toArray(new TreePath[tpl.size()]);
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param parent DOCUMENT ME!
* @param lc DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private List<TreePath> getAllServices(final TreePath parent, final LayerCollection lc) {
final List<TreePath> tpl = new ArrayList<TreePath>();
final TreePath parentWithCollection = parent.pathByAddingChild(lc);
for (final Object o : lc) {
if (o instanceof LayerCollection) {
tpl.addAll(getAllServices(parentWithCollection, (LayerCollection)o));
} else if (o != null) {
tpl.add(parentWithCollection.pathByAddingChild(o));
}
}
return tpl;
}
@Override
protected Geometry doInBackground() throws Exception {
Geometry geom = null;
for (final TreePath path : tps) {
Geometry g = null;
RetrievalServiceLayer rsl = null;
if ((path != null) && (path.getLastPathComponent() instanceof RetrievalServiceLayer)) {
rsl = (RetrievalServiceLayer)path.getLastPathComponent();
} else if ((path != null)
&& (path.getParentPath().getLastPathComponent() instanceof RetrievalServiceLayer)) {
rsl = (RetrievalServiceLayer)path.getParentPath().getLastPathComponent();
}
if (rsl != null) {
g = getServiceBounds(rsl);
}
if (g != null) {
if (geom == null) {
geom = g.getEnvelope();
geom.setSRID(g.getSRID());
} else {
if (geom.getSRID() != g.getSRID()) {
g = CrsTransformer.transformToGivenCrs(
g,
CrsTransformer.createCrsFromSrid(geom.getSRID()));
}
final Geometry ge = g.getEnvelope();
ge.setSRID(geom.getSRID());
geom = geom.union(g);
}
}
}
return geom;
}
/**
* DOCUMENT ME!
*
* @param rsl DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static Geometry getServiceBounds(final RetrievalServiceLayer rsl) {
Geometry g = null;
if (rsl instanceof AbstractFeatureService) {
final AbstractFeatureService afs = (AbstractFeatureService)rsl;
if (!afs.isInitialized()) {
try {
afs.initAndWait();
} catch (Exception e) {
LOG.error("Error while initialising feature service", e);
}
}
}
if (rsl instanceof WMSServiceLayer) {
final Layer l = ((WMSServiceLayer)rsl).getLayerInformation();
Envelope envelope = null;
if (l != null) {
envelope = CapabilityWidget.getEnvelopeForWmsLayer(l);
} else {
final WMSCapabilities caps = ((WMSServiceLayer)rsl).getWmsCapabilities();
if (caps != null) {
envelope = CapabilityWidget.getEnvelopeForWmsCaps(caps);
}
}
if (envelope != null) {
g = CapabilityWidget.createGeometryFromEnvelope(envelope);
}
} else if (rsl instanceof WebFeatureService) {
final WebFeatureService l = ((WebFeatureService)rsl);
final Envelope envelope = CapabilityWidget.getEnvelopeFromFeatureType(l.getFeature());
if (envelope != null) {
g = CapabilityWidget.createGeometryFromEnvelope(envelope);
}
} else if (rsl instanceof SlidableWMSServiceLayerGroup) {
final Layer l = ((SlidableWMSServiceLayerGroup)rsl).getLayerInformation();
if (l != null) {
final Envelope envelope = CapabilityWidget.getEnvelopeForWmsLayer(l);
if (envelope != null) {
g = CapabilityWidget.createGeometryFromEnvelope(envelope);
}
}
} else if (rsl instanceof SimpleWMS) {
final SimpleWMS wms = ((SimpleWMS)rsl);
final Layer l = wms.getLayerInformation();
if (l != null) {
final Envelope envelope = CapabilityWidget.getEnvelopeForWmsLayer(l);
if (envelope != null) {
g = CapabilityWidget.createGeometryFromEnvelope(envelope);
}
}
} else if (rsl instanceof ShapeFileFeatureService) {
final ShapeFileFeatureService sffs = (ShapeFileFeatureService)rsl;
g = ((ShapeFeatureFactory)sffs.getFeatureFactory()).getEnvelope();
} else if (rsl instanceof JDBCFeatureService) {
final JDBCFeatureService sffs = (JDBCFeatureService)rsl;
g = ((JDBCFeatureFactory)sffs.getFeatureFactory()).getEnvelope();
} else if (rsl.getClass().getName().equals("de.cismet.cismap.cidslayer.CidsLayer")) {
try {
final Method getFeatureFactory = rsl.getClass().getMethod("getFeatureFactory");
final Object o = getFeatureFactory.invoke(rsl);
final Method getEnvelope = o.getClass().getMethod("getEnvelope");
getEnvelope.setAccessible(true);
g = (Geometry)getEnvelope.invoke(o);
} catch (Exception e) {
LOG.error("Error while getting the envelope.", e);
}
} else if (rsl instanceof GMLFeatureService) {
final GMLFeatureService sffs = (GMLFeatureService)rsl;
g = ((GMLFeatureFactory)sffs.getFeatureFactory()).getEnvelope();
} else if (rsl instanceof ImageRasterService) {
final ImageRasterService irs = (ImageRasterService)rsl;
g = irs.getEnvelope();
}
return g;
}
@Override
protected void done() {
try {
final Geometry geom = get();
if (geom != null) {
final XBoundingBox boundingBox = new XBoundingBox(geom);
if (buffer != 0) {
boundingBox.increase(buffer);
}
CismapBroker.getInstance().getMappingComponent().gotoBoundingBoxWithHistory(boundingBox);
}
} catch (Exception e) {
LOG.error("Error while zooming to extend", e);
}
}
}