gernotbelger@9404: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
gernotbelger@9404: * Software engineering by Intevation GmbH
gernotbelger@9404: *
gernotbelger@9404: * This file is Free Software under the GNU AGPL (>=v3)
gernotbelger@9404: * and comes with ABSOLUTELY NO WARRANTY! Check out the
gernotbelger@9404: * documentation coming with Dive4Elements River for details.
gernotbelger@9404: */
gernotbelger@9404:
gernotbelger@9404: package org.dive4elements.river.artifacts.services;
gernotbelger@9404:
gernotbelger@9404: import java.util.Date;
gernotbelger@9404: import java.util.List;
gernotbelger@9404:
gernotbelger@9404: import org.dive4elements.artifacts.CallMeta;
gernotbelger@9404: import org.dive4elements.artifacts.GlobalContext;
gernotbelger@9404: import org.dive4elements.artifacts.common.ArtifactNamespaceContext;
gernotbelger@9404: import org.dive4elements.artifacts.common.utils.XMLUtils;
gernotbelger@9404: import org.dive4elements.river.model.Gauge;
gernotbelger@9404: import org.dive4elements.river.model.MainValue;
gernotbelger@9404: import org.dive4elements.river.model.River;
gernotbelger@9404: import org.w3c.dom.Document;
gernotbelger@9404:
gernotbelger@9404: /**
gernotbelger@9404: * This service returns the main values of a river's gauge based on the start
gernotbelger@9404: * and end point of the river.
gernotbelger@9404: *
gernotbelger@9404: * @author Ingo Weinzierl
gernotbelger@9404: */
gernotbelger@9404: abstract public class AbstractDynamicMainValuesService extends AbstractMainValuesService {
gernotbelger@9404:
gernotbelger@9404: private static final long serialVersionUID = 1L;
gernotbelger@9404:
gernotbelger@9404: @Override
gernotbelger@9404: public Document doProcess(final Document data, final GlobalContext context, final CallMeta callMeta) {
gernotbelger@9404: try {
gernotbelger@9404:
gernotbelger@9404: final River river = getRequestedRiver(data, "/art:mainvalues/art:river/text()");
gernotbelger@9404: final Gauge gauge = getRequestedGauge(data, river);
gernotbelger@9404: final Date startTime = getRequestedStartDate(data, "/art:mainvalues/art:startDate/text()");
gernotbelger@9404: final Date endTime = getRequestedEndDate(data, "/art:mainvalues/art:endDate/text()");
gernotbelger@9404:
gernotbelger@9404: final List mainValues = getMainValues(river, gauge, startTime, endTime);
gernotbelger@9404:
gernotbelger@9404: return buildDocument(river, gauge, mainValues, context);
gernotbelger@9404: }
gernotbelger@9404: catch (final MainValuesServiceException e) {
gernotbelger@9404: // e.printStackTrace();
gernotbelger@9404: return error(e.getMessage());
gernotbelger@9404: }
gernotbelger@9404: catch (final Exception e) {
gernotbelger@9404: e.printStackTrace();
gernotbelger@9404: return error(e.getMessage());
gernotbelger@9404: }
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: public static final Date getRequestedStartDate(final Document data, final String XPATH_END_YEAR) throws MainValuesServiceException {
gernotbelger@9404:
gernotbelger@9404: final String startStr = XMLUtils.xpathString(data, XPATH_END_YEAR, ArtifactNamespaceContext.INSTANCE);
gernotbelger@9404:
gernotbelger@9404: if (startStr == null)
gernotbelger@9404: throw new MainValuesServiceException("no start date");
gernotbelger@9404:
gernotbelger@9404: try {
gernotbelger@9404: return new Date(Long.parseLong(startStr));
gernotbelger@9404: // FIXME: timezone? probably must match timezone of database
gernotbelger@9404: }
gernotbelger@9404: catch (final NumberFormatException e) {
gernotbelger@9404: e.printStackTrace();
gernotbelger@9404: throw new MainValuesServiceException("invalid start date");
gernotbelger@9404: }
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: public static final Date getRequestedEndDate(final Document data, final String XPATH_END_DATE) throws MainValuesServiceException {
gernotbelger@9404:
gernotbelger@9404: final String endStr = XMLUtils.xpathString(data, XPATH_END_DATE, ArtifactNamespaceContext.INSTANCE);
gernotbelger@9404:
gernotbelger@9404: if (endStr == null)
gernotbelger@9404: throw new MainValuesServiceException("no end date");
gernotbelger@9404:
gernotbelger@9404: try {
gernotbelger@9404: return new Date(Long.parseLong(endStr));
gernotbelger@9404: // FIXME: timezone? probably must match timezone of database
gernotbelger@9404: }
gernotbelger@9404: catch (final NumberFormatException e) {
gernotbelger@9404: e.printStackTrace();
gernotbelger@9404: throw new MainValuesServiceException("invalid end date");
gernotbelger@9404: }
gernotbelger@9404: }
gernotbelger@9404:
gernotbelger@9404: /**
gernotbelger@9404: * Computes a gauge's main values for a period of time based on its daily discharges stored in the database
gernotbelger@9404: */
gernotbelger@9404: protected abstract List getMainValues(final River river, final Gauge gauge, final Date startTime, final Date endTime)
gernotbelger@9404: throws MainValuesServiceException;
gernotbelger@9404:
gernotbelger@9404: }