ingo@570: package de.intevation.gnv.action; ingo@570: sascha@683: import de.intevation.gnv.action.sessionmodel.DiagrammOptions; sascha@683: import de.intevation.gnv.action.sessionmodel.SessionModel; sascha@683: import de.intevation.gnv.action.sessionmodel.SessionModelFactory; sascha@683: sascha@683: import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; sascha@683: import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; sascha@683: sascha@683: import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; sascha@683: import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter; sascha@683: import de.intevation.gnv.artifactdatabase.objects.InputParameter; sascha@683: import de.intevation.gnv.artifactdatabase.objects.OutputMode; sascha@683: import de.intevation.gnv.artifactdatabase.objects.OutputParameter; sascha@683: sascha@683: import de.intevation.gnv.util.XMLUtils; sascha@683: ingo@680: import java.text.DateFormat; sascha@683: 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; sascha@683: ingo@570: import org.apache.struts.action.ActionForm; ingo@570: import org.apache.struts.action.ActionForward; ingo@570: import org.apache.struts.action.ActionMapping; ingo@585: sascha@683: import org.w3c.dom.Document; 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: ingo@668: public static final String XPATH_LAYER_TITLE = ingo@668: "/art:meta/art:layer/art:title/text()"; ingo@668: ingo@970: public static final String XPATH_LAYER_NAME = ingo@970: "/art:meta/art:layer/art:name/text()"; ingo@970: ingo@970: public static final String XPATH_TTL = ingo@970: "/art:meta/art:mapserver/art:ttl/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@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); 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@668: String layer = XMLUtils.getStringXPath( ingo@970: meta, XPATH_LAYER_NAME); ingo@680: String tmpTTL = XMLUtils.getStringXPath( ingo@970: meta, XPATH_TTL); ingo@668: layer = layer != null ? layer : artifact.getId(); ingo@585: 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@970: logger.debug("Layer: " + layer); ingo@680: logger.debug("Layer ttl: " + ttl); ingo@668: } ingo@668: ingo@668: request.setAttribute("wms", true); ingo@585: request.setAttribute("mapserver", mapserverPath); ingo@585: request.setAttribute("mapfile", mapfilePath); ingo@668: request.setAttribute("layer", layer); ingo@680: request.setAttribute("ttl", ttl); sascha@681: if (mapserverPath != null && tim@676: mapfilePath != null && tim@676: layer != null){ tim@677: request.setAttribute("wms_published", Boolean.TRUE); 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 :