Skip to content

Commit ed8aa8a

Browse files
committed
Use a BufferedReader to parse import analysis metadata
By using `BufferedReader`s all the platform dependent line endings are handled automatically. No weird splitting, joining and replacing needed. This also reduces space usage, because not all lines are kept in memory at the same time.
1 parent f67b0b1 commit ed8aa8a

1 file changed

Lines changed: 58 additions & 58 deletions

File tree

src/main/java/org/variantsync/diffdetective/analysis/AnalysisResult.java

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
import org.variantsync.diffdetective.metadata.ExplainedFilterSummary;
77
import org.variantsync.diffdetective.metadata.Metadata;
88
import org.variantsync.diffdetective.pattern.elementary.proposed.ProposedElementaryPatterns;
9-
import org.variantsync.diffdetective.util.IO;
109
import org.variantsync.functjonal.Functjonal;
1110
import org.variantsync.functjonal.category.InplaceMonoid;
1211
import org.variantsync.functjonal.category.InplaceSemigroup;
1312
import org.variantsync.functjonal.category.Semigroup;
1413
import org.variantsync.functjonal.map.MergeMap;
1514

15+
import java.io.BufferedReader;
1616
import java.io.IOException;
17+
import java.nio.file.Files;
1718
import java.nio.file.Path;
1819
import java.util.*;
1920
import java.util.function.BiConsumer;
@@ -137,73 +138,72 @@ public static AnalysisResult importFrom(final Path p, final Map<String, BiConsum
137138

138139
final List<String> filterHitsLines = new ArrayList<>();
139140
final List<String> elementaryPatternCountsLines = new ArrayList<>();
140-
141-
String fileInput = IO.readAsString(p); // read in metadata file
142-
fileInput = fileInput.replace("\r", ""); // remove carriage returns if present
143-
final String[] lines = fileInput.split("\n");
144-
145-
// examine each line of the metadata file separately
146-
for (/*final*/ String line : lines) {
147-
String[] keyValuePair = line.split(": ");
148-
String key = keyValuePair[0];
149-
String value = keyValuePair[1];
150-
151-
switch (key) {
152-
case MetadataKeys.REPONAME -> result.repoName = value;
153-
case MetadataKeys.TREES -> result.exportedTrees = Integer.parseInt(value);
154-
case MetadataKeys.PROCESSED_COMMITS -> result.exportedCommits = Integer.parseInt(value);
155-
case MetadataKeys.TOTAL_COMMITS -> result.totalCommits = Integer.parseInt(value);
156-
case MetadataKeys.EMPTY_COMMITS -> result.emptyCommits = Integer.parseInt(value);
157-
case MetadataKeys.FAILED_COMMITS -> result.failedCommits = Integer.parseInt(value);
158-
case MetadataKeys.FILTERED_COMMITS -> { /* Do nothing because this value is derived. */ }
159-
case MetadataKeys.NON_NODE_COUNT -> result.debugData.numExportedNonNodes = Integer.parseInt(value);
160-
case MetadataKeys.ADD_NODE_COUNT -> result.debugData.numExportedAddNodes = Integer.parseInt(value);
161-
case MetadataKeys.REM_NODE_COUNT -> result.debugData.numExportedRemNodes = Integer.parseInt(value);
162-
case MetadataKeys.MINCOMMIT -> result.min.set(CommitProcessTime.fromString(value));
163-
case MetadataKeys.MAXCOMMIT -> result.max.set(CommitProcessTime.fromString(value));
164-
case MetadataKeys.RUNTIME -> {
165-
if (value.endsWith("s")) {
166-
value = value.substring(0, value.length() - 1);
141+
142+
try (BufferedReader input = Files.newBufferedReader(p)) {
143+
// examine each line of the metadata file separately
144+
String line;
145+
while ((line = input.readLine()) != null) {
146+
String[] keyValuePair = line.split(": ");
147+
String key = keyValuePair[0];
148+
String value = keyValuePair[1];
149+
150+
switch (key) {
151+
case MetadataKeys.REPONAME -> result.repoName = value;
152+
case MetadataKeys.TREES -> result.exportedTrees = Integer.parseInt(value);
153+
case MetadataKeys.PROCESSED_COMMITS -> result.exportedCommits = Integer.parseInt(value);
154+
case MetadataKeys.TOTAL_COMMITS -> result.totalCommits = Integer.parseInt(value);
155+
case MetadataKeys.EMPTY_COMMITS -> result.emptyCommits = Integer.parseInt(value);
156+
case MetadataKeys.FAILED_COMMITS -> result.failedCommits = Integer.parseInt(value);
157+
case MetadataKeys.FILTERED_COMMITS -> { /* Do nothing because this value is derived. */ }
158+
case MetadataKeys.NON_NODE_COUNT -> result.debugData.numExportedNonNodes = Integer.parseInt(value);
159+
case MetadataKeys.ADD_NODE_COUNT -> result.debugData.numExportedAddNodes = Integer.parseInt(value);
160+
case MetadataKeys.REM_NODE_COUNT -> result.debugData.numExportedRemNodes = Integer.parseInt(value);
161+
case MetadataKeys.MINCOMMIT -> result.min.set(CommitProcessTime.fromString(value));
162+
case MetadataKeys.MAXCOMMIT -> result.max.set(CommitProcessTime.fromString(value));
163+
case MetadataKeys.RUNTIME -> {
164+
if (value.endsWith("s")) {
165+
value = value.substring(0, value.length() - 1);
166+
}
167+
result.runtimeInSeconds = Double.parseDouble(value);
167168
}
168-
result.runtimeInSeconds = Double.parseDouble(value);
169-
}
170-
case MetadataKeys.RUNTIME_WITH_MULTITHREADING -> {
171-
if (value.endsWith("s")) {
172-
value = value.substring(0, value.length() - 1);
169+
case MetadataKeys.RUNTIME_WITH_MULTITHREADING -> {
170+
if (value.endsWith("s")) {
171+
value = value.substring(0, value.length() - 1);
172+
}
173+
result.runtimeWithMultithreadingInSeconds = Double.parseDouble(value);
173174
}
174-
result.runtimeWithMultithreadingInSeconds = Double.parseDouble(value);
175-
}
176-
default -> {
175+
default -> {
177176

178-
// temporary fix for renaming from Unchanged to Untouched
179-
final String unchanged = "Unchanged";
180-
if (key.startsWith(unchanged)) {
181-
key = ProposedElementaryPatterns.Untouched.getName();
182-
line = key + line.substring(unchanged.length());
183-
}
177+
// temporary fix for renaming from Unchanged to Untouched
178+
final String unchanged = "Unchanged";
179+
if (key.startsWith(unchanged)) {
180+
key = ProposedElementaryPatterns.Untouched.getName();
181+
line = key + line.substring(unchanged.length());
182+
}
184183

185-
final String finalKey = key;
186-
if (ProposedElementaryPatterns.All.stream().anyMatch(pattern -> pattern.getName().equals(finalKey))) {
187-
elementaryPatternCountsLines.add(line);
188-
} else if (key.startsWith(ExplainedFilterSummary.FILTERED_MESSAGE_BEGIN)) {
189-
filterHitsLines.add(line);
190-
} else if (key.startsWith(ERROR_BEGIN)) {
191-
DiffError e = new DiffError(key.substring(ERROR_BEGIN.length(), key.length() - ERROR_END.length()));
192-
// add DiffError
193-
result.diffErrors.put(e, Integer.parseInt(value));
194-
} else {
195-
final BiConsumer<AnalysisResult, String> customParser = customParsers.get(key);
196-
if (customParser == null) {
197-
final String errorMessage = "Unknown entry \"" + line + "\"!";
198-
throw new IOException(errorMessage);
184+
final String finalKey = key;
185+
if (ProposedElementaryPatterns.All.stream().anyMatch(pattern -> pattern.getName().equals(finalKey))) {
186+
elementaryPatternCountsLines.add(line);
187+
} else if (key.startsWith(ExplainedFilterSummary.FILTERED_MESSAGE_BEGIN)) {
188+
filterHitsLines.add(line);
189+
} else if (key.startsWith(ERROR_BEGIN)) {
190+
DiffError e = new DiffError(key.substring(ERROR_BEGIN.length(), key.length() - ERROR_END.length()));
191+
// add DiffError
192+
result.diffErrors.put(e, Integer.parseInt(value));
199193
} else {
200-
customParser.accept(result, value);
194+
final BiConsumer<AnalysisResult, String> customParser = customParsers.get(key);
195+
if (customParser == null) {
196+
final String errorMessage = "Unknown entry \"" + line + "\"!";
197+
throw new IOException(errorMessage);
198+
} else {
199+
customParser.accept(result, value);
200+
}
201201
}
202202
}
203203
}
204204
}
205205
}
206-
206+
207207
result.filterHits = ExplainedFilterSummary.parse(filterHitsLines);
208208
result.elementaryPatternCounts = ElementaryPatternCount.parse(elementaryPatternCountsLines, p.toString());
209209

0 commit comments

Comments
 (0)