package org.visico.neighborhoodpss.gwt.server.project.db;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
import java.util.HashSet;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.visico.neighborhoodpss.domain.project.BuildingDataTypeDTO;
import org.visico.neighborhoodpss.domain.project.ProjectDTO;
import org.visico.neighborhoodpss.domain.project.ScenarioDTO;
import org.visico.neighborhoodpss.domain.project.UserDTO;
@Entity
@Table(name="PROJECT")
public class Project implements Cloneable, Serializable
{
/**
*
*/
private static final long serialVersionUID = -1996881128129978288L;
@Id
@GeneratedValue
private int id;
@Column
private String name;
@Column
private double latitude;
@Column
private double longitude;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="project_id")
Set<Scenario> parentScenarios = new HashSet<Scenario>();
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name="PROJECT_USER",
joinColumns=@JoinColumn(name="project_id"),
inverseJoinColumns=@JoinColumn(name="user_id")
)
Set<User> users = new HashSet<User>();
@ManyToMany
@JoinTable(
name="BUILDING_DATA_TYPE_PROJECT",
joinColumns=@JoinColumn(name="project_id"),
inverseJoinColumns=@JoinColumn(name="building_data_type_id")
)
Set<BuildingDataType> buildingDataTypes = new HashSet<BuildingDataType>();
@Transient
private ProjectDTO dto_object = null;
public Project()
{
}
public Project(ProjectDTO dto)
{
this.dto_object = dto;
this.id = dto.getId();
this.name = dto.getName();
this.latitude = dto.getLatitude();
this.longitude = dto.getLongitude();
Iterator<ScenarioDTO> it = this.dto_object.getParent_scenarios().iterator();
while(it.hasNext())
{
this.addParentScenario( new Scenario(it.next()));
}
Iterator<UserDTO> uit = this.dto_object.getUsers().iterator();
while(uit.hasNext())
{
this.addUser( new User(uit.next()));
}
for (BuildingDataTypeDTO type : this.dto_object.getBuildingDataTypes())
this.buildingDataTypes.add(new BuildingDataType(type));
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
public Set<Scenario> getParentScenarios() {
return parentScenarios;
}
public void setParentScenarios(Set<Scenario> parentScenarios) {
this.parentScenarios = parentScenarios;
}
public void addParentScenario(Scenario s)
{
this.parentScenarios.add(s);
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
public void addUser(User u)
{
this.users.add(u);
}
public Set<BuildingDataType> getBuildingDataTypes() {
return buildingDataTypes;
}
public void setBuildingDataTypes(Set<BuildingDataType> buildingDataTypes) {
this.buildingDataTypes = buildingDataTypes;
}
public ProjectDTO getDto_object() {
if (dto_object == null)
{
dto_object = new ProjectDTO();
dto_object.setId(id);
dto_object.setLatitude(latitude);
dto_object.setLongitude(longitude);
dto_object.setName(name);
for (Scenario s : getParentScenarios())
{
dto_object.addParentScenario(s.getDto_object());
}
for (User u : getUsers())
{
dto_object.addUser(u.getDto_object());
}
for (BuildingDataType d : getBuildingDataTypes())
{
dto_object.getBuildingDataTypes().add(d.getDto_object());
}
}
return dto_object;
}
public void setDto_object(ProjectDTO dto_object) {
this.dto_object = dto_object;
}
public void update_dtoIds()
{
this.dto_object.setId(this.id);
Iterator<Scenario> sit = this.getParentScenarios().iterator();
while(sit.hasNext())
{
sit.next().update_dtoIds();
}
Iterator<User> uit = this.getUsers().iterator();
while(uit.hasNext())
{
uit.next().update_dtoIds();
}
for (BuildingDataType d : buildingDataTypes)
d.update_dtoIds();
}
public static ArrayList<ProjectDTO> getDTOList(ArrayList<Project> projects)
{
ArrayList<ProjectDTO> dtos = new ArrayList<ProjectDTO>();
for (Project p : projects)
dtos.add(p.getDto_object());
return dtos;
}
}