diff --git a/CHANGELOG.md b/CHANGELOG.md index 397ee653d..3e444a049 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,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) - Refactor CSV data sources [#716](https://github.com/ie3-institute/PowerSystemDataModel/issues/716) +- Added dateTimeFormatter field to the processors [#766](https://github.com/ie3-institute/PowerSystemDataModel/issues/766) - Deleted parameter initFiles, set parameter append to false by default [#791](https://github.com/ie3-institute/PowerSystemDataModel/issues/791) - Use nio paths instead of strings for file path [#723](https://github.com/ie3-institute/PowerSystemDataModel/issues/723) - Data source will throw an exceptions instead of returning an empty optionals [#707](https://github.com/ie3-institute/PowerSystemDataModel/issues/707) 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 a8c79e735..d0524becc 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java @@ -12,6 +12,7 @@ import edu.ie3.datamodel.utils.Try.*; import edu.ie3.util.exceptions.QuantityException; import java.lang.reflect.Method; +import java.time.format.DateTimeFormatter; import java.util.*; import javax.measure.Quantity; import javax.measure.quantity.Energy; @@ -39,9 +40,11 @@ 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) throws EntityProcessorException { - super(registeredClass); + protected EntityProcessor(Class registeredClass, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { + 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 830fbef02..61d2bd1be 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -24,6 +24,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; @@ -70,12 +71,17 @@ 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) throws EntityProcessorException { + protected Processor(Class foreSeenClass, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { + this.dateTimeFormatter = dateTimeFormatter; if (!getEligibleEntityClasses().contains(foreSeenClass)) throw new EntityProcessorException( "Cannot register class '" @@ -411,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 8f3bb42f4..ccc3ce6d0 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; @@ -19,8 +18,9 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; import edu.ie3.datamodel.utils.Try; +import edu.ie3.util.TimeUtil; +import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.function.Function; import java.util.stream.Collectors; /** @@ -46,9 +46,9 @@ public class ProcessorProvider { timeSeriesProcessors; /** Get an instance of this class with all existing entity processors */ - public ProcessorProvider() throws EntityProcessorException { - this.entityProcessors = init(allEntityProcessors()); - this.timeSeriesProcessors = allTimeSeriesProcessors(); + public ProcessorProvider(DateTimeFormatter dateTimeFormatter) throws EntityProcessorException { + this.entityProcessors = init(allEntityProcessors(dateTimeFormatter)); + this.timeSeriesProcessors = allTimeSeriesProcessors(dateTimeFormatter); } /** @@ -233,9 +233,21 @@ private Map, EntityProcessor> allEntityProcessors() throws EntityProcessorException { + 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) throws EntityProcessorException { Collection> resultingProcessors = new ArrayList<>(); - resultingProcessors.addAll(allInputEntityProcessors()); - resultingProcessors.addAll(allResultEntityProcessors()); + resultingProcessors.addAll(allInputEntityProcessors(dateTimeFormatter)); + resultingProcessors.addAll(allResultEntityProcessors(dateTimeFormatter)); return resultingProcessors; } @@ -246,9 +258,21 @@ public static Collection> allEntityProce */ public static Collection> allInputEntityProcessors() throws EntityProcessorException { + 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) throws EntityProcessorException { Collection> resultingProcessors = new ArrayList<>(); for (Class cls : InputEntityProcessor.eligibleEntityClasses) { - resultingProcessors.add(new InputEntityProcessor(cls)); + resultingProcessors.add(new InputEntityProcessor(cls, dateTimeFormatter)); } return resultingProcessors; } @@ -260,9 +284,21 @@ public static Collection> allInputEntity */ public static Collection> allResultEntityProcessors() throws EntityProcessorException { + 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) throws EntityProcessorException { Collection> resultingProcessors = new ArrayList<>(); for (Class cls : ResultEntityProcessor.eligibleEntityClasses) { - resultingProcessors.add(new ResultEntityProcessor(cls)); + resultingProcessors.add(new ResultEntityProcessor(cls, dateTimeFormatter)); } return resultingProcessors; } @@ -278,25 +314,37 @@ public static Collection> allResultEntit TimeSeriesProcessor< TimeSeries, Value>, TimeSeriesEntry, Value>> allTimeSeriesProcessors() throws EntityProcessorException { - try { - return Try.scanStream( - TimeSeriesProcessor.eligibleKeys.stream() - .map( - key -> - Try.of( - () -> - new TimeSeriesProcessor<>( - (Class, Value>>) - key.getTimeSeriesClass(), - (Class>) key.getEntryClass(), - (Class) key.getValueClass()), - EntityProcessorException.class)), - "list of processors") - .getOrThrow() - .collect(Collectors.toMap(TimeSeriesProcessor::getRegisteredKey, Function.identity())); - } catch (FailureException e) { - throw new EntityProcessorException(e.getCause()); - } + 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< + TimeSeries, Value>, TimeSeriesEntry, Value>> + allTimeSeriesProcessors(DateTimeFormatter dateTimeFormatter) throws EntityProcessorException { + return TimeSeriesProcessor.eligibleKeys.stream() + .collect( + Collectors.toMap( + key -> key, + key -> { + try { + return new TimeSeriesProcessor<>( + (Class, Value>>) key.getTimeSeriesClass(), + (Class>) key.getEntryClass(), + (Class) key.getValueClass(), + 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 398f404aa..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 @@ -20,6 +20,8 @@ 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; /** @@ -76,7 +78,13 @@ public class InputEntityProcessor extends EntityProcessor { public InputEntityProcessor(Class registeredClass) throws EntityProcessorException { - super(registeredClass); + super(registeredClass, TimeUtil.withDefaults.getDateTimeFormatter()); + } + + public InputEntityProcessor( + Class registeredClass, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { + 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 177ed1909..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 @@ -20,7 +20,9 @@ import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult; 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,7 +64,13 @@ public class ResultEntityProcessor extends EntityProcessor { public ResultEntityProcessor(Class registeredClass) throws EntityProcessorException { - super(registeredClass); + super(registeredClass, TimeUtil.withDefaults.getDateTimeFormatter()); + } + + public ResultEntityProcessor( + Class registeredClass, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { + 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 52f1a602a..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 @@ -16,7 +16,9 @@ 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.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -68,7 +70,16 @@ public class TimeSeriesProcessor< public TimeSeriesProcessor(Class timeSeriesClass, Class entryClass, Class valueClass) throws EntityProcessorException { - super(timeSeriesClass); + this(timeSeriesClass, entryClass, valueClass, TimeUtil.withDefaults.getDateTimeFormatter()); + } + + public TimeSeriesProcessor( + Class timeSeriesClass, + Class entryClass, + Class valueClass, + DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { + 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 da67f99a0..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,8 +29,10 @@ 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; @@ -52,12 +54,22 @@ 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(Path baseFolderPath) throws EntityProcessorException { - this(baseFolderPath, new FileNamingStrategy(), ","); + this( + baseFolderPath, + new FileNamingStrategy(), + TimeUtil.withDefaults.getDateTimeFormatter(), + ","); + } + + public CsvFileSink(Path baseFolderPath, DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { + this(baseFolderPath, new FileNamingStrategy(), dateTimeFormatter, ","); } /** @@ -67,11 +79,16 @@ public CsvFileSink(Path baseFolderPath) throws EntityProcessorException { * * @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 csvSep the csv file separator that should be use */ - public CsvFileSink(Path baseFolderPath, FileNamingStrategy fileNamingStrategy, String csvSep) + public CsvFileSink( + Path baseFolderPath, + FileNamingStrategy fileNamingStrategy, + DateTimeFormatter dateTimeFormatter, + String csvSep) throws EntityProcessorException { - this(baseFolderPath, new ProcessorProvider(), fileNamingStrategy, csvSep); + this(baseFolderPath, new ProcessorProvider(dateTimeFormatter), fileNamingStrategy, csvSep); } /** @@ -81,7 +98,7 @@ public CsvFileSink(Path baseFolderPath, FileNamingStrategy fileNamingStrategy, S * {@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 7c2f7b9f8..819fcf01a 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java @@ -15,7 +15,9 @@ 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 org.influxdb.dto.BatchPoints; @@ -35,6 +37,28 @@ 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) 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); + } + /** * Initializes a new InfluxDbWeatherSource * @@ -44,21 +68,27 @@ public class InfluxDbSink implements OutputDataSink { public InfluxDbSink( InfluxDbConnector connector, EntityPersistenceNamingStrategy entityPersistenceNamingStrategy) throws EntityProcessorException { - this.connector = connector; - this.entityPersistenceNamingStrategy = entityPersistenceNamingStrategy; - this.processorProvider = - new ProcessorProvider( - ProcessorProvider.allResultEntityProcessors(), - ProcessorProvider.allTimeSeriesProcessors()); + this(connector, entityPersistenceNamingStrategy, TimeUtil.withDefaults.getDateTimeFormatter()); } /** - * Initializes a new InfluxDbWeatherSource with a default EntityPersistenceNamingStrategy + * 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) throws EntityProcessorException { - this(connector, new EntityPersistenceNamingStrategy()); + public InfluxDbSink( + InfluxDbConnector connector, + EntityPersistenceNamingStrategy entityPersistenceNamingStrategy, + DateTimeFormatter dateTimeFormatter) + throws EntityProcessorException { + this.connector = connector; + this.entityPersistenceNamingStrategy = entityPersistenceNamingStrategy; + this.processorProvider = + new ProcessorProvider( + ProcessorProvider.allResultEntityProcessors(dateTimeFormatter), + ProcessorProvider.allTimeSeriesProcessors(dateTimeFormatter)); } @Override 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/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index 5fffb0fa1..0da2e49f7 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -53,12 +53,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, @@ -130,7 +132,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), @@ -154,9 +157,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: @@ -181,9 +185,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: @@ -206,9 +211,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", @@ -250,8 +256,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) @@ -267,8 +274,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 65dc1e1a6..e1f0bd913 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 = [ @@ -68,7 +70,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" @@ -136,7 +139,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" @@ -280,7 +284,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", @@ -299,7 +304,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", @@ -318,7 +324,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", @@ -336,7 +343,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", @@ -352,7 +360,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, @@ -389,7 +398,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", @@ -413,7 +423,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", @@ -442,7 +453,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", @@ -477,7 +489,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", @@ -499,7 +512,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", @@ -521,7 +535,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", @@ -545,7 +560,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", @@ -566,7 +582,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", @@ -588,7 +605,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", @@ -615,7 +633,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 94f55d0ad..40f46bdef 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: @@ -92,7 +94,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: @@ -105,7 +108,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) @@ -127,7 +131,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) @@ -215,7 +220,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 @@ -235,7 +241,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) @@ -260,7 +267,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) @@ -283,8 +291,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) @@ -295,10 +304,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 62491ebc6..ad14f4c76 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 java.nio.file.Path import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLTAMPERE @@ -77,7 +79,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" @@ -98,7 +101,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" @@ -117,28 +121,29 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink should persist provided elements correctly"() { 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(), ",") @@ -201,7 +206,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) @@ -224,7 +230,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) @@ -244,7 +251,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", @@ -299,9 +307,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(), ",") 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..7ebf4dcec 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() } @@ -172,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), @@ -182,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) 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 4b8ebf9c3..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 @@ -16,6 +16,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. @@ -32,13 +33,16 @@ class GridIoIT extends Specification implements CsvTestDataMeta { @Shared CsvFileSink sinkHierarchic + @Shared + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME + def setupSpec() { FileNamingStrategy hierarchicNamingStrategy = new FileNamingStrategy( new EntityPersistenceNamingStrategy(), new DefaultDirectoryHierarchy(Path.of("output"), "vn_simona")) tempDirectory = Files.createTempDirectory("GridIoIT") - sinkFlat = new CsvFileSink(tempDirectory.toAbsolutePath()) - sinkHierarchic = new CsvFileSink(tempDirectory.toAbsolutePath(), hierarchicNamingStrategy, ",") + sinkFlat = new CsvFileSink(tempDirectory.toAbsolutePath(), dateTimeFormatter) + sinkHierarchic = new CsvFileSink(tempDirectory.toAbsolutePath(), hierarchicNamingStrategy, dateTimeFormatter, ",") } def cleanupSpec() { 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