Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Writers used to write time series are closed right away
- Changed class name in FlexOptionsResult.toString [#693](https://github.com/ie3-institute/PowerSystemDataModel/issues/693)
- Deleted parameter decimalPlaces and changed naming of serialization method [#710](https://github.com/ie3-institute/PowerSystemDataModel/issues/710)
- Included option to overwrite files [#763](https://github.com/ie3-institute/PowerSystemDataModel/issues/763)

## [2.0.1] - 2021-07-08

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public CsvFileConnector(String baseDirectoryName, FileNamingStrategy fileNamingS
}

public synchronized BufferedCsvWriter getOrInitWriter(
Class<? extends UniqueEntity> clz, String[] headerElements, String csvSep)
Class<? extends UniqueEntity> clz, String[] headerElements, String csvSep, boolean overwrite)
throws ConnectorException {
/* Try to the the right writer */
BufferedCsvWriter predefinedWriter = entityWriters.get(clz);
Expand All @@ -67,7 +67,7 @@ public synchronized BufferedCsvWriter getOrInitWriter(
/* If it is not available, build and register one */
try {
CsvFileDefinition fileDefinition = buildFileDefinition(clz, headerElements, csvSep);
BufferedCsvWriter newWriter = initWriter(baseDirectoryName, fileDefinition);
BufferedCsvWriter newWriter = initWriter(baseDirectoryName, fileDefinition, overwrite);

entityWriters.put(clz, newWriter);
return newWriter;
Expand All @@ -78,7 +78,8 @@ public synchronized BufferedCsvWriter getOrInitWriter(
}

public synchronized <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
BufferedCsvWriter getOrInitWriter(T timeSeries, String[] headerElements, String csvSep)
BufferedCsvWriter getOrInitWriter(
T timeSeries, String[] headerElements, String csvSep, boolean overwrite)
throws ConnectorException {
/* Try to the the right writer */
BufferedCsvWriter predefinedWriter = timeSeriesWriters.get(timeSeries.getUuid());
Expand All @@ -87,7 +88,7 @@ BufferedCsvWriter getOrInitWriter(T timeSeries, String[] headerElements, String
/* If it is not available, build and register one */
try {
CsvFileDefinition fileDefinition = buildFileDefinition(timeSeries, headerElements, csvSep);
BufferedCsvWriter newWriter = initWriter(baseDirectoryName, fileDefinition);
BufferedCsvWriter newWriter = initWriter(baseDirectoryName, fileDefinition, overwrite);

timeSeriesWriters.put(timeSeries.getUuid(), newWriter);
return newWriter;
Expand All @@ -102,11 +103,13 @@ BufferedCsvWriter getOrInitWriter(T timeSeries, String[] headerElements, String
*
* @param baseDirectory Base directory, where the file hierarchy should start
* @param fileDefinition Definition of the files shape
* @param overwrite true if the input should be appended to a new file
* @return an initialized buffered writer
* @throws ConnectorException If the base folder is a file
* @throws IOException If the writer cannot be initialized correctly
*/
private BufferedCsvWriter initWriter(String baseDirectory, CsvFileDefinition fileDefinition)
private BufferedCsvWriter initWriter(
String baseDirectory, CsvFileDefinition fileDefinition, boolean overwrite)
throws ConnectorException, IOException {
/* Join the full DIRECTORY path (excluding file name) */
String baseDirectoryHarmonized = IoUtil.harmonizeFileSeparator(baseDirectory);
Expand All @@ -123,6 +126,9 @@ private BufferedCsvWriter initWriter(String baseDirectory, CsvFileDefinition fil

File pathFile = new File(fullPath);
boolean append = pathFile.exists();
if (overwrite == true) {
append = false;
}
BufferedCsvWriter writer =
new BufferedCsvWriter(
fullPath, fileDefinition.headLineElements(), fileDefinition.csvSep(), append);
Expand Down
30 changes: 20 additions & 10 deletions src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public class CsvFileSink implements InputDataSink, OutputDataSink {
private final String csvSep;

public CsvFileSink(String baseFolderPath) {
this(baseFolderPath, new FileNamingStrategy(), false, ",");
this(baseFolderPath, new FileNamingStrategy(), false, false, ",");
}

/**
Expand All @@ -72,23 +72,25 @@ public CsvFileSink(String baseFolderPath) {
* @param initFiles true if the files should be created during initialization (might create files,
* that only consist of a headline, because no data will be written into them), false
* otherwise
* @param overwrite true if the input should be appended to a new file
* @param csvSep the csv file separator that should be use
*/
public CsvFileSink(
String baseFolderPath,
FileNamingStrategy fileNamingStrategy,
boolean initFiles,
boolean overwrite,
String csvSep) {
this(baseFolderPath, new ProcessorProvider(), fileNamingStrategy, initFiles, csvSep);
this(baseFolderPath, new ProcessorProvider(), fileNamingStrategy, initFiles, overwrite, csvSep);
}

/**
* Create an instance of a csv file sink that can be used to persist Unique entities. This
* implementation processes in sequential order. To parallelize this process one might consider
* starting several sinks and use them for specific entities. Be careful when providing your own
* {@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
* you're going to process exceptions might occur. Therefor 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()}
*
* @param baseFolderPath the base folder path where the files should be put into
Expand All @@ -97,19 +99,21 @@ public CsvFileSink(
* @param initFiles true if the files should be created during initialization (might create files,
* that only consist of a headline, because no data will be written into them), false
* otherwise
* @param overwrite true if the input should be appended to a new file
* @param csvSep the csv file separator that should be use
*/
public CsvFileSink(
String baseFolderPath,
ProcessorProvider processorProvider,
FileNamingStrategy fileNamingStrategy,
boolean initFiles,
boolean overwrite,
String csvSep) {
this.csvSep = csvSep;
this.processorProvider = processorProvider;
this.connector = new CsvFileConnector(baseFolderPath, fileNamingStrategy);

if (initFiles) initFiles(processorProvider, connector);
if (initFiles) initFiles(processorProvider, connector, overwrite);
}

@Override
Expand Down Expand Up @@ -262,7 +266,9 @@ public <E extends TimeSeriesEntry<V>, V extends Value> void persistTimeSeries(
try {
TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries);
String[] headerElements = csvHeaderElements(processorProvider.getHeaderElements(key));
BufferedCsvWriter writer = connector.getOrInitWriter(timeSeries, headerElements, csvSep);
Boolean overwrite = true;
BufferedCsvWriter writer =
connector.getOrInitWriter(timeSeries, headerElements, csvSep, overwrite);
persistTimeSeries(timeSeries, writer);
connector.closeTimeSeriesWriter(timeSeries.getUuid());
} catch (ProcessorProviderException e) {
Expand Down Expand Up @@ -309,7 +315,7 @@ private <E extends TimeSeriesEntry<V>, V extends Value> void persistTimeSeries(
}

/**
* Writes a entity into the corresponding CSV file. Does <b>not</b> include any nested entities.
* Writes an entity into the corresponding CSV file. Does <b>not</b> include any nested entities.
* The header names for the fields will be determined by the given {@link ProcessorProvider}.
*
* @param entity the entity to write
Expand All @@ -334,8 +340,9 @@ private <C extends UniqueEntity> void write(C entity) {
+ "]"));

String[] headerElements = processorProvider.getHeaderElements(entity.getClass());
boolean overwrite = true;
BufferedCsvWriter writer =
connector.getOrInitWriter(entity.getClass(), headerElements, csvSep);
connector.getOrInitWriter(entity.getClass(), headerElements, csvSep, overwrite);
writer.write(entityFieldData);
} catch (ProcessorProviderException e) {
log.error(
Expand All @@ -360,9 +367,12 @@ private <C extends UniqueEntity> void write(C entity) {
* @param processorProvider the processor provider all files that will be processed is derived
* from
* @param connector the connector to the files
* @param overwrite true if the input should be appended to a new file
*/
private void initFiles(
final ProcessorProvider processorProvider, final CsvFileConnector connector) {
final ProcessorProvider processorProvider,
final CsvFileConnector connector,
final boolean overwrite) {
processorProvider
.getRegisteredClasses()
.forEach(
Expand All @@ -371,7 +381,7 @@ private void initFiles(
String[] headerElements =
csvHeaderElements(processorProvider.getHeaderElements(clz));

connector.getOrInitWriter(clz, headerElements, csvSep);
connector.getOrInitWriter(clz, headerElements, csvSep, overwrite);
} catch (ProcessorProviderException e) {
log.error(
"Error during receiving of head line elements. Cannot prepare writer for class {}.",
Expand Down