# HG changeset patch # User gernotbelger # Date 1522249391 -7200 # Node ID 708f210ff242b514c840c3cae9ddd173ee5f5951 # Parent 8a1c6e2ad48b23b0ef94e9ae3842dbcf9cc4bd0d Fetching year informations for waterlevels used in sinfo diff -r 8a1c6e2ad48b -r 708f210ff242 artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstColumnFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstColumnFactory.java Wed Mar 28 17:03:11 2018 +0200 @@ -0,0 +1,41 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * Software engineering by + * Björnsen Beratende Ingenieure GmbH + * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.model; + +import java.util.List; + +import org.dive4elements.river.backend.SessionHolder; +import org.dive4elements.river.model.Wst; +import org.dive4elements.river.model.WstColumn; +import org.hibernate.Query; +import org.hibernate.Session; + +/** + * @author Gernot Belger + */ +public final class WstColumnFactory { + private WstColumnFactory() { + throw new UnsupportedOperationException("helper class"); + } + + public static WstColumn getWstColumn(final int wst_id, final int columnPosition) { + final Session session = SessionHolder.HOLDER.get(); + + final Wst wst = WstFactory.getWst(wst_id); + + final Query query = session.createQuery("from WstColumn where wst=:wst_id and position = :position"); + query.setParameter("wst_id", wst); + query.setInteger("position", columnPosition); + + final List columns = query.list(); + + return columns.isEmpty() ? null : columns.get(0); + } +} \ No newline at end of file diff -r 8a1c6e2ad48b -r 708f210ff242 artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstFactory.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstFactory.java Wed Mar 28 14:35:01 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstFactory.java Wed Mar 28 17:03:11 2018 +0200 @@ -52,5 +52,17 @@ return wsts.isEmpty() ? null : wsts.get(0); } + + + public static Wst getWst(final int id) { + final Session session = SessionHolder.HOLDER.get(); + + final Query query = session.createQuery("from Wst where id=:id"); + query.setInteger("id", id); + + final List wsts = query.list(); + + return wsts.isEmpty() ? null : wsts.get(0); + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r 8a1c6e2ad48b -r 708f210ff242 artifacts/src/main/java/org/dive4elements/river/artifacts/states/WaterlevelFetcher.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WaterlevelFetcher.java Wed Mar 28 14:35:01 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WaterlevelFetcher.java Wed Mar 28 17:03:11 2018 +0200 @@ -9,6 +9,8 @@ */ package org.dive4elements.river.artifacts.states; +import java.util.Calendar; +import java.util.Date; import java.util.List; import org.apache.log4j.Logger; @@ -24,9 +26,12 @@ import org.dive4elements.river.artifacts.model.Segment; import org.dive4elements.river.artifacts.model.WKms; import org.dive4elements.river.artifacts.model.WQKms; +import org.dive4elements.river.artifacts.model.WstColumnFactory; import org.dive4elements.river.artifacts.model.fixings.FixRealizingCalculationExtended; import org.dive4elements.river.artifacts.model.fixings.FixRealizingResult; import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; +import org.dive4elements.river.model.TimeInterval; +import org.dive4elements.river.model.WstColumn; import org.dive4elements.river.utils.RiverUtils; /** @@ -82,8 +87,9 @@ return null; } - // REMARK/TODO: instead of several helper methods here this would be a good place for abstraction, in order to push - // this logic back to the corresponding artifacts + // REMARK: instead of several helper methods here this would be a good place for abstraction, in order to push + // this logic back to the corresponding artifacts. However this will most certainly break existing + // artifact-serialization private WaterlevelData fetchStaticWKmsArtifactWaterlevel(final StaticWKmsArtifact staticWKms, final int idx, final double from, final double to) { @@ -94,8 +100,7 @@ if (wkms != null) { - // FIXME: woher bekommen?: eventuell zusammenhang mit tabelle 'time_intervals' - final int year = -1; + final int year = fetchStaticWKmsYear(staticWKms); return new WaterlevelData(wkms, year); } @@ -112,8 +117,7 @@ if (wkms != null) { - // FIXME: woher bekommen?: eventuell zusammenhang mit tabelle 'time_intervals' - final int year = -1; + final int year = fetchStaticWKmsYear(staticWKms); return new WaterlevelData(wkms, year); } @@ -164,4 +168,32 @@ return new WaterlevelData(frR.getWQKms()[idx], year, showAllGauges).filterByRange(from, to); } + + /** + * Fetches the 'year' for a staticXXX-artifact. + * REMARK: actually this should happen inside the staticWKms artifact and eventually in the WKmsFactory, but the code + * there is already awful and it will also break the old artifact-serialization... + */ + private int fetchStaticWKmsYear(final D4EArtifact staticWKms) { + + final int colPos = Integer.parseInt(staticWKms.getDataAsString("col_pos")); + final int wstId = Integer.parseInt(staticWKms.getDataAsString("wst_id")); + + final WstColumn wstColumn = WstColumnFactory.getWstColumn(wstId, colPos); + final TimeInterval timeInterval = wstColumn.getTimeInterval(); + if (timeInterval == null) + return -1; + + final Date startTime = timeInterval.getStartTime(); + if (startTime == null) + return -1; + + // REMARK: the times are stored without timezone in the DB, so it is unclear what hibernate makes of it. + // We simply use the default timezone here and hope we never get problems... + // Actually we always have 12:00 as time in the db data, so a smal timeshift due to winter/sommertime or UTC/GMT+1 will + // no change anything regarding the year. + final Calendar cal = Calendar.getInstance(); + cal.setTime(startTime); + return cal.get(Calendar.YEAR); + } } \ No newline at end of file