From e2924ee391bef4822b50b8f8a6585d8ae8529d97 Mon Sep 17 00:00:00 2001 From: Vicky Bung Date: Mon, 24 Apr 2023 13:43:01 +0200 Subject: [PATCH 01/10] Included option to parse a dateTimeFormatter to the processors --- CHANGELOG.md | 1 + .../datamodel/io/connectors/SqlConnector.java | 4 +- .../io/processor/EntityProcessor.java | 6 +- .../ie3/datamodel/io/processor/Processor.java | 8 ++- .../io/processor/ProcessorProvider.java | 29 ++++---- .../processor/input/InputEntityProcessor.java | 6 +- .../result/ResultEntityProcessor.java | 6 +- .../timeseries/TimeSeriesProcessor.java | 9 ++- .../ie3/datamodel/io/sink/CsvFileSink.java | 16 +++-- .../ie3/datamodel/io/sink/InfluxDbSink.java | 12 ++-- .../io/connectors/SqlConnectorIT.groovy | 1 + .../io/processor/ProcessorProviderTest.groovy | 26 ++++--- .../input/InputEntityProcessorTest.groovy | 55 ++++++++++----- .../result/ResultEntityProcessorTest.groovy | 29 ++++---- .../timeseries/TimeSeriesProcessorTest.groovy | 49 ++++++++----- .../datamodel/io/sink/CsvFileSinkTest.groovy | 69 +++++++++++-------- .../datamodel/io/sink/InfluxDbSinkIT.groovy | 6 +- .../ie3/test/common/TimeSeriesTestData.groovy | 69 ++++++++++--------- 18 files changed, 250 insertions(+), 151 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3622a2799..9bed27fde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,6 +105,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Deleted parameter decimalPlaces and changed naming of serialization method [#710](https://github.com/ie3-institute/PowerSystemDataModel/issues/710) - Changed switch result documentation according to the implementation [#757](https://github.com/ie3-institute/PowerSystemDataModel/issues/757) - Added documentation for EmResult and FlexOptionResult [#656](https://github.com/ie3-institute/PowerSystemDataModel/issues/656) +- Included option to parse a dateTimeFormatter to the processors [#766](https://github.com/ie3-institute/PowerSystemDataModel/issues/766) ## [2.0.1] - 2021-07-08 diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index 8b13ec0d0..7a8b027b6 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -20,8 +20,8 @@ public class SqlConnector implements DataConnector { public static final Logger log = LoggerFactory.getLogger(SqlConnector.class); - private final String jdbcUrl; - private final Properties connectionProps; + final String jdbcUrl; + final Properties connectionProps; private Connection connection; /** 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 3209799f9..17c58a38b 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java @@ -9,6 +9,7 @@ import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.UniqueEntity; import java.lang.reflect.Method; +import java.time.format.DateTimeFormatter; import java.util.*; import javax.measure.Quantity; import javax.measure.quantity.Energy; @@ -37,8 +38,9 @@ public abstract class EntityProcessor extends Processor< * * @param registeredClass the class the entity processor should be able to handle */ - protected EntityProcessor(Class registeredClass) { - super(registeredClass); + protected EntityProcessor( + Class registeredClass, DateTimeFormatter dateTimeFormatter) { + super(registeredClass, dateTimeFormatter); this.fieldNameToMethod = mapFieldNameToGetter(registeredClass, Collections.singleton(NODE_INTERNAL)); this.headerElements = fieldNameToMethod.keySet().toArray(new String[0]); diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 36f197db6..b07b0b1d7 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -21,6 +21,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import javax.measure.Quantity; @@ -67,12 +68,15 @@ public abstract class Processor { private static final String PARALLEL_DEVICES = "parallelDevices"; + private final DateTimeFormatter dateTimeFormatter; /** * Instantiates a Processor for a foreseen class * * @param foreSeenClass Class and its children that are foreseen to be handled with this processor + * @param dateTimeFormatter */ - protected Processor(Class foreSeenClass) { + protected Processor(Class foreSeenClass, DateTimeFormatter dateTimeFormatter) { + this.dateTimeFormatter = dateTimeFormatter; if (!getEligibleEntityClasses().contains(foreSeenClass)) throw new EntityProcessorException( "Cannot register class '" @@ -242,7 +246,7 @@ protected String processMethodResult(Object methodReturnObject, Method method, S }) .orElse("")); case "ZonedDateTime" -> resultStringBuilder.append( - processZonedDateTime((ZonedDateTime) methodReturnObject)); + dateTimeFormatter.format((ZonedDateTime) methodReturnObject)); case "OperationTime" -> resultStringBuilder.append( processOperationTime((OperationTime) methodReturnObject, fieldName)); case "VoltageLevel" -> resultStringBuilder.append( 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 8539ca52b..bc579bcd4 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -17,6 +17,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import org.slf4j.Logger; @@ -47,9 +48,9 @@ public class ProcessorProvider { timeSeriesProcessors; /** Get an instance of this class with all existing entity processors */ - public ProcessorProvider() { - this.entityProcessors = init(allEntityProcessors()); - this.timeSeriesProcessors = allTimeSeriesProcessors(); + public ProcessorProvider(DateTimeFormatter dateTimeFormatter) { + this.entityProcessors = init(allEntityProcessors(dateTimeFormatter)); + this.timeSeriesProcessors = allTimeSeriesProcessors(dateTimeFormatter); } /** @@ -235,10 +236,11 @@ private Map, EntityProcessor> allEntityProcessors() { + public static Collection> allEntityProcessors( + DateTimeFormatter dateTimeFormatter) { Collection> resultingProcessors = new ArrayList<>(); - resultingProcessors.addAll(allInputEntityProcessors()); - resultingProcessors.addAll(allResultEntityProcessors()); + resultingProcessors.addAll(allInputEntityProcessors(dateTimeFormatter)); + resultingProcessors.addAll(allResultEntityProcessors(dateTimeFormatter)); return resultingProcessors; } @@ -247,10 +249,11 @@ public static Collection> allEntityProce * * @return a collection of all input processors */ - public static Collection> allInputEntityProcessors() { + public static Collection> allInputEntityProcessors( + DateTimeFormatter dateTimeFormatter) { Collection> resultingProcessors = new ArrayList<>(); for (Class cls : InputEntityProcessor.eligibleEntityClasses) { - resultingProcessors.add(new InputEntityProcessor(cls)); + resultingProcessors.add(new InputEntityProcessor(cls, dateTimeFormatter)); } return resultingProcessors; } @@ -260,10 +263,11 @@ public static Collection> allInputEntity * * @return a collection of all result processors */ - public static Collection> allResultEntityProcessors() { + public static Collection> allResultEntityProcessors( + DateTimeFormatter dateTimeFormatter) { Collection> resultingProcessors = new ArrayList<>(); for (Class cls : ResultEntityProcessor.eligibleEntityClasses) { - resultingProcessors.add(new ResultEntityProcessor(cls)); + resultingProcessors.add(new ResultEntityProcessor(cls, dateTimeFormatter)); } return resultingProcessors; } @@ -277,7 +281,7 @@ public static Collection> allResultEntit TimeSeriesProcessorKey, TimeSeriesProcessor< TimeSeries, Value>, TimeSeriesEntry, Value>> - allTimeSeriesProcessors() { + allTimeSeriesProcessors(DateTimeFormatter dateTimeFormatter) { return TimeSeriesProcessor.eligibleKeys.stream() .collect( Collectors.toMap( @@ -286,7 +290,8 @@ public static Collection> allResultEntit new TimeSeriesProcessor<>( (Class, Value>>) key.getTimeSeriesClass(), (Class>) key.getEntryClass(), - (Class) key.getValueClass()))); + (Class) key.getValueClass(), + dateTimeFormatter))); } @SuppressWarnings("unchecked cast") diff --git a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java index 16a75b725..09a7bcd0f 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java @@ -19,6 +19,7 @@ import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput; +import java.time.format.DateTimeFormatter; import java.util.List; /** @@ -73,8 +74,9 @@ public class InputEntityProcessor extends EntityProcessor { StorageTypeInput.class, WecTypeInput.class); - public InputEntityProcessor(Class registeredClass) { - super(registeredClass); + public InputEntityProcessor( + Class registeredClass, DateTimeFormatter dateTimeFormatter) { + super(registeredClass, dateTimeFormatter); } @Override diff --git a/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java index 93a792eda..d93240f24 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java @@ -17,6 +17,7 @@ import edu.ie3.datamodel.models.result.system.*; import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult; import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult; +import java.time.format.DateTimeFormatter; import java.util.*; import javax.measure.Quantity; import javax.measure.quantity.Energy; @@ -56,8 +57,9 @@ public class ResultEntityProcessor extends EntityProcessor { EmResult.class, FlexOptionsResult.class); - public ResultEntityProcessor(Class registeredClass) { - super(registeredClass); + public ResultEntityProcessor( + Class registeredClass, DateTimeFormatter dateTimeFormatter) { + super(registeredClass, dateTimeFormatter); } @Override diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index e4b9dbcfa..721af5e33 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -17,6 +17,7 @@ import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; import edu.ie3.datamodel.models.value.*; import java.lang.reflect.Method; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -66,8 +67,12 @@ public class TimeSeriesProcessor< private final String[] flattenedHeaderElements; - public TimeSeriesProcessor(Class timeSeriesClass, Class entryClass, Class valueClass) { - super(timeSeriesClass); + public TimeSeriesProcessor( + Class timeSeriesClass, + Class entryClass, + Class valueClass, + DateTimeFormatter dateTimeFormatter) { + super(timeSeriesClass, dateTimeFormatter); /* Check, if this processor can handle the foreseen combination of time series, entry and value */ TimeSeriesProcessorKey timeSeriesKey = diff --git a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java index ec50a044f..f6908ce20 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java @@ -33,6 +33,7 @@ import edu.ie3.datamodel.models.value.Value; import edu.ie3.util.StringUtils; import java.io.IOException; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -54,12 +55,13 @@ public class CsvFileSink implements InputDataSink, OutputDataSink { private static final Logger log = LoggerFactory.getLogger(CsvFileSink.class); private final CsvFileConnector connector; + private final ProcessorProvider processorProvider; private final String csvSep; - public CsvFileSink(String baseFolderPath) { - this(baseFolderPath, new FileNamingStrategy(), false, ","); + public CsvFileSink(String baseFolderPath, DateTimeFormatter dateTimeFormatter) { + this(baseFolderPath, new FileNamingStrategy(), dateTimeFormatter, false, ","); } /** @@ -77,9 +79,15 @@ public CsvFileSink(String baseFolderPath) { public CsvFileSink( String baseFolderPath, FileNamingStrategy fileNamingStrategy, + DateTimeFormatter dateTimeFormatter, boolean initFiles, String csvSep) { - this(baseFolderPath, new ProcessorProvider(), fileNamingStrategy, initFiles, csvSep); + this( + baseFolderPath, + new ProcessorProvider(dateTimeFormatter), + fileNamingStrategy, + initFiles, + csvSep); } /** @@ -89,7 +97,7 @@ public CsvFileSink( * {@link ProcessorProvider} because if you're not 100% sure that it knows about all entities * you're going to process exceptions might occur. Therefore it is strongly advised to either use * a constructor without providing the {@link ProcessorProvider} or provide a general {@link - * ProcessorProvider} by calling {@link ProcessorProvider#ProcessorProvider()} + * ProcessorProvider} * * @param baseFolderPath the base folder path where the files should be put into * @param processorProvider the processor provided that should be used for entity serialization diff --git a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java index 20eac6dbb..10955496f 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java @@ -16,6 +16,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -44,13 +45,14 @@ public class InfluxDbSink implements OutputDataSink { */ public InfluxDbSink( InfluxDbConnector connector, - EntityPersistenceNamingStrategy entityPersistenceNamingStrategy) { + EntityPersistenceNamingStrategy entityPersistenceNamingStrategy, + DateTimeFormatter dateTimeFormatter) { this.connector = connector; this.entityPersistenceNamingStrategy = entityPersistenceNamingStrategy; this.processorProvider = new ProcessorProvider( - ProcessorProvider.allResultEntityProcessors(), - ProcessorProvider.allTimeSeriesProcessors()); + ProcessorProvider.allResultEntityProcessors(dateTimeFormatter), + ProcessorProvider.allTimeSeriesProcessors(dateTimeFormatter)); } /** @@ -58,8 +60,8 @@ public InfluxDbSink( * * @param connector needed for database connection */ - public InfluxDbSink(InfluxDbConnector connector) { - this(connector, new EntityPersistenceNamingStrategy()); + public InfluxDbSink(InfluxDbConnector connector, DateTimeFormatter dateTimeFormatter) { + this(connector, new EntityPersistenceNamingStrategy(), dateTimeFormatter); } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlConnectorIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlConnectorIT.groovy index 66db0baca..02ba4c7ba 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlConnectorIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlConnectorIT.groovy @@ -13,6 +13,7 @@ import spock.lang.Shared import spock.lang.Specification import java.sql.SQLException +import java.time.format.DateTimeFormatter @Testcontainers class SqlConnectorIT extends Specification implements TestContainerHelper { 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 32a6279b4..bf4be41bb 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -52,12 +52,14 @@ import tech.units.indriya.quantity.Quantities import javax.measure.Quantity import javax.measure.quantity.Power +import java.time.format.DateTimeFormatter class ProcessorProviderTest extends Specification implements TimeSeriesTestData { def "A ProcessorProvider should initialize all known EntityProcessors by default"() { given: - ProcessorProvider provider = new ProcessorProvider() + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + ProcessorProvider provider = new ProcessorProvider(dateTimeFormatter) List knownEntityProcessors = [ /* InputEntity */ OperatorInput, @@ -129,7 +131,8 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData def "A ProcessorProvider should initialize all known TimeSeriesProcessors by default"() { given: - ProcessorProvider provider = new ProcessorProvider() + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + ProcessorProvider provider = new ProcessorProvider(dateTimeFormatter) Set expected = [ new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, SolarIrradianceValue), @@ -153,9 +156,10 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData def "A ProcessorProvider should return the header elements for a entity class known by one of its processors and do nothing otherwise"() { given: + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME ProcessorProvider provider = new ProcessorProvider([ - new ResultEntityProcessor(PvResult), - new ResultEntityProcessor(EvResult) + new ResultEntityProcessor(PvResult, dateTimeFormatter), + new ResultEntityProcessor(EvResult, dateTimeFormatter) ], [] as Map, Value>, TimeSeriesEntry, Value>>) when: @@ -180,9 +184,10 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData def "A ProcessorProvider should return the header elements for a time series key known by one of its processors and do nothing otherwise"() { given: + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME TimeSeriesProcessorKey availableKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) Map, Value>, TimeSeriesEntry, Value>> timeSeriesProcessors = new HashMap<>() - timeSeriesProcessors.put(availableKey, new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue)) + timeSeriesProcessors.put(availableKey, new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue,dateTimeFormatter)) ProcessorProvider provider = new ProcessorProvider([], timeSeriesProcessors) when: @@ -205,9 +210,10 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData def "A ProcessorProvider should process an entity known by its underlying processors correctly and do nothing otherwise"() { given: + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME ProcessorProvider provider = new ProcessorProvider([ - new ResultEntityProcessor(PvResult), - new ResultEntityProcessor(EvResult) + new ResultEntityProcessor(PvResult, dateTimeFormatter), + new ResultEntityProcessor(EvResult, dateTimeFormatter) ], [] as Map, Value>, TimeSeriesEntry, Value>>) Map expectedMap = ["uuid" : "22bea5fc-2cb2-4c61-beb9-b476e0107f52", @@ -241,8 +247,9 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData def "A ProcessorProvider returns an empty Optional, if none of the assigned processors is able to handle a time series"() { given: + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue, dateTimeFormatter) Map timeSeriesProcessorMap = new HashMap<>() timeSeriesProcessorMap.put(key, processor) ProcessorProvider provider = new ProcessorProvider([], timeSeriesProcessorMap) @@ -256,8 +263,9 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData def "A ProcessorProvider handles a time series correctly"() { given: + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue, dateTimeFormatter) Map timeSeriesProcessorMap = new HashMap<>() timeSeriesProcessorMap.put(key, processor) ProcessorProvider provider = new ProcessorProvider([], timeSeriesProcessorMap) diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy index defe04b4d..06c0d956f 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy @@ -29,6 +29,7 @@ import spock.lang.Specification import tech.units.indriya.quantity.Quantities import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter import static edu.ie3.util.quantities.PowerSystemUnits.PU @@ -42,7 +43,8 @@ class InputEntityProcessorTest extends Specification { def "A InputEntityProcessor should serialize a provided NodeInput correctly"() { given: - def processor = new InputEntityProcessor(NodeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def processor = new InputEntityProcessor(NodeInput, dateTimeFormatter) def validResult = GridTestData.nodeA Map expectedResults = [ @@ -69,7 +71,8 @@ class InputEntityProcessorTest extends Specification { def "A InputEntityProcessor should serialize a provided ConnectorInput correctly"() { given: - def processor = new InputEntityProcessor(modelClass) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def processor = new InputEntityProcessor(modelClass, dateTimeFormatter) def validInput = modelInstance when: "the entity is passed to the processor" @@ -139,7 +142,8 @@ class InputEntityProcessorTest extends Specification { def "A InputEntityProcessor should serialize a provided SystemParticipantInput correctly"() { given: - def processor = new InputEntityProcessor(modelClass) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def processor = new InputEntityProcessor(modelClass, dateTimeFormatter) def validInput = modelInstance when: "the entity is passed to the processor" @@ -285,7 +289,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided NodeGraphicInput with point correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(NodeGraphicInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(NodeGraphicInput, dateTimeFormatter) NodeGraphicInput validNode = GridTestData.nodeGraphicC Map expected = [ "uuid" : "09aec636-791b-45aa-b981-b14edf171c4c", @@ -305,7 +310,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided NodeGraphicInput with path correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(NodeGraphicInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(NodeGraphicInput, dateTimeFormatter) NodeGraphicInput validNode = GridTestData.nodeGraphicD Map expected = [ "uuid" : "9ecad435-bd16-4797-a732-762c09d4af25", @@ -325,7 +331,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided LineGraphicInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(LineGraphicInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(LineGraphicInput, dateTimeFormatter) LineGraphicInput validNode = GridTestData.lineGraphicCtoD Map expected = [ "uuid" : "ece86139-3238-4a35-9361-457ecb4258b0", @@ -344,7 +351,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided OperatorInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(OperatorInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(OperatorInput, dateTimeFormatter) OperatorInput operator = new OperatorInput(UUID.fromString("420ee39c-dd5a-4d9c-9156-23dbdef13e5e"), "Prof. Brokkoli") Map expected = [ "uuid": "420ee39c-dd5a-4d9c-9156-23dbdef13e5e", @@ -361,7 +369,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided RandomLoadParameters correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(RandomLoadParameters) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(RandomLoadParameters, dateTimeFormatter) RandomLoadParameters parameters = new RandomLoadParameters( UUID.fromString("a5b0f432-27b5-4b3e-b87a-61867b9edd79"), 4, @@ -399,7 +408,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided WecTypeInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(WecTypeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(WecTypeInput, dateTimeFormatter) WecTypeInput type = TypeTestData.wecType Map expected = [ "uuid" : "a24fc5b9-a26f-44de-96b8-c9f50b665cb3", @@ -424,7 +434,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided Transformer2WTypeInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(Transformer2WTypeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(Transformer2WTypeInput, dateTimeFormatter) Transformer2WTypeInput type = GridTestData.transformerTypeBtoD Map expected = [ "uuid" : "202069a7-bcf8-422c-837c-273575220c8a", @@ -454,7 +465,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided Transformer3WTypeInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(Transformer3WTypeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(Transformer3WTypeInput, dateTimeFormatter) Transformer3WTypeInput type = GridTestData.transformerTypeAtoBtoC Map expected = [ "uuid" : "5b0ee546-21fb-4a7f-a801-5dbd3d7bb356", @@ -490,7 +502,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided LineTypeInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(LineTypeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(LineTypeInput, dateTimeFormatter) LineTypeInput type = GridTestData.lineTypeInputCtoD Map expected = [ "uuid" : "3bed3eb3-9790-4874-89b5-a5434d408088", @@ -513,7 +526,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided EvTypeInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(EvTypeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(EvTypeInput, dateTimeFormatter) EvTypeInput type = TypeTestData.evType Map expected = [ "uuid" : "66b0db5d-b2fb-41d0-a9bc-990d6b6a36db", @@ -536,7 +550,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided ChpTypeInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(ChpTypeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(ChpTypeInput, dateTimeFormatter) ChpTypeInput type = TypeTestData.chpType Map expected = [ "uuid" : "1c027d3e-5409-4e52-a0e2-f8a23d5d0af0", @@ -561,7 +576,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided HpTypeInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(HpTypeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(HpTypeInput, dateTimeFormatter) HpTypeInput type = TypeTestData.hpType Map expected = [ "uuid" : "1059ef51-9e17-4c13-928c-7c1c716d4ee6", @@ -583,7 +599,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided BmTypeInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(BmTypeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(BmTypeInput, dateTimeFormatter) BmTypeInput type = TypeTestData.bmType Map expected = [ "uuid" : "c3bd30f5-1a62-4a37-86e3-074040d965a4", @@ -606,7 +623,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided StorageTypeInput correctly"() { given: - InputEntityProcessor processor = new InputEntityProcessor(StorageTypeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(StorageTypeInput, dateTimeFormatter) StorageTypeInput type = TypeTestData.storageType Map expected = [ "uuid" : "fbee4995-24dd-45e4-9c85-7d986fe99ff3", @@ -634,7 +652,8 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize an entity but ignore the operator field when OperatorInput is equal to NO_OPERATOR_ASSIGNED"() { given: - InputEntityProcessor processor = new InputEntityProcessor(NodeInput) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + InputEntityProcessor processor = new InputEntityProcessor(NodeInput, dateTimeFormatter) def nodeWithOutOperator = new NodeInput( UUID.fromString("6e0980e0-10f2-4e18-862b-eb2b7c90509b"), "node_d", OperatorInput.NO_OPERATOR_ASSIGNED, OperationTime.notLimited() diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy index d634f8c96..177ed01d1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy @@ -24,6 +24,7 @@ import tech.units.indriya.unit.Units import javax.measure.Quantity import javax.measure.quantity.* import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter class ResultEntityProcessorTest extends Specification { @@ -66,7 +67,8 @@ class ResultEntityProcessorTest extends Specification { def "A ResultEntityProcessor should serialize a provided SystemParticipantResult correctly"() { given: - def sysPartResProcessor = new ResultEntityProcessor(modelClass) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def sysPartResProcessor = new ResultEntityProcessor(modelClass, dateTimeFormatter) def validResult = validSystemParticipantResult when: @@ -93,7 +95,8 @@ class ResultEntityProcessorTest extends Specification { def "A ResultEntityProcessor should throw an exception if the provided class is not registered"() { given: - def sysPartResProcessor = new ResultEntityProcessor(LoadResult) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def sysPartResProcessor = new ResultEntityProcessor(LoadResult, dateTimeFormatter) def storageResult = new StorageResult(uuid, ZonedDateTime.parse("2020-01-30T17:26:44Z[UTC]"), inputModel, p, q, Quantities.getQuantity(10d, StandardUnits.SOC)) when: @@ -106,7 +109,8 @@ class ResultEntityProcessorTest extends Specification { def "A ResultEntityProcessor should serialize a NodeResult correctly"() { given: - def sysPartResProcessor = new ResultEntityProcessor(NodeResult) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def sysPartResProcessor = new ResultEntityProcessor(NodeResult, dateTimeFormatter) Quantity vMag = Quantities.getQuantity(0.95, PowerSystemUnits.PU) Quantity vAng = Quantities.getQuantity(45, StandardUnits.VOLTAGE_ANGLE) @@ -129,7 +133,8 @@ class ResultEntityProcessorTest extends Specification { def "A ResultEntityProcessor should serialize a FlexOptionsResult correctly"() { given: - def sysPartResProcessor = new ResultEntityProcessor(FlexOptionsResult) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def sysPartResProcessor = new ResultEntityProcessor(FlexOptionsResult, dateTimeFormatter) // take wrong unit for pRef on purpose, should get converted Quantity pRef = Quantities.getQuantity(5100, PowerSystemUnits.KILOWATT) @@ -218,7 +223,8 @@ class ResultEntityProcessorTest extends Specification { def "A ResultEntityProcessor should serialize all ConnectorResults correctly"() { given: - def sysPartResProcessor = new ResultEntityProcessor(modelClass) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def sysPartResProcessor = new ResultEntityProcessor(modelClass, dateTimeFormatter) def validResult = validConnectorResult @@ -239,7 +245,8 @@ class ResultEntityProcessorTest extends Specification { def "A ResultEntityProcessor should serialize a CylindricalStorageResult correctly"() { given: - def sysPartResProcessor = new ResultEntityProcessor(CylindricalStorageResult) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def sysPartResProcessor = new ResultEntityProcessor(CylindricalStorageResult, dateTimeFormatter) Quantity qDot = Quantities.getQuantity(2, StandardUnits.Q_DOT_RESULT) Quantity energy = Quantities.getQuantity(3, StandardUnits.ENERGY_RESULT) @@ -265,7 +272,8 @@ class ResultEntityProcessorTest extends Specification { def "A ResultEntityProcessor should throw an EntityProcessorException when it receives an entity result that is not eligible"() { given: - def sysPartResProcessor = new ResultEntityProcessor(ResultEntityProcessor.eligibleEntityClasses.get(0)) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def sysPartResProcessor = new ResultEntityProcessor(ResultEntityProcessor.eligibleEntityClasses.get(0), dateTimeFormatter) def invalidClassResult = new InvalidTestResult(ZonedDateTime.parse("2020-01-30T17:26:44Z[UTC]"), uuid) @@ -288,8 +296,9 @@ class ResultEntityProcessorTest extends Specification { def "ResultEntityProcessor should throw an exception if an invalid class is passed into the constructor"() { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME when: - new ResultEntityProcessor(InvalidTestResult) + new ResultEntityProcessor(InvalidTestResult, dateTimeFormatter) then: thrown(EntityProcessorException) @@ -300,10 +309,6 @@ class ResultEntityProcessorTest extends Specification { InvalidTestResult(ZonedDateTime time, UUID inputModel) { super(time, inputModel) } - - InvalidTestResult(UUID uuid, ZonedDateTime time, UUID inputModel) { - super(uuid, time, inputModel) - } } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy index fb033e06d..41a12ffeb 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy @@ -17,11 +17,13 @@ import edu.ie3.test.common.TimeSeriesTestData import spock.lang.Specification import java.lang.reflect.Method +import java.time.format.DateTimeFormatter class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestData { def "A TimeSeriesProcessor is instantiated correctly"() { when: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue, dateTimeFormatter) Map expectedSourceMapping = [ "uuid": FieldSourceToMethod.FieldSource.ENTRY, "price": FieldSourceToMethod.FieldSource.VALUE, @@ -49,7 +51,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessor throws an Exception on instantiation, if the time series combination is not supported"() { when: - new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, IntValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, IntValue, dateTimeFormatter) then: EntityProcessorException thrown = thrown(EntityProcessorException) @@ -58,7 +61,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessor throws an Exception, when the simple handle method is called"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue, dateTimeFormatter) when: processor.handleEntity(individualEnergyPriceTimeSeries) @@ -70,7 +74,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessor correctly extracts the field name to getter map"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue, dateTimeFormatter) when: Map actual = processor.extractFieldToMethod(source) @@ -87,7 +92,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessor handles an entry correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue, dateTimeFormatter) Map expected = Processor.putUuidFirst([ "uuid" : "9e4dba1b-f3bb-4e40-bd7e-2de7e81b7704", "price": "5.0", @@ -105,7 +111,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with EnergyPriceValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(individualEnergyPriceTimeSeries) @@ -116,7 +123,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with TemperatureValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, TemperatureValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, TemperatureValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(individualTemperatureTimeSeries) @@ -127,7 +135,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with WindValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, WindValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, WindValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(individualWindTimeSeries) @@ -138,7 +147,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with IrradianceValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, SolarIrradianceValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, SolarIrradianceValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(individualIrradianceTimeSeries) @@ -149,7 +159,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with WeatherValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, WeatherValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, WeatherValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(individualWeatherTimeSeries) @@ -160,7 +171,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with HeatDemandValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatDemandValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatDemandValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(individualHeatDemandTimeSeries) @@ -171,7 +183,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with PValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, PValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, PValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(individualPTimeSeries) @@ -182,7 +195,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with HeatAndPValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatAndPValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatAndPValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(individualHeatAndPTimeSeries) @@ -193,7 +207,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with SValue correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, SValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, SValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(individualSTimeSeries) @@ -204,7 +219,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with HeatAndSValue correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatAndSValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatAndSValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(individualHeatAndSTimeSeries) @@ -215,7 +231,8 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete LoadProfileInput correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(LoadProfileInput, LoadProfileEntry, PValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(LoadProfileInput, LoadProfileEntry, PValue, dateTimeFormatter) when: Set> actual = processor.handleTimeSeries(loadProfileInput) diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index ccd738a5e..81758ae99 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -8,6 +8,8 @@ package edu.ie3.datamodel.io.sink import edu.ie3.datamodel.models.result.system.EmResult import edu.ie3.datamodel.models.result.system.FlexOptionsResult +import java.time.format.DateTimeFormatter + import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLTAMPERE import static tech.units.indriya.unit.Units.PERCENT import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM @@ -74,7 +76,8 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink called by simple constructor should not initialize files by default and consist of several default values"() { given: - CsvFileSink csvFileSink = new CsvFileSink(testBaseFolderPath) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + CsvFileSink csvFileSink = new CsvFileSink(testBaseFolderPath, dateTimeFormatter) csvFileSink.shutdown() expect: @@ -84,10 +87,11 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink with 'initFiles' enabled should create files as expected"() { given: + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME CsvFileSink csvFileSink = new CsvFileSink(testBaseFolderPath, new ProcessorProvider([ - new ResultEntityProcessor(PvResult), - new ResultEntityProcessor(EvResult) + new ResultEntityProcessor(PvResult, dateTimeFormatter), + new ResultEntityProcessor(EvResult, dateTimeFormatter) ], [] as Map), new FileNamingStrategy(), true, @@ -102,7 +106,8 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink is able to convert an entity data map correctly to RFC 4180 compliant strings"() { given: - def csvFileSink = new CsvFileSink(testBaseFolderPath) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def csvFileSink = new CsvFileSink(testBaseFolderPath, dateTimeFormatter) def input = [ "hello, whats up?": "nothing", "okay" : "that's fine" @@ -123,7 +128,8 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink throws an IllegalStateException, if processing entity data map to RFC 4180 compliant strings generates duplicated keys"() { given: - def csvFileSink = new CsvFileSink(testBaseFolderPath) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def csvFileSink = new CsvFileSink(testBaseFolderPath, dateTimeFormatter) def input = [ "what is \"this\"?" : "nothing", "\"what is \"this\"?\"": "something" @@ -142,28 +148,29 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink without 'initFiles' should only persist provided elements correctly but not init all files"() { given: + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME CsvFileSink csvFileSink = new CsvFileSink(testBaseFolderPath, new ProcessorProvider([ - new ResultEntityProcessor(PvResult), - new ResultEntityProcessor(WecResult), - new ResultEntityProcessor(EvResult), - new ResultEntityProcessor(EvcsResult), - new ResultEntityProcessor(EmResult), - new ResultEntityProcessor(FlexOptionsResult), - new InputEntityProcessor(Transformer2WInput), - new InputEntityProcessor(NodeInput), - new InputEntityProcessor(EvcsInput), - new InputEntityProcessor(Transformer2WTypeInput), - new InputEntityProcessor(LineGraphicInput), - new InputEntityProcessor(NodeGraphicInput), - new InputEntityProcessor(CylindricalStorageInput), - new InputEntityProcessor(ThermalHouseInput), - new InputEntityProcessor(OperatorInput), - new InputEntityProcessor(LineInput), - new InputEntityProcessor(ThermalBusInput), - new InputEntityProcessor(LineTypeInput), - new InputEntityProcessor(LoadInput), - new InputEntityProcessor(EmInput) + new ResultEntityProcessor(PvResult, dateTimeFormatter), + new ResultEntityProcessor(WecResult, dateTimeFormatter), + new ResultEntityProcessor(EvResult, dateTimeFormatter), + new ResultEntityProcessor(EvcsResult, dateTimeFormatter), + new ResultEntityProcessor(EmResult, dateTimeFormatter), + new ResultEntityProcessor(FlexOptionsResult, dateTimeFormatter), + new InputEntityProcessor(Transformer2WInput, dateTimeFormatter), + new InputEntityProcessor(NodeInput, dateTimeFormatter), + new InputEntityProcessor(EvcsInput, dateTimeFormatter), + new InputEntityProcessor(Transformer2WTypeInput, dateTimeFormatter), + new InputEntityProcessor(LineGraphicInput, dateTimeFormatter), + new InputEntityProcessor(NodeGraphicInput, dateTimeFormatter), + new InputEntityProcessor(CylindricalStorageInput, dateTimeFormatter), + new InputEntityProcessor(ThermalHouseInput, dateTimeFormatter), + new InputEntityProcessor(OperatorInput, dateTimeFormatter), + new InputEntityProcessor(LineInput, dateTimeFormatter), + new InputEntityProcessor(ThermalBusInput, dateTimeFormatter), + new InputEntityProcessor(LineTypeInput, dateTimeFormatter), + new InputEntityProcessor(LoadInput, dateTimeFormatter), + new InputEntityProcessor(EmInput, dateTimeFormatter) ], [] as Map), new FileNamingStrategy(), false, @@ -227,7 +234,8 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink should persist a time series correctly"() { given: - TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue, dateTimeFormatter) TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) HashMap timeSeriesProcessorMap = new HashMap<>() timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) @@ -251,7 +259,8 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink persists a bunch of time series correctly"() { given: - CsvFileSink csvFileSink = new CsvFileSink(testBaseFolderPath) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + CsvFileSink csvFileSink = new CsvFileSink(testBaseFolderPath, dateTimeFormatter) when: csvFileSink.persistAll(allTimeSeries) @@ -271,7 +280,8 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink is able to persist an InputEntity without persisting the nested elements"() { given: - def csvFileSink = new CsvFileSink(testBaseFolderPath) + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def csvFileSink = new CsvFileSink(testBaseFolderPath, dateTimeFormatter) def nestedInput = new PvInput( UUID.fromString("d56f15b7-8293-4b98-b5bd-58f6273ce229"), "test_pvInput", @@ -327,9 +337,10 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink should persist a valid joint grid container correctly"() { given: /* A csv file sink, that is NOT able to handle time series */ + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME def csvFileSink = new CsvFileSink( testBaseFolderPath, - new ProcessorProvider(), + new ProcessorProvider(dateTimeFormatter), new FileNamingStrategy(), false, ",") diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy index 4b5c57905..e007a9b3d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy @@ -31,6 +31,7 @@ import tech.units.indriya.quantity.Quantities import java.time.ZoneId import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter @Testcontainers class InfluxDbSinkIT extends Specification { @@ -50,9 +51,12 @@ class InfluxDbSinkIT extends Specification { @Shared InfluxDbSink sink + @Shared + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def setupSpec() { connector = new InfluxDbConnector(influxDbContainer.url,"test_out", "test_scenario") - sink = new InfluxDbSink(connector) + sink = new InfluxDbSink(connector, dateTimeFormatter) fileNamingStrategy = new FileNamingStrategy() } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index 61986f7ad..511b70e67 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -55,18 +55,21 @@ trait TimeSeriesTestData { Set> individualEnergyPriceTimeSeriesProcessed = [ [ "uuid" : "9e4dba1b-f3bb-4e40-bd7e-2de7e81b7704", - "time" : "2020-04-02T10:00Z[UTC]", - "price" : "5.0" + "price" : "5.0", + "time" : "2020-04-02T10:00:00Z[UTC]" + ] as LinkedHashMap, [ "uuid" : "520d8e37-b842-40fd-86fb-32007e88493e", - "time" : "2020-04-02T10:15Z[UTC]", - "price" : "15.0" + "price" : "15.0", + "time" : "2020-04-02T10:15:00Z[UTC]", + ] as LinkedHashMap, [ "uuid" : "593d006c-ef76-46a9-b8db-f8666f69c5db", - "time" : "2020-04-02T10:30Z[UTC]", - "price" : "10.0" + "price" : "10.0", + "time" : "2020-04-02T10:30:00Z[UTC]", + ] as LinkedHashMap ] as Set @@ -100,17 +103,17 @@ trait TimeSeriesTestData { Set> individualTemperatureTimeSeriesProcessed = [ [ "uuid" : "48962a4a-b169-41f4-b0fe-e4bd8539b281", - "time" : "2020-04-02T10:00Z[UTC]", + "time" : "2020-04-02T10:00:00Z[UTC]", "temperature" : "5.0" ] as LinkedHashMap, [ "uuid" : "38e8188d-17dc-4b49-9827-68ba1eeac1e3", - "time" : "2020-04-02T10:15Z[UTC]", + "time" : "2020-04-02T10:15:00Z[UTC]", "temperature" : "15.0" ] as LinkedHashMap, [ "uuid" : "e332cae2-785d-47db-941a-3c400fa8518b", - "time" : "2020-04-02T10:30Z[UTC]", + "time" : "2020-04-02T10:30:00Z[UTC]", "temperature" : "10.0" ] as LinkedHashMap ] as Set @@ -137,19 +140,19 @@ trait TimeSeriesTestData { [ "uuid" : "3453d88d-50f6-4124-b2d0-807a9b7dbf54", "direction" : "5.0", - "time" : "2020-04-02T10:00Z[UTC]", + "time" : "2020-04-02T10:00:00Z[UTC]", "velocity" : "10.0" ] as LinkedHashMap, [ "uuid" : "870e8e22-5667-4681-96ad-5ab6ac9cf25b", "direction" : "15.0", - "time" : "2020-04-02T10:15Z[UTC]", + "time" : "2020-04-02T10:15:00Z[UTC]", "velocity" : "20.0" ] as LinkedHashMap, [ "uuid" : "cb7da21b-59af-4579-9352-2aa6b3020627", "direction" : "10.0", - "time" : "2020-04-02T10:30Z[UTC]", + "time" : "2020-04-02T10:30:00Z[UTC]", "velocity" : "15.0" ] as LinkedHashMap ] as Set @@ -177,19 +180,19 @@ trait TimeSeriesTestData { "uuid" : "e397cf20-43ae-4601-a6cd-0ee85c63cec3", "directIrradiance" : "5.0", "diffuseIrradiance" : "10.0", - "time" : "2020-04-02T10:00Z[UTC]" + "time" : "2020-04-02T10:00:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "94400577-83ac-4dd5-818d-8d62edcd4ee2", "directIrradiance" : "15.0", "diffuseIrradiance" : "20.0", - "time" : "2020-04-02T10:15Z[UTC]" + "time" : "2020-04-02T10:15:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "d7523ef9-f8d7-449f-834f-7b92bf51fd9e", "directIrradiance" : "10.0", "diffuseIrradiance" : "15.0", - "time" : "2020-04-02T10:30Z[UTC]" + "time" : "2020-04-02T10:30:00Z[UTC]" ] as LinkedHashMap ] as Set @@ -237,7 +240,7 @@ trait TimeSeriesTestData { "directIrradiance" : "5.0", "direction" : "5.0", "temperature" : "5.0", - "time" : "2020-04-02T10:00Z[UTC]", + "time" : "2020-04-02T10:00:00Z[UTC]", "velocity" : "10.0" ] as LinkedHashMap, [ @@ -247,7 +250,7 @@ trait TimeSeriesTestData { "directIrradiance" : "15.0", "direction" : "15.0", "temperature" : "15.0", - "time" : "2020-04-02T10:15Z[UTC]", + "time" : "2020-04-02T10:15:00Z[UTC]", "velocity" : "20.0" ] as LinkedHashMap, [ @@ -257,7 +260,7 @@ trait TimeSeriesTestData { "directIrradiance" : "10.0", "direction" : "10.0", "temperature" : "10.0", - "time" : "2020-04-02T10:30Z[UTC]", + "time" : "2020-04-02T10:30:00Z[UTC]", "velocity" : "15.0" ] as LinkedHashMap ] as Set @@ -284,17 +287,17 @@ trait TimeSeriesTestData { [ "uuid" : "89ae0ccd-04fd-47a7-a49f-a882cab66784", "heatDemand" : "5.0", - "time" : "2020-04-02T10:00Z[UTC]" + "time" : "2020-04-02T10:00:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "56e4295b-740a-45dd-9a0d-f5ec8b3bec13", "heatDemand" : "15.0", - "time" : "2020-04-02T10:15Z[UTC]" + "time" : "2020-04-02T10:15:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "996a0ffa-548b-4f5e-825a-25b1452bc9c0", "heatDemand" : "10.0", - "time" : "2020-04-02T10:30Z[UTC]" + "time" : "2020-04-02T10:30:00Z[UTC]" ] as LinkedHashMap ] as Set @@ -320,17 +323,17 @@ trait TimeSeriesTestData { [ "uuid" : "cb3c12e9-7b54-4066-8e51-30aed8ea05ff", "p" : "5.0", - "time" : "2020-04-02T10:00Z[UTC]" + "time" : "2020-04-02T10:00:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "07937986-c7b6-48b8-852d-8579a4de0f3f", "p" : "15.0", - "time" : "2020-04-02T10:15Z[UTC]" + "time" : "2020-04-02T10:15:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "43fcb651-94ff-4491-9994-5ce5980b51f8", "p" : "10.0", - "time" : "2020-04-02T10:30Z[UTC]" + "time" : "2020-04-02T10:30:00Z[UTC]" ] as LinkedHashMap ] as Set @@ -357,19 +360,19 @@ trait TimeSeriesTestData { "uuid" : "d0dd9b16-6561-45cd-989f-2f9f2d623285", "heatDemand" : "10.0", "p" : "5.0", - "time" : "2020-04-02T10:00Z[UTC]" + "time" : "2020-04-02T10:00:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "76cdb572-db19-4731-a51d-f88d60ac23bf", "heatDemand" : "20.0", "p" : "15.0", - "time" : "2020-04-02T10:15Z[UTC]" + "time" : "2020-04-02T10:15:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "85d34be8-9672-4382-bb28-6c526e061979", "heatDemand" : "15.0", "p" : "10.0", - "time" : "2020-04-02T10:30Z[UTC]" + "time" : "2020-04-02T10:30:00Z[UTC]" ] as LinkedHashMap ] as Set @@ -396,19 +399,19 @@ trait TimeSeriesTestData { "uuid" : "1db6d265-40b3-4c02-bee9-ffc74574af65", "p" : "5.0", "q" : "10.0", - "time" : "2020-04-02T10:00Z[UTC]" + "time" : "2020-04-02T10:00:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "c4fe02c4-1a11-4975-8641-7c3daf452475", "p" : "15.0", "q" : "20.0", - "time" : "2020-04-02T10:15Z[UTC]" + "time" : "2020-04-02T10:15:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "90082474-af4c-44ea-8b38-f7c6fb48907c", "p" : "10.0", "q" : "15.0", - "time" : "2020-04-02T10:30Z[UTC]" + "time" : "2020-04-02T10:30:00Z[UTC]" ] as LinkedHashMap ] as Set @@ -436,21 +439,21 @@ trait TimeSeriesTestData { "heatDemand" : "15.0", "p" : "5.0", "q" : "10.0", - "time" : "2020-04-02T10:00Z[UTC]" + "time" : "2020-04-02T10:00:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "adb6a248-c57f-4ca5-9feb-d0ca3296f0c7", "heatDemand" : "25.0", "p" : "15.0", "q" : "20.0", - "time" : "2020-04-02T10:15Z[UTC]" + "time" : "2020-04-02T10:15:00Z[UTC]" ] as LinkedHashMap, [ "uuid" : "07feb8fa-1ee0-4a40-bca0-cf831db0b745", "heatDemand" : "20.0", "p" : "10.0", "q" : "15.0", - "time" : "2020-04-02T10:30Z[UTC]" + "time" : "2020-04-02T10:30:00Z[UTC]" ] as LinkedHashMap ] as Set From 2dfa475291dc14a42f65b0ba9d7452f9f927083a Mon Sep 17 00:00:00 2001 From: Vicky Bung Date: Mon, 24 Apr 2023 13:54:14 +0200 Subject: [PATCH 02/10] Updated tests --- src/test/groovy/edu/ie3/datamodel/io/csv/GridIoIT.groovy | 6 +++++- .../groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/csv/GridIoIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/csv/GridIoIT.groovy index af966ea52..8fd90def0 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/csv/GridIoIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/csv/GridIoIT.groovy @@ -14,6 +14,7 @@ import spock.lang.Specification import java.nio.file.Files import java.nio.file.Path +import java.time.format.DateTimeFormatter /** * Testing whether PSDM CSV grids are equal when serialized and deserialized sequentially. @@ -27,9 +28,12 @@ class GridIoIT extends Specification implements CsvTestDataMeta { @Shared CsvFileSink sink + @Shared + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def setupSpec() { tempDirectory = Files.createTempDirectory("GridIoIT") - sink = new CsvFileSink(tempDirectory.toAbsolutePath().toString()) + sink = new CsvFileSink(tempDirectory.toAbsolutePath().toString(), dateTimeFormatter) } def cleanupSpec() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy index e007a9b3d..7ebf4dcec 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy @@ -176,6 +176,7 @@ class InfluxDbSinkIT extends Specification { def "An InfluxDbSink will use the class name if the NamingStrategy is failing"() { given: + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME def lineResult1 = new LineResult(ZonedDateTime.of(2020, 5, 3, 14, 18, 0, 0, ZoneId.of("UTC")), UUID.randomUUID(), Quantities.getQuantity(1.13d, StandardUnits.ELECTRIC_CURRENT_MAGNITUDE), @@ -186,7 +187,7 @@ class InfluxDbSinkIT extends Specification { new PValue(Quantities.getQuantity(5d, StandardUnits.ACTIVE_POWER_IN))) IndividualTimeSeries timeSeries = new IndividualTimeSeries(UUID.randomUUID(), [p1] as Set) - def sinkWithEmptyNamingStrategy = new InfluxDbSink(connector, new EmptyFileNamingStrategy()) + def sinkWithEmptyNamingStrategy = new InfluxDbSink(connector, new EmptyFileNamingStrategy(), dateTimeFormatter) when: sinkWithEmptyNamingStrategy.persist(lineResult1) sinkWithEmptyNamingStrategy.persist(timeSeries) From 396ba8cd7d263f3d18c15a965096244ff2097e0e Mon Sep 17 00:00:00 2001 From: Vicky Bung Date: Mon, 24 Apr 2023 14:03:04 +0200 Subject: [PATCH 03/10] Update --- src/main/java/edu/ie3/datamodel/io/processor/Processor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index b07b0b1d7..2eb479829 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -73,7 +73,6 @@ public abstract class Processor { * Instantiates a Processor for a foreseen class * * @param foreSeenClass Class and its children that are foreseen to be handled with this processor - * @param dateTimeFormatter */ protected Processor(Class foreSeenClass, DateTimeFormatter dateTimeFormatter) { this.dateTimeFormatter = dateTimeFormatter; From 167936233281abce52aa9aae1b1471947bc767bd Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 19 Jun 2023 14:28:53 +0200 Subject: [PATCH 04/10] Fix changelog entry --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bed27fde..ce1bdebc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Removing deprecated classes and methods [#540](https://github.com/ie3-institute/PowerSystemDataModel/issues/540) +- Included option to pass a dateTimeFormatter to the processors [#766](https://github.com/ie3-institute/PowerSystemDataModel/issues/766) ## [3.0.0] - 2023-02-16 @@ -105,7 +106,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Deleted parameter decimalPlaces and changed naming of serialization method [#710](https://github.com/ie3-institute/PowerSystemDataModel/issues/710) - Changed switch result documentation according to the implementation [#757](https://github.com/ie3-institute/PowerSystemDataModel/issues/757) - Added documentation for EmResult and FlexOptionResult [#656](https://github.com/ie3-institute/PowerSystemDataModel/issues/656) -- Included option to parse a dateTimeFormatter to the processors [#766](https://github.com/ie3-institute/PowerSystemDataModel/issues/766) ## [2.0.1] - 2021-07-08 From 0a109bb541ca7262c2e11d5830ac572f8f06c668 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 19 Jun 2023 15:01:52 +0200 Subject: [PATCH 05/10] Allow TimeUtil dateTimeFormatter as default --- CHANGELOG.md | 4 +- .../io/processor/EntityProcessor.java | 1 + .../ie3/datamodel/io/processor/Processor.java | 4 +- .../io/processor/ProcessorProvider.java | 50 +++++++++++++++++++ .../processor/input/InputEntityProcessor.java | 5 ++ .../result/ResultEntityProcessor.java | 5 ++ .../timeseries/TimeSeriesProcessor.java | 5 ++ 7 files changed, 71 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce1bdebc5..ae0a761ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Removing deprecated classes and methods [#540](https://github.com/ie3-institute/PowerSystemDataModel/issues/540) -- Included option to pass a dateTimeFormatter to the processors [#766](https://github.com/ie3-institute/PowerSystemDataModel/issues/766) +- Added dateTimeFormatter field to the processors [#766](https://github.com/ie3-institute/PowerSystemDataModel/issues/766) ## [3.0.0] - 2023-02-16 @@ -28,7 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ThermalUnits` as a container to hold all thermal units [#134](https://github.com/ie3-institute/PowerSystemDataModel/issues/134) - `ThermalInput` as a distinct abstract class for all thermal models - `ThermalGrid` as a container for a completely connected thermal grid -- `EmResult` and `FlexOptionsResult` for Energy Management Systems [#651](https://github.com/ie3-institute/PowerSystemDataModel/issues/651) +- `EmResult` and `FlexOptionsResult` for Energy Mdanagement Systems [#651](https://github.com/ie3-institute/PowerSystemDataModel/issues/651) - `EvcsInput` now has a parameter for enabling and disabling vehicle to grid support [#681](https://github.com/ie3-institute/PowerSystemDataModel/issues/681) - Added Dependabot updates to sphinx/readthedocs dependencies [#735](https://github.com/ie3-institute/PowerSystemDataModel/issues/735) - Created convenience function for JointGridContainer from CSV [#502](https://github.com/ie3-institute/PowerSystemDataModel/issues/502) 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 17c58a38b..fa4272f47 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java @@ -37,6 +37,7 @@ public abstract class EntityProcessor extends Processor< * Create a new EntityProcessor * * @param registeredClass the class the entity processor should be able to handle + * @param dateTimeFormatter the formatter to use for date time fields */ protected EntityProcessor( Class registeredClass, DateTimeFormatter dateTimeFormatter) { diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 2eb479829..c17016416 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -69,10 +69,12 @@ public abstract class Processor { private static final String PARALLEL_DEVICES = "parallelDevices"; private final DateTimeFormatter dateTimeFormatter; + /** * Instantiates a Processor for a foreseen class * * @param foreSeenClass Class and its children that are foreseen to be handled with this processor + * @param dateTimeFormatter Formatter to use for date time processing */ protected Processor(Class foreSeenClass, DateTimeFormatter dateTimeFormatter) { this.dateTimeFormatter = dateTimeFormatter; @@ -107,7 +109,7 @@ public int compare(String a, String b) { * Maps the foreseen table fields to the objects getters * * @param cls class to use for mapping - * @return an array of strings of all field values of the class + * @return a map of field name to its respective getter method name */ protected SortedMap mapFieldNameToGetter(Class cls) { return mapFieldNameToGetter(cls, Collections.emptyList()); 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 bc579bcd4..fcebd5810 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -17,6 +17,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; +import edu.ie3.util.TimeUtil; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -236,6 +237,17 @@ private Map, EntityProcessor> allEntityProcessors() { + DateTimeFormatter dateTimeFormatter = TimeUtil.withDefaults.getDateTimeFormatter(); + return allEntityProcessors(dateTimeFormatter); + } + + /** + * Build a collection of all existing processors + * + * @param dateTimeFormatter the date time formatter to use for persisting date time values + * @return a collection of all existing processors + */ public static Collection> allEntityProcessors( DateTimeFormatter dateTimeFormatter) { Collection> resultingProcessors = new ArrayList<>(); @@ -249,6 +261,17 @@ public static Collection> allEntityProce * * @return a collection of all input processors */ + public static Collection> allInputEntityProcessors() { + DateTimeFormatter dateTimeFormatter = TimeUtil.withDefaults.getDateTimeFormatter(); + return allInputEntityProcessors(dateTimeFormatter); + } + + /** + * Build a collection of all input processors + * + * @param dateTimeFormatter the date time formatter to use for persisting date time values + * @return a collection of all input processors + */ public static Collection> allInputEntityProcessors( DateTimeFormatter dateTimeFormatter) { Collection> resultingProcessors = new ArrayList<>(); @@ -263,6 +286,17 @@ public static Collection> allInputEntity * * @return a collection of all result processors */ + public static Collection> allResultEntityProcessors() { + DateTimeFormatter dateTimeFormatter = TimeUtil.withDefaults.getDateTimeFormatter(); + return allResultEntityProcessors(dateTimeFormatter); + } + + /** + * Build a collection of all result processors + * + * @param dateTimeFormatter the date time formatter to use for persisting date time values + * @return a collection of all result processors + */ public static Collection> allResultEntityProcessors( DateTimeFormatter dateTimeFormatter) { Collection> resultingProcessors = new ArrayList<>(); @@ -277,6 +311,22 @@ public static Collection> allResultEntit * * @return A mapping from eligible combinations to processors */ + public static Map< + TimeSeriesProcessorKey, + TimeSeriesProcessor< + TimeSeries, Value>, TimeSeriesEntry, Value>> + allTimeSeriesProcessors() { + DateTimeFormatter dateTimeFormatter = TimeUtil.withDefaults.getDateTimeFormatter(); + return allTimeSeriesProcessors(dateTimeFormatter); + } + + /** + * Create processors for all known eligible combinations and map them + * + * @param dateTimeFormatter the date time formatter to use for persisting date time values + * @return A mapping from eligible combinations to processors + */ + @SuppressWarnings("unchecked") public static Map< TimeSeriesProcessorKey, TimeSeriesProcessor< diff --git a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java index 09a7bcd0f..3e8e0de43 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java @@ -19,6 +19,7 @@ import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput; +import edu.ie3.util.TimeUtil; import java.time.format.DateTimeFormatter; import java.util.List; @@ -74,6 +75,10 @@ public class InputEntityProcessor extends EntityProcessor { StorageTypeInput.class, WecTypeInput.class); + public InputEntityProcessor(Class registeredClass) { + super(registeredClass, TimeUtil.withDefaults.getDateTimeFormatter()); + } + public InputEntityProcessor( Class registeredClass, DateTimeFormatter dateTimeFormatter) { super(registeredClass, dateTimeFormatter); diff --git a/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java index d93240f24..48b89cb87 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java @@ -17,6 +17,7 @@ import edu.ie3.datamodel.models.result.system.*; import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult; import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult; +import edu.ie3.util.TimeUtil; import java.time.format.DateTimeFormatter; import java.util.*; import javax.measure.Quantity; @@ -57,6 +58,10 @@ public class ResultEntityProcessor extends EntityProcessor { EmResult.class, FlexOptionsResult.class); + public ResultEntityProcessor(Class registeredClass) { + super(registeredClass, TimeUtil.withDefaults.getDateTimeFormatter()); + } + public ResultEntityProcessor( Class registeredClass, DateTimeFormatter dateTimeFormatter) { super(registeredClass, dateTimeFormatter); diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index 721af5e33..f9d7d53d1 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -16,6 +16,7 @@ import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; import edu.ie3.datamodel.models.value.*; +import edu.ie3.util.TimeUtil; import java.lang.reflect.Method; import java.time.format.DateTimeFormatter; import java.util.*; @@ -67,6 +68,10 @@ public class TimeSeriesProcessor< private final String[] flattenedHeaderElements; + public TimeSeriesProcessor(Class timeSeriesClass, Class entryClass, Class valueClass) { + this(timeSeriesClass, entryClass, valueClass, TimeUtil.withDefaults.getDateTimeFormatter()); + } + public TimeSeriesProcessor( Class timeSeriesClass, Class entryClass, From 1ddd9d4a1ae7d47f9d3ebab2d6bab23633a4b6ec Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 19 Jun 2023 15:03:02 +0200 Subject: [PATCH 06/10] Fix wrong return type in docs --- src/main/java/edu/ie3/datamodel/io/processor/Processor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index c17016416..00ec28d42 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -120,7 +120,7 @@ protected SortedMap mapFieldNameToGetter(Class cls) { * * @param cls class to use for mapping * @param ignoreFields A collection of all field names to ignore during process - * @return an array of strings of all field values of the class + * @return a map of field name to its respective getter method name */ protected SortedMap mapFieldNameToGetter( Class cls, Collection ignoreFields) { From ae6278daceb56ed8d35f05176ea8924093796135 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 19 Jun 2023 16:37:00 +0200 Subject: [PATCH 07/10] Add default timePattern to sinks --- .../ie3/datamodel/io/sink/CsvFileSink.java | 7 ++++ .../ie3/datamodel/io/sink/InfluxDbSink.java | 34 ++++++++++++++----- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java index f6908ce20..d5442dbfe 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java @@ -37,6 +37,8 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; + +import edu.ie3.util.TimeUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,6 +62,10 @@ public class CsvFileSink implements InputDataSink, OutputDataSink { private final String csvSep; + public CsvFileSink(String baseFolderPath) { + this(baseFolderPath, TimeUtil.withDefaults.getDateTimeFormatter()); + } + public CsvFileSink(String baseFolderPath, DateTimeFormatter dateTimeFormatter) { this(baseFolderPath, new FileNamingStrategy(), dateTimeFormatter, false, ","); } @@ -71,6 +77,7 @@ public CsvFileSink(String baseFolderPath, DateTimeFormatter dateTimeFormatter) { * * @param baseFolderPath the base folder path where the files should be put into * @param fileNamingStrategy the data sink file naming strategy that should be used + * @param dateTimeFormatter the formatter to use for processing date time fields * @param initFiles true if the files should be created during initialization (might create files, * that only consist of a headline, because no data will be written into them), false * otherwise diff --git a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java index 10955496f..b4a274113 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java @@ -20,6 +20,8 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; + +import edu.ie3.util.TimeUtil; import org.influxdb.dto.BatchPoints; import org.influxdb.dto.Point; import org.slf4j.Logger; @@ -37,12 +39,35 @@ public class InfluxDbSink implements OutputDataSink { private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy; private final ProcessorProvider processorProvider; + /** + * Initializes a new InfluxDbWeatherSource with a default EntityPersistenceNamingStrategy + * + * @param connector needed for database connection + */ + public InfluxDbSink(InfluxDbConnector connector) { + this(connector, new EntityPersistenceNamingStrategy(), TimeUtil.withDefaults.getDateTimeFormatter()); + } + /** * Initializes a new InfluxDbWeatherSource * * @param connector needed for database connection * @param entityPersistenceNamingStrategy needed to create measurement names for entities */ + public InfluxDbSink( + InfluxDbConnector connector, + EntityPersistenceNamingStrategy entityPersistenceNamingStrategy) { + this(connector, entityPersistenceNamingStrategy, TimeUtil.withDefaults.getDateTimeFormatter()); + } + + + /** + * Initializes a new InfluxDbWeatherSource + * + * @param connector needed for database connection + * @param entityPersistenceNamingStrategy needed to create measurement names for entities + * @param dateTimeFormatter the formatter to use for processing date time fields + */ public InfluxDbSink( InfluxDbConnector connector, EntityPersistenceNamingStrategy entityPersistenceNamingStrategy, @@ -55,14 +80,7 @@ public InfluxDbSink( ProcessorProvider.allTimeSeriesProcessors(dateTimeFormatter)); } - /** - * Initializes a new InfluxDbWeatherSource with a default EntityPersistenceNamingStrategy - * - * @param connector needed for database connection - */ - public InfluxDbSink(InfluxDbConnector connector, DateTimeFormatter dateTimeFormatter) { - this(connector, new EntityPersistenceNamingStrategy(), dateTimeFormatter); - } + @Override public void shutdown() { From c88aa4f3d285176ea3ff0739f1c52e204835b450 Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Thu, 23 Nov 2023 09:46:47 +0100 Subject: [PATCH 08/10] Merge dev --- .../io/processor/EntityProcessor.java | 4 +-- .../ie3/datamodel/io/processor/Processor.java | 5 +-- .../io/processor/ProcessorProvider.java | 22 +++++++----- .../processor/input/InputEntityProcessor.java | 6 ++-- .../result/ResultEntityProcessor.java | 10 +++--- .../timeseries/TimeSeriesProcessor.java | 6 ++-- .../ie3/datamodel/io/sink/CsvFileSink.java | 26 +++++++------- .../ie3/datamodel/io/sink/InfluxDbSink.java | 36 +++++++++---------- .../io/extractor/ExtractorTest.groovy | 1 - .../naming/FlatDirectoryHierarchyTest.groovy | 1 - .../datamodel/io/source/csv/GridIoIT.groovy | 5 ++- 11 files changed, 66 insertions(+), 56 deletions(-) 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 9f260555f..d0524becc 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java @@ -42,8 +42,8 @@ public abstract class EntityProcessor extends Processor< * @param registeredClass the class the entity processor should be able to handle * @param dateTimeFormatter the formatter to use for date time fields */ - protected EntityProcessor( - Class registeredClass, DateTimeFormatter dateTimeFormatter) { + protected EntityProcessor(Class registeredClass, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { super(registeredClass, dateTimeFormatter); this.fieldNameToMethod = mapFieldNameToGetter(registeredClass, Collections.singleton(NODE_INTERNAL)); diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 9c89bc0a5..61d2bd1be 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -79,7 +79,8 @@ public abstract class Processor { * @param foreSeenClass Class and its children that are foreseen to be handled with this processor * @param dateTimeFormatter Formatter to use for date time processing */ - protected Processor(Class foreSeenClass, DateTimeFormatter dateTimeFormatter) throws EntityProcessorException { + protected Processor(Class foreSeenClass, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { this.dateTimeFormatter = dateTimeFormatter; if (!getEligibleEntityClasses().contains(foreSeenClass)) throw new EntityProcessorException( @@ -416,7 +417,7 @@ protected String processOperationTime(OperationTime operationTime, String fieldN * @return string representation of the ZonedDateTime */ protected String processZonedDateTime(ZonedDateTime zonedDateTime) { - return zonedDateTime.toString(); + return dateTimeFormatter.format(zonedDateTime); } /** 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 2f721d001..0175a120f 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -6,7 +6,6 @@ package edu.ie3.datamodel.io.processor; import edu.ie3.datamodel.exceptions.EntityProcessorException; -import edu.ie3.datamodel.exceptions.FailureException; import edu.ie3.datamodel.exceptions.ProcessorProviderException; import edu.ie3.datamodel.io.processor.input.InputEntityProcessor; import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor; @@ -22,7 +21,6 @@ import edu.ie3.util.TimeUtil; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.function.Function; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -237,7 +235,8 @@ private Map, EntityProcessor> allEntityProcessors() throws EntityProcessorException { + public static Collection> allEntityProcessors() + throws EntityProcessorException { DateTimeFormatter dateTimeFormatter = TimeUtil.withDefaults.getDateTimeFormatter(); return allEntityProcessors(dateTimeFormatter); } @@ -261,7 +260,8 @@ public static Collection> allEntityProce * * @return a collection of all input processors */ - public static Collection> allInputEntityProcessors() throws EntityProcessorException { + public static Collection> allInputEntityProcessors() + throws EntityProcessorException { DateTimeFormatter dateTimeFormatter = TimeUtil.withDefaults.getDateTimeFormatter(); return allInputEntityProcessors(dateTimeFormatter); } @@ -286,7 +286,8 @@ public static Collection> allInputEntity * * @return a collection of all result processors */ - public static Collection> allResultEntityProcessors() throws EntityProcessorException { + public static Collection> allResultEntityProcessors() + throws EntityProcessorException { DateTimeFormatter dateTimeFormatter = TimeUtil.withDefaults.getDateTimeFormatter(); return allResultEntityProcessors(dateTimeFormatter); } @@ -337,12 +338,17 @@ public static Collection> allResultEntit .collect( Collectors.toMap( key -> key, - key -> - new TimeSeriesProcessor<>( + key -> { + try { + return new TimeSeriesProcessor<>( (Class, Value>>) key.getTimeSeriesClass(), (Class>) key.getEntryClass(), (Class) key.getValueClass(), - dateTimeFormatter))); + dateTimeFormatter); + } catch (EntityProcessorException e) { + throw new RuntimeException(e); + } + })); } @SuppressWarnings("unchecked cast") diff --git a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java index 51440b00d..24543e8f1 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java @@ -76,12 +76,14 @@ public class InputEntityProcessor extends EntityProcessor { StorageTypeInput.class, WecTypeInput.class); - public InputEntityProcessor(Class registeredClass) throws EntityProcessorException { + public InputEntityProcessor(Class registeredClass) + throws EntityProcessorException { super(registeredClass, TimeUtil.withDefaults.getDateTimeFormatter()); } public InputEntityProcessor( - Class registeredClass, DateTimeFormatter dateTimeFormatter) throws EntityProcessorException { + Class registeredClass, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { super(registeredClass, dateTimeFormatter); } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java index 06b0a073b..72e0b6f03 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java @@ -18,11 +18,11 @@ import edu.ie3.datamodel.models.result.system.*; import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult; import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult; -import edu.ie3.util.TimeUtil; -import java.time.format.DateTimeFormatter; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.*; +import edu.ie3.util.TimeUtil; import edu.ie3.util.exceptions.QuantityException; +import java.time.format.DateTimeFormatter; import java.util.*; import javax.measure.Quantity; import javax.measure.quantity.Energy; @@ -62,12 +62,14 @@ public class ResultEntityProcessor extends EntityProcessor { EmResult.class, FlexOptionsResult.class); - public ResultEntityProcessor(Class registeredClass) throws EntityProcessorException { + public ResultEntityProcessor(Class registeredClass) + throws EntityProcessorException { super(registeredClass, TimeUtil.withDefaults.getDateTimeFormatter()); } public ResultEntityProcessor( - Class registeredClass, DateTimeFormatter dateTimeFormatter) throws EntityProcessorException { + Class registeredClass, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { super(registeredClass, dateTimeFormatter); } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index cec8ba7d1..9a88585d4 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -68,7 +68,8 @@ public class TimeSeriesProcessor< private final String[] flattenedHeaderElements; - public TimeSeriesProcessor(Class timeSeriesClass, Class entryClass, Class valueClass) throws EntityProcessorException { + public TimeSeriesProcessor(Class timeSeriesClass, Class entryClass, Class valueClass) + throws EntityProcessorException { this(timeSeriesClass, entryClass, valueClass, TimeUtil.withDefaults.getDateTimeFormatter()); } @@ -76,7 +77,8 @@ public TimeSeriesProcessor( Class timeSeriesClass, Class entryClass, Class valueClass, - DateTimeFormatter dateTimeFormatter) throws EntityProcessorException { + DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { super(timeSeriesClass, dateTimeFormatter); /* Check, if this processor can handle the foreseen combination of time series, entry and value */ diff --git a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java index 8ab61f444..ff887b370 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java @@ -29,14 +29,13 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; import edu.ie3.util.StringUtils; +import edu.ie3.util.TimeUtil; import java.io.IOException; import java.nio.file.Path; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; - -import edu.ie3.util.TimeUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,10 +60,15 @@ public class CsvFileSink implements InputDataSink, OutputDataSink { private final String csvSep; public CsvFileSink(Path baseFolderPath) throws EntityProcessorException { - this(baseFolderPath, new FileNamingStrategy(), TimeUtil.withDefaults.getDateTimeFormatter(), ","); + this( + baseFolderPath, + new FileNamingStrategy(), + TimeUtil.withDefaults.getDateTimeFormatter(), + ","); } - public CsvFileSink(Path baseFolderPath, DateTimeFormatter dateTimeFormatter) throws EntityProcessorException { + public CsvFileSink(Path baseFolderPath, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { this(baseFolderPath, new FileNamingStrategy(), dateTimeFormatter, ","); } @@ -79,16 +83,12 @@ public CsvFileSink(Path baseFolderPath, DateTimeFormatter dateTimeFormatter) thr * @param csvSep the csv file separator that should be use */ public CsvFileSink( - Path baseFolderPath, - FileNamingStrategy fileNamingStrategy, - DateTimeFormatter dateTimeFormatter, - String csvSep) + Path baseFolderPath, + FileNamingStrategy fileNamingStrategy, + DateTimeFormatter dateTimeFormatter, + String csvSep) throws EntityProcessorException { - this( - baseFolderPath, - new ProcessorProvider(), - fileNamingStrategy, - csvSep); + this(baseFolderPath, new ProcessorProvider(dateTimeFormatter), fileNamingStrategy, csvSep); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java index 2b8f52fa5..819fcf01a 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java @@ -10,19 +10,16 @@ import edu.ie3.datamodel.io.connectors.InfluxDbConnector; import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy; import edu.ie3.datamodel.io.processor.ProcessorProvider; -import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.result.ResultEntity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; +import edu.ie3.util.TimeUtil; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import edu.ie3.util.TimeUtil; import org.influxdb.dto.BatchPoints; import org.influxdb.dto.Point; import org.slf4j.Logger; @@ -45,8 +42,21 @@ public class InfluxDbSink implements OutputDataSink { * * @param connector needed for database connection */ - public InfluxDbSink(InfluxDbConnector connector) { - this(connector, new EntityPersistenceNamingStrategy(), TimeUtil.withDefaults.getDateTimeFormatter()); + public InfluxDbSink(InfluxDbConnector connector) throws EntityProcessorException { + this( + connector, + new EntityPersistenceNamingStrategy(), + TimeUtil.withDefaults.getDateTimeFormatter()); + } + /** + * Initializes a new InfluxDbWeatherSource + * + * @param connector needed for database connection + * @param entityPersistenceNamingStrategy needed to create measurement names for entities + */ + public InfluxDbSink(InfluxDbConnector connector, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { + this(connector, new EntityPersistenceNamingStrategy(), dateTimeFormatter); } /** @@ -61,7 +71,6 @@ public InfluxDbSink( this(connector, entityPersistenceNamingStrategy, TimeUtil.withDefaults.getDateTimeFormatter()); } - /** * Initializes a new InfluxDbWeatherSource * @@ -72,7 +81,8 @@ public InfluxDbSink( public InfluxDbSink( InfluxDbConnector connector, EntityPersistenceNamingStrategy entityPersistenceNamingStrategy, - DateTimeFormatter dateTimeFormatter) throws EntityProcessorException { + DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { this.connector = connector; this.entityPersistenceNamingStrategy = entityPersistenceNamingStrategy; this.processorProvider = @@ -81,16 +91,6 @@ public InfluxDbSink( ProcessorProvider.allTimeSeriesProcessors(dateTimeFormatter)); } - /** - * Initializes a new InfluxDbWeatherSource with a default EntityPersistenceNamingStrategy - * - * @param connector needed for database connection - */ - public InfluxDbSink(InfluxDbConnector connector) throws EntityProcessorException { - this(connector, new EntityPersistenceNamingStrategy(), TimeUtil.withDefaults.getDateTimeFormatter()); - } - - @Override public void shutdown() { connector.shutdown(); diff --git a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy index 9db59b4e9..202e21cc0 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy @@ -21,7 +21,6 @@ class ExtractorTest extends Specification { def "An Extractor should be able to extract an entity with nested elements correctly"() { expect: - println(nestedEntity) def result = Extractor.extractElements(nestedEntity) as Set result == expectedExtractedEntities as Set diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/FlatDirectoryHierarchyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/FlatDirectoryHierarchyTest.groovy index 76b0ddc62..60f1612a5 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/FlatDirectoryHierarchyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/FlatDirectoryHierarchyTest.groovy @@ -39,7 +39,6 @@ class FlatDirectoryHierarchyTest extends Specification { def fdh = new FlatDirectoryHierarchy() then: - println(basePath) Files.exists(basePath) Files.isDirectory(basePath) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy index c250ba735..ea17c66bd 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy @@ -43,9 +43,8 @@ class GridIoIT extends Specification implements CsvTestDataMeta { new EntityPersistenceNamingStrategy(), new DefaultDirectoryHierarchy(Path.of("output"), "vn_simona")) tempDirectory = Files.createTempDirectory("GridIoIT") - sinkFlat = new CsvFileSink(tempDirectory.toAbsolutePath()) - sinkHierarchic = new CsvFileSink(tempDirectory.toAbsolutePath(), hierarchicNamingStrategy, false, ",") - sink = new CsvFileSink(tempDirectory.toAbsolutePath(), dateTimeFormatter) + sinkFlat = new CsvFileSink(tempDirectory.toAbsolutePath(), dateTimeFormatter) + sinkHierarchic = new CsvFileSink(tempDirectory.toAbsolutePath(), hierarchicNamingStrategy, dateTimeFormatter, ",") } def cleanupSpec() { From 78583e1fb4ebe121f3cb95ea67ed2c19a46ff76f Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Fri, 24 Nov 2023 10:16:24 +0100 Subject: [PATCH 09/10] Codacy --- .../java/edu/ie3/datamodel/io/processor/ProcessorProvider.java | 2 -- .../edu/ie3/datamodel/io/connectors/SqlConnectorIT.groovy | 1 - src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy | 2 -- 3 files changed, 5 deletions(-) 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 0175a120f..b3ff3fca4 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -37,8 +37,6 @@ */ public class ProcessorProvider { - private static final Logger log = LoggerFactory.getLogger(ProcessorProvider.class); - /** unmodifiable map of all processors that has been provided on construction */ private final Map, EntityProcessor> entityProcessors; diff --git a/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlConnectorIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlConnectorIT.groovy index 02ba4c7ba..66db0baca 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlConnectorIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlConnectorIT.groovy @@ -13,7 +13,6 @@ import spock.lang.Shared import spock.lang.Specification import java.sql.SQLException -import java.time.format.DateTimeFormatter @Testcontainers class SqlConnectorIT extends Specification implements TestContainerHelper { diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy index ea17c66bd..a8a32235c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/GridIoIT.groovy @@ -10,8 +10,6 @@ import edu.ie3.datamodel.io.naming.DefaultDirectoryHierarchy import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.sink.CsvFileSink -import edu.ie3.datamodel.io.source.csv.CsvJointGridContainerSource -import edu.ie3.datamodel.io.source.csv.CsvTestDataMeta import edu.ie3.util.io.FileIOUtils import spock.lang.Shared import spock.lang.Specification From b4039dcaef84de4fe75c9a4512d02138d452c641 Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Fri, 24 Nov 2023 10:30:57 +0100 Subject: [PATCH 10/10] spotless --- .../java/edu/ie3/datamodel/io/processor/ProcessorProvider.java | 2 -- 1 file changed, 2 deletions(-) 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 b3ff3fca4..ccc3ce6d0 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -22,8 +22,6 @@ import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Wrapper providing the class specific processor to convert an instance of a {@link UniqueEntity}