ingo@1774: package de.intevation.flys.exports; ingo@1774: ingo@1774: import java.io.IOException; ingo@1774: import java.io.OutputStream; ingo@1774: import java.util.ArrayList; ingo@1774: import java.util.List; ingo@1774: ingo@1774: import org.w3c.dom.Document; ingo@1774: import org.w3c.dom.Element; ingo@1774: ingo@1774: import org.apache.log4j.Logger; ingo@1774: ingo@1774: import com.vividsolutions.jts.geom.Envelope; ingo@1774: ingo@1774: import de.intevation.artifacts.Artifact; ingo@1774: import de.intevation.artifacts.CallContext; ingo@1774: ingo@1774: import de.intevation.artifacts.common.ArtifactNamespaceContext; ingo@1774: import de.intevation.artifacts.common.utils.XMLUtils; ingo@1774: import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator; ingo@1774: ingo@1774: import de.intevation.artifactdatabase.state.Facet; ingo@1774: ingo@1774: import de.intevation.flys.artifacts.FLYSArtifact; ingo@1774: import de.intevation.flys.artifacts.model.FacetTypes; ingo@1774: import de.intevation.flys.artifacts.model.WMSLayerFacet; ingo@1774: import de.intevation.flys.utils.GeometryUtils; ingo@1774: ingo@1774: ingo@1774: public class MapGenerator implements OutGenerator, FacetTypes { ingo@1774: ingo@1774: private static Logger logger = Logger.getLogger(MapGenerator.class); ingo@1774: ingo@1774: ingo@1774: protected Artifact master; ingo@1774: ingo@1774: protected Document request; ingo@1774: ingo@1774: protected OutputStream out; ingo@1774: ingo@1774: protected CallContext context; ingo@1774: ingo@1774: protected List layers; ingo@1774: ingo@1774: protected Envelope maxExtent; ingo@1774: protected Envelope initialExtent; ingo@1774: ingo@1774: protected String srid; ingo@1774: ingo@1774: ingo@1774: ingo@1774: @Override ingo@1774: public void init(Document request, OutputStream out, CallContext context) { ingo@1774: logger.debug("MapGenerator.init"); ingo@1774: ingo@1774: this.request = request; ingo@1774: this.out = out; ingo@1774: this.context = context; ingo@1774: ingo@1774: this.layers = new ArrayList(); ingo@1774: ingo@1774: this.maxExtent = null; ingo@1774: this.initialExtent = null; ingo@1774: } ingo@1774: ingo@1774: ingo@1774: @Override ingo@1774: public void setMasterArtifact(Artifact master) { ingo@1774: logger.debug("MapGenerator.setMasterArtifact"); ingo@1774: this.master = master; ingo@1774: } ingo@1774: ingo@1774: ingo@1774: @Override ingo@1774: public void doOut( ingo@1774: Artifact artifact, ingo@1774: Facet facet, ingo@1774: Document attr, ingo@1774: boolean visible) ingo@1774: { ingo@1774: String name = facet.getName(); ingo@1774: ingo@1774: logger.debug("MapGenerator.doOut: " +artifact.identifier()+" | "+name); ingo@1774: FLYSArtifact flys = (FLYSArtifact) artifact; ingo@1774: ingo@1774: Facet nativeFacet = flys.getNativeFacet(facet); ingo@1774: ingo@1774: if (nativeFacet instanceof WMSLayerFacet) { ingo@1774: WMSLayerFacet wms = (WMSLayerFacet) nativeFacet; ingo@1774: Envelope extent = wms.getExtent(); ingo@1774: ingo@1774: layers.add(wms); ingo@1774: ingo@1774: setMaxExtent(extent); ingo@1774: setSrid(wms.getSrid()); ingo@1774: ingo@1774: if (FLOODMAP_WSPLGEN.equals(name) && initialExtent == null) { ingo@1774: setInitialExtent(extent); ingo@1774: } ingo@1774: } ingo@1774: else { ingo@1774: logger.warn("Facet not supported: " + nativeFacet.getClass()); ingo@1774: } ingo@1774: ingo@1774: } ingo@1774: ingo@1774: ingo@1774: @Override ingo@1774: public void generate() ingo@1774: throws IOException ingo@1774: { ingo@1774: logger.debug("MapGenerator.generate"); ingo@1774: ingo@1774: Document response = XMLUtils.newDocument(); ingo@1774: ElementCreator c = new ElementCreator( ingo@1774: response, ingo@1774: ArtifactNamespaceContext.NAMESPACE_URI, ingo@1774: ArtifactNamespaceContext.NAMESPACE_PREFIX); ingo@1774: ingo@1774: Element root = c.create("floodmap"); ingo@1774: Element layers = c.create("layers"); ingo@1774: ingo@1774: response.appendChild(root); ingo@1774: root.appendChild(layers); ingo@1774: ingo@1774: appendLayers(layers); ingo@1774: appendMapInformation(root, c); ingo@1774: ingo@1774: XMLUtils.toStream(response, out); ingo@1774: } ingo@1774: ingo@1774: ingo@1774: protected void appendLayers(Element parent) { ingo@1774: for (WMSLayerFacet facet: layers) { ingo@1774: parent.appendChild(facet.toXML(parent.getOwnerDocument())); ingo@1774: } ingo@1774: } ingo@1774: ingo@1774: ingo@1774: protected void setMaxExtent(Envelope maxExtent) { ingo@1774: if (maxExtent == null) { ingo@1774: return; ingo@1774: } ingo@1774: ingo@1774: if (this.maxExtent == null) { ingo@1774: logger.debug("Set max extent to: " + maxExtent); ingo@1774: this.maxExtent = maxExtent; ingo@1774: return; ingo@1774: } ingo@1774: ingo@1774: logger.debug("Expand max extent by: " + maxExtent); ingo@1774: logger.debug("Max extent before expanding: " + this.maxExtent); ingo@1774: this.maxExtent.expandToInclude(maxExtent); ingo@1774: logger.debug("Max extent after expanding: " + this.maxExtent); ingo@1774: } ingo@1774: ingo@1774: ingo@1774: protected void setInitialExtent(Envelope initialExtent) { ingo@1774: if (initialExtent == null) { ingo@1774: return; ingo@1774: } ingo@1774: ingo@1774: if (this.initialExtent == null) { ingo@1774: logger.debug("Set initial extent to: " + initialExtent); ingo@1774: this.initialExtent = initialExtent; ingo@1774: return; ingo@1774: } ingo@1774: ingo@1774: logger.debug("Set initial extent to: " + initialExtent); ingo@1774: this.initialExtent = initialExtent; ingo@1774: } ingo@1774: ingo@1774: ingo@1774: protected void setSrid(String srid) { ingo@1774: if (srid == null || srid.length() == 0) { ingo@1774: return; ingo@1774: } ingo@1774: ingo@1774: this.srid = srid; ingo@1774: } ingo@1774: ingo@1774: ingo@1774: protected void appendMapInformation(Element parent, ElementCreator c) { ingo@1774: String mE = GeometryUtils.jtsBoundsToOLBounds(this.maxExtent); ingo@1774: logger.debug("BUILD MAX EXTENT OF:" + this.maxExtent); ingo@1774: logger.debug("BUILD MAX EXTENT:" + mE); ingo@1774: ingo@1774: Element maxExtent = c.create("maxExtent"); ingo@1774: maxExtent.setTextContent(mE); ingo@1774: ingo@1774: String iE = GeometryUtils.jtsBoundsToOLBounds(this.initialExtent); ingo@1774: logger.debug("BUILD INITIAL EXTENT OF: " + this.initialExtent); ingo@1774: logger.debug("BUILD INITIAL EXTENT: " + iE); ingo@1774: Element initExtent = c.create("initialExtent"); ingo@1774: initExtent.setTextContent(iE); ingo@1774: ingo@1774: Element srid = c.create("srid"); ingo@1774: srid.setTextContent(this.srid); ingo@1774: ingo@1774: // TODO zoom levels ingo@1774: // TODO resolutation ingo@1774: ingo@1774: parent.appendChild(maxExtent); ingo@1774: parent.appendChild(initExtent); ingo@1774: parent.appendChild(srid); ingo@1774: } ingo@1774: } ingo@1774: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :