Skip to content

Included option to parse a DateTimeFormatter to the processors #799

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 13 commits into from
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