teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5863: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5863: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.states; ingo@2191: ingo@2191: import java.util.Calendar; ingo@2191: import java.util.List; ingo@2191: ingo@2191: import org.apache.log4j.Logger; christian@3745: import org.hibernate.SQLQuery; ingo@2191: import org.hibernate.Session; ingo@2191: import org.hibernate.type.StandardBasicTypes; ingo@2191: teichmann@5831: import org.dive4elements.river.artifacts.FLYSArtifact; teichmann@5831: import org.dive4elements.river.backend.SessionHolder; teichmann@5831: import org.dive4elements.river.model.Gauge; teichmann@5831: import org.dive4elements.river.utils.FLYSUtils; ingo@2191: ingo@2191: ingo@2191: /** ingo@2191: * @author Ingo Weinzierl ingo@2191: */ ingo@2191: public class GaugeTimerangeState extends IntRangeState { ingo@2191: felix@5413: /** Private logger. */ ingo@2191: private static final Logger logger = christian@3745: Logger.getLogger(GaugeTimerangeState.class); ingo@2191: ingo@2191: felix@5413: /** Get 'min' and 'max'times of gauge time intervals. */ ingo@4132: protected long[] getLowerUpper(FLYSArtifact flys) { ingo@2191: Gauge gauge = FLYSUtils.getReferenceGauge(flys); ingo@2191: ingo@2191: if (gauge == null) { ingo@2191: logger.warn("No reference gauge specified!"); ingo@4132: return new long[] { 0, 0 }; ingo@2191: } ingo@2191: ingo@2191: Session session = SessionHolder.HOLDER.get(); ingo@2191: ingo@2191: SQLQuery query = session.createSQLQuery( christian@3745: "SELECT min(start_time) as min, max(stop_time) as max " + christian@3745: "FROM time_intervals WHERE id in " + christian@3745: "(SELECT time_interval_id FROM discharge_tables " + christian@3745: "WHERE gauge_id =:gid)"); ingo@2191: ingo@2191: query.addScalar("min", StandardBasicTypes.CALENDAR); ingo@2191: query.addScalar("max", StandardBasicTypes.CALENDAR); ingo@2191: ingo@2191: query.setInteger("gid", gauge.getId()); ingo@2191: christian@3745: List results = query.list(); ingo@2191: ingo@2191: if (results != null) { ingo@2191: Object[] res = (Object[]) results.get(0); ingo@2191: ingo@2191: Calendar lo = (Calendar) res[0]; ingo@2191: Calendar up = (Calendar) res[1]; ingo@2191: christian@3745: if (lo != null && up != null) { ingo@4132: return new long[] { lo.getTimeInMillis(), up.getTimeInMillis() }; christian@3745: } ingo@2191: } ingo@2191: ingo@2191: logger.warn("Could not determine time range for gauge: " + gauge); ingo@2191: ingo@2191: return null; ingo@2191: } ingo@2191: ingo@2191: ingo@2191: @Override ingo@2191: protected Object getLower(FLYSArtifact flys) { ingo@4132: long[] lowerUpper = getLowerUpper(flys); ingo@2191: ingo@2191: return lowerUpper != null ? lowerUpper[0] : 0; ingo@2191: } ingo@2191: ingo@2191: ingo@2191: @Override ingo@2191: protected Object getUpper(FLYSArtifact flys) { ingo@4132: long[] lowerUpper = getLowerUpper(flys); ingo@2191: ingo@2191: return lowerUpper != null ? lowerUpper[1] : 0; ingo@2191: } raimund@2276: raimund@2276: raimund@2276: @Override raimund@2276: protected String getUIProvider() { raimund@2276: return "gaugetimerange"; raimund@2276: } ingo@4132: ingo@4132: @Override ingo@4132: protected String getType() { ingo@4132: return "longrange"; ingo@4132: } ingo@2191: } ingo@2191: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :