felix@7182: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde felix@7182: * Software engineering by Intevation GmbH felix@7182: * felix@7182: * This file is Free Software under the GNU AGPL (>=v3) felix@7182: * and comes with ABSOLUTELY NO WARRANTY! Check out the felix@7182: * documentation coming with Dive4Elements River for details. felix@7182: */ felix@7182: felix@7182: package org.dive4elements.river.artifacts; felix@7182: felix@7182: import java.util.ArrayList; felix@7182: import java.util.List; felix@7182: felix@7182: import org.apache.log4j.Logger; felix@7182: import org.w3c.dom.Document; felix@7182: felix@7182: import org.dive4elements.artifactdatabase.state.DefaultOutput; felix@7182: import org.dive4elements.artifactdatabase.state.Facet; felix@7182: import org.dive4elements.artifactdatabase.state.FacetActivity; felix@7182: import org.dive4elements.artifactdatabase.state.State; felix@7182: import org.dive4elements.artifacts.Artifact; felix@7182: import org.dive4elements.artifacts.ArtifactFactory; felix@7182: import org.dive4elements.artifacts.CallMeta; felix@7182: import org.dive4elements.artifacts.common.utils.XMLUtils; felix@7182: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; felix@7186: import org.dive4elements.river.artifacts.model.Calculation; felix@7186: import org.dive4elements.river.artifacts.model.CalculationResult; felix@7182: import org.dive4elements.river.artifacts.model.minfo.SedimentLoad; felix@7182: import org.dive4elements.river.artifacts.model.minfo.SedimentLoadFacet; felix@7182: import org.dive4elements.river.artifacts.model.minfo.SedimentLoadFactory; felix@7186: import org.dive4elements.river.artifacts.model.minfo.SedimentLoadResult; felix@7182: import org.dive4elements.river.artifacts.states.StaticState; felix@7182: felix@7182: import org.dive4elements.river.artifacts.model.FacetTypes; felix@7182: felix@7182: felix@7196: /** Artifact to access sediment yield measurements. */ felix@7202: // TODO Naming: would SedimentLoadArtifact be more precise? felix@7182: public class SedimentYieldArtifact felix@7182: extends StaticD4EArtifact felix@7182: implements FacetTypes felix@7182: { felix@7182: /** The logger for this class. */ felix@7182: private static Logger logger = felix@7182: Logger.getLogger(SedimentYieldArtifact.class); felix@7182: felix@7182: /** Artifact key name. */ felix@7182: private static final String NAME = "sedimentyield"; felix@7182: felix@7182: /** Spawn only inactive facets. */ felix@7182: static { felix@7182: // TODO: Move to configuration. felix@7182: FacetActivity.Registry.getInstance() felix@7182: .register(NAME, FacetActivity.INACTIVE); felix@7182: } felix@7182: felix@7182: /** Need to give the state an id. */ felix@7182: public static final String STATIC_STATE_NAME = felix@7182: "state.sedimentyield.static"; felix@7182: felix@7182: /** One and only state to be in. */ felix@7182: protected transient State state = null; felix@7182: felix@7182: protected String DATA_NAME = "ID"; felix@7182: felix@7182: /** felix@7182: * Trivial Constructor. felix@7182: */ felix@7182: public SedimentYieldArtifact() { felix@7182: logger.debug("SedimentYieldArtifact.SedimentYieldArtifact"); felix@7182: } felix@7182: felix@7182: felix@7182: /** Get artifact key name. */ felix@7182: @Override felix@7182: public String getName() { felix@7182: return NAME; felix@7182: } felix@7182: felix@7182: felix@7186: private Object getSedimentLoad() { felix@7186: logger.debug("SedimentYieldArtifact.getSedimentLoad"); felix@7186: String id = getDataAsString(DATA_NAME); felix@7186: String river = getDataAsString("river"); felix@7186: felix@7196: // TODO use cache if possible felix@7186: SedimentLoad myLoad = SedimentLoadFactory.getSedimentLoadWithDataUncached(id, river); felix@7186: return new CalculationResult( felix@7186: new SedimentLoadResult[] { felix@7186: new SedimentLoadResult(1983,2042,myLoad) felix@7186: }, new Calculation()); felix@7186: } felix@7186: felix@7186: felix@7182: /** Create a new state with bogus output. */ felix@7182: protected State spawnState() { felix@7186: state = new StaticState(STATIC_STATE_NAME) { felix@7186: felix@7186: public Object staticCompute(List facets) { felix@7186: return getSedimentLoad(); felix@7186: } felix@7186: }; felix@7182: List fs = getFacets(STATIC_STATE_NAME); felix@7182: DefaultOutput output = new DefaultOutput( felix@7182: "general", felix@7182: "general", felix@7182: "image/png", felix@7182: fs, felix@7182: "chart"); felix@7182: felix@7182: state.getOutputs().add(output); felix@7182: felix@7182: return state; felix@7182: } felix@7182: felix@7182: felix@7182: /** felix@7182: * Gets called from factory, to set things up. felix@7182: */ felix@7182: @Override felix@7182: public void setup( felix@7182: String identifier, felix@7182: ArtifactFactory factory, felix@7182: Object context, felix@7182: CallMeta callMeta, felix@7182: Document data) felix@7182: { felix@7182: logger.debug("SedimentYieldArtifact.setup"); felix@7182: felix@7186: // Refactor? this happens at another place, too felix@7182: // Store id, yield yields. felix@7186: state = new StaticState(STATIC_STATE_NAME) { felix@7182: felix@7186: public Object staticCompute(List facets) { felix@7186: return getSedimentLoad(); felix@7186: } felix@7186: }; felix@7182: if (logger.isDebugEnabled()) { felix@7182: logger.debug(XMLUtils.toString(data)); felix@7182: } felix@7182: felix@7182: List fs = new ArrayList(); felix@7182: String code = getDatacageIDValue(data); felix@7182: felix@7182: if (code != null) { felix@7186: String name = SedimentLoadFactory.getSedimentYieldDescription(Integer.valueOf(code)); felix@7182: felix@7182: Facet facet = new SedimentLoadFacet( felix@7186: 0, felix@7182: SEDIMENT_LOAD_COARSE, felix@7186: name, felix@7182: //???? felix@7182: ComputeType.ADVANCE, state.getID(), "hash" felix@7182: ); felix@7182: fs.add(facet); felix@7182: addFacets(state.getID(), fs); felix@7182: addStringData(DATA_NAME, code); felix@7182: } felix@7182: felix@7182: spawnState(); felix@7182: super.setup(identifier, factory, context, callMeta, data); felix@7182: } felix@7182: felix@7182: felix@7182: /** felix@7182: * Get a list containing the one and only State. felix@7182: * @param context ignored. felix@7182: * @return list with one and only state. felix@7182: */ felix@7182: @Override felix@7182: protected List getStates(Object context) { felix@7182: ArrayList states = new ArrayList(); felix@7182: states.add(getState()); felix@7182: return states; felix@7182: } felix@7182: felix@7182: felix@7182: /** felix@7182: * Get the "current" state (there is but one). felix@7182: * @param cc ignored. felix@7182: * @return the "current" (only possible) state. felix@7182: */ felix@7182: @Override felix@7182: public State getCurrentState(Object cc) { felix@7182: return getState(); felix@7182: } felix@7182: felix@7182: felix@7182: /** felix@7182: * Get the only possible state. felix@7182: * @return the state. felix@7182: */ felix@7182: protected State getState() { felix@7182: return getState(null, null); felix@7182: } felix@7182: felix@7182: felix@7182: /** felix@7182: * Get the state. felix@7182: * @param context ignored. felix@7182: * @param stateID ignored. felix@7182: * @return the state. felix@7182: */ felix@7182: @Override felix@7182: protected State getState(Object context, String stateID) { felix@7182: return (state != null) felix@7182: ? state felix@7182: : spawnState(); felix@7182: } felix@7182: felix@7182: felix@7182: /** felix@7182: * Called via setup. Overridden to avoid cloning all data. felix@7182: * felix@7182: * @param artifact The master-artifact. felix@7182: */ felix@7182: @Override felix@7182: protected void initialize( felix@7182: Artifact artifact, felix@7182: Object context, felix@7182: CallMeta meta) felix@7182: { felix@7186: logger.debug("SedimentYieldArtifact.initialize"); felix@7186: importData((D4EArtifact) artifact, "river"); felix@7182: } felix@7182: } felix@7182: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :