# HG changeset patch # User Ingo Weinzierl # Date 1321992286 0 # Node ID fde3db5e68e8d965163cc60434b8289cb20f3a93 # Parent 01f2473e362d755b3b184f79e0c9e86f4db1bf99 Added a new Artifact to enable users to add external WMS layers to floodmaps. flys-artifacts/trunk@3302 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 01f2473e362d -r fde3db5e68e8 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Tue Nov 22 14:00:55 2011 +0000 +++ b/flys-artifacts/ChangeLog Tue Nov 22 20:04:46 2011 +0000 @@ -1,3 +1,21 @@ +2011-11-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/ExternalWMSArtifact.java: New. + This Artifact is used to allow users adding external WMS layers to their + floodmaps. An ExternalWMSArtifact stores an URL of a WMS, the name and the + title of the WMS layer. The internal State extends WMSBackgroundState. + + * doc/conf/conf.xml: Registered the ExternalWMSArtifact. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added a + new type "floodmap.externalwms" which is used by the ExternalWMSArtifact. + + * doc/conf/artifacts/winfo.xml: Allowed the "floodmap.externalwms" facet for + floodmaps. + + * src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java: + Some refactoring to allow easier subclassing. + 2011-11-22 Felix Wolfsteller Fixed flys/411. diff -r 01f2473e362d -r fde3db5e68e8 flys-artifacts/doc/conf/artifacts/winfo.xml --- a/flys-artifacts/doc/conf/artifacts/winfo.xml Tue Nov 22 14:00:55 2011 +0000 +++ b/flys-artifacts/doc/conf/artifacts/winfo.xml Tue Nov 22 20:04:46 2011 +0000 @@ -386,6 +386,7 @@ + diff -r 01f2473e362d -r fde3db5e68e8 flys-artifacts/doc/conf/conf.xml --- a/flys-artifacts/doc/conf/conf.xml Tue Nov 22 14:00:55 2011 +0000 +++ b/flys-artifacts/doc/conf/conf.xml Tue Nov 22 20:04:46 2011 +0000 @@ -44,6 +44,9 @@ de.intevation.artifactdatabase.DefaultArtifactFactory + de.intevation.artifactdatabase.DefaultArtifactFactory de.intevation.artifactdatabase.DefaultArtifactFactory diff -r 01f2473e362d -r fde3db5e68e8 flys-artifacts/src/main/java/de/intevation/flys/artifacts/ExternalWMSArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/ExternalWMSArtifact.java Tue Nov 22 20:04:46 2011 +0000 @@ -0,0 +1,172 @@ +package de.intevation.flys.artifacts; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallMeta; + +import de.intevation.artifacts.common.ArtifactNamespaceContext; +import de.intevation.artifacts.common.utils.XMLUtils; + +import de.intevation.artifactdatabase.data.DefaultStateData; +import de.intevation.artifactdatabase.state.DefaultOutput; +import de.intevation.artifactdatabase.state.Facet; +import de.intevation.artifactdatabase.state.State; + +import de.intevation.flys.artifacts.states.WMSBackgroundState; + + +public class ExternalWMSArtifact extends StaticFLYSArtifact { + + public static final String XPATH_IDS = "/art:action/art:ids/@value"; + + public static final String NAME = "external_wms"; + + private static final Logger logger = + Logger.getLogger(ExternalWMSArtifact.class); + + + @Override + public String getName() { + return NAME; + } + + + @Override + public void setup( + String identifier, + ArtifactFactory factory, + Object context, + CallMeta callMeta, + Document data) + { + logger.info("ExternalWMSArtifact.setup"); + + super.setup(identifier, factory, context, callMeta, data); + + String ids = XMLUtils.xpathString( + data, XPATH_IDS, ArtifactNamespaceContext.INSTANCE); + + if (ids != null && ids.length() > 0) { + addData("ids", new DefaultStateData("ids", null, null, ids)); + } + else { + throw new IllegalArgumentException("No attribute 'ids' found!"); + } + + List fs = new ArrayList(); + + WMSBackgroundState s = (WMSBackgroundState) getCurrentState(context); + s.computeInit(this, hash(), context, callMeta, fs); + + if (!fs.isEmpty()) { + facets.put(getCurrentStateId(), fs); + } + } + + + @Override + protected void initialize( + Artifact artifact, + Object context, + CallMeta callMeta) + { + // do nothing + } + + + @Override + public State getCurrentState(Object cc) { + State s = new ExternalWMSState(this); + + List fs = facets.get(getCurrentStateId()); + + DefaultOutput o = new DefaultOutput( + "floodmap", + "floodmap", + "image/png", + fs, + "map"); + + s.getOutputs().add(o); + + return s; + } + + + /** + * Get a list containing the one and only State. + * @param context ignored. + * @return list with one and only state. + */ + @Override + protected List getStates(Object context) { + ArrayList states = new ArrayList(); + states.add(getCurrentState(context)); + + return states; + } + + + public static class ExternalWMSState extends WMSBackgroundState { + + protected ExternalWMSArtifact artifact; + + protected String ids; + + + public ExternalWMSState(ExternalWMSArtifact artifact) { + super(); + this.artifact = artifact; + } + + protected String getIds() { + if (ids == null || ids.length() == 0) { + ids = artifact.getDataAsString("ids"); + } + + return ids; + } + + @Override + protected String getFacetType() { + return FLOODMAP_EXTERNAL_WMS; + } + + @Override + protected String getSrid() { + return ""; + } + + @Override + protected String getUrl() { + String ids = getIds(); + String[] parts = ids.split(";"); + + return parts[0]; + } + + @Override + protected String getLayer() { + String ids = getIds(); + String[] parts = ids.split(";"); + + return parts[1]; + } + + @Override + protected String getTitle(CallMeta meta) { + String ids = getIds(); + String[] parts = ids.split(";"); + + return parts[2]; + } + } // end of class ExternalWMSState +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 01f2473e362d -r fde3db5e68e8 flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java Tue Nov 22 14:00:55 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java Tue Nov 22 20:04:46 2011 +0000 @@ -26,6 +26,7 @@ String FLOODMAP_LINES = "floodmap.lines"; String FLOODMAP_BUILDINGS = "floodmap.buildings"; String FLOODMAP_FIXPOINTS = "floodmap.fixpoints"; + String FLOODMAP_EXTERNAL_WMS = "floodmap.externalwms"; String DISCHARGE_LONGITUDINAL_W = "discharge_longitudinal_section.w"; String DISCHARGE_LONGITUDINAL_Q = "discharge_longitudinal_section.q"; diff -r 01f2473e362d -r fde3db5e68e8 flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java Tue Nov 22 14:00:55 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java Tue Nov 22 20:04:46 2011 +0000 @@ -42,6 +42,10 @@ protected String layer; protected String srid; + protected Document cfg; + + protected Map variables; + private static final Logger logger = Logger.getLogger(WMSBackgroundState.class); @@ -64,34 +68,14 @@ ) { logger.debug("WMSBackgroundState.computeInit()"); - if (url == null || layer == null) { - Document cfg = Config.getConfig(); - - String river = artifact.getDataAsString("river"); - - Map variables = new HashMap(); - variables.put("name", river); + initVariables(artifact); - srid = (String) XMLUtils.xpath( - cfg, - XPATH_SRID, - XPathConstants.STRING, - null, - variables); - - url = (String) XMLUtils.xpath( - cfg, - XPATH_WMS_URL, - XPathConstants.STRING, - null, - variables); - - layer = (String) XMLUtils.xpath( - cfg, - XPATH_WMS_LAYER, - XPathConstants.STRING, - null, - variables); + if (url == null || layer == null) { + // XXX I don't remember why 'srid', 'url' and 'layer' are member + // variables. I think the reason was buffering those values. + srid = getSrid(); + url = getUrl(); + layer = getLayer(); } if (url == null || layer == null) { @@ -103,8 +87,8 @@ WMSLayerFacet facet = new WMSLayerFacet( 0, - FLOODMAP_WMSBACKGROUND, - Resources.getMsg(meta, I18N_DESCRIPTION, I18N_DESCRIPTION), + getFacetType(), + getTitle(meta), ComputeType.INIT, getID(), hash, url); @@ -116,5 +100,62 @@ return null; } + + + protected Document getConfig() { + if (cfg == null) { + cfg = Config.getConfig(); + } + + return cfg; + } + + + protected void initVariables(FLYSArtifact artifact) { + String river = artifact.getDataAsString("river"); + + variables = new HashMap(); + variables.put("name", river); + } + + + protected String getFacetType() { + return FLOODMAP_WMSBACKGROUND; + } + + + protected String getSrid() { + return (String) XMLUtils.xpath( + getConfig(), + XPATH_SRID, + XPathConstants.STRING, + null, + variables); + } + + + protected String getUrl() { + return (String) XMLUtils.xpath( + getConfig(), + XPATH_WMS_URL, + XPathConstants.STRING, + null, + variables); + } + + + protected String getLayer() { + return (String) XMLUtils.xpath( + getConfig(), + XPATH_WMS_LAYER, + XPathConstants.STRING, + null, + variables); + } + + + protected String getTitle(CallMeta meta) { + return Resources.getMsg(meta, I18N_DESCRIPTION, I18N_DESCRIPTION); + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :