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 :