teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.states.minfo; raimund@3629: ingo@3749: import java.util.ArrayList; ingo@3767: import java.util.Date; ingo@3749: import java.util.List; ingo@3749: ingo@3749: import org.apache.log4j.Logger; ingo@3749: teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet; rrenkert@6262: import org.dive4elements.artifactdatabase.state.FacetActivity; rrenkert@6262: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.artifacts.CallMeta; teichmann@5867: import org.dive4elements.river.artifacts.D4EArtifact; teichmann@5831: import org.dive4elements.river.artifacts.access.BedQualityAccess; teichmann@5831: import org.dive4elements.river.artifacts.model.CalculationResult; teichmann@5831: import org.dive4elements.river.artifacts.model.DataFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.DateRange; teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedDensityFacet; rrenkert@6252: import org.dive4elements.river.artifacts.model.minfo.BedDiameterDataFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedDiameterFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedDiameterResult; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedParametersResult; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedPorosityFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedQualityCalculation; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedQualityDiameterResult; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedQualityResult; rrenkert@6262: import org.dive4elements.river.artifacts.model.minfo.BedloadDiameterDataFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedloadDiameterFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedloadDiameterResult; teichmann@5831: import org.dive4elements.river.artifacts.resources.Resources; teichmann@5831: import org.dive4elements.river.artifacts.states.DefaultState; raimund@3629: sascha@3750: ingo@3757: public class BedQualityState extends DefaultState implements FacetTypes { ingo@3757: ingo@3757: private static final long serialVersionUID = 1L; ingo@3757: ingo@3757: private static final Logger logger = Logger ingo@3757: .getLogger(BedQualityState.class); sascha@3750: ingo@3767: public static final String I18N_TOPLAYER = "bedquality.toplayer"; ingo@3767: public static final String I18N_SUBLAYER = "bedquality.sublayer"; ingo@3767: ingo@3767: public static final String I18N_FACET_BED_POROSITY_TOPLAYER = "facet.bedquality.bed.porosity.toplayer"; ingo@3767: public static final String I18N_FACET_BED_POROSITY_SUBLAYER = "facet.bedquality.bed.porosity.sublayer"; ingo@3767: public static final String I18N_FACET_BED_DENSITY_TOPLAYER = "facet.bedquality.bed.density.toplayer"; ingo@3767: public static final String I18N_FACET_BED_DENSITY_SUBLAYER = "facet.bedquality.bed.density.sublayer"; ingo@3767: public static final String I18N_FACET_BED_DIAMETER_TOPLAYER = "facet.bedquality.bed.diameter.toplayer"; ingo@3767: public static final String I18N_FACET_BED_DIAMETER_SUBLAYER = "facet.bedquality.bed.diameter.sublayer"; rrenkert@6252: public static final String I18N_FACET_BED_DIAMETER_DATA_TOPLAYER = "facet.bedquality.bed.diameter.data.toplayer"; rrenkert@6252: public static final String I18N_FACET_BED_DIAMETER_DATA_SUBLAYER = "facet.bedquality.bed.diameter.data.sublayer"; rrenkert@6252: public static final String I18N_FACET_BEDLOAD_DIAMETER_DATA = "facet.bedquality.bedload.diameter.data"; ingo@3767: public static final String I18N_FACET_BEDLOAD_DIAMETER = "facet.bedquality.bedload.diameter"; ingo@3767: rrenkert@6262: static { rrenkert@6262: // Active/deactivate facets. rrenkert@6262: FacetActivity.Registry.getInstance().register( rrenkert@6262: "minfo", rrenkert@6262: new FacetActivity() { rrenkert@6262: @Override rrenkert@6262: public Boolean isInitialActive( rrenkert@6262: Artifact artifact, rrenkert@6262: Facet facet, rrenkert@6262: String output rrenkert@6262: ) { rrenkert@6262: String name = facet.getName(); rrenkert@6262: if (name.equals(BED_QUALITY_SEDIMENT_DENSITY_TOPLAYER) || rrenkert@6262: name.equals(BED_QUALITY_SEDIMENT_DENSITY_SUBLAYER) || rrenkert@6262: name.equals(BED_DIAMETER_DATA_TOP) || rrenkert@6262: name.equals(BED_DIAMETER_DATA_SUB) || rrenkert@6262: name.equals(BEDLOAD_DIAMETER_DATA)){ rrenkert@6262: return Boolean.FALSE; rrenkert@6262: } rrenkert@6262: else { rrenkert@6262: return null; rrenkert@6262: } rrenkert@6262: } rrenkert@6262: }); rrenkert@6262: } rrenkert@6262: ingo@3749: @Override teichmann@5867: public Object computeAdvance(D4EArtifact artifact, String hash, ingo@3757: CallContext context, List facets, Object old) { ingo@3749: logger.debug("BedQualityState.computeAdvance"); raimund@3629: ingo@3749: List newFacets = new ArrayList(); ingo@3749: felix@4825: BedQualityAccess access = new BedQualityAccess(artifact, context); ingo@3749: ingo@3757: CalculationResult res = old instanceof CalculationResult ? (CalculationResult) old ingo@3749: : new BedQualityCalculation().calculate(access); ingo@3749: ingo@3749: if (facets == null || res == null) { ingo@3749: return res; ingo@3749: } ingo@3749: ingo@3762: BedQualityResult[] results = (BedQualityResult[]) res.getData(); ingo@3757: ingo@3762: if (results == null || results.length == 0) { ingo@3762: logger.warn("Calculation computed no results!"); ingo@3762: return res; ingo@3762: } ingo@3757: ingo@3767: generateFacets(context, newFacets, results, getID(), hash); ingo@3762: logger.debug("Created " + newFacets.size() + " new Facets."); rrenkert@6252: generateDataFacets(context, newFacets, access, getID(), hash); ingo@3749: facets.addAll(newFacets); ingo@3749: ingo@3749: return res; ingo@3749: } ingo@3762: rrenkert@6252: private void generateDataFacets( rrenkert@6252: CallContext context, rrenkert@6252: List newFacets, rrenkert@6252: BedQualityAccess access, rrenkert@6252: String stateId, rrenkert@6252: String hash) { rrenkert@6252: List diameters = access.getBedDiameter(); rrenkert@6262: List loadDiameters = access.getBedloadDiameter(); rrenkert@6252: List ranges = access.getDateRanges(); teichmann@7254: for (int i = 0, R = ranges.size(); i < R; i++) { rrenkert@6252: DateRange range = ranges.get(i); rrenkert@6252: for (String diameter: diameters) { rrenkert@6262: int ndxTop = generateIndex(diameter); teichmann@7254: int ndxSub = ndxTop; // TODO: Is this correct? rrenkert@6262: ndxTop += 1; rrenkert@6262: ndxTop = ndxTop << 3; rrenkert@6262: ndxSub = ndxSub << 3; rrenkert@6262: ndxTop += i; rrenkert@6262: ndxSub += i; rrenkert@6252: String toplayer = rrenkert@6252: Resources.getMsg( rrenkert@6252: context.getMeta(), I18N_TOPLAYER, I18N_TOPLAYER); rrenkert@6252: String sublayer = rrenkert@6252: Resources.getMsg( rrenkert@6252: context.getMeta(), I18N_SUBLAYER, I18N_SUBLAYER); rrenkert@6252: //toplayer rrenkert@6252: newFacets.add(new BedDiameterDataFacet( rrenkert@6252: ndxTop, rrenkert@6252: BED_DIAMETER_DATA_TOP, rrenkert@6252: Resources.getMsg( rrenkert@6252: context.getMeta(), rrenkert@6252: I18N_FACET_BED_DIAMETER_DATA_TOPLAYER, rrenkert@6252: I18N_FACET_BED_DIAMETER_DATA_TOPLAYER, rrenkert@6252: new Object[] { diameter.toUpperCase(), rrenkert@6252: range.getFrom(), range.getTo(), toplayer}), rrenkert@6252: ComputeType.ADVANCE, rrenkert@6252: stateId, rrenkert@6252: hash)); rrenkert@6252: //sublayer rrenkert@6252: newFacets.add(new BedDiameterDataFacet( rrenkert@6252: ndxSub, rrenkert@6252: BED_DIAMETER_DATA_SUB, rrenkert@6252: Resources.getMsg( rrenkert@6252: context.getMeta(), rrenkert@6252: I18N_FACET_BED_DIAMETER_DATA_TOPLAYER, rrenkert@6252: I18N_FACET_BED_DIAMETER_DATA_TOPLAYER, rrenkert@6252: new Object[] { diameter.toUpperCase(), rrenkert@6252: range.getFrom(), range.getTo(), sublayer}), rrenkert@6252: ComputeType.ADVANCE, rrenkert@6252: stateId, rrenkert@6252: hash)); rrenkert@6252: } rrenkert@6262: for (String loadDiameter: loadDiameters) { rrenkert@6262: int ndx = generateIndex(loadDiameter); rrenkert@6262: ndx = ndx << 3; rrenkert@6262: ndx += i; rrenkert@6262: newFacets.add(new BedloadDiameterDataFacet( rrenkert@6262: ndx, rrenkert@6262: BEDLOAD_DIAMETER_DATA, rrenkert@6262: Resources.getMsg( rrenkert@6262: context.getMeta(), rrenkert@6262: I18N_FACET_BEDLOAD_DIAMETER_DATA, rrenkert@6262: I18N_FACET_BEDLOAD_DIAMETER_DATA, rrenkert@6262: new Object[] { loadDiameter.toUpperCase(), rrenkert@6262: range.getFrom(), range.getTo()}), rrenkert@6262: ComputeType.ADVANCE, rrenkert@6262: stateId, rrenkert@6262: hash)); rrenkert@6262: } rrenkert@6252: } rrenkert@6252: } rrenkert@6252: rrenkert@6262: private int generateIndex(String diameter) { rrenkert@6252: int d = 0; rrenkert@6252: if(diameter.equals("d10")) { rrenkert@6252: d = 1; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d16")) { rrenkert@6252: d = 2; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d20")) { rrenkert@6252: d = 3; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d25")) { rrenkert@6252: d = 4; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d30")) { rrenkert@6252: d = 5; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d40")) { rrenkert@6252: d = 6; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d50")) { rrenkert@6252: d = 7; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d60")) { rrenkert@6252: d = 8; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d70")) { rrenkert@6252: d = 9; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d75")) { rrenkert@6252: d = 10; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d80")) { rrenkert@6252: d = 11; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d84")) { rrenkert@6252: d = 12; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("d90")) { rrenkert@6252: d = 13; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("dmin")) { rrenkert@6252: d = 14; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("dmax")) { rrenkert@6252: d = 15; rrenkert@6252: } rrenkert@6252: else if (diameter.equals("dm")) { rrenkert@6252: d = 16; rrenkert@6252: } rrenkert@6262: int ndx = d << 1; rrenkert@6252: return ndx; rrenkert@6252: } rrenkert@6252: ingo@3767: protected void generateFacets(CallContext context, List newFacets, ingo@3762: BedQualityResult[] results, String stateId, String hash) { ingo@3762: logger.debug("BedQualityState.generateFacets"); ingo@3762: ingo@3767: CallMeta meta = context.getMeta(); ingo@3767: ingo@3785: newFacets.add(new DataFacet(CSV, "CSV data", ComputeType.ADVANCE, hash, id)); ingo@3762: for (int idx = 0; idx < results.length; idx++) { ingo@3762: BedQualityResult result = results[idx]; ingo@3784: DateRange range = result.getDateRange(); ingo@3784: BedDiameterResult[] bedDiameter = result.getBedResults(); ingo@3784: for (int j = 0; j < bedDiameter.length; j++) { ingo@3784: newFacets.add(new BedDiameterFacet((idx << 8) + j, ingo@3784: BED_QUALITY_BED_DIAMETER_TOPLAYER, ingo@3784: createDiameterTopLayerDescription( ingo@3784: meta, ingo@3784: bedDiameter[j], ingo@3784: range), ingo@3762: ComputeType.ADVANCE, stateId, hash)); ingo@3762: ingo@3784: newFacets.add(new BedDiameterFacet((idx << 8) +j, ingo@3784: BED_QUALITY_BED_DIAMETER_SUBLAYER, ingo@3784: createDiameterSubLayerDescription( ingo@3784: meta, ingo@3784: bedDiameter[j], ingo@3784: range), ingo@3766: ComputeType.ADVANCE, stateId, hash)); ingo@3784: } ingo@3784: BedloadDiameterResult[] bedloadDiameter = result.getBedloadResults(); ingo@3784: for (int j = 0; j < bedloadDiameter.length; j++) { ingo@3784: newFacets.add(new BedloadDiameterFacet( ingo@3784: (idx << 8) + j, ingo@3784: BED_QUALITY_BEDLOAD_DIAMETER, ingo@3784: createDiameterDescription( ingo@3784: meta, bedloadDiameter[j]), ingo@3784: ComputeType.ADVANCE, ingo@3784: stateId, ingo@3784: hash)); ingo@3767: ingo@3784: } rrenkert@6262: if (bedDiameter.length > 0) { rrenkert@6262: BedParametersResult[] bedParameters = result.getParameters(); rrenkert@6262: for (int j = 0; j < bedParameters.length; j++) { rrenkert@6262: newFacets.add(new BedPorosityFacet((idx << 8) + j, rrenkert@6262: BED_QUALITY_POROSITY_TOPLAYER, rrenkert@6262: createPorosityTopLayerDescription( rrenkert@6262: meta, rrenkert@6262: bedParameters[j], rrenkert@6262: range), rrenkert@6262: ComputeType.ADVANCE, stateId, hash)); ingo@3767: rrenkert@6262: newFacets.add(new BedPorosityFacet((idx << 8) + j, rrenkert@6262: BED_QUALITY_POROSITY_SUBLAYER, rrenkert@6262: createPorositySubLayerDescription( rrenkert@6262: meta, rrenkert@6262: bedParameters[j], rrenkert@6262: range), rrenkert@6262: ComputeType.ADVANCE, stateId, hash)); ingo@3784: rrenkert@6262: newFacets.add(new BedDensityFacet((idx << 8) + j, rrenkert@6262: BED_QUALITY_SEDIMENT_DENSITY_TOPLAYER, rrenkert@6262: createDensityTopLayerDescription( rrenkert@6262: meta, rrenkert@6262: bedParameters[j], rrenkert@6262: range), rrenkert@6262: ComputeType.ADVANCE, stateId, hash)); ingo@3784: rrenkert@6262: newFacets.add(new BedDensityFacet((idx << 8) + j, rrenkert@6262: BED_QUALITY_SEDIMENT_DENSITY_SUBLAYER, rrenkert@6262: createDensitySubLayerDescription( rrenkert@6262: meta, rrenkert@6262: bedParameters[j], rrenkert@6262: range), rrenkert@6262: ComputeType.ADVANCE, stateId, hash)); rrenkert@6262: } ingo@3762: } ingo@3762: } ingo@3762: } ingo@3767: ingo@3767: protected String createPorosityTopLayerDescription(CallMeta meta, ingo@3784: BedParametersResult result, DateRange range) { ingo@3767: Date from = range != null ? range.getFrom() : new Date(); ingo@3767: Date to = range != null ? range.getTo() : new Date(); sascha@3772: ingo@3767: String toplayer = Resources.getMsg(meta, I18N_TOPLAYER, I18N_TOPLAYER); ingo@3767: return Resources.getMsg(meta, I18N_FACET_BED_POROSITY_TOPLAYER, ingo@3767: I18N_FACET_BED_POROSITY_TOPLAYER, new Object[] { from, to, toplayer }); ingo@3767: } ingo@3767: ingo@3767: protected String createPorositySubLayerDescription(CallMeta meta, ingo@3784: BedParametersResult result, DateRange range) { ingo@3767: Date from = range != null ? range.getFrom() : new Date(); ingo@3767: Date to = range != null ? range.getTo() : new Date(); sascha@3772: ingo@3767: String sublayer = Resources.getMsg(meta, I18N_SUBLAYER, I18N_SUBLAYER); ingo@3767: return Resources.getMsg(meta, I18N_FACET_BED_POROSITY_SUBLAYER, ingo@3767: I18N_FACET_BED_POROSITY_SUBLAYER, new Object[] { from, to, sublayer }); ingo@3767: } ingo@3767: ingo@3767: protected String createDensityTopLayerDescription(CallMeta meta, ingo@3784: BedParametersResult result, DateRange range) { ingo@3767: Date from = range != null ? range.getFrom() : new Date(); ingo@3767: Date to = range != null ? range.getTo() : new Date(); sascha@3772: ingo@3767: String toplayer = Resources.getMsg(meta, I18N_TOPLAYER, I18N_TOPLAYER); ingo@3767: return Resources.getMsg(meta, I18N_FACET_BED_DENSITY_TOPLAYER, ingo@3767: I18N_FACET_BED_DENSITY_TOPLAYER, new Object[] { from, to, toplayer }); ingo@3767: } ingo@3767: ingo@3767: protected String createDensitySubLayerDescription(CallMeta meta, ingo@3784: BedParametersResult result, DateRange range) { ingo@3767: Date from = range != null ? range.getFrom() : new Date(); ingo@3767: Date to = range != null ? range.getTo() : new Date(); sascha@3772: ingo@3767: String sublayer = Resources.getMsg(meta, I18N_SUBLAYER, I18N_SUBLAYER); ingo@3767: return Resources.getMsg(meta, I18N_FACET_BED_DENSITY_SUBLAYER, ingo@3767: I18N_FACET_BED_DENSITY_SUBLAYER, new Object[] { from, to, sublayer }); ingo@3767: } ingo@3767: ingo@3767: protected String createDiameterTopLayerDescription(CallMeta meta, ingo@3784: BedDiameterResult result, DateRange range) { ingo@3767: Date from = range != null ? range.getFrom() : new Date(); ingo@3767: Date to = range != null ? range.getTo() : new Date(); ingo@3767: ingo@3767: String toplayer = Resources.getMsg(meta, I18N_TOPLAYER, I18N_TOPLAYER); ingo@3767: ingo@3767: return Resources.getMsg(meta, I18N_FACET_BED_DIAMETER_TOPLAYER, ingo@3767: I18N_FACET_BED_DIAMETER_TOPLAYER, new Object[] { result.getType(), ingo@3767: from, to, toplayer }); ingo@3767: } ingo@3767: ingo@3767: protected String createDiameterSubLayerDescription(CallMeta meta, ingo@3784: BedDiameterResult result, DateRange range) { ingo@3767: Date from = range != null ? range.getFrom() : new Date(); ingo@3767: Date to = range != null ? range.getTo() : new Date(); sascha@3772: ingo@3767: String sublayer = Resources.getMsg(meta, I18N_SUBLAYER, I18N_SUBLAYER); ingo@3767: return Resources.getMsg(meta, I18N_FACET_BED_DIAMETER_SUBLAYER, ingo@3767: I18N_FACET_BED_DIAMETER_SUBLAYER, new Object[] { result.getType(), ingo@3767: from, to, sublayer }); ingo@3767: } ingo@3767: ingo@3767: protected String createDiameterDescription(CallMeta meta, ingo@3784: BedQualityDiameterResult result) { ingo@3767: return Resources.getMsg(meta, I18N_FACET_BEDLOAD_DIAMETER, ingo@3767: I18N_FACET_BEDLOAD_DIAMETER, new Object[] { result.getType() }); ingo@3767: } raimund@3629: } christian@3761: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :