package org.visico.neighborhoodpss.gwt.server.project.db;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.visico.neighborhoodpss.domain.project.BuildingDTO;
import org.visico.neighborhoodpss.domain.project.BuildingNetworkDTO;
import org.visico.neighborhoodpss.domain.project.GeoNetworkDTO;
import org.visico.neighborhoodpss.domain.project.ScenarioDTO;
import javax.persistence.*;
@Entity
@Table(name="SCENARIO")
public class Scenario implements Cloneable, Serializable
{
// label is automatically created
@Id
@GeneratedValue
private int id;
@Column
private String label;
@Column
private String name;
@Column
private String description;
@ManyToOne(cascade = CascadeType.ALL)
private Scenario parent;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="scenario_id")
private Set<Building> buildings = new HashSet<Building>();
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="scenario_id")
private Set<GeoNetwork> geonetworks = new HashSet<GeoNetwork>();
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="scenario_id")
private Set<BuildingNetwork> buildingnetworks = new HashSet<BuildingNetwork>();
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="parent_id")
private Set<Scenario> children = new HashSet<Scenario>();
public Set<GeoNetwork> getNetworks() {
return geonetworks;
}
public void setNetworks(Set<GeoNetwork> networks) {
this.geonetworks = networks;
}
@Transient
private ScenarioDTO dto_object = null;
/**
*
*/
private static final long serialVersionUID = 732022436294521332L;
/**
*
*
* @param n
*/
public static Set<Scenario> createFromParentDTO(ScenarioDTO parentScenario)
{
HashSet<Scenario> scenarios = new HashSet<Scenario>();
Scenario p = new Scenario(parentScenario);
scenarios.add(p);
Iterator<ScenarioDTO> it = parentScenario.getChildren().iterator();
while (it.hasNext())
{
ScenarioDTO child = it.next();
scenarios.addAll(createDTO(child, p));
}
return scenarios;
}
/** Recursive function to generate all children DTOs from the scenario hierarchy.
*
* @param parent_dto
* @param parent
* @return
*/
private static Set<Scenario> createDTO(ScenarioDTO child_dto, Scenario parent)
{
HashSet<Scenario> scenarios = new HashSet<Scenario>();
Scenario s = new Scenario(child_dto, parent);
scenarios.add(s);
Iterator<ScenarioDTO> it = child_dto.getChildren().iterator();
while (it.hasNext())
{
ScenarioDTO child = it.next();
scenarios.addAll(createDTO(child, s));
}
return scenarios;
}
public Scenario (String n)
{
label = "";
name = n;
}
public Scenario()
{
}
/** construction to construct Scenario object from DTO without parent
*
* @param s_dto
*/
public Scenario(ScenarioDTO s_dto)
{
this.label = s_dto.label();
this.name = s_dto.getName();
this.description = s_dto.getDescription();
this.id = s_dto.getId();
this.dto_object = s_dto;
copyDependentObjects(s_dto);
}
/**
* construct scenario with parent.
* @param s_dto and the parent
*/
private Scenario(ScenarioDTO s_dto, Scenario parent)
{
this.label = s_dto.label();
this.name = s_dto.getName();
this.description = s_dto.getDescription();
this.id = s_dto.getId();
this.parent = parent;
this.dto_object = s_dto;
copyDependentObjects(s_dto);
}
private void copyDependentObjects(ScenarioDTO s_dto)
{
Iterator<BuildingDTO> itb = s_dto.getBuildingDTOs().iterator();
while (itb.hasNext())
{
BuildingDTO b = itb.next();
this.addBuilding(new Building(b));
}
Iterator<GeoNetworkDTO> itn = s_dto.getNetworkDTOs().iterator();
while (itn.hasNext())
{
GeoNetworkDTO n = itn.next();
this.addGeoNetwork(new GeoNetwork(n));
}
Iterator<BuildingNetworkDTO> itbn = s_dto.getBuildingNetworkDTOs().iterator();
while (itbn.hasNext())
{
BuildingNetworkDTO n = itbn.next();
this.addBuildingNetwork(new BuildingNetwork(n));
}
Iterator<ScenarioDTO> its = s_dto.getChildren().iterator();
while (its.hasNext())
{
this.addChild(new Scenario(its.next()));
}
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Scenario getParent() {
return parent;
}
public void setParent(Scenario parent) {
this.parent = parent;
}
public Set<Scenario> getChildren() {
return children;
}
public void setChildren(Set<Scenario> children) {
this.children = children;
}
public Set<Building> getBuildings() {
return buildings;
}
public void setBuildings(Set<Building> buildings) {
this.buildings = buildings;
}
public void addBuilding(Building b)
{
buildings.add(b);
}
public void addGeoNetwork (GeoNetwork n)
{
geonetworks.add(n);
}
public void addBuildingNetwork (BuildingNetwork n)
{
buildingnetworks.add(n);
}
public String label()
{
return label;
}
public void addChild(Scenario child)
{
children.add(child);
}
public boolean hasParent()
{
if (parent == null)
return false;
else
return true;
}
public Scenario createChild()
{
Scenario child;
child = (Scenario)this.clone();
return child;
}
protected Scenario clone()
{
Scenario child = new Scenario();
if (parent == null)
{
child.label = Integer.toString(children.size());
}
else
{
child.label = label + "." + Integer.toString(children.size());
}
child.name = this.getName();
child.description = this.description;
child.id = this.id;
child.parent = this;
child.children = new HashSet<Scenario>();
child.buildings = new HashSet<Building>();
child.buildings.addAll(this.buildings);
child.geonetworks = new HashSet<GeoNetwork>();
child.geonetworks.addAll(this.geonetworks);
child.buildingnetworks = new HashSet<BuildingNetwork>();
child.buildingnetworks.addAll(this.buildingnetworks);
this.children.add(child);
return child;
}
public ScenarioDTO getDto_object() {
if (dto_object == null)
{
dto_object = new ScenarioDTO();
dto_object.setId(this.getId());
dto_object.setLabel(this.getLabel());
dto_object.setName(this.getName());
dto_object.setDescription(this.getDescription());
if (this.parent != null)
dto_object.setParent(this.getParent().dto_object);
for (Building b : buildings)
dto_object.addBuilingDTO(b.getDto_object());
for (GeoNetwork n : geonetworks)
dto_object.addGeoNetworkDTO(n.getDto_object());
for (GeoNetwork n : geonetworks)
dto_object.addGeoNetworkDTO(n.getDto_object());
for (BuildingNetwork n : buildingnetworks)
dto_object.addBuildingNetworkDTO(n.getDto_object());
for (Scenario c : children)
dto_object.addChild(c.getDto_object());
}
return dto_object;
}
public void setDto_object(ScenarioDTO dto_object) {
this.dto_object = dto_object;
}
public void update_dtoIds()
{
this.dto_object.setId(this.id);
Iterator<Building> bit = buildings.iterator();
while(bit.hasNext())
{
Building b = bit.next();
b.update_dtoIds();
}
Iterator<GeoNetwork> nit = geonetworks.iterator();
while(nit.hasNext())
{
GeoNetwork n = nit.next();
n.update_dtoIds();
}
}
}