gernotbelger@9288: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
gernotbelger@9288: * Software engineering by Intevation GmbH
gernotbelger@9288: *
gernotbelger@9288: * This file is Free Software under the GNU AGPL (>=v3)
gernotbelger@9288: * and comes with ABSOLUTELY NO WARRANTY! Check out the
gernotbelger@9288: * documentation coming with Dive4Elements River for details.
gernotbelger@9288: */
gernotbelger@9288:
gernotbelger@9288: package org.dive4elements.river.artifacts.services;
gernotbelger@9288:
gernotbelger@9288: import java.math.BigDecimal;
gernotbelger@9288: import java.util.ArrayList;
gernotbelger@9288: import java.util.Calendar;
gernotbelger@9288: import java.util.Date;
gernotbelger@9288: import java.util.List;
gernotbelger@9288:
gernotbelger@9288: import org.dive4elements.artifacts.CallMeta;
gernotbelger@9288: import org.dive4elements.artifacts.GlobalContext;
gernotbelger@9288: import org.dive4elements.artifacts.common.ArtifactNamespaceContext;
gernotbelger@9288: import org.dive4elements.artifacts.common.utils.XMLUtils;
gernotbelger@9288: import org.dive4elements.river.model.Gauge;
gernotbelger@9288: import org.dive4elements.river.model.MainValue;
gernotbelger@9288: import org.dive4elements.river.model.MainValueType;
gernotbelger@9288: import org.dive4elements.river.model.MainValueType.MainValueTypeKey;
gernotbelger@9288: import org.dive4elements.river.model.NamedMainValue;
gernotbelger@9288: import org.dive4elements.river.model.OfficialLine;
gernotbelger@9288: import org.dive4elements.river.model.River;
gernotbelger@9288: import org.dive4elements.river.model.TimeInterval;
gernotbelger@9288: import org.w3c.dom.Document;
gernotbelger@9288:
gernotbelger@9288: /**
gernotbelger@9288: * This service returns the main values of a river's gauge based on the start
gernotbelger@9288: * and end point of the river.
gernotbelger@9288: *
gernotbelger@9288: * @author Ingo Weinzierl
gernotbelger@9288: */
gernotbelger@9288: public class DynamicMainValuesService extends AbstractMainValuesService {
gernotbelger@9288:
gernotbelger@9288: private static final long serialVersionUID = 1L;
gernotbelger@9288:
gernotbelger@9288: private static final String XPATH_START_YEAR = "/art:mainvalues/art:startYear/text()";
gernotbelger@9288:
gernotbelger@9288: private static final String XPATH_END_YEAR = "/art:mainvalues/art:endYear/text()";
gernotbelger@9288:
gernotbelger@9288: @Override
gernotbelger@9288: public Document doProcess(final Document data, final GlobalContext context, final CallMeta callMeta) {
gernotbelger@9288: try {
gernotbelger@9288:
gernotbelger@9288: final River river = getRequestedRiver(data);
gernotbelger@9288: final Gauge gauge = getRequestedGauge(data, river);
gernotbelger@9288: final Date startTime = getRequestedStartYear(data);
gernotbelger@9288: final Date endTime = getRequestedEndYear(data);
gernotbelger@9288:
gernotbelger@9288: final List mainValues = getMainValues(river, gauge, startTime, endTime);
gernotbelger@9288:
gernotbelger@9288: return buildDocument(river, gauge, mainValues, context);
gernotbelger@9288: }
gernotbelger@9288: catch (final MainValuesServiceException e) {
gernotbelger@9288: e.printStackTrace();
gernotbelger@9288: return error(e.getMessage());
gernotbelger@9288: }
gernotbelger@9288: }
gernotbelger@9288:
gernotbelger@9288: private Date getRequestedStartYear(final Document data) throws MainValuesServiceException {
gernotbelger@9288:
gernotbelger@9288: final String startStr = XMLUtils.xpathString(data, XPATH_START_YEAR, ArtifactNamespaceContext.INSTANCE);
gernotbelger@9288:
gernotbelger@9288: if (startStr == null)
gernotbelger@9288: throw new MainValuesServiceException("no start year");
gernotbelger@9288:
gernotbelger@9288: try {
gernotbelger@9288: final int year = Integer.parseInt(startStr);
gernotbelger@9288:
gernotbelger@9288: // FIXME: timezone? probably must match timezone of database
gernotbelger@9288: final Calendar cal = Calendar.getInstance();
gernotbelger@9288: cal.clear();
gernotbelger@9288: cal.set(year, 0, 1);
gernotbelger@9288: return cal.getTime();
gernotbelger@9288: }
gernotbelger@9288: catch (final NumberFormatException e) {
gernotbelger@9288: e.printStackTrace();
gernotbelger@9288: throw new MainValuesServiceException("invalid start year");
gernotbelger@9288: }
gernotbelger@9288: }
gernotbelger@9288:
gernotbelger@9288: private Date getRequestedEndYear(final Document data) throws MainValuesServiceException {
gernotbelger@9288:
gernotbelger@9288: final String endStr = XMLUtils.xpathString(data, XPATH_END_YEAR, ArtifactNamespaceContext.INSTANCE);
gernotbelger@9288:
gernotbelger@9288: if (endStr == null)
gernotbelger@9288: throw new MainValuesServiceException("no end year");
gernotbelger@9288:
gernotbelger@9288: try {
gernotbelger@9288: final int year = Integer.parseInt(endStr);
gernotbelger@9288:
gernotbelger@9288: // FIXME: timezone? probably must match timezone of database
gernotbelger@9288: final Calendar cal = Calendar.getInstance();
gernotbelger@9288: cal.clear();
gernotbelger@9288: cal.set(year, 11, 31);
gernotbelger@9288: return cal.getTime();
gernotbelger@9288: }
gernotbelger@9288: catch (final NumberFormatException e) {
gernotbelger@9288: e.printStackTrace();
gernotbelger@9288: throw new MainValuesServiceException("invalid end year");
gernotbelger@9288: }
gernotbelger@9288: }
gernotbelger@9288:
gernotbelger@9288: /**
gernotbelger@9288: * This method creates the result document that includes the main values of
gernotbelger@9288: * the specified gauge.
gernotbelger@9288: *
gernotbelger@9288: * @param river
gernotbelger@9288: * The river.
gernotbelger@9288: * @param gauge
gernotbelger@9288: * The gauge.
gernotbelger@9288: * @param endYear
gernotbelger@9288: * @param startYear
gernotbelger@9288: *
gernotbelger@9288: * @return a document that includes the main values of the specified river
gernotbelger@9288: * at the specified gauge.
gernotbelger@9288: */
gernotbelger@9288: protected List getMainValues(final River river, final Gauge gauge, final Date startTime, final Date endTime) {
gernotbelger@9288:
gernotbelger@9288: // TODO: compute our own main values from the discharge timeseries.
gernotbelger@9288:
gernotbelger@9288: // final List mainValues = gauge.getMainValues();
gernotbelger@9288: final List mainValues = new ArrayList<>();
gernotbelger@9288:
gernotbelger@9288: final MainValue myMain = new MainValue();
gernotbelger@9288:
gernotbelger@9288: // TODO: fetch real NamedMainValue from database: GLQ20, MNQ, MQ, MHQ, HQ5 + Dauerzahlen
gernotbelger@9288: final NamedMainValue mainValue = new NamedMainValue("Testname", new MainValueType(MainValueTypeKey.Q.getName()));
gernotbelger@9288: mainValue.setOfficialLines(new ArrayList());
gernotbelger@9288:
gernotbelger@9288: myMain.setMainValue(mainValue);
gernotbelger@9288: // FIXME: compute value
gernotbelger@9288: myMain.setValue(new BigDecimal("1234.567"));
gernotbelger@9288:
gernotbelger@9288: final TimeInterval timeInterval = new TimeInterval(startTime, endTime);
gernotbelger@9288: myMain.setTimeInterval(timeInterval);
gernotbelger@9288:
gernotbelger@9288: mainValues.add(myMain);
gernotbelger@9288:
gernotbelger@9288: return mainValues;
gernotbelger@9288: }
gernotbelger@9288: }