package com.evolveum.midpoint.repo.sql.data.common.other;
import com.evolveum.midpoint.repo.sql.data.common.RLookupTable;
import com.evolveum.midpoint.repo.sql.data.common.container.Container;
import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString;
import com.evolveum.midpoint.repo.sql.data.common.id.RContainerId;
import com.evolveum.midpoint.repo.sql.query.definition.OwnerIdGetter;
import com.evolveum.midpoint.repo.sql.query2.definition.IdQueryProperty;
import com.evolveum.midpoint.repo.sql.query2.definition.NotQueryable;
import com.evolveum.midpoint.repo.sql.type.XMLGregorianCalendarType;
import com.evolveum.midpoint.repo.sql.util.RUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Date;
/**
* @author Viliam Repan (lazyman)
*/
@Entity
@Table(indexes = {
//todo create indexes after lookup api is created (when we know how we will search through lookup table [lazyman]
// @Index(name = "iRowKey", columnList = "key"),
// @Index(name = "iRowLabelOrig", columnList = "label.orig"),
// @Index(name = "iRowLabelNorm", columnList = "label.norm")
},
uniqueConstraints = {
@UniqueConstraint(name = "uc_row_key", columnNames = {"owner_oid", "row_key"})
})
@IdClass(RContainerId.class)
public class RLookupTableRow implements Container<RLookupTable> {
//todo move to super class Container (change container to abstract class)
private Boolean trans;
private RLookupTable owner;
private String ownerOid;
private Integer id;
private String key;
private String value;
private RPolyString label;
private XMLGregorianCalendar lastChangeTimestamp;
@Id
@ForeignKey(name = "fk_lookup_table_owner")
@MapsId("owner")
@ManyToOne(fetch = FetchType.LAZY)
@Override
@NotQueryable
public RLookupTable getOwner() {
return owner;
}
@Column(name = "owner_oid", length = RUtil.COLUMN_LENGTH_OID, nullable = false)
@OwnerIdGetter()
public String getOwnerOid() {
if (owner != null && ownerOid == null) {
ownerOid = owner.getOid();
}
return ownerOid;
}
public static final String ID_COLUMN_NAME = "id";
@Id
@GeneratedValue(generator = "ContainerIdGenerator")
@GenericGenerator(name = "ContainerIdGenerator", strategy = "com.evolveum.midpoint.repo.sql.util.ContainerIdGenerator")
@Column(name = ID_COLUMN_NAME)
@IdQueryProperty
public Integer getId() {
return id;
}
@Id
@Column(name = "row_key")
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public RPolyString getLabel() {
return label;
}
public void setLabel(RPolyString label) {
this.label = label;
}
public XMLGregorianCalendar getLastChangeTimestamp() {
return lastChangeTimestamp;
}
public void setLastChangeTimestamp(XMLGregorianCalendar lastChangeTimestamp) {
this.lastChangeTimestamp = lastChangeTimestamp;
}
@Column(name = "row_value")
public String getValue() {
return value;
}
@Transient
@Override
public Boolean isTransient() {
return trans;
}
public void setValue(String value) {
this.value = value;
}
@Override
public void setOwner(RLookupTable owner) {
this.owner = owner;
}
@Override
public void setOwnerOid(String ownerOid) {
this.ownerOid = ownerOid;
}
@Override
public void setId(Integer id) {
this.id = id;
}
@Override
public void setTransient(Boolean trans) {
this.trans = trans;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RLookupTableRow that = (RLookupTableRow) o;
if (key != null ? !key.equals(that.key) : that.key != null) return false;
if (label != null ? !label.equals(that.label) : that.label != null) return false;
if (lastChangeTimestamp != null ? !lastChangeTimestamp.equals(that.lastChangeTimestamp) : that.lastChangeTimestamp != null)
return false;
if (value != null ? !value.equals(that.value) : that.value != null) return false;
return true;
}
@Override
public int hashCode() {
int result = key != null ? key.hashCode() : 0;
result = 31 * result + (value != null ? value.hashCode() : 0);
result = 31 * result + (label != null ? label.hashCode() : 0);
result = 31 * result + (lastChangeTimestamp != null ? lastChangeTimestamp.hashCode() : 0);
return result;
}
public LookupTableRowType toJAXB() {
LookupTableRowType row = new LookupTableRowType();
row.setId(Long.valueOf(id));
row.setKey(key);
row.setLastChangeTimestamp(lastChangeTimestamp);
row.setValue(value);
row.setLabel(RPolyString.copyToJAXB(label));
return row;
}
public static RLookupTableRow toRepo(RLookupTable owner, LookupTableRowType row) throws SchemaException {
RLookupTableRow rRow = toRepo(row);
rRow.setOwner(owner);
return rRow;
}
public static RLookupTableRow toRepo(String ownerOid, LookupTableRowType row) throws SchemaException {
RLookupTableRow rRow = toRepo(row);
rRow.setOwnerOid(ownerOid);
return rRow;
}
private static RLookupTableRow toRepo(LookupTableRowType row) throws SchemaException {
RLookupTableRow rRow = new RLookupTableRow();
rRow.setId(RUtil.toInteger(row.getId()));
if (row.getKey() == null) {
throw new SchemaException("Attempt to insert a row with no key");
}
rRow.setKey(row.getKey());
rRow.setLabel(RPolyString.copyFromJAXB(row.getLabel()));
rRow.setLastChangeTimestamp(row.getLastChangeTimestamp());
if (rRow.getLastChangeTimestamp() == null) {
XMLGregorianCalendar cal = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date());
rRow.setLastChangeTimestamp(cal);
row.setLastChangeTimestamp(cal);
}
rRow.setValue(row.getValue());
return rRow;
}
@Override
public String toString() {
return "RLookupTableRow{" +
"id=" + id +
", owner=" + owner +
", ownerOid='" + ownerOid + '\'' +
", key='" + key + '\'' +
", value='" + value + '\'' +
", label=" + label +
'}';
}
}