/* * 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.util.Collections; import java.util.Map; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @Entity @Table(name = "value_set", uniqueConstraints = @UniqueConstraint(columnNames = { "value_table_id", "variable_entity_id" })) @NamedQueries({ // @NamedQuery(name = "findValueSetIdsByTableId", query = "SELECT id FROM ValueSetState WHERE valueTable.id = :valueTableId"), @NamedQuery(name = "findValueSetTimestampsByTableId", query = "SELECT id, created, updated FROM ValueSetState WHERE valueTable.id = :valueTableId"), @NamedQuery(name = "setLastUpdateForTableId", query = "UPDATE ValueSetState SET updated = :updated WHERE valueTable.id = :valueTableId"), @NamedQuery(name = "deleteEmptyValueSets", query = "DELETE FROM ValueSetState WHERE id NOT IN (SELECT DISTINCT(id.valueSet.id) from ValueSetValue)"), @NamedQuery(name = "deleteValueSetStates", query = "DELETE FROM ValueSetState WHERE id IN (:valueTableIds)") }) public class ValueSetState extends AbstractTimestampVersionedEntity { private static final long serialVersionUID = 1L; @ManyToOne(optional = false) @JoinColumn(name = "value_table_id") private ValueTableState valueTable; @ManyToOne(optional = false) @JoinColumn(name = "variable_entity_id") private VariableEntityState variableEntity; @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "SE_BAD_FIELD", justification = "Cannot declare as LinkedHashSet because of Hibernate: Illegal attempt to map a non collection as a @OneToMany") @OneToMany(cascade = CascadeType.ALL, mappedBy = "id.valueSet", orphanRemoval = true) private Set<ValueSetValue> values; private transient Map<String, ValueSetValue> valueMap; @SuppressWarnings("UnusedDeclaration") public ValueSetState() { } public ValueSetState(ValueTableState valueTable, VariableEntityState variableEntity) { this.valueTable = valueTable; this.variableEntity = variableEntity; } public VariableEntityState getVariableEntity() { return variableEntity; } @SuppressWarnings("UnusedDeclaration") public ValueTableState getValueTable() { return valueTable; } public Set<ValueSetValue> getValues() { return values == null ? (values = Sets.newLinkedHashSet()) : values; } public synchronized Map<String, ValueSetValue> getValueMap() { return valueMap == null ? valuesAsMap() : valueMap; } private synchronized Map<String, ValueSetValue> valuesAsMap() { if(valueMap == null) { Map<String, ValueSetValue> map = Maps.newHashMap(); for(ValueSetValue vsv : getValues()) { // log.info("{}={}", vsv.getVariable().getName(), vsv.getValue().toString()); map.put(vsv.getVariable().getName(), vsv); } valueMap = Collections.unmodifiableMap(map); } return valueMap; } }