Skip to content

Commit

Permalink
Throw clear exception if parameter set missing (#233)
Browse files Browse the repository at this point in the history
* Throw exception if missing parameter set
* Add unit test
* Update unit tests

Signed-off-by: Florian Dupuy <florian.dupuy@rte-france.com>
  • Loading branch information
flo-dup authored Jun 6, 2023
1 parent 5b266c8 commit a8c028b
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,11 @@
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference;

import static com.powsybl.dynawaltz.xml.DynaWaltzXmlConstants.DYN_URI;

Expand All @@ -51,7 +54,11 @@ public static List<ParametersSet> load(InputStream parametersFile) {
public static ParametersSet load(InputStream parametersFile, String parameterSetId) {
try {
XMLStreamReader xmlReader = createXmlInputFactory().createXMLStreamReader(parametersFile);
return readOneSetAndClose(xmlReader, parameterSetId);
ParametersSet parametersSet = readOneSetAndClose(xmlReader, parameterSetId);
if (parametersSet == null) {
throw new PowsyblException("Could not find parameters set with id='" + parameterSetId + "' in given input stream");
}
return parametersSet;
} catch (XMLStreamException e) {
throw new UncheckedXmlStreamException(e);
}
Expand All @@ -71,7 +78,11 @@ public static List<ParametersSet> load(Path parametersFile) {
public static ParametersSet load(Path parametersFile, String parameterSetId) {
try (Reader reader = Files.newBufferedReader(parametersFile, StandardCharsets.UTF_8)) {
XMLStreamReader xmlReader = createXmlInputFactory().createXMLStreamReader(reader);
return readOneSetAndClose(xmlReader, parameterSetId);
ParametersSet parametersSet = readOneSetAndClose(xmlReader, parameterSetId);
if (parametersSet == null) {
throw new PowsyblException("Could not find parameters set with id='" + parameterSetId + "' in file '" + parametersFile + "'");
}
return parametersSet;
} catch (IOException e) {
throw new UncheckedIOException(e);
} catch (XMLStreamException e) {
Expand All @@ -87,38 +98,35 @@ private static List<ParametersSet> readAndClose(XMLStreamReader xmlReader) throw
closeAndThrowException(xmlReader, xmlReader.getLocalName());
}
String parameterSetIdRead = xmlReader.getAttributeValue(null, "id");
ParametersSet parametersSet = new ParametersSet(parameterSetIdRead);
fillParametersSet(xmlReader, parametersSet);
parametersSets.add(parametersSet);
parametersSets.add(createParametersSet(xmlReader, parameterSetIdRead));
});
xmlReader.close();
return parametersSets;
}

private static ParametersSet readOneSetAndClose(XMLStreamReader xmlReader, String parameterSetId) throws XMLStreamException {
ParametersSet parametersSet = new ParametersSet(parameterSetId);
AtomicBoolean found = new AtomicBoolean(false);
AtomicReference<ParametersSet> parametersSet = new AtomicReference<>();
skipComments(xmlReader);
com.powsybl.commons.xml.XmlUtil.readUntilEndElement(PARAMETERS_SET_ELEMENT_NAME, xmlReader, () -> {
if (found.get()) {
if (parametersSet.get() != null) {
return;
}
if (!xmlReader.getLocalName().equals("set")) {
closeAndThrowException(xmlReader, xmlReader.getLocalName());
}
if (xmlReader.getAttributeValue(null, "id").equals(parameterSetId)) {
fillParametersSet(xmlReader, parametersSet);
found.set(true);
parametersSet.set(createParametersSet(xmlReader, parameterSetId));
} else {
com.powsybl.commons.xml.XmlUtil.readUntilEndElement("set", xmlReader, () -> {
});
}
});
xmlReader.close();
return parametersSet;
return parametersSet.get();
}

private static void fillParametersSet(XMLStreamReader xmlReader, ParametersSet parametersSet) throws XMLStreamException {
private static ParametersSet createParametersSet(XMLStreamReader xmlReader, String parameterSetId) throws XMLStreamException {
ParametersSet parametersSet = new ParametersSet(parameterSetId);
com.powsybl.commons.xml.XmlUtil.readUntilEndElement("set", xmlReader, () -> {
String name = xmlReader.getAttributeValue(null, "name");
ParameterType type = ParameterType.valueOf(xmlReader.getAttributeValue(null, "type"));
Expand All @@ -133,6 +141,7 @@ private static void fillParametersSet(XMLStreamReader xmlReader, ParametersSet p
closeAndThrowException(xmlReader, xmlReader.getLocalName());
}
});
return parametersSet;
}

private static XMLInputFactory createXmlInputFactory() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package com.powsybl.dynawaltz;

import com.powsybl.commons.PowsyblException;
import com.powsybl.commons.config.InMemoryPlatformConfig;
import com.powsybl.commons.config.MapModuleConfig;
import com.powsybl.commons.test.AbstractConverterTest;
Expand All @@ -15,16 +16,17 @@
import com.powsybl.dynawaltz.parameters.Parameter;
import com.powsybl.dynawaltz.parameters.ParameterType;
import com.powsybl.dynawaltz.parameters.ParametersSet;
import com.powsybl.dynawaltz.xml.ParametersXml;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Objects;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;

/**
* @author Marcos de Miguel <demiguelm at aia.es>
Expand Down Expand Up @@ -59,7 +61,7 @@ void checkParameters() throws IOException {

DynaWaltzParameters parameters = DynaWaltzParameters.load(platformConfig, fileSystem);

checModelParameters(parameters);
checkModelParameters(parameters);

assertEquals(networkParametersId, parameters.getNetworkParameters().getId());
ParametersSet networkParameters = parameters.getNetworkParameters();
Expand Down Expand Up @@ -132,21 +134,36 @@ void checkDefaultParameters() throws IOException {
copyFile("/parametersSet/solvers.par", DynaWaltzParameters.DEFAULT_INPUT_SOLVER_PARAMETERS_FILE);

DynaWaltzParameters parameters = DynaWaltzParameters.load(platformConfig, fileSystem);
checModelParameters(parameters);
checkModelParameters(parameters);

assertEquals(DynaWaltzParameters.DEFAULT_NETWORK_PAR_ID, parameters.getNetworkParameters().getId());
assertTrue(parameters.getNetworkParameters().getParameters().isEmpty());
assertTrue(parameters.getNetworkParameters().getReferences().isEmpty());

assertEquals(DynaWaltzParameters.DEFAULT_SOLVER_TYPE, parameters.getSolverType());
assertEquals(DynaWaltzParameters.DEFAULT_SOLVER_PAR_ID, parameters.getSolverParameters().getId());
assertTrue(parameters.getSolverParameters().getParameters().isEmpty());
assertTrue(parameters.getSolverParameters().getReferences().isEmpty());
assertEquals("1", parameters.getSolverParameters().getId());

assertEquals(DynaWaltzParameters.DEFAULT_MERGE_LOADS, parameters.isMergeLoads());
}

private static void checModelParameters(DynaWaltzParameters dynaWaltzParameters) {
@Test
void checkException() throws IOException {
Files.createDirectories(fileSystem.getPath(USER_HOME));
copyFile("/parametersSet/models.par", DynaWaltzParameters.DEFAULT_INPUT_PARAMETERS_FILE);
copyFile("/parametersSet/network.par", DynaWaltzParameters.DEFAULT_INPUT_NETWORK_PARAMETERS_FILE);
copyFile("/parametersSet/solversMissingDefault.par", DynaWaltzParameters.DEFAULT_INPUT_SOLVER_PARAMETERS_FILE);

PowsyblException e1 = assertThrows(PowsyblException.class, () -> DynaWaltzParameters.load(platformConfig, fileSystem));
assertEquals("Could not find parameters set with id='1' in file '/work/inmemory/solvers.par'", e1.getMessage());

try (InputStream is = getClass().getResourceAsStream("/parametersSet/solvers.par")) {
PowsyblException e2 = assertThrows(PowsyblException.class, () -> ParametersXml.load(is, "2"));
assertEquals("Could not find parameters set with id='2' in given input stream", e2.getMessage());
}
}

private static void checkModelParameters(DynaWaltzParameters dynaWaltzParameters) {
Parameter booleanParameter = dynaWaltzParameters.getModelParameters("test").getParameter("boolean");
assertEquals("true", booleanParameter.getValue());
assertEquals("boolean", booleanParameter.getName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
<par type="DOUBLE" name="load_Tp" value="90"/>
<par type="BOOL" name="load_isControllable" value="false"/>
</set>
<set id="1">
</set>
</parametersSet>
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
<par type="INT" name="order" value="1"/>
<par type="DOUBLE" name="absAccuracy" value="1e-4"/>
</set>
<set id="1">
</set>
</parametersSet>
2 changes: 2 additions & 0 deletions dynawaltz/src/test/resources/parametersSet/network.par
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
<par type="DOUBLE" name="load_Tp" value="90"/>
<par type="BOOL" name="load_isControllable" value="false"/>
</set>
<set id="1">
</set>
</parametersSet>
4 changes: 4 additions & 0 deletions dynawaltz/src/test/resources/parametersSet/solvers.par
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@
<par type="INT" name="order" value="1"/>
<par type="DOUBLE" name="absAccuracy" value="1e-4"/>
</set>
<set id="1">
<par type="INT" name="order" value="1"/>
<par type="DOUBLE" name="absAccuracy" value="1e-4"/>
</set>
</parametersSet>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<parametersSet xmlns="http://www.rte-france.com/dynawo">
<set id="solverParametersId">
<par type="INT" name="order" value="1"/>
<par type="DOUBLE" name="absAccuracy" value="1e-4"/>
</set>
</parametersSet>

0 comments on commit a8c028b

Please sign in to comment.