Skip to content
Closed
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
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 @@ -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;
Expand Down Expand Up @@ -39,9 +40,11 @@ public abstract class EntityProcessor<T extends UniqueEntity> 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<? extends T> registeredClass) throws EntityProcessorException {
super(registeredClass);
protected EntityProcessor(Class<? extends T> registeredClass, DateTimeFormatter dateTimeFormatter)
throws EntityProcessorException {
super(registeredClass, dateTimeFormatter);
this.fieldNameToMethod =
mapFieldNameToGetter(registeredClass, Collections.singleton(NODE_INTERNAL));
this.headerElements = fieldNameToMethod.keySet().toArray(new String[0]);
Expand Down
10 changes: 8 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 @@ -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;
Expand Down Expand Up @@ -70,12 +71,17 @@ 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 Formatter to use for date time processing
*/
protected Processor(Class<? extends T> foreSeenClass) throws EntityProcessorException {
protected Processor(Class<? extends T> foreSeenClass, DateTimeFormatter dateTimeFormatter)
throws EntityProcessorException {
this.dateTimeFormatter = dateTimeFormatter;
if (!getEligibleEntityClasses().contains(foreSeenClass))
throw new EntityProcessorException(
"Cannot register class '"
Expand Down Expand Up @@ -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);
}

/**
Expand Down
104 changes: 76 additions & 28 deletions src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

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

/**
Expand Down Expand Up @@ -233,9 +233,21 @@ private Map<Class<? extends UniqueEntity>, EntityProcessor<? extends UniqueEntit
*/
public static Collection<EntityProcessor<? extends UniqueEntity>> 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<EntityProcessor<? extends UniqueEntity>> allEntityProcessors(
DateTimeFormatter dateTimeFormatter) throws EntityProcessorException {
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 @@ -246,9 +258,21 @@ public static Collection<EntityProcessor<? extends UniqueEntity>> allEntityProce
*/
public static Collection<EntityProcessor<? extends UniqueEntity>> 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<EntityProcessor<? extends UniqueEntity>> allInputEntityProcessors(
DateTimeFormatter dateTimeFormatter) throws EntityProcessorException {
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,9 +284,21 @@ public static Collection<EntityProcessor<? extends UniqueEntity>> allInputEntity
*/
public static Collection<EntityProcessor<? extends UniqueEntity>> 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<EntityProcessor<? extends UniqueEntity>> allResultEntityProcessors(
DateTimeFormatter dateTimeFormatter) throws EntityProcessorException {
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 @@ -278,25 +314,37 @@ public static Collection<EntityProcessor<? extends UniqueEntity>> allResultEntit
TimeSeriesProcessor<
TimeSeries<TimeSeriesEntry<Value>, Value>, TimeSeriesEntry<Value>, Value>>
allTimeSeriesProcessors() throws EntityProcessorException {
try {
return Try.scanStream(
TimeSeriesProcessor.eligibleKeys.stream()
.map(
key ->
Try.of(
() ->
new TimeSeriesProcessor<>(
(Class<TimeSeries<TimeSeriesEntry<Value>, Value>>)
key.getTimeSeriesClass(),
(Class<TimeSeriesEntry<Value>>) key.getEntryClass(),
(Class<Value>) 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<TimeSeriesEntry<Value>, Value>, TimeSeriesEntry<Value>, Value>>
allTimeSeriesProcessors(DateTimeFormatter dateTimeFormatter) throws EntityProcessorException {
return TimeSeriesProcessor.eligibleKeys.stream()
.collect(
Collectors.toMap(
key -> key,
key -> {
try {
return new TimeSeriesProcessor<>(
(Class<TimeSeries<TimeSeriesEntry<Value>, Value>>) key.getTimeSeriesClass(),
(Class<TimeSeriesEntry<Value>>) key.getEntryClass(),
(Class<Value>) key.getValueClass(),
dateTimeFormatter);
} catch (EntityProcessorException e) {
throw new RuntimeException(e);
}
}));
}

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

/**
Expand Down Expand Up @@ -76,7 +78,13 @@ public class InputEntityProcessor extends EntityProcessor<InputEntity> {

public InputEntityProcessor(Class<? extends InputEntity> registeredClass)
throws EntityProcessorException {
super(registeredClass);
super(registeredClass, TimeUtil.withDefaults.getDateTimeFormatter());
}

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

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -62,7 +64,13 @@ public class ResultEntityProcessor extends EntityProcessor<ResultEntity> {

public ResultEntityProcessor(Class<? extends ResultEntity> registeredClass)
throws EntityProcessorException {
super(registeredClass);
super(registeredClass, TimeUtil.withDefaults.getDateTimeFormatter());
}

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

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -68,7 +70,16 @@ public class TimeSeriesProcessor<

public TimeSeriesProcessor(Class<T> timeSeriesClass, Class<E> entryClass, Class<V> valueClass)
throws EntityProcessorException {
super(timeSeriesClass);
this(timeSeriesClass, entryClass, valueClass, TimeUtil.withDefaults.getDateTimeFormatter());
}

public TimeSeriesProcessor(
Class<T> timeSeriesClass,
Class<E> entryClass,
Class<V> 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 =
Expand Down
25 changes: 21 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 @@ -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;
Expand All @@ -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, ",");
}

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

/**
Expand All @@ -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
Expand Down
Loading