import static java.util.Collections.unmodifiableSet;
import static java.util.Objects.requireNonNull;
import static java.util.Optional.ofNullable;
import static com.aa.cleanwithus.util.ToStrings.toStringBuilder;
import java.util.Collection;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import com.aa.cleanwithus.flight.CompanyCategory;
import org.hibernate.annotations.Immutable;
@Entity(name="ReconciliationTurn")
@Table(name="reconcile_turn")
@Immutable
public class TurnEntity {
private static final Aircraft DEFAULT_AIRCRAFT = new Aircraft();
@Id
@Column(name="reconcile_turn_id")
private long id;
@Column(name="rt_station")
@NotNull
private String station;
@Column(name="rt_carrier_category")
@NotNull
private CompanyCategory carrierCategory;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="tail",column=@Column(name="rt_tail")),
@AttributeOverride(name="fleet",column=@Column(name="rt_fleet"))
})
private Aircraft aircraft;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="id",column=@Column(name="rt_in_id")),
@AttributeOverride(name="number",column=@Column(name="rt_in_number")),
@AttributeOverride(name="arrivalTime",column=@Column(name="rt_in_arr_time")),
@AttributeOverride(name="origin",column=@Column(name="rt_in_origin"))
})
private Inbound inbound;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="id",column=@Column(name="rt_out_id")),
@AttributeOverride(name="number",column=@Column(name="rt_out_number")),
@AttributeOverride(name="departureTime",column=@Column(name="rt_out_dep_time")),
@AttributeOverride(name="destination",column=@Column(name="rt_out_destination"))
})
private Outbound outbound;
@OneToMany
@JoinColumn(name="rj_turn")
private Set<JobEntity> jobs;
TurnEntity() {}
public TurnEntity(
long id,
String station,
CompanyCategory carrierCategory,
Aircraft aircraft,
Optional<Inbound> inbound,
Optional<Outbound> outbound,
Collection<? extends JobEntity> jobs
){
this.id = id;
this.station = requireNonNull(station);
this.carrierCategory = requireNonNull(carrierCategory);
this.aircraft = requireNonNull(aircraft);
this.inbound = inbound.orElse(null);
this.outbound = outbound.orElse(null);
this.jobs = new HashSet<>(jobs);
}
@Override
public String toString() {
return toStringBuilder(this)
.append("id", id)
.append("station", getStation())
.append("carrierCategory", getCarrierCategory())
.append("aircraft", getAircraft())
.append("inbound", getInbound().orElse(null))
.append("outbound", getOutbound().orElse(null))
.append("jobs", getJobs())
.build();
}
@Override
public final int hashCode() {
return Long.hashCode(getId());
}
@Override
public final boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof TurnEntity)) return false;
TurnEntity rhs = (TurnEntity)obj;
return getId() == rhs.getId();
}
public long getId() {
return id;
}
public String getStation() {
return station;
}
public CompanyCategory getCarrierCategory() {
return carrierCategory;
}
public Optional<Inbound> getInbound() {
return ofNullable(inbound);
}
public Optional<Outbound> getOutbound() {
return ofNullable(outbound);
}
public Aircraft getAircraft() {
return aircraft != null ? aircraft : DEFAULT_AIRCRAFT;
}
public Set<JobEntity> getJobs() {
return unmodifiableSet(jobs);
}
}