felix@7199: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde felix@7199: * Software engineering by Intevation GmbH felix@7199: * felix@7199: * This file is Free Software under the GNU AGPL (>=v3) felix@7199: * and comes with ABSOLUTELY NO WARRANTY! Check out the felix@7199: * documentation coming with Dive4Elements River for details. felix@7199: */ felix@7199: felix@7199: package org.dive4elements.river.artifacts; felix@7199: felix@7199: import java.util.ArrayList; felix@7199: import java.util.List; felix@7199: felix@7199: import org.apache.log4j.Logger; felix@7199: import org.w3c.dom.Document; felix@7199: felix@7199: import org.dive4elements.artifactdatabase.state.DefaultOutput; felix@7199: import org.dive4elements.artifactdatabase.state.Facet; felix@7199: import org.dive4elements.artifactdatabase.state.FacetActivity; felix@7199: import org.dive4elements.artifactdatabase.state.State; felix@7199: import org.dive4elements.artifacts.Artifact; felix@7199: import org.dive4elements.artifacts.ArtifactFactory; felix@7199: import org.dive4elements.artifacts.CallMeta; felix@7199: import org.dive4elements.artifacts.common.utils.XMLUtils; felix@7199: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; felix@7199: import org.dive4elements.river.artifacts.model.minfo.SedimentDensityFacet; felix@7199: import org.dive4elements.river.artifacts.model.minfo.SedimentDensityFactory; felix@7311: import org.dive4elements.river.artifacts.resources.Resources; felix@7199: import org.dive4elements.river.artifacts.states.StaticState; felix@7199: felix@7199: import org.dive4elements.river.artifacts.model.FacetTypes; felix@7199: felix@7199: felix@7199: /** Artifact to access sediment density measurements. */ felix@7199: public class SedimentDensityArtifact felix@7199: extends StaticD4EArtifact felix@7199: implements FacetTypes felix@7199: { teichmann@8202: /** The log for this class. */ teichmann@8202: private static Logger log = felix@7199: Logger.getLogger(SedimentDensityArtifact.class); felix@7199: felix@7199: /** Artifact key name. */ felix@7199: private static final String NAME = "sedimentdensity"; felix@7199: felix@7199: /** Spawn only inactive facets. */ felix@7199: static { felix@7199: // TODO: Move to configuration. felix@7199: FacetActivity.Registry.getInstance() felix@7199: .register(NAME, FacetActivity.INACTIVE); felix@7199: } felix@7199: felix@7199: /** Need to give the state an id. */ felix@7199: public static final String STATIC_STATE_NAME = felix@7199: "state.sedimentdensity.static"; felix@7199: felix@7199: /** One and only state to be in. */ felix@7199: protected transient State state = null; felix@7199: felix@7199: protected String DATA_ID = "ID"; felix@7199: felix@7199: /** felix@7199: * Trivial Constructor. felix@7199: */ felix@7199: public SedimentDensityArtifact() { teichmann@8202: log.debug("SedimentDensityArtifact.SedimentDensityArtifact"); felix@7199: } felix@7199: felix@7199: felix@7199: /** Get artifact key name. */ felix@7199: @Override felix@7199: public String getName() { felix@7199: return NAME; felix@7199: } felix@7199: felix@7199: felix@7199: private Object getSedimentDensity() { teichmann@8202: log.debug("SedimentDensityArtifact.getSedimentDensity"); felix@7199: Integer id = getDataAsInteger(DATA_ID); felix@7199: felix@7199: // TODO use cache if possible felix@7204: return SedimentDensityFactory.getSedimentDensityUncached(id); felix@7199: } felix@7199: felix@7199: felix@7199: private State newDensityState() { felix@7199: return new StaticState(STATIC_STATE_NAME) { felix@7199: public Object staticCompute(List facets) { felix@7199: return getSedimentDensity(); felix@7199: } felix@7199: }; felix@7199: } felix@7199: felix@7199: felix@7199: /** Create a new state with bogus output. */ felix@7199: protected State spawnState() { felix@7199: state = newDensityState(); felix@7199: List fs = getFacets(STATIC_STATE_NAME); felix@7199: DefaultOutput output = new DefaultOutput( felix@7199: "general", felix@7199: "general", felix@7199: "image/png", felix@7199: fs, felix@7199: "chart"); felix@7199: felix@7199: state.getOutputs().add(output); felix@7199: felix@7199: return state; felix@7199: } felix@7199: felix@7199: felix@7199: /** felix@7199: * Gets called from factory, to set things up. felix@7199: */ felix@7199: @Override felix@7199: public void setup( felix@7199: String identifier, felix@7199: ArtifactFactory factory, felix@7199: Object context, felix@7199: CallMeta callMeta, rrenkert@7842: Document data, rrenkert@7842: List loadFacets) felix@7199: { teichmann@8202: log.debug("SedimentDensityArtifact.setup"); felix@7199: felix@7199: state = newDensityState(); teichmann@8202: if (log.isDebugEnabled()) { teichmann@8202: log.debug(XMLUtils.toString(data)); felix@7199: } felix@7199: felix@7199: List fs = new ArrayList(); felix@7199: felix@7199: String code = getDatacageIDValue(data); felix@7199: felix@7199: if (code != null) { tom@8856: double[] depth = SedimentDensityFactory.getDepth( tom@8856: Integer.valueOf(code)); felix@7199: tom@8856: String name = Resources.getMsg( tom@8856: callMeta, "sedimentdensity", "sedimentdensity"); felix@7311: name += " " + depth[0] + " - " + depth[1] + " cm"; felix@7199: Facet facet = new SedimentDensityFacet( felix@7199: 0, felix@7204: SEDIMENT_DENSITY, felix@7199: name, felix@7199: ComputeType.ADVANCE, state.getID(), "hash" felix@7199: ); felix@7199: fs.add(facet); felix@7199: addFacets(state.getID(), fs); felix@7199: addStringData(DATA_ID, code); felix@7204: } felix@7204: else { teichmann@8202: log.error("No id given."); felix@7199: } felix@7199: felix@7199: spawnState(); rrenkert@7842: super.setup(identifier, factory, context, callMeta, data, loadFacets); felix@7199: } felix@7199: felix@7199: felix@7199: /** felix@7199: * Get a list containing the one and only State. felix@7199: * @param context ignored. felix@7199: * @return list with one and only state. felix@7199: */ felix@7199: @Override felix@7199: protected List getStates(Object context) { felix@7199: ArrayList states = new ArrayList(); felix@7199: states.add(getState()); felix@7199: return states; felix@7199: } felix@7199: felix@7199: felix@7199: /** felix@7199: * Get the "current" state (there is but one). felix@7199: * @param cc ignored. felix@7199: * @return the "current" (only possible) state. felix@7199: */ felix@7199: @Override felix@7199: public State getCurrentState(Object cc) { felix@7199: return getState(); felix@7199: } felix@7199: felix@7199: felix@7199: /** felix@7199: * Get the only possible state. felix@7199: * @return the state. felix@7199: */ felix@7199: protected State getState() { felix@7199: return getState(null, null); felix@7199: } felix@7199: felix@7199: felix@7199: /** felix@7199: * Get the state. felix@7199: * @param context ignored. felix@7199: * @param stateID ignored. felix@7199: * @return the state. felix@7199: */ felix@7199: @Override felix@7199: protected State getState(Object context, String stateID) { felix@7199: return (state != null) felix@7199: ? state felix@7199: : spawnState(); felix@7199: } felix@7199: felix@7199: felix@7199: /** felix@7199: * Called via setup. Overridden to avoid cloning all data. felix@7199: * felix@7199: * @param artifact The master-artifact. felix@7199: */ felix@7199: @Override felix@7199: protected void initialize( felix@7199: Artifact artifact, felix@7199: Object context, felix@7199: CallMeta meta) felix@7199: { teichmann@8202: log.debug("SedimentDensityArtifact.initialize"); felix@7199: } felix@7199: } felix@7199: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :