ingo@1022: /* ingo@1022: * Copyright (c) 2010 by Intevation GmbH ingo@1022: * ingo@1022: * This program is free software under the LGPL (>=v2.1) ingo@1022: * Read the file LGPL.txt coming with the software for details ingo@1022: * or visit http://www.gnu.org/licenses/ if it does not exist. ingo@1022: */ ingo@1022: ingo@570: package de.intevation.gnv.action; ingo@570: ingo@680: import java.text.DateFormat; ingo@668: import java.util.ArrayList; ingo@668: import java.util.Collection; ingo@680: import java.util.Date; ingo@668: import java.util.Iterator; ingo@668: ingo@570: import javax.servlet.http.HttpServletRequest; ingo@570: import javax.servlet.http.HttpServletResponse; ingo@570: ingo@570: import org.apache.log4j.Logger; ingo@570: import org.apache.struts.action.ActionForm; ingo@570: import org.apache.struts.action.ActionForward; ingo@570: import org.apache.struts.action.ActionMapping; tim@976: import org.w3c.dom.Document; tim@976: import org.w3c.dom.Node; tim@976: import org.w3c.dom.NodeList; ingo@585: tim@976: import de.intevation.gnv.action.sessionmodel.DiagrammOptions; tim@976: import de.intevation.gnv.action.sessionmodel.SessionModel; tim@976: import de.intevation.gnv.action.sessionmodel.SessionModelFactory; tim@976: import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; tim@976: import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; tim@976: import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; tim@976: import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter; tim@976: import de.intevation.gnv.artifactdatabase.objects.InputParameter; tim@976: import de.intevation.gnv.artifactdatabase.objects.OutputMode; tim@976: import de.intevation.gnv.artifactdatabase.objects.OutputParameter; tim@976: import de.intevation.gnv.artifactdatabase.objects.map.DefaultLayer; tim@976: import de.intevation.gnv.artifactdatabase.objects.map.DefaultMapService; tim@976: import de.intevation.gnv.artifactdatabase.objects.map.Layer; tim@976: import de.intevation.gnv.artifactdatabase.objects.map.MapService; tim@976: import de.intevation.gnv.util.XMLUtils; ingo@570: ingo@570: /** ingo@690: * This controller is used to publish the results of the current artifact as ingo@690: * WMS. The wms export mode of the artifact server is triggered which feeds a ingo@690: * MapServer with the given shapefiles (path to the shapefiles is stored in the ingo@690: * artifact). After calling this controller, the shapefiles are ready to be ingo@690: * queried as WMS layers. ingo@690: * sascha@684: * @author Ingo Weinzierl ingo@570: */ ingo@570: public class WMSAction extends DescribeUIAction { ingo@585: ingo@585: public static final String XPATH_MAPSERVER_PATH = ingo@585: "/art:meta/art:mapserver/art:server/text()"; ingo@585: ingo@585: public static final String XPATH_MAPSERVER_MAPFILE = ingo@585: "/art:meta/art:mapserver/art:map/text()"; ingo@585: tim@976: public static final String XPATH_LAYERNODESET = tim@976: "/art:meta/art:layer"; tim@976: ingo@668: public static final String XPATH_LAYER_TITLE = tim@976: "art:title/text()"; ingo@668: ingo@970: public static final String XPATH_LAYER_NAME = tim@976: "art:name/text()"; ingo@970: ingo@970: public static final String XPATH_TTL = ingo@970: "/art:meta/art:mapserver/art:ttl/text()"; tim@984: tim@984: public static final String XPATH_BBOX = tim@984: "/art:meta/art:mapserver/art:Box/art:coordinates/text()"; ingo@680: ingo@570: /** ingo@570: * the logger, used to log exceptions and additonaly information ingo@570: */ ingo@570: private static Logger logger = Logger.getLogger(WMSAction.class); ingo@570: ingo@570: /** ingo@570: * Constructor ingo@570: */ ingo@570: public WMSAction() { ingo@570: super(); ingo@570: } ingo@570: ingo@570: @Override ingo@570: public ActionForward execute(ActionMapping mapping, ActionForm form, ingo@570: HttpServletRequest request, ingo@570: HttpServletResponse response) throws Exception { ingo@991: if (isSessionExhausted(request)) { ingo@991: return sessionExhaustedForward(mapping, form, request, response); ingo@991: } ingo@991: ingo@570: logger.debug("WMSAction.execute"); ingo@570: try { ingo@570: SessionModel sm = SessionModelFactory.getInstance().getSessionModel( ingo@570: request); ingo@668: ingo@668: OutputMode outputMode = sm.getOutputMode("wms"); ingo@668: Collection ips = null; ingo@668: if (outputMode != null) { ingo@668: Collection inputParameter = ingo@668: outputMode.getOutputParameters(); ingo@668: ingo@668: if (inputParameter != null) { ingo@668: ips = new ArrayList(inputParameter.size()); ingo@668: Iterator it = inputParameter.iterator(); ingo@668: DiagrammOptions diagrammOptions = new DiagrammOptions(); ingo@668: ingo@668: int params = 0; ingo@668: while (it.hasNext()) { ingo@668: String name = it.next().getName(); ingo@668: String[] values = request.getParameterValues(name); ingo@668: String value = request.getParameter(name); ingo@668: InputParameter ip = new DefaultInputParameter(name, ingo@705: encode(values)); ingo@668: ips.add(ip); ingo@668: ingo@668: if (value != null) { ingo@668: ++params; ingo@705: diagrammOptions.setValue(name, encode(value)); ingo@668: } ingo@668: } ingo@668: ingo@668: if (params > 0) { ingo@668: sm.setDiagrammOptions(diagrammOptions); ingo@668: } ingo@668: } ingo@668: } ingo@668: ingo@570: ArtifactObject artifact = sm.getCurrentArtifact(); ingo@570: ingo@570: ArtifactDatabaseClientFactory factory = ingo@570: ArtifactDatabaseClientFactory.getInstance(); ingo@570: ArtifactDatabaseClient adc = factory.getArtifactDatabaseClient( ingo@570: getLocale(request)); ingo@570: ArtifactObject artifactfactory = sm.getSelectedArtifactFactory(); ingo@570: ingo@570: // do wms publishing ingo@668: Document meta = adc.publishWMS(artifactfactory,artifact,ips); tim@976: tim@976: // read the Server-information ingo@585: String mapserverPath = XMLUtils.getStringXPath( ingo@585: meta, XPATH_MAPSERVER_PATH); ingo@585: String mapfilePath = XMLUtils.getStringXPath( ingo@585: meta, XPATH_MAPSERVER_MAPFILE); ingo@680: String tmpTTL = XMLUtils.getStringXPath( tim@976: meta, XPATH_TTL); tim@984: tim@984: String bbox = XMLUtils.getStringXPath(meta, XPATH_BBOX); ingo@680: String ttl = null; ingo@680: if (tmpTTL != null) { ingo@680: DateFormat df = DateFormat.getDateTimeInstance( ingo@680: DateFormat.LONG, ingo@680: DateFormat.LONG, ingo@680: request.getLocale()); sascha@681: ingo@680: try { ingo@680: long tmp = Long.parseLong(tmpTTL); ingo@680: ttl = df.format(new Date(tmp)); ingo@680: } ingo@680: catch (NumberFormatException nfe) { ingo@680: logger.error("Error while parsing time to live."); ingo@680: logger.error(nfe,nfe); ingo@680: ingo@680: ttl = ""; ingo@680: } ingo@680: } ingo@680: ingo@668: if (logger.isDebugEnabled()) { ingo@668: logger.debug("Mapserver path: " + mapserverPath); ingo@668: logger.debug("Mapfile path: " + mapfilePath); ingo@680: logger.debug("Layer ttl: " + ttl); ingo@668: } tim@976: // read the layer information tim@976: tim@976: NodeList layerNodes = XMLUtils.getNodeSetXPath(meta, tim@976: XPATH_LAYERNODESET); tim@976: Collection layers = null; tim@976: if (layerNodes != null && layerNodes.getLength() > 0){ tim@976: layers = new ArrayList(layerNodes.getLength()); tim@976: for (int i = 0 ; i < layerNodes.getLength(); i++){ tim@976: Node tmpLayerNode = layerNodes.item(i); tim@976: String layerName = XMLUtils.getStringXPath( tim@976: tmpLayerNode, XPATH_LAYER_NAME); tim@976: String layerTitle = XMLUtils.getStringXPath( tim@976: tmpLayerNode, XPATH_LAYER_TITLE); tim@976: // TODO: write layerTitle to title and not to id tim@976: Layer currentLayer = new DefaultLayer(layerTitle, layerName, tim@976: false, null); tim@976: layers.add(currentLayer); tim@976: } tim@976: } tim@976: ingo@668: tim@976: tim@976: tim@976: // TODO PUT MAPFILEPATH AND TTL to MapServiceObject tim@976: sascha@681: if (mapserverPath != null && tim@976: mapfilePath != null) { tim@677: request.setAttribute("wms_published", Boolean.TRUE); tim@976: tim@976: MapService mapService = new DefaultMapService("0815", layers, tim@984: "UMN", mapserverPath, tim@994: bbox,ttl); tim@976: sm.setLocalMapService(mapService); tim@676: return super.execute(mapping, form, request, response); tim@676: }else{ ingo@970: return super.execute(mapping, form, request, response); tim@676: } ingo@570: } ingo@570: catch (Exception e) { ingo@570: logger.error(e, e); ingo@570: request.setAttribute( ingo@570: CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, ingo@570: e.getMessage()); ingo@570: ingo@570: return super.getExceptionForward(mapping); ingo@570: } ingo@570: } ingo@570: } ingo@570: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :