Skip to content
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -37,8 +38,9 @@ public abstract class EntityProcessor<T extends UniqueEntity> extends Processor<
*
* @param registeredClass the class the entity processor should be able to handle
*/
protected EntityProcessor(Class<? extends T> registeredClass) {
super(registeredClass);
protected EntityProcessor(
Class<? extends T> registeredClass, DateTimeFormatter dateTimeFormatter) {
super(registeredClass, dateTimeFormatter);
this.fieldNameToMethod =
mapFieldNameToGetter(registeredClass, Collections.singleton(NODE_INTERNAL));
this.headerElements = fieldNameToMethod.keySet().toArray(new String[0]);
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/edu/ie3/datamodel/io/processor/Processor.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -67,12 +68,15 @@ public abstract class Processor<T> {

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<? extends T> foreSeenClass) {
protected Processor(Class<? extends T> foreSeenClass, DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
if (!getEligibleEntityClasses().contains(foreSeenClass))
throw new EntityProcessorException(
"Cannot register class '"
Expand Down Expand Up @@ -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(
Expand Down
29 changes: 17 additions & 12 deletions src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

/**
Expand Down Expand Up @@ -235,10 +236,11 @@ private Map<Class<? extends UniqueEntity>, EntityProcessor<? extends UniqueEntit
*
* @return a collection of all existing processors
*/
public static Collection<EntityProcessor<? extends UniqueEntity>> allEntityProcessors() {
public static Collection<EntityProcessor<? extends UniqueEntity>> allEntityProcessors(
DateTimeFormatter dateTimeFormatter) {
Collection<EntityProcessor<? extends UniqueEntity>> resultingProcessors = new ArrayList<>();
resultingProcessors.addAll(allInputEntityProcessors());
resultingProcessors.addAll(allResultEntityProcessors());
resultingProcessors.addAll(allInputEntityProcessors(dateTimeFormatter));
resultingProcessors.addAll(allResultEntityProcessors(dateTimeFormatter));
return resultingProcessors;
}

Expand All @@ -247,10 +249,11 @@ public static Collection<EntityProcessor<? extends UniqueEntity>> allEntityProce
*
* @return a collection of all input processors
*/
public static Collection<EntityProcessor<? extends UniqueEntity>> allInputEntityProcessors() {
public static Collection<EntityProcessor<? extends UniqueEntity>> allInputEntityProcessors(
DateTimeFormatter dateTimeFormatter) {
Collection<EntityProcessor<? extends UniqueEntity>> resultingProcessors = new ArrayList<>();
for (Class<? extends InputEntity> cls : InputEntityProcessor.eligibleEntityClasses) {
resultingProcessors.add(new InputEntityProcessor(cls));
resultingProcessors.add(new InputEntityProcessor(cls, dateTimeFormatter));
}
return resultingProcessors;
}
Expand All @@ -260,10 +263,11 @@ public static Collection<EntityProcessor<? extends UniqueEntity>> allInputEntity
*
* @return a collection of all result processors
*/
public static Collection<EntityProcessor<? extends UniqueEntity>> allResultEntityProcessors() {
public static Collection<EntityProcessor<? extends UniqueEntity>> allResultEntityProcessors(
DateTimeFormatter dateTimeFormatter) {
Collection<EntityProcessor<? extends UniqueEntity>> resultingProcessors = new ArrayList<>();
for (Class<? extends ResultEntity> cls : ResultEntityProcessor.eligibleEntityClasses) {
resultingProcessors.add(new ResultEntityProcessor(cls));
resultingProcessors.add(new ResultEntityProcessor(cls, dateTimeFormatter));
}
return resultingProcessors;
}
Expand All @@ -277,7 +281,7 @@ public static Collection<EntityProcessor<? extends UniqueEntity>> allResultEntit
TimeSeriesProcessorKey,
TimeSeriesProcessor<
TimeSeries<TimeSeriesEntry<Value>, Value>, TimeSeriesEntry<Value>, Value>>
allTimeSeriesProcessors() {
allTimeSeriesProcessors(DateTimeFormatter dateTimeFormatter) {
return TimeSeriesProcessor.eligibleKeys.stream()
.collect(
Collectors.toMap(
Expand All @@ -286,7 +290,8 @@ public static Collection<EntityProcessor<? extends UniqueEntity>> allResultEntit
new TimeSeriesProcessor<>(
(Class<TimeSeries<TimeSeriesEntry<Value>, Value>>) key.getTimeSeriesClass(),
(Class<TimeSeriesEntry<Value>>) key.getEntryClass(),
(Class<Value>) key.getValueClass())));
(Class<Value>) key.getValueClass(),
dateTimeFormatter)));
}

@SuppressWarnings("unchecked cast")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -73,8 +74,9 @@ public class InputEntityProcessor extends EntityProcessor<InputEntity> {
StorageTypeInput.class,
WecTypeInput.class);

public InputEntityProcessor(Class<? extends InputEntity> registeredClass) {
super(registeredClass);
public InputEntityProcessor(
Class<? extends InputEntity> registeredClass, DateTimeFormatter dateTimeFormatter) {
super(registeredClass, dateTimeFormatter);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -56,8 +57,9 @@ public class ResultEntityProcessor extends EntityProcessor<ResultEntity> {
EmResult.class,
FlexOptionsResult.class);

public ResultEntityProcessor(Class<? extends ResultEntity> registeredClass) {
super(registeredClass);
public ResultEntityProcessor(
Class<? extends ResultEntity> registeredClass, DateTimeFormatter dateTimeFormatter) {
super(registeredClass, dateTimeFormatter);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -66,8 +67,12 @@ public class TimeSeriesProcessor<

private final String[] flattenedHeaderElements;

public TimeSeriesProcessor(Class<T> timeSeriesClass, Class<E> entryClass, Class<V> valueClass) {
super(timeSeriesClass);
public TimeSeriesProcessor(
Class<T> timeSeriesClass,
Class<E> entryClass,
Class<V> valueClass,
DateTimeFormatter dateTimeFormatter) {
super(timeSeriesClass, dateTimeFormatter);

/* Check, if this processor can handle the foreseen combination of time series, entry and value */
TimeSeriesProcessorKey timeSeriesKey =
Expand Down
16 changes: 12 additions & 4 deletions src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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, ",");
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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
Expand Down
12 changes: 7 additions & 5 deletions src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -44,22 +45,23 @@ 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));
}

/**
* Initializes a new InfluxDbWeatherSource with a default EntityPersistenceNamingStrategy
*
* @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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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),
Expand All @@ -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<TimeSeriesProcessorKey, TimeSeriesProcessor<TimeSeries<TimeSeriesEntry<Value>, Value>, TimeSeriesEntry<Value>, Value>>)

when:
Expand All @@ -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<TimeSeriesProcessorKey, TimeSeriesProcessor<TimeSeries<TimeSeriesEntry<Value>, Value>, TimeSeriesEntry<Value>, 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:
Expand All @@ -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<TimeSeriesProcessorKey, TimeSeriesProcessor<TimeSeries<TimeSeriesEntry<Value>, Value>, TimeSeriesEntry<Value>, Value>>)

Map expectedMap = ["uuid" : "22bea5fc-2cb2-4c61-beb9-b476e0107f52",
Expand Down Expand Up @@ -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<IndividualTimeSeries, TimeBasedValue, EnergyPriceValue> processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue)
TimeSeriesProcessor<IndividualTimeSeries, TimeBasedValue, EnergyPriceValue> processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue, dateTimeFormatter)
Map<TimeSeriesProcessorKey, TimeSeriesProcessor> timeSeriesProcessorMap = new HashMap<>()
timeSeriesProcessorMap.put(key, processor)
ProcessorProvider provider = new ProcessorProvider([], timeSeriesProcessorMap)
Expand All @@ -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<IndividualTimeSeries, TimeBasedValue, EnergyPriceValue> processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue)
TimeSeriesProcessor<IndividualTimeSeries, TimeBasedValue, EnergyPriceValue> processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue, dateTimeFormatter)
Map<TimeSeriesProcessorKey, TimeSeriesProcessor> timeSeriesProcessorMap = new HashMap<>()
timeSeriesProcessorMap.put(key, processor)
ProcessorProvider provider = new ProcessorProvider([], timeSeriesProcessorMap)
Expand Down
Loading