/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma.datasource.hibernate.domain;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
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.Version;
import javax.validation.constraints.NotNull;
import org.hibernate.annotations.Columns;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.obiba.magma.Value;
import org.obiba.magma.datasource.hibernate.type.ValueHibernateType;
import com.google.common.base.Objects;
@Entity
@Table(name = "value_set_value")
@TypeDef(name = "value", typeClass = ValueHibernateType.class)
@NamedQueries({ //
@NamedQuery(name = "findValuesByTable",
query = "SELECT vsv FROM ValueSetValue vsv WHERE vsv.id.valueSet " + //
"IN (SELECT vs.id FROM ValueSetState vs WHERE vs.valueTable.id = :valueTableId)"),
@NamedQuery(name = "deleteValueSetValues",
query = "DELETE FROM ValueSetValue WHERE id.valueSet.id IN (:valueSetIds)"),
@NamedQuery(name = "deleteVariableValueSetValues",
query = "DELETE FROM ValueSetValue WHERE id.variable.id = :variableId") })
public class ValueSetValue implements Timestamped, Serializable {
private static final long serialVersionUID = 4356913652103162813L;
@EmbeddedId
private ValueSetValueId id;
@Type(type = "value")
@Columns(columns = { //
@Column(name = "value_type", nullable = false), //
@Column(name = "is_sequence", nullable = false), //
@Column(name = "value", length = Integer.MAX_VALUE, nullable = false) })
private Value value;
@SuppressWarnings("FieldMayBeFinal")
@Temporal(TemporalType.TIMESTAMP)
@Column(insertable = true, updatable = false, nullable = false)
private Date created = new Date();
@Version
@Column(nullable = false)
private Date updated;
@SuppressWarnings("UnusedDeclaration")
public ValueSetValue() {
}
public ValueSetValue(@NotNull VariableState variable, @NotNull ValueSetState valueSet) {
//noinspection ConstantConditions
if(variable == null) throw new IllegalArgumentException("variable cannot be null");
//noinspection ConstantConditions
if(valueSet == null) throw new IllegalArgumentException("valueSet cannot be null");
id = new ValueSetValueId(variable, valueSet);
}
public void setValue(Value value) {
if(value.isNull()) {
throw new IllegalArgumentException("cannot persist null values");
}
this.value = value;
}
public Value getValue() {
return value;
}
@Override
public Date getCreated() {
return new Date(created.getTime());
}
@Override
public Date getUpdated() {
return new Date(updated.getTime());
}
public ValueSetState getValueSet() {
return id.valueSet;
}
public VariableState getVariable() {
return id.variable;
}
@Embeddable
public final static class ValueSetValueId implements Serializable {
private static final long serialVersionUID = 4020718518680731845L;
@ManyToOne(optional = false)
@JoinColumn(name = "value_set_id", referencedColumnName = "id")
private ValueSetState valueSet;
@ManyToOne(optional = false)
@JoinColumn(name = "variable_id", referencedColumnName = "id")
private VariableState variable;
public ValueSetValueId() {
}
public ValueSetValueId(VariableState variable, ValueSetState valueSet) {
this.valueSet = valueSet;
this.variable = variable;
}
@Override
public int hashCode() {
return Objects.hashCode(valueSet, variable);
}
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(obj == null || getClass() != obj.getClass()) return false;
ValueSetValueId other = (ValueSetValueId) obj;
return Objects.equal(valueSet, other.valueSet) && Objects.equal(variable, other.variable);
}
}
}