Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DischargeInfoService.java @ 3318:dbe2f85bf160
merged flys-artifacts/2.8
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:35 +0200 |
parents | 4bd3d8bbb60c |
children | 0cc2c3d89a9d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DischargeInfoService.java Fri Sep 28 12:14:35 2012 +0200 @@ -0,0 +1,128 @@ +package de.intevation.flys.artifacts.services; + +import java.util.List; +import java.util.Date; +import java.util.Calendar; +import java.util.GregorianCalendar; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import de.intevation.artifacts.CallMeta; +import de.intevation.artifacts.GlobalContext; + +import de.intevation.artifacts.common.ArtifactNamespaceContext; +import de.intevation.artifacts.common.utils.XMLUtils; + +import de.intevation.flys.model.Gauge; +import de.intevation.flys.model.DischargeTable; +import de.intevation.flys.model.TimeInterval; + +/** + * This service provides information about discharges at a defined gauge. + * + * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a> + */ +public class DischargeInfoService extends FLYSService { + + /** The logger used in this service. */ + private static Logger logger = Logger.getLogger(DischargeInfoService.class); + + public static final String GAUGE_XPATH = "/art:gauge/text()"; + + public DischargeInfoService() { + } + + + @Override + public Document doProcess( + Document data, + GlobalContext globalContext, + CallMeta callMeta + ) { + logger.debug("DischargeInfoService.process"); + + String gaugeNumber = XMLUtils.xpathString( + data, GAUGE_XPATH, ArtifactNamespaceContext.INSTANCE); + + if(gaugeNumber == null || + (gaugeNumber = gaugeNumber.trim()).length() == 0) { + logger.warn("No gauge specified. Cannot return discharge info."); + return XMLUtils.newDocument(); + } + + logger.debug("Getting discharge for gauge: " + gaugeNumber); + + long gn; + try { + gn = Long.parseLong(gaugeNumber); + } + catch (NumberFormatException nfe) { + logger.warn("Invalid gauge number. Cannot return discharg info."); + return XMLUtils.newDocument(); + } + + Gauge gauge = Gauge.getGaugeByOfficialNumber(gn); + + logger.debug("Found gauge: " + gauge.getName()); + + return buildDocument(gauge); + } + + + protected Document buildDocument(Gauge gauge) { + Document result = XMLUtils.newDocument(); + + List<DischargeTable> tables =gauge.getDischargeTables(); + + Element all = result.createElement("discharges"); + for (DischargeTable dt: tables) { + if (dt.getKind() == Gauge.MASTER_DISCHARGE_TABLE) { + continue; + } + + Element discharge = result.createElement("discharge"); + discharge.setAttribute("description", dt.getDescription()); + + // Get time interval. + TimeInterval ti = dt.getTimeInterval(); + + if (ti == null) { + logger.warn("DischargeTable has no TimeInterval set!"); + continue; + } + + Date startTime = ti.getStartTime(); + Date stopTime = ti.getStopTime(); + + // Get the year for start end end date. + int startYear; + int stopYear; + Calendar c = new GregorianCalendar(); + if (startTime != null) { + c.setTime(startTime); + startYear = c.get(Calendar.YEAR); + } + else { + startYear = -1; + } + if (stopTime != null) { + c.setTime(stopTime); + stopYear = c.get(Calendar.YEAR); + } + else { + stopYear = -1; + } + + discharge.setAttribute("start", String.valueOf(startYear)); + discharge.setAttribute("end", String.valueOf(stopYear)); + + all.appendChild(discharge); + } + result.appendChild(all); + return result; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :