bjoern@4246: package de.intevation.flys.artifacts.services;
bjoern@4246:
bjoern@4246: import java.math.BigDecimal;
bjoern@4246: import java.util.List;
bjoern@4246:
bjoern@4246: import org.apache.log4j.Logger;
bjoern@4246:
bjoern@4246: import org.w3c.dom.Document;
bjoern@4246: import org.w3c.dom.Element;
bjoern@4246:
bjoern@4246: import de.intevation.artifacts.CallMeta;
bjoern@4246: import de.intevation.artifacts.GlobalContext;
bjoern@4246: import de.intevation.artifacts.common.ArtifactNamespaceContext;
bjoern@4246: import de.intevation.artifacts.common.utils.XMLUtils;
bjoern@4246:
bjoern@4246: import de.intevation.flys.artifacts.model.RiverFactory;
bjoern@4246: import de.intevation.flys.model.MeasurementStation;
bjoern@4246: import de.intevation.flys.model.Range;
bjoern@4246: import de.intevation.flys.model.River;
bjoern@4246:
bjoern@4246: /**
bjoern@4246: * @author Björn Ricks
bjoern@4246: */
bjoern@4246: public class MeasurementStationInfoService extends FLYSService {
bjoern@4246:
bjoern@4246: private static final Logger logger = Logger.getLogger(
bjoern@4246: GaugeOverviewInfoService.class);
bjoern@4246:
bjoern@4246: public static final String RIVER_XPATH = "/art:river/text()";
bjoern@4246:
bjoern@4246: @Override
bjoern@4246: public Document doProcess(
bjoern@4246: Document data,
bjoern@4246: GlobalContext globalContext,
bjoern@4246: CallMeta callMeta
bjoern@4246: ) {
bjoern@4246: logger.debug("MeasurementStationInfoService.process");
bjoern@4246:
bjoern@4246: String riverstr = XMLUtils.xpathString(
bjoern@4246: data, RIVER_XPATH, ArtifactNamespaceContext.INSTANCE);
bjoern@4246:
bjoern@4246: River river = RiverFactory.getRiver(riverstr);
bjoern@4246:
bjoern@4246: Document result = XMLUtils.newDocument();
bjoern@4246:
bjoern@4246: if (river == null) {
bjoern@4246: logger.warn("No river with name " + riverstr + " found.");
bjoern@4246: return result;
bjoern@4246: }
bjoern@4246:
bjoern@4246: XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(
bjoern@4246: result,
bjoern@4246: ArtifactNamespaceContext.NAMESPACE_URI,
bjoern@4246: ArtifactNamespaceContext.NAMESPACE_PREFIX);
bjoern@4246:
bjoern@4246: Element go = ec.create("masurement-station-info");
bjoern@4246:
bjoern@4246: double[] minmax = river.determineMinMaxDistance();
bjoern@4246: double[] minmaxq = river.determineMinMaxQ();
bjoern@4246:
bjoern@4246: Element r = ec.create("river");
bjoern@4246: ec.addAttr(r, "name", river.getName(), true);
bjoern@4246: ec.addAttr(r, "start", Double.toString(minmax[0]), true);
bjoern@4246: ec.addAttr(r, "end", Double.toString(minmax[1]), true);
bjoern@4246: ec.addAttr(r, "wstunit", river.getWstUnit().getName(), true);
bjoern@4246: ec.addAttr(r, "kmup", Boolean.toString(river.getKmUp()), true);
bjoern@4246: ec.addAttr(r, "minq", Double.toString(minmaxq[0]), true);
bjoern@4246: ec.addAttr(r, "maxq", Double.toString(minmaxq[1]), true);
bjoern@4246: ec.addAttr(r, "official", Long.toString(river.getOfficialNumber()),
bjoern@4246: true);
bjoern@4246:
bjoern@4246: Element egs = ec.create("measurement-stations");
bjoern@4246:
bjoern@4246: List mstations = river.getMeasurementStations();
bjoern@4246:
bjoern@4246: if (logger.isDebugEnabled()) {
bjoern@4246: logger.debug("Loaded stations: " + mstations);
bjoern@4246: }
bjoern@4246:
bjoern@4246: for (MeasurementStation mstation: mstations) {
bjoern@4246: Element eg = ec.create("measurement-station");
bjoern@4246:
bjoern@4246: String name = mstation.getName();
bjoern@4246: if (name != null) {
bjoern@4246: ec.addAttr(eg, "name", name, true);
bjoern@4246: }
bjoern@4246:
bjoern@4246: String type = mstation.getMeasurementType();
bjoern@4246: if (type != null) {
bjoern@4246: ec.addAttr(eg, "type", type, true);
bjoern@4246: }
bjoern@4246:
bjoern@4246: String riverside = mstation.getRiverside();
bjoern@4246: if (riverside != null) {
bjoern@4246: ec.addAttr(eg, "riverside", riverside, true);
bjoern@4246: }
bjoern@4246:
bjoern@4246: Double station = mstation.getStation();
bjoern@4246: if (station != null) {
bjoern@4246: ec.addAttr(eg, "station", Double.toString(station), true);
bjoern@4246: }
bjoern@4246:
bjoern@4246: Range range = mstation.getRange();
bjoern@4246: if (range != null) {
bjoern@4246: BigDecimal a = range.getA();
bjoern@4246: if (a != null) {
bjoern@4246: ec.addAttr(eg, "start", getStringValue(a), true);
bjoern@4246: }
bjoern@4246:
bjoern@4246: BigDecimal b = range.getB();
bjoern@4246: if (b != null) {
bjoern@4246: ec.addAttr(eg, "end", getStringValue(b), true);
bjoern@4246: }
bjoern@4246: }
bjoern@4246:
bjoern@4246: egs.appendChild(eg);
bjoern@4246: }
bjoern@4246:
bjoern@4246: go.appendChild(r);
bjoern@4246: go.appendChild(egs);
bjoern@4246: result.appendChild(go);
bjoern@4246:
bjoern@4246: return result;
bjoern@4246: }
bjoern@4246:
bjoern@4246: /**
bjoern@4246: * Returns a Double as String from a BigDecimal value.
bjoern@4246: *
bjoern@4246: * If value is null an empty String is returned.
bjoern@4246: */
bjoern@4246: private static String getStringValue(BigDecimal value) {
bjoern@4246: return value != null
bjoern@4246: ? Double.toString(value.doubleValue()) : "";
bjoern@4246: }
bjoern@4246: }