package no.niths.domain.signaling;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import no.niths.application.rest.exception.BadRequestException;
import no.niths.common.constants.DomainConstantNames;
import no.niths.domain.Domain;
import no.niths.domain.location.Room;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;
/**
* Domain class for AccessField
*
* <p>
* AccessField has these variables:
* minRange = example 53,
* maxRange = example 64
* </p>
* <p>
* And relations too:
* AccessPoint,
* Room
* </p>
*/
@Entity
@Table(name = DomainConstantNames.ACCESS_FIELDS)
@XmlRootElement(name = "accessfield")
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class AccessField implements Domain {
private static final long serialVersionUID = 2425345455743938142L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "min_range")
private Integer minRange;
@Column(name = "max_range")
private Integer maxRange;
@JsonIgnore
@XmlTransient
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "rooms_accessfields",
joinColumns = @JoinColumn(name = "accessfield_id"),
inverseJoinColumns = @JoinColumn(name = "room_id"))
private List<Room> rooms = new ArrayList<Room>();
@ManyToOne(fetch = FetchType.LAZY)
@JoinTable(name = "accessfields_accesspoints",
joinColumns = @JoinColumn(name = "accessfield_id"),
inverseJoinColumns = @JoinColumn(name = "accesspoint_id"))
private AccessPoint accessPoint;
public AccessField() {
this(null, null);
setAccessPoint(null);
setRooms(null);
}
public AccessField(Integer min, Integer max) {
this.maxRange = max;
this.minRange = min;
validateRanges();
}
public AccessField(Long id) {
this.id = id;
}
private void validateRanges() {
if (minRange != null && maxRange != null && minRange > maxRange) {
throw new BadRequestException(
"Min range is greater than max range");
}
}
public boolean isWithinRanges(AccessField accessField) {
return
accessField.getId() == id &&
accessField.getMaxRange() <= maxRange &&
accessField.getMinRange() >= minRange;
}
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setMinRange(Integer minRange) {
this.minRange = minRange;
validateRanges();
}
@XmlElement(name = "minrange")
public Integer getMinRange() {
return minRange;
}
public void setMaxRange(Integer maxRange) {
this.maxRange = maxRange;
validateRanges();
}
@XmlElement(name = "maxrange")
public Integer getMaxRange() {
return maxRange;
}
@XmlElement(name = "accesspoint")
@JsonSerialize(as=AccessPoint.class)
public AccessPoint getAccessPoint() {
return accessPoint;
}
public void setAccessPoint(AccessPoint accessPoint) {
this.accessPoint = accessPoint;
}
public List<Room> getRooms() {
return rooms;
}
public void setRooms(List<Room> rooms) {
this.rooms = rooms;
}
@Override
public boolean equals(Object obj) {
if(obj == this) return true;
if(!(obj instanceof AccessField))return false;
AccessField af = (AccessField)obj;
return getId() == af.getId();
}
@Override
public String toString() {
return String.format("[%s][%s][%s]", id, minRange, maxRange);
}
}