felix@7285: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde felix@7285: * Software engineering by Intevation GmbH felix@7285: * felix@7285: * This file is Free Software under the GNU AGPL (>=v3) felix@7285: * and comes with ABSOLUTELY NO WARRANTY! Check out the felix@7285: * documentation coming with Dive4Elements River for details. felix@7285: */ felix@7285: felix@7285: package org.dive4elements.river.artifacts; felix@7285: felix@7285: import java.util.ArrayList; felix@7285: import java.util.List; felix@7285: felix@7285: import org.apache.log4j.Logger; felix@7285: import org.w3c.dom.Document; felix@7285: felix@7285: import org.dive4elements.artifactdatabase.state.DefaultOutput; felix@7285: import org.dive4elements.artifactdatabase.state.Facet; felix@7285: import org.dive4elements.artifactdatabase.state.FacetActivity; felix@7285: import org.dive4elements.artifactdatabase.state.State; felix@7285: import org.dive4elements.artifacts.Artifact; felix@7285: import org.dive4elements.artifacts.ArtifactFactory; felix@7285: import org.dive4elements.artifacts.CallMeta; felix@7285: import org.dive4elements.artifacts.common.utils.XMLUtils; felix@7285: import org.dive4elements.river.artifacts.model.Calculation; felix@7285: import org.dive4elements.river.artifacts.model.CalculationResult; felix@7285: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; felix@7285: import org.dive4elements.river.model.FlowVelocityModel; felix@7285: import org.dive4elements.river.artifacts.model.FlowVelocityCalculation; felix@7285: import org.dive4elements.river.artifacts.model.FlowVelocityData; felix@7285: import org.dive4elements.river.artifacts.model.FlowVelocityFacet; felix@7285: import org.dive4elements.river.artifacts.states.StaticState; felix@7285: felix@7285: import org.dive4elements.river.artifacts.model.FacetTypes; felix@7285: felix@7534: import org.dive4elements.river.artifacts.resources.Resources; felix@7285: felix@7285: /** Artifact to access flow velocity models. */ felix@7285: public class FlowVelocityModelArtifact felix@7285: extends StaticD4EArtifact felix@7285: implements FacetTypes felix@7285: { teichmann@8202: /** The log for this class. */ teichmann@8202: private static Logger log = felix@7285: Logger.getLogger(FlowVelocityModelArtifact.class); felix@7285: felix@7285: /** Artifact key name. */ felix@7285: private static final String NAME = "flowvelocitymodel"; felix@7285: felix@7534: private static final String I18N_MAINCHANNEL = felix@7534: "facet.flow_velocity.model.mainchannel"; felix@7534: felix@7534: private static final String I18N_TAU = felix@7534: "facet.flow_velocity.model.tau"; felix@7534: felix@7534: private static final String I18N_TOTALCHANNEL = felix@7534: "facet.flow_velocity.model.totalchannel"; felix@7534: felix@7534: private static final String I18N_Q = felix@7534: "facet.flow_velocity.model.q"; felix@7534: felix@7285: /** Spawn only inactive facets. */ felix@7285: static { felix@7285: // TODO: Move to configuration. felix@7285: FacetActivity.Registry.getInstance() felix@7285: .register(NAME, FacetActivity.INACTIVE); felix@7285: } felix@7285: felix@7285: /** Need to give the state an id. */ felix@7285: public static final String STATIC_STATE_NAME = felix@7285: "state.flowvelocitymodel.static"; felix@7285: felix@7285: /** One and only state to be in. */ felix@7285: protected transient State state = null; felix@7285: felix@7285: protected String DATA_ID = "ID"; felix@7285: felix@7285: /** felix@7285: * Trivial Constructor. felix@7285: */ felix@7285: public FlowVelocityModelArtifact() { teichmann@8202: log.debug("FlowVelocityModelArtifact.FlowVelocityModelArtifact"); felix@7285: } felix@7285: felix@7285: felix@7285: /** Get artifact key name. */ felix@7285: @Override felix@7285: public String getName() { felix@7285: return NAME; felix@7285: } felix@7285: felix@7285: felix@7285: private Object getFlowVelocity() { teichmann@8202: log.debug("FlowVelocityModelArtifact.getFlowVelocity"); felix@7285: Integer id = getDataAsInteger(DATA_ID); felix@7285: felix@7285: FlowVelocityModel model = FlowVelocityModel.getModel(id); felix@7367: FlowVelocityData data = new FlowVelocityData(); felix@7285: felix@7285: // TODO rangeaccess felix@7285: FlowVelocityCalculation.prepareData(data, model, 0d, 1000d); felix@7285: felix@7285: return new CalculationResult( felix@7285: new FlowVelocityData[] {data} , new Calculation()); felix@7285: } felix@7285: felix@7285: felix@7285: /** Create a static state. */ felix@7285: private State newState() { felix@7285: return new StaticState(STATIC_STATE_NAME) { felix@7285: public Object staticCompute(List facets) { felix@7285: return getFlowVelocity(); felix@7285: } felix@7285: }; felix@7285: } felix@7285: felix@7285: felix@7285: /** Create a new state with bogus output. */ felix@7285: protected State spawnState() { felix@7285: state = newState(); felix@7285: List fs = getFacets(STATIC_STATE_NAME); felix@7285: DefaultOutput output = new DefaultOutput( felix@7285: "general", felix@7285: "general", felix@7285: "image/png", felix@7285: fs, felix@7285: "chart"); felix@7285: felix@7285: state.getOutputs().add(output); felix@7285: felix@7285: return state; felix@7285: } felix@7285: felix@7285: felix@7285: /** felix@7285: * Gets called from factory, to set things up. felix@7285: */ felix@7285: @Override felix@7285: public void setup( felix@7285: String identifier, felix@7285: ArtifactFactory factory, felix@7285: Object context, felix@7285: CallMeta callMeta, rrenkert@7842: Document data, rrenkert@7842: List loadFacets) felix@7285: { teichmann@8202: log.debug("FlowVelocityModelArtifact.setup"); felix@7285: felix@7285: state = newState(); teichmann@8202: if (log.isDebugEnabled()) { teichmann@8202: log.debug(XMLUtils.toString(data)); felix@7285: } felix@7285: felix@7285: List fs = new ArrayList(); felix@7285: felix@7285: String code = getDatacageIDValue(data); felix@7285: felix@7285: if (code != null) { felix@7368: String name = FlowVelocityModel.getModelDescription(Integer.valueOf(code)); felix@7368: felix@7285: Facet facet = new FlowVelocityFacet( felix@7285: 0, felix@7285: FLOW_VELOCITY_MAINCHANNEL, felix@7534: Resources.getMsg(callMeta, felix@7534: I18N_MAINCHANNEL, felix@7534: new Object[] { name } ), felix@7285: ComputeType.ADVANCE, state.getID(), "hash" felix@7285: ); felix@7285: fs.add(facet); felix@7285: Facet tauFacet = new FlowVelocityFacet( felix@7285: 0, felix@7285: FLOW_VELOCITY_TAU, felix@7534: Resources.getMsg(callMeta, felix@7534: I18N_TAU, felix@7534: new Object[] { name} ), felix@7285: ComputeType.ADVANCE, state.getID(), "hash" felix@7285: ); felix@7285: fs.add(tauFacet); felix@7285: Facet qFacet = new FlowVelocityFacet( felix@7285: 0, felix@7285: FLOW_VELOCITY_DISCHARGE, felix@7534: Resources.getMsg(callMeta, felix@7534: I18N_Q, felix@7534: new Object[] { name} ), felix@7285: ComputeType.ADVANCE, state.getID(), "hash" felix@7285: ); felix@7285: fs.add(qFacet); felix@7285: Facet tFacet = new FlowVelocityFacet( felix@7285: 0, felix@7285: FLOW_VELOCITY_TOTALCHANNEL, felix@7534: Resources.getMsg(callMeta, felix@7534: I18N_TOTALCHANNEL, felix@7534: new Object[] { name} ), felix@7285: ComputeType.ADVANCE, state.getID(), "hash" felix@7285: ); felix@7285: fs.add(tFacet); felix@7285: addFacets(state.getID(), fs); felix@7285: addStringData(DATA_ID, code); felix@7285: } felix@7285: else { teichmann@8202: log.error("No id given."); felix@7285: } felix@7285: felix@7285: spawnState(); rrenkert@7842: super.setup(identifier, factory, context, callMeta, data, loadFacets); felix@7285: } felix@7285: felix@7285: felix@7285: /** felix@7285: * Get a list containing the one and only State. felix@7285: * @param context ignored. felix@7285: * @return list with one and only state. felix@7285: */ felix@7285: @Override felix@7285: protected List getStates(Object context) { felix@7285: ArrayList states = new ArrayList(); felix@7285: states.add(getState()); felix@7285: return states; felix@7285: } felix@7285: felix@7285: felix@7285: /** felix@7285: * Get the "current" state (there is but one). felix@7285: * @param cc ignored. felix@7285: * @return the "current" (only possible) state. felix@7285: */ felix@7285: @Override felix@7285: public State getCurrentState(Object cc) { felix@7285: return getState(); felix@7285: } felix@7285: felix@7285: felix@7285: /** felix@7285: * Get the only possible state. felix@7285: * @return the state. felix@7285: */ felix@7285: protected State getState() { felix@7285: return getState(null, null); felix@7285: } felix@7285: felix@7285: felix@7285: /** felix@7285: * Get the state. felix@7285: * @param context ignored. felix@7285: * @param stateID ignored. felix@7285: * @return the state. felix@7285: */ felix@7285: @Override felix@7285: protected State getState(Object context, String stateID) { felix@7285: return (state != null) felix@7285: ? state felix@7285: : spawnState(); felix@7285: } felix@7285: felix@7285: felix@7285: /** felix@7285: * Called via setup. Overridden to avoid cloning all data. felix@7285: * felix@7285: * @param artifact The master-artifact. felix@7285: */ felix@7285: @Override felix@7285: protected void initialize( felix@7285: Artifact artifact, felix@7285: Object context, felix@7285: CallMeta meta) felix@7285: { teichmann@8202: log.debug("FlowVelocityModelArtifact.initialize"); felix@7285: } felix@7285: } felix@7285: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :