package org.optaconf.domain;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.annotations.Columns;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.TypeDef;
import org.optaplanner.core.api.domain.solution.PlanningEntityCollectionProperty;
import org.optaplanner.core.api.domain.solution.PlanningSolution;
import org.optaplanner.core.api.domain.solution.Solution;
import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider;
import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import org.optaplanner.persistence.jpa.impl.score.buildin.hardsoft.HardSoftScoreHibernateType;
@PlanningSolution
@Entity(name = "optaconf_conference")
@TypeDef(defaultForType = HardSoftScore.class, typeClass = HardSoftScoreHibernateType.class)
public class Conference extends AbstractPersistable implements Solution<HardSoftScore> {
@NotNull @Size(max = 120)
private String name;
@NotNull @Size(max = 240)
private String comment;
@OneToOne(mappedBy = "conference", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private ConferenceParametrization conferenceParametrization;
@OneToMany(mappedBy = "conference", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<Day> dayList = new ArrayList<Day>();
@ValueRangeProvider(id = "timeslotRange")
@OneToMany(mappedBy = "conference", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<Timeslot> timeslotList = new ArrayList<Timeslot>();
@ValueRangeProvider(id = "roomRange")
@OneToMany(mappedBy = "conference", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<Room> roomList = new ArrayList<Room>();
@OneToMany(mappedBy = "conference", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<UnavailableTimeslotRoomPenalty> unavailableTimeslotRoomPenaltyList = new ArrayList<UnavailableTimeslotRoomPenalty>();
@OneToMany(mappedBy = "conference", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<Track> trackList = new ArrayList<Track>();
@OneToMany(mappedBy = "conference", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<Speaker> speakerList = new ArrayList<Speaker>();
@PlanningEntityCollectionProperty
@OneToMany(mappedBy = "conference", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<Talk> talkList = new ArrayList<Talk>();
@OneToMany(mappedBy = "conference", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<SpeakingRelation> speakingRelationList = new ArrayList<SpeakingRelation>();
@OneToMany(mappedBy = "conference", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<TalkExclusion> talkExclusionList = new ArrayList<TalkExclusion>();
@Columns(columns = {@Column(name = "hardScore"), @Column(name="softScore")})
private HardSoftScore score;
public Conference() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public ConferenceParametrization getConferenceParametrization() {
return conferenceParametrization;
}
public void setConferenceParametrization(ConferenceParametrization conferenceParametrization) {
this.conferenceParametrization = conferenceParametrization;
}
public List<Day> getDayList() {
return dayList;
}
public void setDayList(List<Day> dayList) {
this.dayList = dayList;
}
public List<Timeslot> getTimeslotList() {
return timeslotList;
}
public void setTimeslotList(List<Timeslot> timeslotList) {
this.timeslotList = timeslotList;
}
public List<Room> getRoomList() {
return roomList;
}
public void setRoomList(List<Room> roomList) {
this.roomList = roomList;
}
public List<UnavailableTimeslotRoomPenalty> getUnavailableTimeslotRoomPenaltyList() {
return unavailableTimeslotRoomPenaltyList;
}
public void setUnavailableTimeslotRoomPenaltyList(
List<UnavailableTimeslotRoomPenalty> unavailableTimeslotRoomPenaltyList) {
this.unavailableTimeslotRoomPenaltyList = unavailableTimeslotRoomPenaltyList;
}
public List<Track> getTrackList() {
return trackList;
}
public void setTrackList(List<Track> trackList) {
this.trackList = trackList;
}
public List<Speaker> getSpeakerList() {
return speakerList;
}
public void setSpeakerList(List<Speaker> speakerList) {
this.speakerList = speakerList;
}
public List<Talk> getTalkList() {
return talkList;
}
public void setTalkList(List<Talk> talkList) {
this.talkList = talkList;
}
public List<TalkExclusion> getTalkExclusionList() {
return talkExclusionList;
}
public List<SpeakingRelation> getSpeakingRelationList() {
return speakingRelationList;
}
public void setSpeakingRelationList(List<SpeakingRelation> speakingRelationList) {
this.speakingRelationList = speakingRelationList;
}
public void setTalkExclusionList(List<TalkExclusion> talkExclusionList) {
this.talkExclusionList = talkExclusionList;
}
public HardSoftScore getScore() {
return score;
}
public void setScore(HardSoftScore score) {
this.score = score;
}
// ************************************************************************
// Real methods
// ************************************************************************
@Override
@JsonIgnore
public Collection<?> getProblemFacts() {
List<Object> facts = new ArrayList<Object>();
facts.add(conferenceParametrization);
facts.addAll(dayList);
facts.addAll(timeslotList);
facts.addAll(roomList);
facts.addAll(unavailableTimeslotRoomPenaltyList);
facts.addAll(trackList);
facts.addAll(speakerList);
facts.addAll(speakingRelationList);
facts.addAll(talkList);
facts.addAll(talkExclusionList);
// Do not add the planning entity's (talkList) because that will be done automatically
return facts;
}
}