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: }