diff --git a/docs/uml/DataSourceClassDiagramm.puml b/docs/uml/main/DataSourceClassDiagramm.puml similarity index 100% rename from docs/uml/DataSourceClassDiagramm.puml rename to docs/uml/main/DataSourceClassDiagramm.puml diff --git a/docs/uml/InputDataDeployment.puml b/docs/uml/main/InputDataDeployment.puml similarity index 100% rename from docs/uml/InputDataDeployment.puml rename to docs/uml/main/InputDataDeployment.puml diff --git a/docs/uml/InputDatamodelConcept.puml b/docs/uml/main/InputDatamodelConcept.puml similarity index 100% rename from docs/uml/InputDatamodelConcept.puml rename to docs/uml/main/InputDatamodelConcept.puml diff --git a/docs/uml/ModelContainerConcept.puml b/docs/uml/main/ModelContainerConcept.puml similarity index 100% rename from docs/uml/ModelContainerConcept.puml rename to docs/uml/main/ModelContainerConcept.puml diff --git a/docs/uml/OutputDatamodelConcept.puml b/docs/uml/main/OutputDatamodelConcept.puml similarity index 100% rename from docs/uml/OutputDatamodelConcept.puml rename to docs/uml/main/OutputDatamodelConcept.puml diff --git a/docs/uml/test/TestDataHierarchy.puml b/docs/uml/test/TestDataHierarchy.puml new file mode 100644 index 000000000..83831602a --- /dev/null +++ b/docs/uml/test/TestDataHierarchy.puml @@ -0,0 +1,8 @@ +@startuml +Interface GridTestData +Interface ComplexTopology +Interface SystemParticipantTestData + +GridTestData <|-- ComplexTopology +GridTestData <|-- SystemParticipantTestData +@enduml \ No newline at end of file diff --git a/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java index ca309b425..5e0b0524e 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java @@ -231,6 +231,7 @@ private String processMethodResult(Object methodReturnObject, Method method, Str case "Transformer3WTypeInput": case "Transformer2WTypeInput": case "LineTypeInput": + case "LineInput": case "OperatorInput": case "WecTypeInput": case "ThermalBusInput": diff --git a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java index 93116891b..de5d6e3df 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -7,9 +7,11 @@ import edu.ie3.datamodel.exceptions.ProcessorProviderException; import edu.ie3.datamodel.io.processor.input.AssetInputProcessor; +import edu.ie3.datamodel.io.processor.input.GraphicInputProcessor; import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.AssetInput; +import edu.ie3.datamodel.models.input.graphics.GraphicInput; import edu.ie3.datamodel.models.result.ResultEntity; import java.util.*; import java.util.stream.Collectors; @@ -135,10 +137,16 @@ private Collection> allProcessors() { resultingProcessors.add(new AssetInputProcessor(cls)); } + // GraphicInput + for (Class cls : GraphicInputProcessor.eligibleEntityClasses) { + resultingProcessors.add(new GraphicInputProcessor(cls)); + } + // SystemParticipantResults for (Class cls : ResultEntityProcessor.eligibleEntityClasses) { resultingProcessors.add(new ResultEntityProcessor(cls)); } + return resultingProcessors; } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/input/GraphicInputProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/input/GraphicInputProcessor.java new file mode 100644 index 000000000..bdb9cd8b9 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/processor/input/GraphicInputProcessor.java @@ -0,0 +1,42 @@ +/* + * © 2020. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.processor.input; + +import edu.ie3.datamodel.io.processor.EntityProcessor; +import edu.ie3.datamodel.models.input.graphics.GraphicInput; +import edu.ie3.datamodel.models.input.graphics.LineGraphicInput; +import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import javax.measure.Quantity; + +/** + * Processor to deserialize all children of {@link GraphicInput} to a mapping from field name to + * value (as string representation). All necessary processes are already apparent in the {@link + * EntityProcessor}, therefore, no additional implementations have to be made. + */ +public class GraphicInputProcessor extends EntityProcessor { + public static final List> eligibleEntityClasses = + Collections.unmodifiableList(Arrays.asList(NodeGraphicInput.class, LineGraphicInput.class)); + + public GraphicInputProcessor(Class registeredClass) { + super(registeredClass); + } + + @Override + protected Optional handleProcessorSpecificQuantity( + Quantity quantity, String fieldName) { + throw new UnsupportedOperationException( + "No specific quantity handling required for graphic input models."); + } + + @Override + protected List> getAllEligibleClasses() { + return eligibleEntityClasses; + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java b/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java index 02d8836d7..2973d247b 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java @@ -5,13 +5,13 @@ */ package edu.ie3.datamodel.io.source; -import com.vividsolutions.jts.geom.Point; import edu.ie3.datamodel.models.timeseries.IndividualTimeSeries; import edu.ie3.datamodel.models.value.WeatherValue; import edu.ie3.util.interval.ClosedInterval; import java.time.ZonedDateTime; import java.util.Collection; import java.util.Map; +import org.locationtech.jts.geom.Point; /** Describes a data source for weather data */ public interface WeatherSource extends DataSource { diff --git a/src/main/java/edu/ie3/datamodel/models/input/graphics/GraphicInput.java b/src/main/java/edu/ie3/datamodel/models/input/graphics/GraphicInput.java index 33f82acb8..c9bf69477 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/graphics/GraphicInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/graphics/GraphicInput.java @@ -5,10 +5,10 @@ */ package edu.ie3.datamodel.models.input.graphics; -import com.vividsolutions.jts.geom.LineString; import edu.ie3.datamodel.models.input.InputEntity; import java.util.Objects; import java.util.UUID; +import org.locationtech.jts.geom.LineString; /** Describes the graphic data belonging to grid assets */ public class GraphicInput extends InputEntity { diff --git a/src/main/java/edu/ie3/datamodel/models/input/graphics/LineGraphicInput.java b/src/main/java/edu/ie3/datamodel/models/input/graphics/LineGraphicInput.java index fc9d6761c..b04f78a99 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/graphics/LineGraphicInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/graphics/LineGraphicInput.java @@ -5,10 +5,10 @@ */ package edu.ie3.datamodel.models.input.graphics; -import com.vividsolutions.jts.geom.LineString; import edu.ie3.datamodel.models.input.connector.LineInput; import java.util.Objects; import java.util.UUID; +import org.locationtech.jts.geom.LineString; /** * Describes the graphic data belonging to a {@link diff --git a/src/main/java/edu/ie3/datamodel/models/input/graphics/NodeGraphicInput.java b/src/main/java/edu/ie3/datamodel/models/input/graphics/NodeGraphicInput.java index 78b69bb46..23a28a43c 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/graphics/NodeGraphicInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/graphics/NodeGraphicInput.java @@ -5,11 +5,11 @@ */ package edu.ie3.datamodel.models.input.graphics; -import com.vividsolutions.jts.geom.LineString; -import com.vividsolutions.jts.geom.Point; import edu.ie3.datamodel.models.input.NodeInput; import java.util.Objects; import java.util.UUID; +import org.locationtech.jts.geom.LineString; +import org.locationtech.jts.geom.Point; /** Describes the graphic data belonging to a {@link NodeInput} */ public class NodeGraphicInput extends GraphicInput { diff --git a/src/main/java/edu/ie3/datamodel/models/value/WeatherValue.java b/src/main/java/edu/ie3/datamodel/models/value/WeatherValue.java index 24137c1e2..c912c3bbc 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/WeatherValue.java +++ b/src/main/java/edu/ie3/datamodel/models/value/WeatherValue.java @@ -5,12 +5,12 @@ */ package edu.ie3.datamodel.models.value; -import com.vividsolutions.jts.geom.Point; import edu.ie3.util.quantities.interfaces.Irradiation; import javax.measure.Quantity; import javax.measure.quantity.Angle; import javax.measure.quantity.Speed; import javax.measure.quantity.Temperature; +import org.locationtech.jts.geom.Point; /** Describes weather as a combination of irradiation, temperature and wind values */ public class WeatherValue implements Value { diff --git a/src/main/java/edu/ie3/datamodel/utils/CoordinateUtils.java b/src/main/java/edu/ie3/datamodel/utils/CoordinateUtils.java index 2fb7d22b7..f2e5aa9aa 100644 --- a/src/main/java/edu/ie3/datamodel/utils/CoordinateUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/CoordinateUtils.java @@ -5,10 +5,10 @@ */ package edu.ie3.datamodel.utils; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.Point; -import com.vividsolutions.jts.geom.PrecisionModel; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.PrecisionModel; public class CoordinateUtils { diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index 966e55824..52571bf65 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -9,6 +9,8 @@ import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput import edu.ie3.datamodel.models.input.connector.Transformer3WInput +import edu.ie3.datamodel.models.input.graphics.LineGraphicInput +import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput import edu.ie3.datamodel.models.input.system.BmInput import edu.ie3.datamodel.models.input.system.ChpInput import edu.ie3.datamodel.models.input.system.EvInput @@ -72,6 +74,8 @@ class ProcessorProviderTest extends Specification { NodeInput, EvcsInput, LoadResult, + NodeGraphicInput, + LineGraphicInput, FixedFeedInResult, BmResult, PvResult, diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/AssetInputProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/AssetInputProcessorTest.groovy index b8b86c0e6..88d66c130 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/AssetInputProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/AssetInputProcessorTest.groovy @@ -130,7 +130,7 @@ class AssetInputProcessorTest extends Specification { "length" : "0.003", "noOfParallelDevices": "2", "nodeA" : "bd837a25-58f3-44ac-aa90-c6b6e3cd91b2", - "nodeB" : "bd865a25-58f3-44ac-aa90-c6b6e3cd91b2", + "nodeB" : "6e0980e0-10f2-4e18-862b-eb2b7c90509b", "olmCharacteristic" : "olm", "operatesUntil" : "2020-03-25 15:11:31", "operatesFrom" : "2020-03-24 15:11:31", diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/GraphicInputProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/GraphicInputProcessorTest.groovy new file mode 100644 index 000000000..96f68f42e --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/GraphicInputProcessorTest.groovy @@ -0,0 +1,74 @@ +package edu.ie3.datamodel.io.processor.input + +import edu.ie3.datamodel.models.input.graphics.LineGraphicInput +import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput +import edu.ie3.test.common.GridTestData +import edu.ie3.util.TimeTools +import spock.lang.Specification + +import java.time.ZoneId + +class GraphicInputProcessorTest extends Specification { + static { + TimeTools.initialize(ZoneId.of("UTC"), Locale.GERMANY, "yyyy-MM-dd HH:mm:ss") + } + + def "The GraphicInputProcessor should de-serialize a provided NodeGraphicInput with point correctly"(){ + given: + GraphicInputProcessor processor = new GraphicInputProcessor(NodeGraphicInput.class) + NodeGraphicInput validNode = GridTestData.nodeGraphicC + Map expected = [ + "uuid" : "09aec636-791b-45aa-b981-b14edf171c4c", + "graphicLayer" : "main", + "path" : "", + "point" : "{\"type\":\"Point\",\"coordinates\":[0.0,10],\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}}}", + "node" : "bd837a25-58f3-44ac-aa90-c6b6e3cd91b2" + ] + + when: + Optional> actual = processor.handleEntity(validNode) + + then: + actual.isPresent() + actual.get() == expected + } + + def "The GraphicInputProcessor should de-serialize a provided NodeGraphicInput with path correctly"(){ + given: + GraphicInputProcessor processor = new GraphicInputProcessor(NodeGraphicInput.class) + NodeGraphicInput validNode = GridTestData.nodeGraphicD + Map expected = [ + "uuid" : "9ecad435-bd16-4797-a732-762c09d4af25", + "graphicLayer" : "main", + "path" : "{\"type\":\"LineString\",\"coordinates\":[[-1,0.0],[1,0.0]],\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}}}", + "point" : "", + "node" : "6e0980e0-10f2-4e18-862b-eb2b7c90509b" + ] + + when: + Optional> actual = processor.handleEntity(validNode) + + then: + actual.isPresent() + actual.get() == expected + } + + def "The GraphicInputProcessor should de-serialize a provided LineGraphicInput correctly"(){ + given: + GraphicInputProcessor processor = new GraphicInputProcessor(LineGraphicInput.class) + LineGraphicInput validNode = GridTestData.lineGraphicCtoD + Map expected = [ + "uuid" : "ece86139-3238-4a35-9361-457ecb4258b0", + "graphicLayer" : "main", + "path" : "{\"type\":\"LineString\",\"coordinates\":[[0.0,0.0],[0.0,10]],\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}}}", + "line" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7" + ] + + when: + Optional> actual = processor.handleEntity(validNode) + + then: + actual.isPresent() + actual.get() == expected + } +} diff --git a/src/test/groovy/edu/ie3/test/common/GridTestData.groovy b/src/test/groovy/edu/ie3/test/common/GridTestData.groovy index ae65bee59..9036e29fc 100644 --- a/src/test/groovy/edu/ie3/test/common/GridTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/GridTestData.groovy @@ -10,6 +10,8 @@ import edu.ie3.datamodel.models.input.connector.Transformer3WInput import edu.ie3.datamodel.models.input.connector.type.LineTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput +import edu.ie3.datamodel.models.input.graphics.LineGraphicInput +import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput import edu.ie3.datamodel.models.voltagelevels.GermanVoltageLevelUtils import edu.ie3.util.TimeTools import edu.ie3.util.quantities.PowerSystemUnits @@ -20,8 +22,6 @@ import tec.uom.se.quantity.Quantities import tec.uom.se.unit.MetricPrefix import tec.uom.se.unit.Units -import java.time.ZonedDateTime - import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLT import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLTAMPERE @@ -37,7 +37,7 @@ import static tec.uom.se.unit.Units.SIEMENS */ class GridTestData { - private static final GeoJsonReader geoJsonReader = new GeoJsonReader(); + private static final GeoJsonReader geoJsonReader = new GeoJsonReader() private static final Transformer2WTypeInput transformerTypeBtoD = new Transformer2WTypeInput( UUID.randomUUID(), @@ -139,7 +139,7 @@ class GridTestData { "node_a", Quantities.getQuantity(1d, PU), true, - (Point) geoJsonReader.read("{ \"type\": \"Point\", \"coordinates\": [7.411111, 51.492528] }"), + geoJsonReader.read("{ \"type\": \"Point\", \"coordinates\": [7.411111, 51.492528] }") as Point, GermanVoltageLevelUtils.EHV_380KV, 1) public static final NodeInput nodeB = new NodeInput( @@ -162,8 +162,15 @@ class GridTestData { null, GermanVoltageLevelUtils.MV_20KV, 3) + public static final NodeGraphicInput nodeGraphicC = new NodeGraphicInput( + UUID.fromString("09aec636-791b-45aa-b981-b14edf171c4c"), + "main", + null, + nodeC, + geoJsonReader.read("{ \"type\": \"Point\", \"coordinates\": [0, 10] }") as Point + ) public static final NodeInput nodeD = new NodeInput( - UUID.fromString("bd865a25-58f3-44ac-aa90-c6b6e3cd91b2"), + UUID.fromString("6e0980e0-10f2-4e18-862b-eb2b7c90509b"), OperationTime.notLimited(), OperatorInput.NO_OPERATOR_ASSIGNED, "node_d", @@ -172,6 +179,13 @@ class GridTestData { null, GermanVoltageLevelUtils.MV_20KV, 4) + public static final NodeGraphicInput nodeGraphicD = new NodeGraphicInput( + UUID.fromString("9ecad435-bd16-4797-a732-762c09d4af25"), + "main", + geoJsonReader.read("{ \"type\": \"LineString\", \"coordinates\": [[-1, 0], [1, 0]]}") as LineString, + nodeD, + null + ) public static final NodeInput nodeE = new NodeInput( UUID.randomUUID(), OperationTime.notLimited(), @@ -310,8 +324,13 @@ class GridTestData { 2, lineTypeInputCtoD, Quantities.getQuantity(3, Units.METRE), - (LineString) geoJsonReader.read("{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}"), + geoJsonReader.read("{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}") as LineString, Optional.of("olm") ) - + public static final LineGraphicInput lineGraphicCtoD = new LineGraphicInput( + UUID.fromString("ece86139-3238-4a35-9361-457ecb4258b0"), + "main", + geoJsonReader.read("{ \"type\": \"LineString\", \"coordinates\": [[0, 0], [0, 10]]}") as LineString, + lineCtoD + ) }