Observation.java 15.91 KiB
/*
* Copyright (c) 2014 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSLogic.
* VIPSLogic is free software: you can redistribute it and/or modify
* it under the terms of the NIBIO Open Source License as published by
* NIBIO, either version 1 of the License, or (at your option) any
* later version.
*
* VIPSLogic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* NIBIO Open Source License for more details.
*
* You should have received a copy of the NIBIO Open Source License
* along with VIPSLogic. If not, see <http://www.nibio.no/licenses/>.
*
*/
package no.nibio.vips.logic.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlRootElement;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.validation.constraints.Size;
import no.nibio.vips.logic.util.GISUtil;
import no.nibio.vips.logic.util.StringJsonUserType;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
/**
* @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
* @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
@Entity
@Table(name = "observation")
@XmlRootElement
@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
@NamedQueries({
@NamedQuery(name = "Observation.findAll", query = "SELECT o FROM Observation o"),
@NamedQuery(name = "Observation.findByObservationId", query = "SELECT o FROM Observation o WHERE o.observationId = :observationId"),
@NamedQuery(name = "Observation.findByUserId", query = "SELECT o FROM Observation o WHERE o.userId IN(:userId)"),
@NamedQuery(name = "Observation.findByOrganizationId", query = "SELECT o FROM Observation o WHERE o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))"),
@NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeId", query = "SELECT o FROM Observation o WHERE o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)) AND o.statusTypeId= :statusTypeId"),
@NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeIdAndBroadcastMessage", query = "SELECT o FROM Observation o WHERE o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)) AND o.statusTypeId= :statusTypeId AND o.broadcastMessage IS TRUE"),
@NamedQuery(name = "Observation.findByOrganism", query = "SELECT o FROM Observation o WHERE o.organism = :organism"), @NamedQuery(name = "Observation.findByTimeOfObservation", query = "SELECT o FROM Observation o WHERE o.timeOfObservation = :timeOfObservation")
})
public class Observation implements Serializable, no.nibio.vips.observation.Observation {
private static final long serialVersionUID = 1L;
private Integer observationId;
private Date timeOfObservation;
private Organism organism;
private Organism cropOrganism;
private Integer userId;
private List<Gis> geoinfo;
private Integer locationPointOfInterestId;
//private Double observedValue;
//private Integer denominator;
//private ObservationMethod observationMethodId;
private String observationHeading;
private String observationText;
private Integer statusTypeId;
private Integer statusChangedByUserId;
private Date statusChangedTime;
private String statusRemarks;
private String observationData;
private Boolean isQuantified;
private Boolean broadcastMessage;
private String observationDataSchema;
private VipsLogicUser user; // Transient
private PointOfInterest location; // Transient
private Set<ObservationIllustration> observationIllustrationSet;
private GISUtil GISUtil;
public Observation() {
this.GISUtil = new GISUtil();
}
public Observation(Integer observationId) {
this.observationId = observationId;
}
/*public Observation(Integer observationId, Date timeOfObservation, Double registeredValue) {
this.observationId = observationId;
this.timeOfObservation = timeOfObservation;
this.observedValue = registeredValue;
}*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "observation_id")
public Integer getObservationId() {
return observationId;
}
public void setObservationId(Integer observationId) {
this.observationId = observationId;
}
@NotNull
@Basic(optional = false)
@Column(name = "time_of_observation")
@Temporal(TemporalType.TIMESTAMP)
@Override
public Date getTimeOfObservation() {
return timeOfObservation;
}
public void setTimeOfObservation(Date timeOfObservation) { this.timeOfObservation = timeOfObservation;
}
// Using PostGIS + Hibernate-spatial + Java Topology Suite to make this work
/*@JsonIgnore
@Type(type = "org.hibernate.spatial.GeometryType")
@Column(name = "location", columnDefinition = "Geometry")
public Point getLocation() {
return location;
}
public void setLocation(Point location) {
this.location = location;
}*/
public void setGeoinfos(List<Gis> geoinfo)
{
this.geoinfo = geoinfo;
}
public void addGeoInfo(Gis geoinfo)
{
if(this.geoinfo == null)
{
this.geoinfo = new ArrayList<>();
}
this.geoinfo.add(geoinfo);
}
@JsonIgnore
@Transient
public List<Gis> getGeoinfos()
{
return this.geoinfo;
}
public void setGeoinfo(String json)
{
this.setGeoinfos(this.GISUtil.getGisFromGeoJSON(json));
}
@Transient
@Override
public String getGeoinfo()
{
Map<String, Object> properties = new HashMap<>();
properties.put("observationId", this.getObservationId());
return this.GISUtil.getGeoJSONFromGis(this.geoinfo, properties);
}
/*@Transient
public Coordinate getLocationCoordinate()
{
return this.location.getCoordinate();
}*/
/*@NotNull
@Basic(optional = false)
@Column(name = "observed_value")
@Override
public Double getObservedValue() {
return observedValue;
}
public void setObservedValue(Double observedValue) {
this.observedValue = observedValue;
}
@Column(name = "denominator")
@Override
public Integer getDenominator() {
return denominator;
}
public void setDenominator(Integer denominator) {
this.denominator = denominator;
}*/
/*
@JoinColumn(name = "observation_method_id", referencedColumnName = "observation_method_id")
@ManyToOne
public ObservationMethod getObservationMethodId() {
return observationMethodId;
}
public void setObservationMethodId(ObservationMethod observationMethodId) {
this.observationMethodId = observationMethodId;
}
*/
@Override
public int hashCode() {
int hash = 0;
hash += (observationId != null ? observationId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Observation)) {
return false;
}
Observation other = (Observation) object;
if ((this.observationId == null && other.observationId != null) || (this.observationId != null && !this.observationId.equals(other.observationId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "no.nibio.vips.logic.entity.Observation[ observationId=" + observationId + " ]";
}
/**
* @return the userId
*/
@Column(name = "user_id")
public Integer getUserId() {
return userId;
}
/**
* @param userId the userId to set
*/
public void setUserId(Integer userId) {
this.userId = userId;
}
@Transient
public Integer getOrganismId() {
return this.getOrganism() != null ? this.getOrganism().getOrganismId() : null;
}
/**
* @return the organism
*/
@JoinColumn(name = "organism_id", referencedColumnName = "organism_id") @ManyToOne
//@JsonIgnore
public Organism getOrganism() {
return organism;
}
/**
* @param organism the organism to set
*/
public void setOrganism(Organism organism) {
this.organism = organism;
}
/*
@Override
@Transient
public Double getLatitude() {
return this.getLocationCoordinate().y;
}
@Override
@Transient
public Double getLongitude() {
return this.getLocationCoordinate().x;
}
*/
@Override
@Transient
public String getName() {
return this.getOrganism().getLatinName();
}
/**
* @return the observationHeading
*/
@Column(name = "observation_heading")
@Size(max = 1023)
public String getObservationHeading() {
return observationHeading;
}
/**
* @param observationHeading the observationHeading to set
*/
public void setObservationHeading(String observationHeading) {
this.observationHeading = observationHeading;
}
/**
* @return the observationText
*/
@Column(name = "observation_text")
@Size(max = 2147483647)
public String getObservationText() {
return observationText;
}
/**
* @param observationText the observationText to set
*/
public void setObservationText(String observationText) {
this.observationText = observationText;
}
/**
* @return the statusTypeId
*/
@Column(name = "status_type_id")
public Integer getStatusTypeId() { return statusTypeId;
}
/**
* @param statusTypeId the statusTypeId to set
*/
public void setStatusTypeId(Integer statusTypeId) {
this.statusTypeId = statusTypeId;
}
/**
* @return the statusChangedByUserId
*/
@Column(name = "status_changed_by_user_id")
public Integer getStatusChangedByUserId() {
return statusChangedByUserId;
}
/**
* @param statusChangedByUserId the statusChangedByUserId to set
*/
public void setStatusChangedByUserId(Integer statusChangedByUserId) {
this.statusChangedByUserId = statusChangedByUserId;
}
/**
* @return the statusChangedTime
*/
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "status_changed_time")
public Date getStatusChangedTime() {
return statusChangedTime;
}
/**
* @param statusChangedTime the statusChangedTime to set
*/
public void setStatusChangedTime(Date statusChangedTime) {
this.statusChangedTime = statusChangedTime;
}
/**
* @return the statusRemarks
*/
@Column(name = "status_remarks")
@Size(max = 2147483647)
public String getStatusRemarks() {
return statusRemarks;
}
/**
* @param statusRemarks the statusRemarks to set
*/
public void setStatusRemarks(String statusRemarks) {
this.statusRemarks = statusRemarks;
}
/**
* @return the observationData
*/
@Type(type = "StringJsonObject")
@Column(name = "observation_data")
@Override
public String getObservationData() {
return observationData;
}
/**
* @param observationData the observationData to set
*/ public void setObservationData(String observationData) {
this.observationData = observationData;
}
@Transient
public String getObservationDataSchema()
{
return this.observationDataSchema != null ? this.observationDataSchema : "";
}
public void setObservationDataSchema(String observationDataSchema)
{
this.observationDataSchema = observationDataSchema;
}
/**
* @return the isQuantified
*/
@Column(name = "is_quantified")
public Boolean getIsQuantified() {
return isQuantified;
}
/**
* @param isQuantified the isQuantified to set
*/
public void setIsQuantified(Boolean isQuantified) {
this.isQuantified = isQuantified;
}
/**
* @return the cropOrganism
*/
@JoinColumn(name = "crop_organism_id", referencedColumnName = "organism_id")
@ManyToOne
public Organism getCropOrganism() {
return cropOrganism;
}
/**
* @param cropOrganism the cropOrganism to set
*/
public void setCropOrganism(Organism cropOrganism) {
this.cropOrganism = cropOrganism;
}
@Transient
public Integer getCropOrganismId() {
return this.getCropOrganism() != null ? this.getCropOrganism().getOrganismId() : null;
}
/**
* @return the broadcastMessage
*/
@Column(name = "broadcast_message")
public Boolean getBroadcastMessage() {
return broadcastMessage;
}
/**
* @param broadcastMessage the broadcastMessage to set
*/
public void setBroadcastMessage(Boolean broadcastMessage) {
this.broadcastMessage = broadcastMessage;
}
/**
* @return the observationIllustrationSet
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "observationId", fetch = FetchType.EAGER) public Set<ObservationIllustration> getObservationIllustrationSet() {
return observationIllustrationSet;
}
/**
* @param observationIllustrationSet the observationIllustrationSet to set
*/
public void setObservationIllustrationSet(Set<ObservationIllustration> observationIllustrationSet) {
this.observationIllustrationSet = observationIllustrationSet;
}
/**
* @return the locationPointOfInterestId
*/
@Column(name = "location_point_of_interest_id")
public Integer getLocationPointOfInterestId() {
return locationPointOfInterestId;
}
/**
* @param locationPointOfInterestId the locationPointOfInterestId to set
*/
public void setLocationPointOfInterestId(Integer locationPointOfInterestId) {
this.locationPointOfInterestId = locationPointOfInterestId;
}
@Override
public int compareTo(Object t) {
return this.getTimeOfObservation().compareTo(((no.nibio.vips.observation.Observation)t).getTimeOfObservation());
}
/**
* @return the user
*/
@Transient
public VipsLogicUser getUser() {
return user;
}
/**
* @param user the user to set
*/
public void setUser(VipsLogicUser user) {
this.user = user;
}
/**
* @return the location
*/
@Transient
public PointOfInterest getLocation() {
return location;
}
/**
* @param location the location to set
*/
public void setLocation(PointOfInterest location) {
this.location = location;
}
}