/* * JGrass - Free Open Source Java GIS http://www.jgrass.org * (C) HydroloGIS - www.hydrologis.com * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Library General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) any * later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more * details. * * You should have received a copy of the GNU Library General Public License * along with this library; if not, write to the Free Foundation, Inc., 59 * Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.jgrasstools.hortonmachine.modules.networktools.epanet; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_AUTHORCONTACTS; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_AUTHORNAMES; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_KEYWORDS; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_LABEL; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_LICENSE; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_NAME; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_STATUS; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inControl_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inDemand_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inExtras_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inJunctions_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inOptions_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inPipes_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inPumps_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inReservoirs_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inRules_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inTanks_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inTime_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_inValves_DESCRIPTION; import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSEPANETINPGENERATOR_outFile_DESCRIPTION; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; import oms3.annotations.Author; import oms3.annotations.Description; import oms3.annotations.Execute; import oms3.annotations.In; import oms3.annotations.Keywords; import oms3.annotations.Label; import oms3.annotations.License; import oms3.annotations.Name; import oms3.annotations.Status; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.feature.DefaultFeatureCollection; import org.jgrasstools.gears.libs.exceptions.ModelsIllegalargumentException; import org.jgrasstools.gears.libs.modules.JGTModel; import org.jgrasstools.gears.utils.features.FeatureUtilities; import org.jgrasstools.gears.utils.files.FileUtilities; import org.jgrasstools.hortonmachine.modules.networktools.epanet.core.EpanetConstants; import org.jgrasstools.hortonmachine.modules.networktools.epanet.core.EpanetFeatureTypes.Junctions; import org.jgrasstools.hortonmachine.modules.networktools.epanet.core.EpanetFeatureTypes.Pipes; import org.jgrasstools.hortonmachine.modules.networktools.epanet.core.EpanetFeatureTypes.Pumps; import org.jgrasstools.hortonmachine.modules.networktools.epanet.core.EpanetFeatureTypes.Reservoirs; import org.jgrasstools.hortonmachine.modules.networktools.epanet.core.EpanetFeatureTypes.Tanks; import org.jgrasstools.hortonmachine.modules.networktools.epanet.core.EpanetFeatureTypes.Valves; import org.opengis.feature.simple.SimpleFeature; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; @Description(OMSEPANETINPGENERATOR_DESCRIPTION) @Author(name = OMSEPANETINPGENERATOR_AUTHORNAMES, contact = OMSEPANETINPGENERATOR_AUTHORCONTACTS) @Keywords(OMSEPANETINPGENERATOR_KEYWORDS) @Label(OMSEPANETINPGENERATOR_LABEL) @Name(OMSEPANETINPGENERATOR_NAME) @Status(OMSEPANETINPGENERATOR_STATUS) @License(OMSEPANETINPGENERATOR_LICENSE) public class OmsEpanetInpGenerator extends JGTModel { @Description(OMSEPANETINPGENERATOR_inOptions_DESCRIPTION) @In public OmsEpanetParametersOptions inOptions = null; @Description(OMSEPANETINPGENERATOR_inTime_DESCRIPTION) @In public OmsEpanetParametersTime inTime = null; @Description(OMSEPANETINPGENERATOR_inJunctions_DESCRIPTION) @In public SimpleFeatureCollection inJunctions = null; @Description(OMSEPANETINPGENERATOR_inTanks_DESCRIPTION) @In public SimpleFeatureCollection inTanks = null; @Description(OMSEPANETINPGENERATOR_inReservoirs_DESCRIPTION) @In public SimpleFeatureCollection inReservoirs = null; @Description(OMSEPANETINPGENERATOR_inPumps_DESCRIPTION) @In public SimpleFeatureCollection inPumps = null; @Description(OMSEPANETINPGENERATOR_inValves_DESCRIPTION) @In public SimpleFeatureCollection inValves = null; @Description(OMSEPANETINPGENERATOR_inPipes_DESCRIPTION) @In public SimpleFeatureCollection inPipes = null; @Description(OMSEPANETINPGENERATOR_inExtras_DESCRIPTION) @In public String inExtras = null; @Description(OMSEPANETINPGENERATOR_inDemand_DESCRIPTION) @In public String inDemand = null; @Description(OMSEPANETINPGENERATOR_inControl_DESCRIPTION) @In public String inControl = null; @Description(OMSEPANETINPGENERATOR_inRules_DESCRIPTION) @In public String inRules = null; @Description(OMSEPANETINPGENERATOR_outFile_DESCRIPTION) @In public String outFile = null; private static final String NL = "\n"; private static final String SPACER = "\t\t"; private HashMap<String, String> curveId2Path = new HashMap<String, String>(); private HashMap<String, String> patternId2Path = new HashMap<String, String>(); private HashMap<String, String> demandId2Path = new HashMap<String, String>(); private List<String> curvesFilesList = new ArrayList<String>(); private List<String> patternsFilesList = new ArrayList<String>(); private BufferedWriter bwInp = null; private BufferedWriter bwEpanetInp = null; @Execute public void process() throws Exception { checkNull(inJunctions, inPipes, outFile); if (inReservoirs == null) { inReservoirs = new DefaultFeatureCollection(); } if (inTanks == null) { inTanks = new DefaultFeatureCollection(); } if (inPumps == null) { inPumps = new DefaultFeatureCollection(); } if (inValves == null) { inValves = new DefaultFeatureCollection(); } int resSize = inReservoirs.size(); int tanksSize = inTanks.size(); if (resSize + tanksSize < 1) { throw new ModelsIllegalargumentException("The model needs at least one tanks or reservoir to work.", this, pm); } if (inExtras != null) { handleCurves(); handlePatterns(); handleDemands(); } List<SimpleFeature> junctionsList = FeatureUtilities.featureCollectionToList(inJunctions); List<SimpleFeature> tanksList = FeatureUtilities.featureCollectionToList(inTanks); List<SimpleFeature> reservoirsList = FeatureUtilities.featureCollectionToList(inReservoirs); List<SimpleFeature> pipesList = FeatureUtilities.featureCollectionToList(inPipes); List<SimpleFeature> pumpsList = FeatureUtilities.featureCollectionToList(inPumps); List<SimpleFeature> valvesList = FeatureUtilities.featureCollectionToList(inValves); File outputFile = new File(outFile); String name = outputFile.getName(); if (name.indexOf('.') != -1) { name = FileUtilities.getNameWithoutExtention(outputFile); } File outputEpanetFile = new File(outputFile.getParentFile(), name + "_epanet.inp"); try { pm.beginTask("Generating inp file...", 15); bwInp = new BufferedWriter(new FileWriter(outputFile)); bwEpanetInp = new BufferedWriter(new FileWriter(outputEpanetFile)); write("[TITLE]"); pm.worked(1); if (junctionsList.size() > 0) { String junctionsText = handleJunctions(junctionsList); write(junctionsText); } pm.worked(1); if (reservoirsList.size() > 0) { String reservoirsText = handleReservoirs(reservoirsList); write(reservoirsText); } pm.worked(1); if (tanksList.size() > 0) { String tanksText = handleTanks(tanksList); write(tanksText); } pm.worked(1); if (pumpsList.size() > 0) { String pumpsText = handlePumps(pumpsList); write(pumpsText); } pm.worked(1); if (valvesList.size() > 0) { String valvesText = handleValves(valvesList); write(valvesText); } pm.worked(2); if (pipesList.size() > 0) { String pipesText = handlePipes(pipesList); write(pipesText); String pipeDemandsText = handlePipedemands(pipesList, valvesList, pumpsList); write(pipeDemandsText, true); } /* * the demands section */ pm.worked(1); if (inDemand != null) { write("\n\n[DEMANDS]\n"); String demandSection = FileUtilities.readFile(new File(inDemand)); write(demandSection); } /* * the controls section */ pm.worked(1); if (inControl != null) { write("\n\n[CONTROLS]\n"); String demandSection = FileUtilities.readFile(new File(inControl)); write(demandSection); } /* * the rules section */ pm.worked(1); if (inRules != null) { write("\n\n[RULES]\n"); String demandSection = FileUtilities.readFile(new File(inRules)); write(demandSection); } /* * the patterns section */ pm.worked(1); write("\n\n[PATTERNS]\n"); for( String patternsFilePath : patternsFilesList ) { String patternString = FileUtilities.readFile(new File(patternsFilePath)); write(patternString); } /* * the curves section */ pm.worked(1); write("\n\n[CURVES]\n"); for( String curveFilePath : curvesFilesList ) { String curveString = FileUtilities.readFile(new File(curveFilePath)); write(curveString); } /* * the time section */ pm.worked(1); write("\n\n" + OmsEpanetParametersTime.TIMESECTION + "\n"); Properties timeParameters = inTime.outProperties; Set<Entry<Object, Object>> entrySet = timeParameters.entrySet(); for( Entry<Object, Object> entry : entrySet ) { Object key = entry.getKey(); Object value = entry.getValue(); if (value.toString().length() > 0) { write(key + "\t" + value + "\n"); } } /* * the options section */ pm.worked(1); write("\n\n" + OmsEpanetParametersOptions.OPTIONSSECTION + "\n"); Properties optionsParameters = inOptions.outProperties; Set<Entry<Object, Object>> optionsEntrySet = optionsParameters.entrySet(); for( Entry<Object, Object> entry : optionsEntrySet ) { Object key = entry.getKey(); Object value = entry.getValue(); if (value.toString().length() > 0) { write(key + "\t" + value + "\n"); } } /* * coordinates and vertices */ pm.worked(1); String coordsText = handleCoordinates(junctionsList, reservoirsList, tanksList); write(coordsText); pm.worked(1); String vertexText = handleVertices(pipesList); write(vertexText); } finally { pm.done(); if (bwInp != null) bwInp.close(); if (bwEpanetInp != null) bwEpanetInp.close(); } } private void write( String string, boolean... onlyCustom ) throws IOException { bwInp.write(string); if (onlyCustom.length == 0 || !onlyCustom[0]) bwEpanetInp.write(string); } private void handleCurves() { final String prefix = EpanetConstants.CURVES_FILE_PREFIX.toString(); File folder = new File(inExtras); File[] curvefiles = folder.listFiles(new FilenameFilter(){ public boolean accept( File dir, String name ) { if (name.toLowerCase().startsWith(prefix)) { return true; } return false; } }); for( File curveFile : curvefiles ) { String name = curveFile.getName(); String id = name.replaceFirst(prefix + "_", ""); curveId2Path.put(id, curveFile.getAbsolutePath()); } } private void handlePatterns() { final String prefix = EpanetConstants.PATTERNS_FILE_PREFIX.toString(); File folder = new File(inExtras); File[] patternFiles = folder.listFiles(new FilenameFilter(){ public boolean accept( File dir, String name ) { if (name.toLowerCase().startsWith(prefix)) { return true; } return false; } }); for( File patternFile : patternFiles ) { String name = patternFile.getName(); String id = name.replaceFirst(prefix + "_", ""); patternId2Path.put(id, patternFile.getAbsolutePath()); } } private void handleDemands() { final String prefix = EpanetConstants.DEMANDS_FILE_PREFIX.toString(); File folder = new File(inExtras); File[] demandsFiles = folder.listFiles(new FilenameFilter(){ public boolean accept( File dir, String name ) { if (name.toLowerCase().startsWith(prefix)) { return true; } return false; } }); for( File demandsFile : demandsFiles ) { String name = demandsFile.getName(); String id = name.replaceFirst(prefix + "_", ""); demandId2Path.put(id, demandsFile.getAbsolutePath()); } } private String handleJunctions( List<SimpleFeature> junctionsList ) throws IOException { StringBuilder sbJunctions = new StringBuilder(); sbJunctions.append("\n\n[JUNCTIONS]\n"); sbJunctions.append(";ID").append(SPACER); sbJunctions.append("ELEV").append(SPACER); sbJunctions.append("DEMAND").append(SPACER); sbJunctions.append("PATTERN").append(NL); StringBuilder sbEmitters = new StringBuilder(); sbEmitters.append("\n\n[EMITTERS]\n"); sbEmitters.append(";JUNCTION").append(SPACER); sbEmitters.append("COEFFICIENT").append(NL); for( SimpleFeature junction : junctionsList ) { // [JUNCTIONS] Object dc_id = getAttribute(junction, Junctions.ID.getAttributeName()); if (dc_id == null) throw new IOException("Found a junction without ID. Please check your data!"); sbJunctions.append(dc_id.toString()); sbJunctions.append(SPACER); Object elevation = getAttribute(junction, Junctions.ELEVATION.getAttributeName()); if (elevation == null) { elevation = new Double(0); } Object depth = getAttribute(junction, Junctions.DEPTH.getAttributeName()); if (depth == null) { depth = new Double(0); } double elev = ((Double) elevation) - ((Double) depth); sbJunctions.append(elev); sbJunctions.append(SPACER); Object demand = getAttribute(junction, Junctions.DEMAND.getAttributeName()); if (demand == null) { demand = new Double(0); } sbJunctions.append(demand.toString()); sbJunctions.append(SPACER); Object pattern = getAttribute(junction, Junctions.PATTERN.getAttributeName()); if (pattern == null) { pattern = new Double(0); } String patternId = pattern.toString(); sbJunctions.append(patternId); sbJunctions.append(NL); String path = patternId2Path.get(patternId); if (path != null) { if (!patternsFilesList.contains(path)) patternsFilesList.add(path); } // emitters Object emitterCoeff = getAttribute(junction, Junctions.EMITTER_COEFFICIENT.getAttributeName()); if (emitterCoeff instanceof Double) { double coeff = (Double) emitterCoeff; sbEmitters.append(dc_id.toString()); sbEmitters.append(SPACER); sbEmitters.append(coeff); sbEmitters.append(NL); } } sbJunctions.append("\n\n"); sbJunctions.append(sbEmitters.toString()); sbJunctions.append("\n\n"); return sbJunctions.toString(); } private String handlePipes( List<SimpleFeature> pipesList ) throws IOException { StringBuilder sbPipes = new StringBuilder(); sbPipes.append("\n\n[PIPES]\n"); sbPipes.append(";ID").append(SPACER); sbPipes.append("NODE1").append(SPACER); sbPipes.append("NODE2").append(SPACER); sbPipes.append("LENGTH").append(SPACER); sbPipes.append("DIAMETER").append(SPACER); sbPipes.append("ROUGHNESS").append(SPACER); sbPipes.append("MINORLOSS").append(SPACER); sbPipes.append("STATUS").append(NL); for( SimpleFeature pipe : pipesList ) { // [PIPES] Object id = getAttribute(pipe, Pipes.ID.getAttributeName()); if (id == null) throw new IOException("Found a pipe without ID. Please check your data!"); String idString = id.toString(); if (idString.toUpperCase().startsWith(EpanetConstants.DUMMYPIPE.toString())) { continue; } sbPipes.append(idString); sbPipes.append(SPACER); Object node1 = getAttribute(pipe, Pipes.START_NODE.getAttributeName()); if (node1 == null) { throwError(idString, "pipe", "startnode"); } sbPipes.append(node1.toString()); sbPipes.append(SPACER); Object node2 = getAttribute(pipe, Pipes.END_NODE.getAttributeName()); if (node2 == null) throwError(idString, "pipe", "endnode"); sbPipes.append(node2.toString()); sbPipes.append(SPACER); Object length = getAttribute(pipe, Pipes.LENGTH.getAttributeName()); if (length == null) throwError(idString, "pipe", "length"); sbPipes.append(length.toString()); sbPipes.append(SPACER); Object diameter = getAttribute(pipe, Pipes.DIAMETER.getAttributeName()); if (diameter == null) throwError(idString, "pipe", "diameter"); sbPipes.append(diameter.toString()); sbPipes.append(SPACER); Object roughness = getAttribute(pipe, Pipes.ROUGHNESS.getAttributeName()); if (roughness == null) throwError(idString, "pipe", "roughness"); sbPipes.append(roughness.toString()); sbPipes.append(SPACER); Object minorloss = getAttribute(pipe, Pipes.MINORLOSS.getAttributeName()); if (minorloss == null) { sbPipes.append("0"); } else { sbPipes.append(minorloss.toString()); } sbPipes.append(SPACER); Object status = getAttribute(pipe, Pipes.STATUS.getAttributeName()); if (status == null) { sbPipes.append("open"); } else { sbPipes.append(status.toString()); } sbPipes.append(NL); } sbPipes.append("\n\n"); return sbPipes.toString(); } private String handlePipedemands( List<SimpleFeature> pipesList, List<SimpleFeature> valvesList, List<SimpleFeature> pumpsList ) throws IOException { StringBuilder sbPipesdemand = new StringBuilder(); sbPipesdemand.append("\n\n[PDEMAND]\n"); sbPipesdemand.append(";ID").append(SPACER); sbPipesdemand.append("PDEMAND").append(SPACER); sbPipesdemand.append("LEAKCOEFF").append(SPACER); sbPipesdemand.append("PATTERN").append(NL); // valves and pumps (virtual pipes for epanet) need a placeholder int dummyNum = valvesList.size() + pumpsList.size(); for( int i = 0; i < dummyNum; i++ ) { sbPipesdemand.append("DUMMY").append(i).append(SPACER); sbPipesdemand.append("0"); sbPipesdemand.append(SPACER); sbPipesdemand.append("0"); sbPipesdemand.append(SPACER); sbPipesdemand.append("\t"); sbPipesdemand.append(NL); } // normal pipes now for( SimpleFeature pipe : pipesList ) { // [PIPES] Object id = getAttribute(pipe, Pipes.ID.getAttributeName()); if (id == null) throw new IOException("Found a pipe without ID. Please check your data!"); String idString = id.toString(); if (idString.toUpperCase().startsWith(EpanetConstants.DUMMYPIPE.toString())) { continue; } sbPipesdemand.append(idString); sbPipesdemand.append(SPACER); Object demand = getAttribute(pipe, Pipes.DEMAND.getAttributeName()); if (demand == null) { sbPipesdemand.append("0"); } else { sbPipesdemand.append(demand.toString()); } sbPipesdemand.append(SPACER); Object leakCoeff = getAttribute(pipe, Pipes.LEAKCOEFF.getAttributeName()); if (leakCoeff == null) { sbPipesdemand.append("0"); } else { sbPipesdemand.append(leakCoeff.toString()); } sbPipesdemand.append(SPACER); Object pattern = getAttribute(pipe, Pipes.PATTERN.getAttributeName()); if (pattern == null) { sbPipesdemand.append("\t"); } else { String patternId = pattern.toString(); sbPipesdemand.append(patternId); String path = patternId2Path.get(patternId); if (path != null) { if (!patternsFilesList.contains(path)) patternsFilesList.add(path); } } sbPipesdemand.append(NL); } sbPipesdemand.append("\n\n"); return sbPipesdemand.toString(); } private void throwError( String idString, String who, String what ) throws IOException { StringBuilder sb = new StringBuilder(); sb.append("The "); sb.append(who); sb.append(" "); sb.append(idString); sb.append(" has no "); sb.append(what); sb.append(" defined. Please check your data."); throw new IOException(sb.toString()); } private String handleReservoirs( List<SimpleFeature> reservoirsList ) throws IOException { StringBuilder sbReservoirs = new StringBuilder(); sbReservoirs.append("\n\n[RESERVOIRS]\n"); sbReservoirs.append(";ID").append(SPACER); sbReservoirs.append("HEAD").append(SPACER); sbReservoirs.append("PATTERN").append(NL); for( SimpleFeature reservoir : reservoirsList ) { // [RESERVOIRS] Object dc_id = getAttribute(reservoir, Reservoirs.ID.getAttributeName()); if (dc_id == null) throw new IOException("Found a reservoir without ID. Please check your data!"); String idString = dc_id.toString(); sbReservoirs.append(idString); sbReservoirs.append(SPACER); Object head = getAttribute(reservoir, Reservoirs.HEAD.getAttributeName()); if (head == null) throwError(idString, "reservoir", "head"); sbReservoirs.append(head.toString()); sbReservoirs.append(SPACER); Object pattern = getAttribute(reservoir, Reservoirs.HEAD_PATTERN.getAttributeName()); String patternId = "0"; if (pattern != null) { patternId = pattern.toString(); sbReservoirs.append(patternId); } sbReservoirs.append(NL); String path = patternId2Path.get(patternId); if (path != null) { if (!patternsFilesList.contains(path)) patternsFilesList.add(path); } } return sbReservoirs.toString(); } private String handleTanks( List<SimpleFeature> tanksList ) throws IOException { StringBuilder sbTanks = new StringBuilder(); sbTanks.append("\n\n[TANKS]\n"); sbTanks.append(";ID").append(SPACER); sbTanks.append("ELEV").append(SPACER); sbTanks.append("INITLEVEL").append(SPACER); sbTanks.append("MINLEVEL").append(SPACER); sbTanks.append("MAXLEVEL").append(SPACER); sbTanks.append("DIAMETER").append(SPACER); sbTanks.append("MINVOL").append(SPACER); sbTanks.append("VOLCURVE").append(NL); for( SimpleFeature tank : tanksList ) { // [TANKS] // ;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve Object dc_id = getAttribute(tank, Tanks.ID.getAttributeName()); if (dc_id == null) throw new IOException("Found a tank without ID. Please check your data!"); sbTanks.append(dc_id.toString()); sbTanks.append(SPACER); Object elevation = getAttribute(tank, Tanks.BOTTOM_ELEVATION.getAttributeName()); if (elevation != null) { sbTanks.append(elevation.toString()); } else { sbTanks.append("0"); } sbTanks.append(SPACER); Object initLevel = getAttribute(tank, Tanks.INITIAL_WATER_LEVEL.getAttributeName()); if (initLevel != null) { sbTanks.append(initLevel.toString()); } else { sbTanks.append("0"); } sbTanks.append(SPACER); Object minLevel = getAttribute(tank, Tanks.MINIMUM_WATER_LEVEL.getAttributeName()); if (minLevel != null) { sbTanks.append(minLevel.toString()); } else { sbTanks.append("0"); } sbTanks.append(SPACER); Object maxLevel = getAttribute(tank, Tanks.MAXIMUM_WATER_LEVEL.getAttributeName()); if (maxLevel != null) { sbTanks.append(maxLevel.toString()); } else { sbTanks.append("0"); } sbTanks.append(SPACER); Object diameter = getAttribute(tank, Tanks.DIAMETER.getAttributeName()); if (diameter != null) { sbTanks.append(diameter.toString()); } else { sbTanks.append("0"); } sbTanks.append(SPACER); Object minVol = getAttribute(tank, Tanks.MINIMUM_VOLUME.getAttributeName()); if (minVol != null) { sbTanks.append(minVol.toString()); } else { sbTanks.append("0"); } sbTanks.append(SPACER); Object volCurve = getAttribute(tank, Tanks.VOLUME_CURVE_ID.getAttributeName()); String volCurveId; if (volCurve != null) { volCurveId = volCurve.toString(); } else { volCurveId = "0"; } sbTanks.append(volCurveId); sbTanks.append(NL); String path = curveId2Path.get(volCurveId); if (path != null) { if (!curvesFilesList.contains(path)) curvesFilesList.add(path); } } return sbTanks.toString(); } private String handlePumps( List<SimpleFeature> pumpsList ) throws IOException { StringBuilder sbPumps = new StringBuilder(); StringBuilder sbEnergy = new StringBuilder(); sbPumps.append("\n\n[PUMPS]\n"); sbPumps.append(";ID").append(SPACER); sbPumps.append("NODE1").append(SPACER); sbPumps.append("NODE2").append(SPACER); sbPumps.append("PARAMETERS").append(NL); sbEnergy.append("\n\n[ENERGY]\n"); for( SimpleFeature pump : pumpsList ) { // [PUMPS] // ;ID Node1 Node2 Parameters(key1 value1 key2 value2...) Object dc_id = getAttribute(pump, Pumps.ID.getAttributeName()); if (dc_id == null) throw new IOException("Found a pump without ID. Please check your data!"); String pumpId = dc_id.toString(); sbPumps.append(pumpId); sbPumps.append(SPACER); Object node1 = getAttribute(pump, Pumps.START_NODE.getAttributeName()); if (node1 == null) { throwError(pumpId, "pump", "startnode"); } sbPumps.append(node1.toString()); sbPumps.append(SPACER); Object node2 = getAttribute(pump, Pumps.END_NODE.getAttributeName()); if (node2 == null) { throwError(pumpId, "pump", "endnode"); } sbPumps.append(node2.toString()); sbPumps.append(SPACER); Object power = getAttribute(pump, Pumps.POWER.getAttributeName()); if (power != null && !power.toString().equals("")) { sbPumps.append("POWER " + power.toString()); sbPumps.append(SPACER); } Object head = getAttribute(pump, Pumps.HEAD_ID.getAttributeName()); if (head != null && !head.toString().equals("")) { String headId = head.toString(); sbPumps.append("HEAD " + headId); sbPumps.append(SPACER); String path = curveId2Path.get(headId); if (path != null) { if (!curvesFilesList.contains(path)) curvesFilesList.add(path); } } Object speed = getAttribute(pump, Pumps.SPEED.getAttributeName()); if (speed != null && !speed.toString().equals("")) { sbPumps.append("SPEED " + speed.toString()); sbPumps.append(SPACER); } Object speedPattern = getAttribute(pump, Pumps.SPEED_PATTERN.getAttributeName()); if (speedPattern != null && !speedPattern.toString().equals("")) { String patternId = speedPattern.toString(); sbPumps.append("PATTERN " + patternId); sbPumps.append(SPACER); String path = patternId2Path.get(patternId); if (path != null) { if (!patternsFilesList.contains(path)) patternsFilesList.add(path); } } sbPumps.append(NL); /* * energy part */ Object price = getAttribute(pump, Pumps.PRICE.getAttributeName()); if (price != null && !price.toString().equals("")) { String priceStr = price.toString(); sbEnergy.append("PUMP " + pumpId); sbEnergy.append(SPACER); sbEnergy.append("PRICE " + priceStr); sbEnergy.append(NL); } Object pricePattern = getAttribute(pump, Pumps.PRICE_PATTERN.getAttributeName()); if (pricePattern != null && !pricePattern.toString().equals("")) { String pricePatternStr = pricePattern.toString(); sbEnergy.append("PUMP " + pumpId); sbEnergy.append(SPACER); sbEnergy.append("PATTERN " + pricePatternStr); sbEnergy.append(NL); } Object effic = getAttribute(pump, Pumps.EFFICIENCY.getAttributeName()); if (effic != null && !effic.toString().equals("")) { String effStr = effic.toString(); sbEnergy.append("PUMP " + pumpId); sbEnergy.append(SPACER); sbEnergy.append("EFFIC " + effStr); sbEnergy.append(NL); String path = curveId2Path.get(effStr); if (path != null) { if (!curvesFilesList.contains(path)) curvesFilesList.add(path); } } } sbPumps.append(NL).append(NL); sbPumps.append(sbEnergy); return sbPumps.toString(); } private String handleValves( List<SimpleFeature> valvesList ) throws IOException { StringBuilder sbValves = new StringBuilder(); sbValves.append("\n\n[VALVES]\n"); sbValves.append(";ID").append(SPACER); sbValves.append("NODE1").append(SPACER); sbValves.append("NODE2").append(SPACER); sbValves.append("DIAMETER").append(SPACER); sbValves.append("TYPE").append(SPACER); sbValves.append("SETTING").append(SPACER); sbValves.append("MINORLOSS").append(NL); StringBuilder sbValvesStatus = new StringBuilder(); sbValvesStatus.append("\n\n[STATUS]\n"); sbValvesStatus.append(";ID").append(SPACER); sbValvesStatus.append("Status/Setting").append(NL); boolean hasStatus = false; for( SimpleFeature valve : valvesList ) { // [VALVES] // ;ID Node1 Node2 Diameter Type Setting MinorLoss Object dc_id = getAttribute(valve, Valves.ID.getAttributeName()); if (dc_id == null) throw new IOException("Found a valve without ID. Please check your data!"); String idString = dc_id.toString(); sbValves.append(idString); sbValves.append(SPACER); Object node1 = getAttribute(valve, Valves.START_NODE.getAttributeName()); if (node1 == null) { throwError(idString, "valve", "startnode"); } sbValves.append(node1.toString()); sbValves.append(SPACER); Object node2 = getAttribute(valve, Valves.END_NODE.getAttributeName()); if (node2 == null) { throwError(idString, "valve", "endnode"); } sbValves.append(node2.toString()); sbValves.append(SPACER); Object diameter = getAttribute(valve, Valves.DIAMETER.getAttributeName()); if (diameter == null) { throwError(idString, "valve", "diameter"); } sbValves.append(diameter.toString()); sbValves.append(SPACER); Object type = getAttribute(valve, Valves.TYPE.getAttributeName()); if (type == null) { throwError(idString, "valve", "type"); } sbValves.append(type.toString()); sbValves.append(SPACER); Object setting = getAttribute(valve, Valves.SETTING.getAttributeName()); if (setting != null) { sbValves.append(setting.toString()); } else { sbValves.append("0"); } sbValves.append(SPACER); Object minorLoss = getAttribute(valve, Valves.MINORLOSS.getAttributeName()); if (setting != null) { sbValves.append(minorLoss.toString()); } else { sbValves.append("0"); } sbValves.append(NL); // STATUS PART Object status = getAttribute(valve, Valves.STATUS.getAttributeName()); if (status != null && status.toString().trim().length() != 0) { sbValvesStatus.append(idString); sbValvesStatus.append(SPACER); sbValvesStatus.append(status.toString()); sbValvesStatus.append(NL); hasStatus = true; } } if (hasStatus) sbValves.append(sbValvesStatus.toString()); sbValves.append("\n\n"); return sbValves.toString(); } private String handleCoordinates( List<SimpleFeature> junctionsList, List<SimpleFeature> reservoirsList, List<SimpleFeature> tanksList ) throws IOException { ArrayList<SimpleFeature> nodesList = new ArrayList<SimpleFeature>(); nodesList.addAll(junctionsList); nodesList.addAll(reservoirsList); nodesList.addAll(tanksList); StringBuilder sbJunctionsCoords = new StringBuilder(); sbJunctionsCoords.append("\n\n[COORDINATES]\n"); sbJunctionsCoords.append(";NODE").append(SPACER); sbJunctionsCoords.append("XCOORD").append(SPACER); sbJunctionsCoords.append("YCOORD").append(NL); for( SimpleFeature node : nodesList ) { Geometry geometry = (Geometry) node.getDefaultGeometry(); Coordinate coordinate = geometry.getCoordinate(); // [COORDINATES] Object attribute = getAttribute(node, Junctions.ID.getAttributeName()); sbJunctionsCoords.append(attribute.toString()); sbJunctionsCoords.append(SPACER); sbJunctionsCoords.append(coordinate.x); sbJunctionsCoords.append(SPACER); sbJunctionsCoords.append(coordinate.y); sbJunctionsCoords.append(NL); } sbJunctionsCoords.append("\n\n"); return sbJunctionsCoords.toString(); } private String handleVertices( List<SimpleFeature> pipesList ) throws IOException { StringBuilder sbPipesVertices = new StringBuilder(); sbPipesVertices.append("\n\n[VERTICES]\n"); sbPipesVertices.append(";NODE").append(SPACER); sbPipesVertices.append("XCOORD").append(SPACER); sbPipesVertices.append("YCOORD").append(NL); for( SimpleFeature pipe : pipesList ) { Geometry geometry = (Geometry) pipe.getDefaultGeometry(); Coordinate[] coordinates = geometry.getCoordinates(); // [PIPES] Object id = getAttribute(pipe, Pipes.ID.getAttributeName()); String idString = id.toString(); if (idString.toUpperCase().startsWith(EpanetConstants.DUMMYPIPE.toString())) { continue; } // [VERTICES] for( Coordinate coordinate : coordinates ) { sbPipesVertices.append(idString); sbPipesVertices.append(SPACER); sbPipesVertices.append(coordinate.x); sbPipesVertices.append(SPACER); sbPipesVertices.append(coordinate.y); sbPipesVertices.append(NL); } } sbPipesVertices.append("\n\n"); return sbPipesVertices.toString(); } private Object getAttribute( SimpleFeature feature, String attributeName ) { Object attribute = feature.getAttribute(attributeName); if (attribute == null) { attribute = feature.getAttribute(attributeName.toUpperCase()); } if (attribute == null) { attribute = feature.getAttribute(attributeName.toLowerCase()); } return attribute; } }