Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java @ 7366:ea5da3e140ef
Cosmetics.
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Thu, 17 Oct 2013 07:44:34 +0200 |
parents | 6205fe683ac7 |
children | 640342d9ab8a |
line wrap: on
line source
/* 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.states; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.artifactdatabase.data.StateData; import org.dive4elements.artifacts.CallContext; import org.dive4elements.artifacts.Artifact; import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; import org.dive4elements.river.artifacts.FixationArtifact; import org.dive4elements.river.artifacts.MINFOArtifact; import org.dive4elements.river.artifacts.StaticWKmsArtifact; import org.dive4elements.river.artifacts.WINFOArtifact; import org.dive4elements.river.artifacts.math.WKmsOperation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; import org.dive4elements.river.artifacts.model.DifferenceCurveFacet; import org.dive4elements.river.artifacts.model.EmptyFacet; import org.dive4elements.river.artifacts.model.FacetTypes; import org.dive4elements.river.artifacts.model.WKms; import org.dive4elements.river.artifacts.model.WQKms; import org.dive4elements.river.artifacts.model.fixings.FixRealizingResult; import org.dive4elements.river.utils.RiverUtils; import org.dive4elements.river.utils.StringUtil; /** State of a WINFOArtifact to get differences of data of other artifacts. */ public class WDifferencesState extends DefaultState implements FacetTypes { /** The logger that is used in this state. */ private static Logger logger = Logger.getLogger(WDifferencesState.class); /** Specify to display nothing (this is kind of a "final" state). */ @Override protected String getUIProvider() { return "noinput"; } @Override public boolean validate(Artifact artifact) throws IllegalArgumentException { D4EArtifact flys = (D4EArtifact) artifact; if (artifact instanceof ChartArtifact) { return true; } StateData data = flys.getData("diffids"); if (data == null) { throw new IllegalArgumentException("diffids is empty"); } // TODO: Also validate format. return true; } /** * Access the data (wkms) of an artifact, coded in mingle. */ protected WKms getWKms(String mingle, CallContext context) { logger.debug("WDifferencesState.getWKms " + mingle); String[] def = mingle.split(";"); String uuid = def[0]; String name = def[1]; int idx = Integer.parseInt(def[2]); if (name.startsWith("staticwkms")) { StaticWKmsArtifact staticWKms = (StaticWKmsArtifact) RiverUtils.getArtifact( uuid, context); logger.debug("WDifferencesState obtain data from StaticWKms"); WKms wkms = staticWKms.getWKms(idx); if (wkms == null) logger.error("No WKms from artifact."); return wkms; } D4EArtifact d4eArtifact = RiverUtils.getArtifact( uuid, context); if (d4eArtifact == null) { logger.warn("One of the artifacts (1) for diff calculation could not be loaded"); return null; } if (d4eArtifact instanceof WINFOArtifact) { logger.debug("Get WKms from WINFOArtifact"); WINFOArtifact flys = (WINFOArtifact) d4eArtifact; WKms[] wkms = (WKms[]) flys.getWaterlevelData(context). getData(); if (wkms == null || wkms.length == 0) { logger.warn("no waterlevels in artifact"); } else if (wkms.length < idx+1) { logger.warn("Not enough waterlevels in artifact."); return new WQKms(); } return wkms[idx]; } else if (d4eArtifact instanceof MINFOArtifact) { logger.debug("Get WKms from MINFOArtifact"); CalculationResult r = (CalculationResult) d4eArtifact.compute(context, ComputeType.ADVANCE, false); } else if (d4eArtifact instanceof FixationArtifact) { logger.debug ("Get WKms from FixationArtifact."); CalculationResult r = (CalculationResult) d4eArtifact.compute(context, ComputeType.ADVANCE, false); FixRealizingResult frR = (FixRealizingResult) r.getData(); return frR.getWQKms()[idx]; } logger.error("Do not know how to handle (getWKms) minuend/subtrahend"); return null; } /** * Return CalculationResult with Array of WKms that are difference of * Waterlevels. Add respective facets (DifferencesCurveFacet, DataFacet). */ @Override public Object computeAdvance( D4EArtifact artifact, String hash, CallContext context, List<Facet> facets, Object old ) { if (artifact instanceof ChartArtifact) { ChartArtifact chart = (ChartArtifact)artifact; facets.add(new EmptyFacet()); return null; } WINFOArtifact winfo = (WINFOArtifact) artifact; String id = getID(); // Load the Artifacts/facets that we want to subtract and display. // Expected format is: // [42537f1e-3522-42ef-8968-635b03d8e9c6;longitudinal_section.w;0]#[1231f2-....] String diffids = winfo.getDataAsString("diffids"); logger.debug("WDifferencesState has: " + diffids); String datas[] = diffids.split("#"); // Validate the Data-Strings. for (String s: datas) { if (!WaterlevelSelectState.isValueValid(s)) { // TODO: escalate. } } if (datas.length < 2) { // TODO crash with style } List<WKms> wkmss = new ArrayList<WKms>(); for(int i = 0; i < datas.length; i+=2) { // e.g.: // 42537f1e-3522-42ef-8968-635b03d8e9c6;longitudinal_section.w;1 WKms minuendWKms = getWKms(StringUtil.unbracket(datas[i+0]), context); WKms subtrahendWKms = getWKms(StringUtil.unbracket(datas[i+1]), context); String facetName = "diff ()"; if (minuendWKms != null && subtrahendWKms != null) { facetName = StringUtil.wWrap(minuendWKms.getName()) + " - " + StringUtil.wWrap(subtrahendWKms.getName()); WKms wkms = WKmsOperation.SUBTRACTION.operate(minuendWKms, subtrahendWKms); wkms.setName(facetName); wkmss.add(wkms); logger.debug("WKMSSubtraction happened"); } if (facets != null) { facets.add(new DifferenceCurveFacet(i/2, W_DIFFERENCES, facetName, ComputeType.ADVANCE, id, hash)); } } if (facets != null) { facets.add(new DataFacet(CSV, "CSV data")); facets.add(new DataFacet(PDF, "PDF data")); logger.debug("Adding facets in WDifferencesState."); } else { logger.debug("Not adding facets in WDifferencesState."); } // TODO Evaluate whether null is okay as reports. WKms[] diffs = wkmss.toArray(new WKms[wkmss.size()]); CalculationResult result = new CalculationResult(diffs, null); return result; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :