teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5863: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5863: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts; raimund@2082: teichmann@5831: import org.dive4elements.artifactdatabase.ProtocolUtils; teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet; teichmann@5831: import org.dive4elements.artifactdatabase.state.Output; teichmann@5831: import org.dive4elements.artifactdatabase.state.State; teichmann@5831: import org.dive4elements.artifactdatabase.state.StateEngine; teichmann@5831: import org.dive4elements.artifacts.ArtifactFactory; teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.artifacts.CallMeta; teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; teichmann@5831: import org.dive4elements.river.artifacts.RiverAxisArtifact.RiverAxisState; teichmann@5831: import org.dive4elements.river.artifacts.context.FLYSContext; teichmann@5831: import org.dive4elements.river.artifacts.model.map.WMSDBLayerFacet; teichmann@5831: import org.dive4elements.river.artifacts.states.DefaultState; teichmann@5831: import org.dive4elements.river.model.River; teichmann@5865: import org.dive4elements.river.utils.RiverUtils; teichmann@5831: import org.dive4elements.river.utils.MapUtils; raimund@2082: christian@4864: import java.util.List; christian@4864: christian@4864: import org.apache.log4j.Logger; christian@4864: import org.w3c.dom.Document; christian@4864: import org.w3c.dom.Element; raimund@2082: raimund@2082: raimund@2089: public class MapArtifact extends FLYSArtifact { raimund@2082: raimund@2082: private static final Logger logger = raimund@2082: Logger.getLogger(MapArtifact.class); raimund@2082: raimund@2082: @Override raimund@2082: public void setup( raimund@2082: String identifier, raimund@2082: ArtifactFactory factory, raimund@2082: Object context, raimund@2082: CallMeta callmeta, raimund@2082: Document data) raimund@2082: { raimund@2082: logger.debug("MapArtifact.setup"); raimund@2082: this.identifier = identifier; raimund@2109: name = "new_map"; raimund@2082: raimund@2089: List states = getStates(context); raimund@2082: raimund@2089: setCurrentState(states.get(0)); raimund@2082: } raimund@2082: raimund@2082: raimund@2082: @Override sascha@3193: protected void appendBackgroundActivity( raimund@2089: ElementCreator cr, raimund@2089: Element root, raimund@2089: CallContext context raimund@2089: ) { raimund@2089: Element inBackground = cr.create("background-processing"); raimund@2089: root.appendChild(inBackground); raimund@2089: raimund@2089: cr.addAttr( raimund@2089: inBackground, raimund@2089: "value", raimund@2089: String.valueOf(context.isInBackground()), raimund@2089: true); raimund@2089: } raimund@2089: raimund@2089: raimund@2089: /** raimund@2089: * Append output mode nodes to a document. raimund@2089: */ sascha@3193: @Override raimund@2089: protected void appendOutputModes( raimund@2089: Document doc, raimund@2089: Element outs, raimund@2089: CallContext context, raimund@2089: String uuid) raimund@2089: { raimund@2089: List stateIds = getPreviousStateIds(); raimund@2089: teichmann@5865: FLYSContext flysContext = RiverUtils.getFlysContext(context); raimund@2089: StateEngine engine = (StateEngine) flysContext.get( raimund@2089: FLYSContext.STATE_ENGINE_KEY); raimund@2089: raimund@2089: for (String stateId: stateIds) { raimund@2089: logger.debug("Append output modes for state: " + stateId); raimund@2089: DefaultState state = (DefaultState) engine.getState(stateId); raimund@2089: raimund@2089: List list = state.getOutputs(); sascha@3555: if (list == null || list.isEmpty()) { raimund@2089: logger.debug("-> No output modes for this state."); raimund@2089: continue; raimund@2089: } raimund@2089: bjoern@4497: List fs = getFacets(stateId); raimund@2089: sascha@3555: if (fs == null || fs.isEmpty()) { raimund@2089: logger.debug("No facets for previous state found."); raimund@2089: continue; raimund@2089: } raimund@2089: raimund@2089: logger.debug("Found " + fs.size() + " facets in previous states."); raimund@2089: raimund@2089: List generated = generateOutputs(list, fs); raimund@2089: raimund@2089: ProtocolUtils.appendOutputModes(doc, outs, generated); raimund@2089: } raimund@2089: raimund@2089: try { raimund@2089: DefaultState cur = (DefaultState) getCurrentState(context); raimund@2089: if (cur.validate(this)) { raimund@2089: List list = cur.getOutputs(); raimund@2089: if (list != null && list.size() > 0) { raimund@2089: logger.debug( raimund@2089: "Append output modes for current state: " + cur.getID()); raimund@2089: bjoern@4497: List fs = getFacets(cur.getID()); raimund@2089: raimund@2089: if (fs != null && fs.size() > 0) { raimund@2089: List generated = generateOutputs(list, fs); raimund@2089: raimund@2089: logger.debug("Found " + fs.size() + " current facets."); raimund@2089: if (!generated.isEmpty()) { raimund@2089: ProtocolUtils.appendOutputModes( raimund@2089: doc, outs, generated); raimund@2089: } raimund@2089: } raimund@2089: else { raimund@2089: logger.debug("No facets found for the current state."); raimund@2089: } raimund@2089: } raimund@2089: } raimund@2089: } raimund@2089: catch (IllegalArgumentException iae) { raimund@2089: // state is not valid, so we do not append its outputs. raimund@2089: } raimund@2089: } raimund@2089: raimund@2082: public static class MapState extends RiverAxisState { raimund@2082: raimund@2082: @Override raimund@2089: public Object computeAdvance( raimund@2082: FLYSArtifact artifact, raimund@2082: String hash, raimund@2082: CallContext context, raimund@2082: List facets, raimund@2082: Object old) raimund@2082: { raimund@2089: logger.debug("MapState.computeAdvance"); raimund@2089: raimund@2089: this.artifact = artifact; raimund@2082: raimund@2082: String type = getFacetType(); raimund@2082: raimund@2082: WMSDBLayerFacet facet = new WMSDBLayerFacet( raimund@2082: 0, raimund@2082: type, raimund@2082: getTitle(context.getMeta()), raimund@2089: ComputeType.ADVANCE, raimund@2082: getID(), hash, raimund@2082: getUrl()); raimund@2082: rrenkert@5272: String name = artifact.getDataAsString("river"); christian@4864: raimund@2082: facet.addLayer(name); ingo@3918: facet.setExtent(getExtent(false)); ingo@3918: facet.setOriginalExtent(getExtent(true)); raimund@2082: facet.setSrid(getSrid()); raimund@2082: facet.setData(getDataString()); raimund@2082: facet.setFilter(getFilter()); raimund@2082: facet.setGeometryType(getGeometryType()); rrenkert@4841: facet.setConnection(MapUtils.getConnection()); rrenkert@4841: facet.setConnectionType(MapUtils.getConnectionType()); raimund@2082: facet.setLabelItem(getLabelItem()); raimund@2082: raimund@2082: facets.add(facet); raimund@2082: raimund@2082: return null; raimund@2082: } raimund@2082: raimund@2082: @Override raimund@2082: public int getRiverId() { teichmann@5865: River r = RiverUtils.getRiver(artifact); raimund@2082: int riverId = r.getId(); raimund@2082: raimund@2082: return riverId; raimund@2082: } raimund@2082: } raimund@2082: } sascha@3083: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :