raimund@2082: package de.intevation.flys.artifacts;
raimund@2082: 
raimund@2082: import org.apache.log4j.Logger;
raimund@2082: 
raimund@2082: import java.util.List;
raimund@2082: 
raimund@2082: import org.w3c.dom.Document;
raimund@2089: import org.w3c.dom.Element;
raimund@2082: 
raimund@2082: import de.intevation.artifacts.ArtifactFactory;
raimund@2082: import de.intevation.artifacts.CallMeta;
raimund@2082: import de.intevation.artifacts.CallContext;
raimund@2082: 
raimund@2089: import de.intevation.artifacts.common.utils.XMLUtils;
raimund@2089: import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
raimund@2089: import de.intevation.artifacts.common.ArtifactNamespaceContext;
raimund@2089: 
raimund@2089: import de.intevation.artifactdatabase.ProtocolUtils;
raimund@2082: import de.intevation.artifactdatabase.state.Facet;
raimund@2082: import de.intevation.artifactdatabase.state.State;
raimund@2089: import de.intevation.artifactdatabase.state.StateEngine;
raimund@2089: import de.intevation.artifactdatabase.state.Output;
raimund@2082: 
raimund@2082: import de.intevation.flys.model.River;
raimund@2089: import de.intevation.flys.utils.FLYSUtils;
raimund@2082: 
raimund@2089: import de.intevation.flys.artifacts.RiverAxisArtifact.RiverAxisState;
raimund@2089: import de.intevation.flys.artifacts.states.DefaultState;
raimund@2089: import de.intevation.flys.artifacts.context.FLYSContext;
ingo@3302: import de.intevation.flys.artifacts.model.map.WMSDBLayerFacet;
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:         FLYSContext flysContext = FLYSUtils.getFlysContext(context);
raimund@2082: 
raimund@2089:         List<State> 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<String> stateIds = getPreviousStateIds();
raimund@2089: 
raimund@2089:         XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
raimund@2089:             doc,
raimund@2089:             ArtifactNamespaceContext.NAMESPACE_URI,
raimund@2089:             ArtifactNamespaceContext.NAMESPACE_PREFIX);
raimund@2089: 
raimund@2089:         FLYSContext flysContext = FLYSUtils.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<Output> 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: 
raimund@2089:             List<Facet> fs = facets.get(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<Output> 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<Output> 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: 
raimund@2089:                     List<Facet> fs = facets.get(cur.getID());
raimund@2089: 
raimund@2089:                     if (fs != null && fs.size() > 0) {
raimund@2089:                         List<Output> 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<Facet>  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: 
raimund@2082:             String name = type + "-" + artifact.identifier();
raimund@2082: 
raimund@2082:             facet.addLayer(name);
raimund@2082:             facet.setExtent(getExtent());
raimund@2082:             facet.setSrid(getSrid());
raimund@2082:             facet.setData(getDataString());
raimund@2082:             facet.setFilter(getFilter());
raimund@2082:             facet.setGeometryType(getGeometryType());
raimund@2082:             facet.setConnection(getConnection());
raimund@2082:             facet.setConnectionType(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() {
raimund@2082:             River r = FLYSUtils.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 :