# HG changeset patch # User Andre Heinecke # Date 1408529381 -7200 # Node ID 54d35418141e3da0e44264581bb120380789ecf1 # Parent 28816abe7d5c5003933236a452624b8fea39372e Add SedimentLoadLSFacet TODO: correct handling of the facet name with regards to grain fraction and unit diff -r 28816abe7d5c -r 54d35418141e artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadLSFacet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadLSFacet.java Wed Aug 20 12:09:41 2014 +0200 @@ -0,0 +1,150 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.artifacts.model.minfo; + +import gnu.trove.TDoubleArrayList; + +import org.dive4elements.artifactdatabase.state.Facet; +import org.dive4elements.artifactdatabase.state.StaticFacet; + +import org.dive4elements.artifacts.Artifact; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.artifacts.CallMeta; + +import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.resources.Resources; + +import org.dive4elements.river.artifacts.model.DataFacet; +import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.minfo.SedimentLoadDataFactory; +import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData; + +import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; + +import org.dive4elements.river.model.SedimentLoadLS; +import org.dive4elements.river.model.SedimentLoadLSValue; + +import org.dive4elements.river.utils.RiverUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; +import java.util.TreeMap; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; + + +/** Facet to access sediment loads for longitudinal sections. + * This facet differs from the sedimentloadfacet in that it + * handles values from the sedimentload_ls table in the backend db. + * + * The sedimentload facet uses the internal sedimentload data model + * to work with measurement stations instead. + */ +public class SedimentLoadLSFacet +extends DataFacet +implements FacetTypes, StaticFacet +{ + private static Logger logger = Logger.getLogger(SedimentLoadLSFacet.class); + + /* Aheinecke we probably need to get the kind and split this up here + * in some way */ + private static final String NAME = SEDIMENT_LOAD_TA_STATIC; + + public SedimentLoadLSFacet() { + } + + public SedimentLoadLSFacet(int idx, String name, String description, + ComputeType type, String stateId, String hash) { + super(idx, name, description, type, hash, stateId); + this.metaData.put("X", "chart.longitudinal.section.xaxis.label"); + this.metaData.put("Y", ""); + } + + @Override + public Object getData(Artifact artifact, CallContext context) { + logger.debug("get Data"); + D4EArtifact arti = (D4EArtifact) artifact; + + String idStr = arti.getDataAsString("load_id"); + int id = Integer.valueOf(idStr); + + SedimentLoadLS theLoad = SedimentLoadLS.getSedimentLoadById(id); + + if (theLoad == null) { + logger.error("No load found for id: " + idStr); + return null; + } + + /* Now lets get what we want */ + TDoubleArrayList xPos = new TDoubleArrayList(); + TDoubleArrayList yPos = new TDoubleArrayList(); + + for (SedimentLoadLSValue val: theLoad.getSedimentLoadLSValues()) { + double value = val.getValue(); + if (Double.isNaN(value)) { + continue; + } + xPos.add(val.getStation()); + yPos.add(value); + } + + return new double[][] {xPos.toNativeArray(), yPos.toNativeArray()}; + } + + @Override + public void setup(Artifact artifact, Document data, CallMeta callMeta) { + logger.debug("setup"); + String code = D4EArtifact.getDatacageIDValue(data); + String[] split = code.split(";"); + String idStr = split[0]; + String desc = ""; + if (split.length >= 2) { + desc = split[1]; + } + + int id = Integer.valueOf(idStr); + SedimentLoadLS theLoad = SedimentLoadLS.getSedimentLoadById(id); + if (theLoad == null) { + logger.error("No load found for id: " + idStr); + return; + } + logger.debug("Setting up SedimentLoadLSFacet for id: " + id); + logger.debug("GrainFraction: " + theLoad.getGrainFraction().getName()); + logger.debug("Kind: " + theLoad.getKind()); + logger.debug("Unit: " + theLoad.getUnit().getName()); + + /* TODO: Name is important. We have to add the Grain Fraction and the + * unit in here so that theming is done correctly and unit is correct.*/ + name = NAME; + description = Resources.getMsg( + callMeta, + "facet.sedimentload", + "Sedimentload", + new Object[] { desc }); + ((D4EArtifact)artifact).addStringData("load_id", idStr); + } + + + /** Copy deeply. */ + @Override + public Facet deepCopy() { + SedimentLoadLSFacet copy = new SedimentLoadLSFacet(); + copy.set(this); + copy.type = type; + copy.hash = hash; + copy.stateId = stateId; + return copy; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :