teichmann@5844: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5844: * Software engineering by Intevation GmbH teichmann@5844: * teichmann@5992: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5844: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5992: * documentation coming with Dive4Elements River for details. teichmann@5844: */ teichmann@5844: teichmann@5829: package org.dive4elements.river.model; ingo@4193: tom@8412: import java.util.Iterator; aheinecke@6857: import java.util.List; tom@8412: import java.util.ArrayList; tom@8418: import java.util.Collections; tom@8418: import java.util.Comparator; tom@8412: ingo@4193: import javax.persistence.Column; ingo@4193: import javax.persistence.Entity; ingo@4193: import javax.persistence.GeneratedValue; ingo@4193: import javax.persistence.GenerationType; ingo@4193: import javax.persistence.Id; ingo@4193: import javax.persistence.JoinColumn; ingo@4193: import javax.persistence.OneToOne; ingo@4193: import javax.persistence.SequenceGenerator; ingo@4193: import javax.persistence.Table; ingo@4193: aheinecke@6857: import org.hibernate.Session; aheinecke@6857: import org.hibernate.Query; aheinecke@6857: aheinecke@6857: import org.dive4elements.river.backend.SessionHolder; ingo@4193: tom@8418: import static org.dive4elements.river.backend.utils.EpsilonComparator.CMP; tom@8418: ingo@4193: @Entity ingo@4193: @Table(name = "measurement_station") ingo@4193: public class MeasurementStation { ingo@4193: ingo@4193: private Integer id; ingo@4193: ingo@4193: private String name; ingo@4193: private String measurementType; ingo@4193: private String riverside; ingo@4193: private String operator; tom@8412: private String comment; ingo@4193: ingo@4193: private Range range; ingo@4193: ingo@4193: private Gauge gauge; rrenkert@5457: private String gaugeName; ingo@4193: ingo@4193: private TimeInterval observationTimerange; ingo@4193: tom@8418: public static final class MeasurementStationComparator tom@8418: implements Comparator { tom@8418: tom@8418: public MeasurementStationComparator() { tom@8418: } tom@8418: tom@8418: @Override tom@8418: public int compare(MeasurementStation m1, MeasurementStation m2) tom@8418: throws IllegalArgumentException { tom@8418: tom@8418: if (m1.getRange().getRiver() != m2.getRange().getRiver()) { tom@8418: throw new IllegalArgumentException( tom@8418: "Stations not at same river"); tom@8418: } tom@8418: tom@8418: boolean kmUp = m1.getRange().getRiver().getKmUp(); tom@8418: double s1 = kmUp && m1.getRange().getB() != null tom@8418: ? m1.getRange().getB().doubleValue() tom@8418: : m1.getRange().getA().doubleValue(); tom@8418: double s2 = kmUp && m2.getRange().getB() != null tom@8418: ? m2.getRange().getB().doubleValue() tom@8418: : m2.getRange().getA().doubleValue(); tom@8418: tom@8418: int cmpStations = CMP.compare(s1, s2); tom@8418: if (cmpStations == 0) { tom@8418: if (m1.getMeasurementType().equals(m2.getMeasurementType())) { tom@8418: throw new IllegalArgumentException( tom@8418: "Two stations of same type at same km"); tom@8418: } tom@8418: tom@8418: return m1.getMeasurementType().equals("Geschiebe") ? -1 : +1; tom@8418: } tom@8418: return cmpStations; tom@8418: } tom@8418: } tom@8418: bjoern@4261: public MeasurementStation() { bjoern@4261: } bjoern@4261: tom@8412: public MeasurementStation(String name, String measurementType, tom@8412: String riverside, Range range, Gauge gauge, rrenkert@5457: String gaugeName, TimeInterval observationTimerange, String operator, tom@8412: String comment rrenkert@5457: ) { ingo@4193: this.name = name; ingo@4193: this.measurementType = measurementType; ingo@4193: this.riverside = riverside; ingo@4193: this.range = range; ingo@4193: this.gauge = gauge; rrenkert@5457: this.gaugeName = gaugeName; ingo@4193: this.observationTimerange = observationTimerange; ingo@4193: this.operator = operator; tom@8412: this.comment = comment; ingo@4193: } ingo@4193: ingo@4193: @Id ingo@4193: @SequenceGenerator(name = "SEQ_MEASUREMENT_STATION_ID_SEQ", sequenceName = "MEASUREMENT_STATION_ID_SEQ", allocationSize = 1) ingo@4193: @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_MEASUREMENT_STATION_ID_SEQ") ingo@4193: @Column(name = "id") ingo@4193: public Integer getId() { ingo@4193: return id; ingo@4193: } ingo@4193: ingo@4193: public void setId(Integer id) { ingo@4193: this.id = id; ingo@4193: } ingo@4193: ingo@4193: @Column(name = "name") ingo@4193: public String getName() { ingo@4193: return name; ingo@4193: } ingo@4193: ingo@4193: public void setName(String name) { ingo@4193: this.name = name; ingo@4193: } ingo@4193: ingo@4193: @Column(name = "measurement_type") ingo@4193: public String getMeasurementType() { ingo@4193: return measurementType; ingo@4193: } ingo@4193: ingo@4193: public void setMeasurementType(String measurementType) { ingo@4193: this.measurementType = measurementType; ingo@4193: } ingo@4193: ingo@4193: @Column(name = "riverside") ingo@4193: public String getRiverside() { ingo@4193: return riverside; ingo@4193: } ingo@4193: ingo@4193: public void setRiverside(String riverside) { ingo@4193: this.riverside = riverside; ingo@4193: } ingo@4193: ingo@4193: @OneToOne ingo@4193: @JoinColumn(name = "reference_gauge_id") ingo@4193: public Gauge getGauge() { ingo@4193: return gauge; ingo@4193: } ingo@4193: ingo@4193: public void setGauge(Gauge gauge) { ingo@4193: this.gauge = gauge; ingo@4193: } ingo@4193: rrenkert@5457: @Column(name = "reference_gauge_name") rrenkert@5457: public String getGaugeName() { rrenkert@5457: return gaugeName; rrenkert@5457: } rrenkert@5457: rrenkert@5457: public void setGaugeName(String gaugeName) { rrenkert@5457: this.gaugeName = gaugeName; rrenkert@5457: } rrenkert@5457: ingo@4193: @OneToOne ingo@4193: @JoinColumn(name = "range_id") ingo@4193: public Range getRange() { ingo@4193: return range; ingo@4193: } ingo@4193: ingo@4193: public void setRange(Range range) { ingo@4193: this.range = range; ingo@4193: } ingo@4193: ingo@4193: @OneToOne tom@8412: @JoinColumn(name = "time_interval_id") ingo@4193: public TimeInterval getObservationTimerange() { ingo@4193: return observationTimerange; ingo@4193: } ingo@4193: ingo@4193: public void setObservationTimerange(TimeInterval observationTimerange) { ingo@4193: this.observationTimerange = observationTimerange; ingo@4193: } ingo@4193: ingo@4193: @Column(name = "operator") ingo@4193: public String getOperator() { ingo@4193: return operator; ingo@4193: } ingo@4193: ingo@4193: public void setOperator(String operator) { ingo@4193: this.operator = operator; ingo@4193: } ingo@4193: tom@8415: @Column(name = "commentary") tom@8412: public String getComment() { tom@8412: return comment; ingo@4193: } ingo@4193: tom@8412: public void setComment(String comment) { tom@8412: this.comment = comment; ingo@4193: } aheinecke@6857: tom@8412: public static List getStationsAtRiver(River river) { aheinecke@6857: Session session = SessionHolder.HOLDER.get(); aheinecke@6857: aheinecke@6857: Query query = session.createQuery( tom@8412: "from MeasurementStation " + tom@8412: "where range.river = :river"); tom@8412: query.setParameter("river", river); aheinecke@6857: tom@8418: List result = query.list(); tom@8418: Collections.sort(result, new MeasurementStationComparator()); tom@8418: return result; aheinecke@6857: } tom@8412: tom@8412: public static List getStationsAtKM( tom@8412: River river, tom@8412: Double river_km tom@8412: ) { tom@8412: Session session = SessionHolder.HOLDER.get(); tom@8412: tom@8412: Query query = session.createQuery( tom@8412: "from MeasurementStation where range.river = :river"); tom@8412: query.setParameter("river", river); tom@8412: tom@8412: List result = new ArrayList(); tom@8412: for (Iterator iter = query.iterate(); iter.hasNext();) { tom@8412: MeasurementStation st = (MeasurementStation)iter.next(); tom@8412: Double a = st.getRange().getA().doubleValue(); tom@8412: Double b = st.getRange().getB() == null tom@8412: ? null tom@8412: : st.getRange().getB().doubleValue(); tom@8412: tom@8412: // In case river is km_up, station is at larger value of range andre@8602: if (river.getKmUp() && b != null && CMP.compare(b, river_km) == 0 andre@8602: || !river.getKmUp() && CMP.compare(a, river_km) == 0 andre@8602: || b == null && CMP.compare(a, river_km) == 0 // no end km given tom@8412: ) { tom@8412: result.add(st); tom@8412: } tom@8412: } tom@8412: return result; tom@8412: } ingo@4193: }