andre@8103: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde andre@8103: * Software engineering by Intevation GmbH andre@8103: * andre@8103: * This file is Free Software under the GNU AGPL (>=v3) andre@8103: * and comes with ABSOLUTELY NO WARRANTY! Check out the andre@8103: * documentation coming with Dive4Elements River for details. andre@8103: */ andre@8103: andre@8103: package org.dive4elements.river.artifacts.model.minfo; andre@8103: andre@8103: import gnu.trove.TDoubleArrayList; andre@8103: andre@8103: import org.dive4elements.artifactdatabase.state.Facet; andre@8103: import org.dive4elements.artifactdatabase.state.StaticFacet; andre@8103: andre@8103: import org.dive4elements.artifacts.Artifact; andre@8103: import org.dive4elements.artifacts.CallContext; andre@8103: import org.dive4elements.artifacts.CallMeta; andre@8103: andre@8103: import org.dive4elements.river.artifacts.D4EArtifact; andre@8103: import org.dive4elements.river.artifacts.resources.Resources; andre@8103: andre@8103: import org.dive4elements.river.artifacts.model.DataFacet; andre@8103: import org.dive4elements.river.artifacts.model.FacetTypes; andre@8103: import org.dive4elements.river.artifacts.model.minfo.SedimentLoadDataFactory; andre@8103: import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData; andre@8103: andre@8103: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; andre@8103: andre@8103: import org.dive4elements.river.model.SedimentLoadLS; andre@8103: import org.dive4elements.river.model.SedimentLoadLSValue; andre@8103: andre@8103: import org.dive4elements.river.utils.RiverUtils; andre@8103: andre@8103: import java.util.ArrayList; andre@8103: import java.util.Collections; andre@8103: import java.util.List; andre@8103: import java.util.Map; andre@8103: import java.util.TreeSet; andre@8103: import java.util.TreeMap; andre@8103: andre@8103: import org.apache.log4j.Logger; andre@8103: andre@8103: import org.w3c.dom.Document; andre@8103: andre@8103: andre@8103: /** Facet to access sediment loads for longitudinal sections. andre@8103: * This facet differs from the sedimentloadfacet in that it andre@8103: * handles values from the sedimentload_ls table in the backend db. andre@8103: * andre@8103: * The sedimentload facet uses the internal sedimentload data model andre@8103: * to work with measurement stations instead. andre@8103: */ andre@8103: public class SedimentLoadLSFacet andre@8103: extends DataFacet andre@8103: implements FacetTypes, StaticFacet andre@8103: { andre@8103: private static Logger logger = Logger.getLogger(SedimentLoadLSFacet.class); andre@8103: andre@8103: /* Aheinecke we probably need to get the kind and split this up here andre@8103: * in some way */ andre@8109: private static final String NAME = "sedimentload"; andre@8103: andre@8103: public SedimentLoadLSFacet() { andre@8103: } andre@8103: andre@8103: public SedimentLoadLSFacet(int idx, String name, String description, andre@8103: ComputeType type, String stateId, String hash) { andre@8103: super(idx, name, description, type, hash, stateId); andre@8103: this.metaData.put("X", "chart.longitudinal.section.xaxis.label"); andre@8103: this.metaData.put("Y", ""); andre@8103: } andre@8103: andre@8103: @Override andre@8103: public Object getData(Artifact artifact, CallContext context) { andre@8103: logger.debug("get Data"); andre@8103: D4EArtifact arti = (D4EArtifact) artifact; andre@8103: andre@8103: String idStr = arti.getDataAsString("load_id"); andre@8103: int id = Integer.valueOf(idStr); andre@8103: andre@8103: SedimentLoadLS theLoad = SedimentLoadLS.getSedimentLoadById(id); andre@8103: andre@8103: if (theLoad == null) { andre@8103: logger.error("No load found for id: " + idStr); andre@8103: return null; andre@8103: } andre@8103: andre@8103: /* Now lets get what we want */ andre@8103: TDoubleArrayList xPos = new TDoubleArrayList(); andre@8103: TDoubleArrayList yPos = new TDoubleArrayList(); andre@8103: andre@8103: for (SedimentLoadLSValue val: theLoad.getSedimentLoadLSValues()) { andre@8103: double value = val.getValue(); andre@8103: if (Double.isNaN(value)) { andre@8103: continue; andre@8103: } andre@8103: xPos.add(val.getStation()); andre@8103: yPos.add(value); andre@8103: } andre@8103: andre@8103: return new double[][] {xPos.toNativeArray(), yPos.toNativeArray()}; andre@8103: } andre@8103: andre@8103: @Override andre@8103: public void setup(Artifact artifact, Document data, CallMeta callMeta) { andre@8103: logger.debug("setup"); andre@8103: String code = D4EArtifact.getDatacageIDValue(data); andre@8103: String[] split = code.split(";"); andre@8103: String idStr = split[0]; andre@8103: String desc = ""; andre@8103: if (split.length >= 2) { andre@8103: desc = split[1]; andre@8103: } andre@8103: andre@8103: int id = Integer.valueOf(idStr); andre@8103: SedimentLoadLS theLoad = SedimentLoadLS.getSedimentLoadById(id); andre@8103: if (theLoad == null) { andre@8103: logger.error("No load found for id: " + idStr); andre@8103: return; andre@8103: } andre@8103: logger.debug("Setting up SedimentLoadLSFacet for id: " + id); andre@8109: if (theLoad.getGrainFraction() != null) { andre@8109: logger.debug("GrainFraction: " + theLoad.getGrainFraction().getName()); andre@8109: } andre@8103: logger.debug("Kind: " + theLoad.getKind()); andre@8103: logger.debug("Unit: " + theLoad.getUnit().getName()); andre@8103: andre@8109: /* Name has the pattern sedimentload.. andre@8109: * this is partly done for backwards compatibility and theming. andre@8109: * See issue 1681 for details. */ andre@8103: name = NAME; andre@8109: tom@8114: String i18nUnit = ""; tom@8114: andre@8109: if (theLoad.getUnit().getName().equals("m3/a")) { andre@8109: /* unit_id is NOT NULL */ andre@8109: name += ".m3a"; tom@8114: i18nUnit = "m\u00b3/a"; andre@8109: } else { andre@8109: name += ".ta"; tom@8114: i18nUnit = "t/a"; andre@8109: } andre@8109: andre@8109: String gfName; andre@8109: if (theLoad.getGrainFraction() != null) { andre@8109: gfName = theLoad.getGrainFraction().getName(); andre@8109: } else { andre@8109: gfName = "unknown"; andre@8109: } andre@8109: name += "." + gfName; andre@8109: andre@8109: logger.debug("Created facet: " + name); andre@8109: andre@8103: description = Resources.getMsg( andre@8103: callMeta, andre@8111: "facet.sedimentload.ls." + gfName, andre@8111: "Error: please add l10n for facet.sedimentload.ls." + gfName, tom@8114: new Object[] { desc, i18nUnit }); andre@8103: ((D4EArtifact)artifact).addStringData("load_id", idStr); andre@8103: } andre@8103: andre@8103: andre@8103: /** Copy deeply. */ andre@8103: @Override andre@8103: public Facet deepCopy() { andre@8103: SedimentLoadLSFacet copy = new SedimentLoadLSFacet(); andre@8103: copy.set(this); andre@8103: copy.type = type; andre@8103: copy.hash = hash; andre@8103: copy.stateId = stateId; andre@8103: return copy; andre@8103: } andre@8103: } andre@8103: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :