Skip to content

Commit 05e7a0d

Browse files
committed
Refactor PSSE model to handle optional headers more gracefully, improve CSV parsing logic, and enhance delimiter and quote management in Context
Signed-off-by: Nicolas Rol <[email protected]>
1 parent 64aee20 commit 05e7a0d

File tree

4 files changed

+43
-26
lines changed

4 files changed

+43
-26
lines changed

psse/psse-model/src/main/java/com/powsybl/psse/model/io/AbstractRecordGroup.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,9 @@ List<T> parseRecords(List<String> records, String[] headers, Context context) {
328328
}
329329

330330
private String[] makeRecordsConsistents(StringBuilder sb, List<String> records, String[] headers, Context context) {
331+
if (records.stream().anyMatch(Objects::isNull)) {
332+
throw new PsseException("Parsing error");
333+
}
331334
int expectedNumFields = records.stream()
332335
.mapToInt(rec -> Math.toIntExact(rec.chars().filter(c -> c == context.getDelimiter())
333336
.count()))

psse/psse-model/src/main/java/com/powsybl/psse/model/io/Context.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ public FileFormat getFileFormat() {
6161

6262
public Context setFileFormat(FileFormat fileFormat) {
6363
this.fileFormat = fileFormat;
64+
this.delimiter = fileFormat.getDefaultDelimiter();
65+
this.quote = fileFormat.getQuote();
6466
return this;
6567
}
6668

psse/psse-model/src/main/java/com/powsybl/psse/model/pf/internal/PsseSubstationSwitchingDevice.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.powsybl.psse.model.PsseVersion;
1212
import de.siegmar.fastcsv.reader.CsvRecord;
1313

14+
import java.util.Optional;
15+
1416
import static com.powsybl.psse.model.io.Util.parseDoubleFromRecord;
1517
import static com.powsybl.psse.model.io.Util.parseIntFromRecord;
1618
import static com.powsybl.psse.model.io.Util.parseStringFromRecord;
@@ -51,24 +53,36 @@ public static PsseSubstationSwitchingDevice fromRecord(CsvRecord rec, PsseVersio
5153
public static String[] toRecord(PsseSubstationSwitchingDevice psseSubstationSwitchingDevice, String[] headers) {
5254
String[] row = new String[headers.length];
5355
for (int i = 0; i < headers.length; i++) {
54-
row[i] = switch (headers[i]) {
55-
case "ni", "inode" -> String.valueOf(psseSubstationSwitchingDevice.getNi());
56-
case "nj", "jnode" -> String.valueOf(psseSubstationSwitchingDevice.getNj());
57-
case "ckt", "swdid" -> String.valueOf(psseSubstationSwitchingDevice.getCkt());
58-
case "name" -> psseSubstationSwitchingDevice.getName();
59-
case "type" -> String.valueOf(psseSubstationSwitchingDevice.getType());
60-
case "stat", "status" -> String.valueOf(psseSubstationSwitchingDevice.getStatus());
61-
case "nstat" -> String.valueOf(psseSubstationSwitchingDevice.getNstat());
62-
case "x", "xpu" -> String.valueOf(psseSubstationSwitchingDevice.getX());
63-
case "rate1" -> String.valueOf(psseSubstationSwitchingDevice.getRate1());
64-
case "rate2" -> String.valueOf(psseSubstationSwitchingDevice.getRate2());
65-
case "rate3" -> String.valueOf(psseSubstationSwitchingDevice.getRate3());
66-
default -> throw new PsseException("Unsupported header: " + headers[i]);
67-
};
56+
if ("rsetnam".equals(headers[i])) {
57+
// This header seems to be expected, but no variable seems consistent with it
58+
continue;
59+
}
60+
Optional<String> optionalValue = psseSubstationSwitchingDevice.headerToString(headers[i]);
61+
if (optionalValue.isEmpty()) {
62+
throw new PsseException("Unsupported header: " + headers[i]);
63+
}
64+
row[i] = optionalValue.get();
6865
}
6966
return row;
7067
}
7168

69+
public Optional<String> headerToString(String header) {
70+
return switch (header) {
71+
case "ni", "inode" -> Optional.of(String.valueOf(getNi()));
72+
case "nj", "jnode" -> Optional.of(String.valueOf(getNj()));
73+
case "ckt", "swdid" -> Optional.of(String.valueOf(getCkt()));
74+
case "name" -> Optional.of(getName());
75+
case "type" -> Optional.of(String.valueOf(getType()));
76+
case "stat", "status" -> Optional.of(String.valueOf(getStatus()));
77+
case "nstat" -> Optional.of(String.valueOf(getNstat()));
78+
case "x", "xpu" -> Optional.of(String.valueOf(getX()));
79+
case "rate1" -> Optional.of(String.valueOf(getRate1()));
80+
case "rate2" -> Optional.of(String.valueOf(getRate2()));
81+
case "rate3" -> Optional.of(String.valueOf(getRate3()));
82+
default -> Optional.empty();
83+
};
84+
}
85+
7286
public int getNi() {
7387
return ni;
7488
}

psse/psse-model/src/main/java/com/powsybl/psse/model/pf/internal/PsseSubstationSwitchingDevicex.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.powsybl.psse.model.PsseVersion;
1212
import de.siegmar.fastcsv.reader.CsvRecord;
1313

14+
import java.util.Optional;
15+
1416
import static com.powsybl.psse.model.io.Util.parseIntFromRecord;
1517

1618
/**
@@ -42,18 +44,14 @@ public static String[] toRecord(PsseSubstationSwitchingDevicex psseSubstationSwi
4244
for (int i = 0; i < headers.length; i++) {
4345
row[i] = switch (headers[i]) {
4446
case "isub" -> String.valueOf(psseSubstationSwitchingDevicex.getIsub());
45-
case "ni", "inode" -> String.valueOf(psseSubstationSwitchingDevicex.getSwitchingDevice().getNi());
46-
case "nj", "jnode" -> String.valueOf(psseSubstationSwitchingDevicex.getSwitchingDevice().getNj());
47-
case "ckt", "swdid" -> String.valueOf(psseSubstationSwitchingDevicex.getSwitchingDevice().getCkt());
48-
case "name" -> psseSubstationSwitchingDevicex.getSwitchingDevice().getName();
49-
case "type" -> String.valueOf(psseSubstationSwitchingDevicex.getSwitchingDevice().getType());
50-
case "stat", "status" -> String.valueOf(psseSubstationSwitchingDevicex.getSwitchingDevice().getStatus());
51-
case "nstat" -> String.valueOf(psseSubstationSwitchingDevicex.getSwitchingDevice().getNstat());
52-
case "x", "xpu" -> String.valueOf(psseSubstationSwitchingDevicex.getSwitchingDevice().getX());
53-
case "rate1" -> String.valueOf(psseSubstationSwitchingDevicex.getSwitchingDevice().getRate1());
54-
case "rate2" -> String.valueOf(psseSubstationSwitchingDevicex.getSwitchingDevice().getRate2());
55-
case "rate3" -> String.valueOf(psseSubstationSwitchingDevicex.getSwitchingDevice().getRate3());
56-
default -> throw new PsseException("Unsupported header: " + headers[i]);
47+
case "rsetnam" -> null; // This header seems to be expected, but no variable seems consistent with it
48+
default -> {
49+
Optional<String> optionalValue = psseSubstationSwitchingDevicex.getSwitchingDevice().headerToString(headers[i]);
50+
if (optionalValue.isPresent()) {
51+
yield optionalValue.get();
52+
}
53+
throw new PsseException("Unsupported header: " + headers[i]);
54+
}
5755
};
5856
}
5957
return row;

0 commit comments

Comments
 (0)