package org.visico.neighborhoodpss.deterioationindicator; import java.io.File; import java.util.ArrayList; import java.util.Set; import org.visico.neighborhoodpss.domain.project.BuildingDTO; import org.visico.neighborhoodpss.domain.project.ScenarioDTO; import org.visico.neighborhoodpss.plugin.IndicatorPlugin; import org.visico.neighborhoodpss.plugin.buildingvisualization.BuildingVisualization; import org.visico.neighborhoodpss.plugin.buildingvisualization.BuildingVisualizationList; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; /** * @author HartmannT * */ public class DeterioationIndicator extends IndicatorPlugin { private static int TIME_STEPS = 1; private static double threshold = 0.99; ScenarioDTO scenario; BuildingGraph graph = new BuildingGraph(); @Override public void calculate(ScenarioDTO scenario) { this.scenario = scenario; createGraph(); propagateDeterioation(); generateOutput(); } private void generateOutput() { // create the jaxb class BuildingVisualizationList xmlListClass = new BuildingVisualizationList(); for (BuildingNode b : graph.nodes) { BuildingVisualization viz = new BuildingVisualization(); viz.setBuildingID(b.getBuilding().getId()); viz.setColor(getConditionDisplayColor(b.getCondition())); xmlListClass.getBuilding().add(viz); } try { // marshall the class File file = new File("Deterioation_"+ scenario.getId() + ".xml"); JAXBContext jaxbContext = JAXBContext.newInstance(BuildingVisualizationList.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); // output pretty printed jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal(xmlListClass, file); jaxbMarshaller.marshal(xmlListClass, System.out); } catch(Exception ex) { ex.printStackTrace(); } } private String getConditionDisplayColor(int condition) { String color; switch(condition) { case 1: color = "#40FF00"; break; case 2: color = "#FFFF00"; break; case 3: color = "#FF8000"; break; case 4: color = "#FF0000"; break; case 5: color = "#3B0B0B"; break; default: color = "#FFFFFF"; } return color; } private void propagateDeterioation() { for (int i=0; i< TIME_STEPS; i++) deterioate(); } public Set<BuildingNode> getBuildingNodes() { return graph.nodes; } public void createGraph() { for (BuildingDTO b : scenario.getBuildingDTOs()) { BuildingNode node = new BuildingNode(b); graph.addNode(node); } graph.buildGraph(); } /** * * @return an double array of size 4 with the min and max coordinates */ public double[] getScaleInfo() { double[] widthHeight = new double[4]; double min_x = Double.MAX_VALUE, max_x = 0, min_y = Double.MAX_VALUE, max_y = 0; for (BuildingNode n : graph.getNodes()) { double x = n.x(); double y = n.y(); if (x < min_x) min_x = x; if (x > max_x) max_x = x; if (y < min_y) min_y = y; if (y > max_y) max_y = y; } widthHeight[0] = min_x; widthHeight[1] = min_y; widthHeight[2] = max_x; widthHeight[3] = max_y; return widthHeight; } public void deterioate() { for (BuildingNode n : graph.getNodes()) { int surroundingConditionAgg = 0; int surroundingBuildings = 0; for (BuildingNode neighbors : graph.getNeighbors(n) ) { surroundingBuildings++; if (neighbors instanceof BuildingNode) { surroundingConditionAgg += ((BuildingNode) neighbors).getCondition(); } } if ( (n.getCondition() - surroundingConditionAgg / surroundingBuildings) > threshold ) n.reduceCondition(1); } } public BuildingGraph getGraph() { return graph; } public void setScenario(ScenarioDTO scenario) { this.scenario = scenario; } }