raimund@3614: package de.intevation.flys.artifacts;
raimund@3614: 
raimund@3614: import java.util.ArrayList;
raimund@3614: import java.util.List;
raimund@3614: 
raimund@3614: import org.apache.log4j.Logger;
raimund@3614: import org.w3c.dom.Document;
raimund@3614: 
raimund@3614: import de.intevation.artifactdatabase.state.Facet;
raimund@3614: import de.intevation.artifactdatabase.state.FacetActivity;
raimund@3614: import de.intevation.artifactdatabase.state.State;
raimund@3614: import de.intevation.artifacts.ArtifactFactory;
raimund@3614: import de.intevation.artifacts.CallMeta;
raimund@3614: import de.intevation.artifacts.common.utils.XMLUtils;
raimund@3614: import de.intevation.flys.artifacts.model.minfo.BedHeight;
raimund@3614: import de.intevation.flys.artifacts.model.minfo.BedHeightFacet;
raimund@3614: import de.intevation.flys.artifacts.model.minfo.BedHeightFactory;
raimund@3614: import de.intevation.flys.artifacts.states.StaticState;
raimund@3614: 
raimund@3614: public class BedHeightsArtifact
raimund@3614: extends      StaticFLYSArtifact
raimund@3614: {
raimund@3614:     /** The logger for this class. */
raimund@3614:     private static Logger logger =
raimund@3614:         Logger.getLogger(BedHeightsArtifact.class);
raimund@3614: 
raimund@3614:     private static final String NAME = "bedheights";
raimund@3614: 
raimund@3614:     static {
raimund@3614:         // TODO: Move to configuration.
raimund@3614:         FacetActivity.Registry.getInstance()
raimund@3614:             .register(NAME, FacetActivity.INACTIVE);
raimund@3614:     }
raimund@3614: 
raimund@3614:     public static final String STATIC_STATE_NAME =
raimund@3614:         "state.additional_bedheights.static";
raimund@3614: 
raimund@3614:     /** Data Item name to know whether we are Heighmarks and reveive
raimund@3614:      * some data slightly different. */
raimund@3614:     public static final String DATA_HEIGHT_TYPE =
raimund@3614:         "height_marks";
raimund@3614: 
raimund@3614:     /** One and only state to be in. */
raimund@3614:     protected transient State state = null;
raimund@3614: 
raimund@3614: 
raimund@3614:     /**
raimund@3614:      * Trivial Constructor.
raimund@3614:      */
raimund@3614:     public BedHeightsArtifact() {
raimund@3614:         logger.debug("BedHeightsArtifact.BedHeightsArtifact");
raimund@3614:     }
raimund@3614: 
raimund@3614:     @Override
raimund@3614:     public String getName() {
raimund@3614:         return NAME;
raimund@3614:     }
raimund@3614: 
raimund@3614:     /**
raimund@3614:      * Gets called from factory, to set things up.
raimund@3614:      */
raimund@3614:     @Override
raimund@3614:     public void setup(
raimund@3614:         String          identifier,
raimund@3614:         ArtifactFactory factory,
raimund@3614:         Object          context,
raimund@3614:         CallMeta        callMeta,
raimund@3614:         Document        data)
raimund@3614:     {
raimund@3614:         logger.debug("BedHeightsArtifact.setup");
raimund@3614: 
raimund@3614:         state = new StaticState(STATIC_STATE_NAME);
raimund@3614: 
raimund@3614:         if (logger.isDebugEnabled()) {
raimund@3614:             logger.debug(XMLUtils.toString(data));
raimund@3614:         }
raimund@3614: 
raimund@3614:         List<Facet> fs = new ArrayList<Facet>();
raimund@3614:         String code = getDatacageIDValue(data);
raimund@3614: 
raimund@3614:         if (code != null) {
raimund@3614:             String [] parts = code.split("-");
raimund@3614: 
raimund@3614:             if (parts.length >= 4) {
raimund@3614:                 if (parts[0].equals("bedheight")) {
raimund@3614:                     addStringData("type", parts[1]);
raimund@3614:                     addStringData("height_id", parts[2]);
raimund@3614:                     addStringData("time", parts[3]);
raimund@3614:                 }
raimund@3614:                 int hId = Integer.parseInt(parts[2]);
raimund@3614:                 String bedHName = BedHeightFactory.getHeightName(parts[1], hId);
raimund@3614: 
raimund@3614:                 Facet bedHFacet = new BedHeightFacet(
raimund@3614:                     "bedheight",
raimund@3614:                     bedHName);
raimund@3614: 
raimund@3614:                 fs.add(bedHFacet);
raimund@3614:                 facets.put(state.getID(), fs);
raimund@3614:             }
raimund@3614:         }
raimund@3614: 
raimund@3614:         //spawnState();
raimund@3614:         super.setup(identifier, factory, context, callMeta, data);
raimund@3614:     }
raimund@3614: 
raimund@3614:     /**
raimund@3614:      * Get a list containing the one and only State.
raimund@3614:      * @param  context ignored.
raimund@3614:      * @return list with one and only state.
raimund@3614:      */
raimund@3614:     @Override
raimund@3614:     protected List<State> getStates(Object context) {
raimund@3614:         ArrayList<State> states = new ArrayList<State>();
raimund@3614:         states.add(getState());
raimund@3614:         return states;
raimund@3614:     }
raimund@3614: 
raimund@3614:     /**
raimund@3614:      * Get the "current" state (there is but one).
raimund@3614:      * @param cc ignored.
raimund@3614:      * @return the "current" (only possible) state.
raimund@3614:      */
raimund@3614:     @Override
raimund@3614:     public State getCurrentState(Object cc) {
raimund@3614:         return getState();
raimund@3614:     }
raimund@3614: 
raimund@3614: 
raimund@3614:     /**
raimund@3614:      * Get the only possible state.
raimund@3614:      * @return the state.
raimund@3614:      */
raimund@3614:     protected State getState() {
raimund@3614:         return getState(null, null);
raimund@3614:     }
raimund@3614: 
raimund@3614: 
raimund@3614:     /**
raimund@3614:      * Get the state.
raimund@3614:      * @param context ignored.
raimund@3614:      * @param stateID ignored.
raimund@3614:      * @return the state.
raimund@3614:      */
raimund@3614:     @Override
raimund@3614:     protected State getState(Object context, String stateID) {
raimund@3614:         return (state != null)
raimund@3614:             ? state
raimund@3614:             : new StaticState(STATIC_STATE_NAME);
raimund@3614:     }
raimund@3614: 
raimund@3614:     /**
raimund@3614:      * Get WKms from factory.
raimund@3614:      * @param idx param is not needed (TODO?)
raimund@3614:      * @return WKms according to parameterization (can be null);
raimund@3614:      */
raimund@3614:     public BedHeight getHeight() {
raimund@3614:         return BedHeightFactory.getHeight(
raimund@3614:             getDataAsString("type"),
raimund@3614:             Integer.parseInt(getDataAsString("height_id")),
raimund@3614:             Integer.parseInt(getDataAsString("time")));
raimund@3614:     }
raimund@3614: 
raimund@3614: }