/***************************************************
*
* 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;
import org.jdom.Attribute;
import org.jdom.Element;
import java.awt.EventQueue;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import de.cismet.cismap.commons.featureservice.DocumentFeatureService;
import de.cismet.cismap.commons.featureservice.JDBCFeatureService;
import de.cismet.cismap.commons.featureservice.ShapeFileFeatureService;
import de.cismet.cismap.commons.featureservice.SimplePostgisFeatureService;
import de.cismet.cismap.commons.featureservice.SimpleUpdateablePostgisFeatureService;
import de.cismet.cismap.commons.featureservice.WebFeatureService;
import de.cismet.cismap.commons.gui.layerwidget.ActiveLayerModel;
import de.cismet.cismap.commons.gui.layerwidget.LayerCollection;
import de.cismet.cismap.commons.interaction.events.ActiveLayerEvent;
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.ImageFileRetrieval;
import de.cismet.cismap.commons.rasterservice.ImageRasterService;
import de.cismet.cismap.commons.rasterservice.MapService;
import de.cismet.cismap.commons.wms.capabilities.WMSCapabilities;
/**
* DOCUMENT ME!
*
* @author thorsten
* @version $Revision$, $Date$
*/
public class CidsLayerFactory {
//~ Static fields/initializers ---------------------------------------------
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CidsLayerFactory.class);
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(CidsLayerFactory.class);
private static boolean DEBUG = true;
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param element DOCUMENT ME!
* @param capabilities DOCUMENT ME!
* @param model DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static ServiceLayer createLayer(final Element element,
final HashMap<String, WMSCapabilities> capabilities,
final ActiveLayerModel model) {
if (DEBUG) {
if (LOG.isDebugEnabled()) {
LOG.debug("trying to create Layer '" + element.getName() + "'"); // NOI18N
}
}
try {
if (element.getName().equals("WMSServiceLayer")) { // NOI18N
final WMSServiceLayer wmsServiceLayer = new WMSServiceLayer(element, capabilities);
try {
if (wmsServiceLayer.getWMSLayers().size() > 0) {
try {
LOG.info(
"createLayer WMSServiceLayer ("
+ wmsServiceLayer.getName()
+ ")"); // NOI18N
return wmsServiceLayer;
} catch (IllegalArgumentException schonVorhanden) {
LOG.warn(
"Layer WMSServiceLayer '"
+ wmsServiceLayer.getName()
+ "' already existed. Do not add the Layer. \n"
+ schonVorhanden.getMessage()); // NOI18N
}
}
} catch (Exception e) {
LOG.error("Error while initialising WMS", e);
}
} else if (element.getName().equals(WebFeatureService.WFS_FEATURELAYER_TYPE)) {
final WebFeatureService wfs = new WebFeatureService(element);
if (EventQueue.isDispatchThread()) {
LOG.fatal("InvokeLater in EDT"); // NOI18N
}
try {
LOG.info(
"addLayer "
+ WebFeatureService.WFS_FEATURELAYER_TYPE
+ " ("
+ wfs.getName()
+ ")"); // NOI18N
return wfs;
} catch (IllegalArgumentException schonVorhanden) {
LOG.warn(
"Layer "
+ WebFeatureService.WFS_FEATURELAYER_TYPE
+ " '"
+ wfs.getName()
+ "' already existed. Do not add the Layer. \n"
+ schonVorhanden.getMessage()); // NOI18N
}
} else if (element.getName().equals("DocumentFeatureServiceLayer")) { // NOI18N
LOG.error("DocumentFeatureServiceLayer not supported"); // NOI18N
// throw new UnsupportedOperationException("DocumentFeatureServiceLayer not supported");
// if(DEBUG)log.debug("DocumentFeatureLayer von ConfigFile wird hinzugefügt"); URI documentURI =
// new URI(element.getChildText("documentURI").trim()); File testFile = new File(documentURI); if
// (!testFile.exists()) { log.warn("Das Angebene Document(" + testFile.getAbsolutePath() + ")
// exisitiert nicht ---> abbruch, es wird kein Layer angelegt"); continue; }
//
// final GMLFeatureService gfs = new GMLFeatureService(element); //langsam sollte nicht im EDT
// ausgeführt werden final DocumentFeatureService dfs =
// DocumentFeatureServiceFactory.createDocumentFeatureService(element); //final
// ShapeFileFeatureService sfs = new ShapeFileFeatureService(element); EventQueue.invokeLater(new
// Runnable() {
//
// @Override public void run() { try { log.info("addLayer DocumentFeatureServiceLayer (" +
// dfs.getName() + ")"); addLayer(dfs); } catch (IllegalArgumentException schonVorhanden) {
// log.warn("Layer DocumentFeatureServiceLayer '" + dfs.getName() + "' already existed. Do not
// add the Layer. \n" + schonVorhanden.getMessage()); } } });
} else if (element.getName().equals("simpleWms")) { // NOI18N
final SimpleWMS simpleWMS = new SimpleWMS(element);
LOG.info("addLayer SimpleWMS (" + simpleWMS.getName() + ")"); // NOI18N
try {
return simpleWMS;
} catch (IllegalArgumentException schonVorhanden) {
LOG.warn(
"Layer SimpleWMS '"
+ simpleWMS.getName()
+ "' already existed. Do not add the Layer. \n"
+ schonVorhanden.getMessage()); // NOI18N
}
} else if (element.getName().equals("ImageRasterService")) { // NOI18N
final ImageRasterService rasterService = new ImageRasterService(element);
LOG.info("addLayer image raster service (" + rasterService.getName() + ")"); // NOI18N
try {
return rasterService;
} catch (IllegalArgumentException schonVorhanden) {
LOG.warn(
"Layer ImageRasterService '"
+ rasterService.getName()
+ "' already existed. Do not add the Layer. \n"
+ schonVorhanden.getMessage()); // NOI18N
}
} else if (element.getName().equals(SlidableWMSServiceLayerGroup.XML_ELEMENT_NAME)) { // NOI18N
final SlidableWMSServiceLayerGroup wms = new SlidableWMSServiceLayerGroup(element, capabilities);
LOG.info("addLayer SlidableWMSServiceLayerGroup (" + wms.getName() + ")"); // NOI18N
try {
return wms;
} catch (IllegalArgumentException schonVorhanden) {
LOG.warn(
"Layer SimpleWMS '"
+ wms.getName()
+ "' already existed. Do not add the Layer. \n"
+ schonVorhanden.getMessage()); // NOI18N
}
} else if (element.getName().equals("simplePostgisFeatureService")) { // NOI18N
SimplePostgisFeatureService spfs;
if ((element.getAttributeValue("updateable") != null)
&& element.getAttributeValue("updateable").equals("true")) { // NOI18N
spfs = new SimpleUpdateablePostgisFeatureService(element);
} else {
spfs = new SimplePostgisFeatureService(element);
}
final SimplePostgisFeatureService simplePostgisFeatureService = spfs;
try {
LOG.info(
"addLayer SimplePostgisFeatureService ("
+ simplePostgisFeatureService.getName()
+ ")"); // NOI18N
return simplePostgisFeatureService;
} catch (IllegalArgumentException schonVorhanden) {
LOG.warn(
"Layer SimplePostgisFeatureService '"
+ simplePostgisFeatureService.getName()
+ "' already existed. Do not add the Layer. \n"
+ schonVorhanden.getMessage()); // NOI18N
}
} else if (element.getName().equals(LayerCollection.XML_ELEMENT_NAME)) { // NOI18N
final LayerCollection lc = new LayerCollection(element, capabilities, model);
try {
LOG.info(
"addLayer LayerCollection ("
+ lc.getName()
+ ")"); // NOI18N
return lc;
} catch (IllegalArgumentException schonVorhanden) {
LOG.warn(
"Layer LayerCollection '"
+ lc.getName()
+ "' already existed. Do not add the Layer. \n"
+ schonVorhanden.getMessage()); // NOI18N
}
} else if (element.getName().equals("ModeLayer")) {
final ModeLayer modeLayer = new ModeLayer();
final String selectedMode = element.getAttributeValue("mode");
final String modeLayerKey = element.getAttributeValue("key");
modeLayer.setLayerKey(modeLayerKey);
final Iterator modeIt = element.getChildren("Mode").iterator();
String first = null;
while (modeIt.hasNext()) {
final Element mode = (Element)modeIt.next();
final String key = mode.getAttributeValue("key");
if (first == null) {
first = key;
}
final Element layerDef = (Element)mode.getChildren().get(0);
final ServiceLayer layer = createLayer(layerDef, capabilities, model);
modeLayer.putModeLayer(key, (RetrievalServiceLayer)layer);
}
if (selectedMode == null) {
modeLayer.setMode(first);
} else {
modeLayer.setMode(selectedMode);
}
ModeLayerRegistry.getInstance().putModeLayer(modeLayerKey, modeLayer);
return modeLayer;
} else {
try {
if (DEBUG) {
if (LOG.isDebugEnabled()) {
LOG.debug("restoring generic layer configuration from xml element '" + element.getName()
+ "'"); // NOI18N
}
}
final RetrievalServiceLayer layer = (RetrievalServiceLayer)XMLObjectFactory
.restoreObjectfromElement(element);
try {
LOG.info("addLayer generic layer configuration (" + layer.getName() + ")"); // NOI18N
return layer;
} catch (IllegalArgumentException schonVorhanden) {
LOG.warn(
"Layer SimplePostgisFeatureService '"
+ layer.getName()
+ "' already existed. Do not add the Layer. \n"
+ schonVorhanden.getMessage()); // NOI18N
}
} catch (Throwable t) {
LOG.error("unsupported xml configuration, layer '" + element.getName()
+ "' could not be created: \n" + t.getLocalizedMessage(),
t); // NOI18N
}
}
} catch (Throwable t) {
LOG.error("Layer layer '" + element.getName() + "' could not be created: \n" + t.getMessage(), t); // NOI18N
}
return null;
}
/**
* DOCUMENT ME!
*
* @param layerelement DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static String getKeyforLayerElement(final Element layerelement) {
final String keyString = null;
if (layerelement != null) {
try {
if (layerelement.getName().equals("WMSServiceLayer")) { // NOI18N
final WMSServiceLayer wmsServiceLayer = new WMSServiceLayer(
layerelement,
new HashMap<String, WMSCapabilities>());
return getKeyForRetrievalService(wmsServiceLayer);
} else if (layerelement.getName().equals(WebFeatureService.WFS_FEATURELAYER_TYPE)) {
final WebFeatureService wfs = new WebFeatureService(layerelement);
return getKeyForRetrievalService(wfs);
} else if (layerelement.getName().equals("DocumentFeatureServiceLayer")) { // NOI18N
log.warn("Sollte nicht vorkommen. Die sollten alle von der XMLObjectFactory geladen werden."); // NOI18N
} else if (layerelement.getName().equals("simpleWms")) { // NOI18N
final SimpleWMS simpleWMS = new SimpleWMS(layerelement);
return getKeyForRetrievalService(simpleWMS);
} else if (layerelement.getName().equals("simplePostgisFeatureService")) { // NOI18N
SimplePostgisFeatureService spfs;
if ((layerelement.getAttributeValue("updateable") != null)
&& layerelement.getAttributeValue("updateable").equals("true")) { // NOI18N
spfs = new SimpleUpdateablePostgisFeatureService(layerelement);
} else {
spfs = new SimplePostgisFeatureService(layerelement);
}
return getKeyForRetrievalService(spfs);
} else if (layerelement.getName().equals(SlidableWMSServiceLayerGroup.XML_ELEMENT_NAME)) { // NOI18N
final SlidableWMSServiceLayerGroup slidableWms = new SlidableWMSServiceLayerGroup(
layerelement,
new HashMap<String, WMSCapabilities>());
// the listener and the internal widget should be removed by the slidable wms object
final ActiveLayerEvent event = new ActiveLayerEvent();
event.setLayer(slidableWms);
slidableWms.layerRemoved(event);
return getKeyForRetrievalService(slidableWms);
} else if (layerelement.getName().equals("ModeLayer")) {
return "ModeLayer#" + layerelement.getAttributeValue("key");
} else {
final RetrievalServiceLayer layer = (RetrievalServiceLayer)XMLObjectFactory
.restoreObjectfromElement(layerelement);
return getKeyForRetrievalService(layer);
}
} catch (Exception ex) {
log.error("Konnte keinen Key für das layerelement "
+ ((layerelement.getName() != null) ? layerelement.getName() : ("null" + " erstellen")),
ex);
}
}
return null;
}
/**
* Same as above if this is done directly by the retrievalservicelayer no instanceof is needed.
*
* @param layer DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static String getKeyForRetrievalService(final RetrievalServiceLayer layer) {
if (layer != null) {
try {
if (layer instanceof WMSServiceLayer) { // NOI18N
final WMSServiceLayer wmsServiceLayer = (WMSServiceLayer)layer;
return wmsServiceLayer.getName() + "#" + wmsServiceLayer.getCapabilitiesUrl();
} else if (layer instanceof WebFeatureService) {
final WebFeatureService wfs = (WebFeatureService)layer;
return wfs.getName() + "#" + wfs.getHostname();
} else if (layer instanceof DocumentFeatureService) { // NOI18N
final DocumentFeatureService dfs = (DocumentFeatureService)layer;
return dfs.getName() + dfs.getDocumentURI();
} else if (layer instanceof SimpleWMS) { // NOI18N
final SimpleWMS simpleWMS = (SimpleWMS)layer;
return simpleWMS.getName() + "#" + simpleWMS.getGmUrl().getUrlTemplate();
} else if (layer instanceof SimplePostgisFeatureService) { // NOI18N
final SimplePostgisFeatureService spfs = (SimplePostgisFeatureService)layer;
return spfs.getName() + "#" + spfs.getConnectionInfo().getUrl();
} else if (layer instanceof SlidableWMSServiceLayerGroup) { // NOI18N
final SlidableWMSServiceLayerGroup wms = (SlidableWMSServiceLayerGroup)layer;
return wms.getName() + "#" + wms.getName();
} else if (layer instanceof ImageRasterService) {
final ImageRasterService rs = (ImageRasterService)layer;
return rs.getName() + "#" + rs.getLayerURI();
} else {
final RetrievalServiceLayer rsl = (RetrievalServiceLayer)layer;
return rsl.getName() + "#" + rsl.getClass();
}
} catch (Exception ex) {
log.error("Konnte keinen Key für das layerelement erstellen", ex);
}
}
return null;
}
/**
* DOCUMENT ME!
*
* @param layer DOCUMENT ME!
* @param preferredBGColor DOCUMENT ME!
* @param preferredExceptionsFormat DOCUMENT ME!
* @param preferredRasterFormat DOCUMENT ME!
* @param srs DOCUMENT ME!
*/
public static void wmsSpecificConfiguration(final RetrievalServiceLayer layer,
final String preferredBGColor,
final String preferredExceptionsFormat,
final String preferredRasterFormat,
final Crs srs) {
if (layer instanceof WMSServiceLayer) {
final WMSServiceLayer wmsLayer = ((WMSServiceLayer)layer);
if (wmsLayer.getBackgroundColor() == null) {
wmsLayer.setBackgroundColor(preferredBGColor);
}
if (wmsLayer.getExceptionsFormat() == null) {
wmsLayer.setExceptionsFormat(preferredExceptionsFormat);
}
if (wmsLayer.getImageFormat() == null) {
wmsLayer.setImageFormat(preferredRasterFormat);
}
wmsLayer.setSrs(srs.getCode());
} else if (layer instanceof SlidableWMSServiceLayerGroup) {
((SlidableWMSServiceLayerGroup)layer).setSrs(srs.getCode());
} else if (layer instanceof ModeLayer) {
final ModeLayer ml = (ModeLayer)layer;
final Set<String> modes = ml.getModes();
for (final String mode : modes) {
wmsSpecificConfiguration(ml.getModeLayer(mode),
preferredBGColor,
preferredExceptionsFormat,
preferredRasterFormat,
srs);
}
}
}
/**
* DOCUMENT ME!
*
* @param crs DOCUMENT ME!
* @param layer DOCUMENT ME!
*/
public static void setLayerToCrs(final Crs crs, final Object layer) {
if (layer instanceof WMSServiceLayer) {
((WMSServiceLayer)layer).setSrs(crs.getCode());
} else if (layer instanceof SlidableWMSServiceLayerGroup) {
((SlidableWMSServiceLayerGroup)layer).setSrs(crs.getCode());
} else if (layer instanceof WebFeatureService) {
((WebFeatureService)layer).setCrs(crs);
} else if (layer instanceof ShapeFileFeatureService) {
((ShapeFileFeatureService)layer).setCrs(crs);
} else if (layer instanceof LayerCollection) {
((LayerCollection)layer).setCrs(crs);
} else if (layer instanceof ModeLayer) {
((ModeLayer)layer).setCrs(crs);
} else if (layer instanceof JDBCFeatureService) {
((JDBCFeatureService)layer).setCrs(crs);
} else {
log.error("The SRS of a layer cannot be changed. Layer is of type " + layer.getClass().getName());
}
}
/**
* DOCUMENT ME!
*
* @param layer DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static Element getElement(final Object layer) {
if (layer instanceof WMSServiceLayer) {
return ((WMSServiceLayer)layer).getElement();
} else if (layer instanceof SimpleWMS) {
return ((SimpleWMS)layer).getElement();
} else if (layer instanceof WebFeatureService) {
return ((WebFeatureService)layer).toElement();
} else if (layer instanceof DocumentFeatureService) {
return ((DocumentFeatureService)layer).toElement();
} else if (layer instanceof SimplePostgisFeatureService) {
return ((SimplePostgisFeatureService)layer).toElement();
} else if (layer instanceof LayerCollection) {
return ((LayerCollection)layer).toElement();
} else if (layer instanceof SimpleUpdateablePostgisFeatureService) {
return ((SimpleUpdateablePostgisFeatureService)layer).toElement();
} else if (layer instanceof SlidableWMSServiceLayerGroup) {
return ((SlidableWMSServiceLayerGroup)layer).toElement();
} else if (layer instanceof ModeLayer) {
return ((ModeLayer)layer).toElement();
} else if (layer instanceof ConvertableToXML) {
return ((ConvertableToXML)layer).toElement();
} else if (layer instanceof JDBCFeatureService) {
return ((JDBCFeatureService)layer).toElement();
} else if (layer instanceof ImageRasterService) {
return ((ImageRasterService)layer).getElement();
} else {
log.warn("saving configuration not supported by service: " + layer); // NOI18N
return null;
}
}
/**
* Layer neu anordnene entweder nach dem layerPosition Attribut (wenn vorhanden) oder nach der Tag-Reihenfolge in
* der XML Config.
*
* @param layersElement DOCUMENT ME!
*
* @return sortierte Liste
*/
public static Element[] orderLayers(final Element layersElement) {
final List<Element> layerElements = layersElement.getChildren();
final Element[] orderedLayerElements = new Element[layerElements.size()];
int i = 0;
for (final Element layerElement : layerElements) {
int layerPosition = -1;
final Attribute layerPositionAttr = layerElement.getAttribute("layerPosition"); // NOI18N
if (layerPositionAttr != null) {
try {
layerPosition = layerPositionAttr.getIntValue();
} catch (Exception e) {
}
}
if ((layerPosition < 0) || (layerPosition >= orderedLayerElements.length)) {
log.warn("layer position of layer #" + i + " (" + layerElement.getName()
+ ") not set or invalid, setting to " + i); // NOI18N
layerPosition = i;
}
if (orderedLayerElements[layerPosition] != null) {
log.warn("conflicting layer position " + layerPosition + ": '" + layerElement.getName() + "' vs '"
+ orderedLayerElements[layerPosition].getName() + "'"); // NOI18N
for (int j = 0; j < orderedLayerElements.length; j++) {
if (orderedLayerElements[j] == null) {
orderedLayerElements[j] = layerElement;
break;
}
}
} else {
orderedLayerElements[layerPosition] = layerElement;
}
if (DEBUG) {
if (log.isDebugEnabled()) {
log.debug(i + " layer '" + layerElement.getName() + "' set to position " + layerPosition); // NOI18N
}
}
i++;
}
return orderedLayerElements;
}
}