package cz.cvut.fel.adaptiverestfulapi.example.model;
import javax.persistence.*;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
@Entity
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@Column
private Date startedAt;
@OneToMany(mappedBy = "project", cascade = CascadeType.ALL)
private List<Bug> bugs;
@OneToMany(mappedBy = "project", cascade = CascadeType.ALL)
private List<Task> tasks;
@ManyToOne
private Employee manager;
public Project() {
this("New Project", new LinkedList<Bug>(), new LinkedList<Task>(), null);
}
public Project(String name, List<Bug> bugs, List<Task> tasks, Employee manager) {
this.setName(name);
this.setBugs(bugs);
this.setTasks(tasks);
this.setManager(manager);
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public void setLowerCasedName(String name) {
this.setName(name != null ? name.toUpperCase() : null);
}
public Date getStartedAt() {
return this.startedAt;
}
public void setStartedAt(Date startedAt) {
this.startedAt = startedAt;
}
public boolean isStarted() {
return this.getStartedAt() != null;
}
public void setStarted(boolean started) {
this.setStartedAt(started ? new Date() : null);
}
public List<Bug> getBugs() {
return this.bugs;
}
public void setBugs(List<Bug> bugs) {
this.bugs = bugs;
}
public void addBug(Bug bug) {
if (this.bugs.contains(bug)) {
return;
}
this.bugs.add(bug);
bug.setProject(this);
}
public void removeBug(Bug bug) {
if (!this.bugs.contains(bug)) {
return;
}
this.bugs.remove(bug);
bug.setProject(null);
}
public List<Task> getTasks() {
return this.tasks;
}
public void setTasks(List<Task> tasks) {
this.tasks = tasks;
}
public void addTask(Task task) {
if (this.tasks.contains(task)) {
return;
}
this.tasks.add(task);
task.setProject(this);
}
public void removeTask(Task task) {
if (!this.tasks.contains(task)) {
return;
}
this.tasks.remove(task);
task.setProject(null);
}
public Employee getManager() {
return this.manager;
}
public void setManager(Employee manager) {
if (this.same(manager)) {
return;
}
Employee old = this.manager;
this.manager = manager;
if (old != null) {
old.removeManagedProject(this);
}
if (this.manager != null) {
this.manager.addManagedProject(this);
}
}
private boolean same(Employee manager) {
return (this.manager == null) ? manager == null : this.manager.equals(manager);
}
}