Skip to content

Commit 1eaf745

Browse files
authored
Merge branch 'main' into cgmes-update-warning-query-not-found
2 parents fe9af29 + 39c3982 commit 1eaf745

File tree

6 files changed

+242
-53
lines changed

6 files changed

+242
-53
lines changed

cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/CgmesT2xModel.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import com.powsybl.cgmes.model.CgmesNames;
1313
import com.powsybl.triplestore.api.PropertyBag;
1414
import com.powsybl.triplestore.api.PropertyBags;
15+
import org.apache.commons.math3.complex.Complex;
16+
17+
import static com.powsybl.iidm.modification.util.TransformerUtils.impedanceConversion;
1518

1619
/**
1720
* @author Luma Zamarreño {@literal <zamarrenolm at aia.es>}
@@ -24,6 +27,7 @@ public class CgmesT2xModel {
2427
final CgmesPartialEnd end1;
2528
final CgmesPartialEnd end2;
2629
final boolean x1IsZero;
30+
final boolean structuralRatioAtEnd2;
2731
final Double ratedS;
2832

2933
public CgmesT2xModel(PropertyBags ends, Context context) {
@@ -32,13 +36,20 @@ public CgmesT2xModel(PropertyBags ends, Context context) {
3236

3337
double x1 = bagEnd1.asDouble(CgmesNames.X);
3438
double x2 = bagEnd2.asDouble(CgmesNames.X);
39+
double ratedU1 = bagEnd1.asDouble(CgmesNames.RATEDU);
40+
double ratedU2 = bagEnd2.asDouble(CgmesNames.RATEDU);
41+
this.x1IsZero = x1 == 0.0;
42+
this.structuralRatioAtEnd2 = InterpretedT2xModel.structuralRatioAlternative(ratedU1, ratedU2, x1IsZero, context.config());
3543

3644
this.r = bagEnd1.asDouble(CgmesNames.R) + bagEnd2.asDouble(CgmesNames.R);
3745
this.x = x1 + x2;
3846
this.end1 = new CgmesPartialEnd(bagEnd1, x, context);
39-
this.end2 = new CgmesPartialEnd(bagEnd2, x, context);
40-
this.x1IsZero = x1 == 0.0;
41-
47+
double xx2 = x;
48+
if (structuralRatioAtEnd2) {
49+
double a0 = ratedU2 / ratedU1;
50+
xx2 = impedanceConversion(x, new Complex(a0, 0.0));
51+
}
52+
this.end2 = new CgmesPartialEnd(bagEnd2, xx2, context);
4253
this.ratedS = getRatedS(bagEnd1, bagEnd2);
4354
}
4455

cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/InterpretedT2xModel.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public InterpretedT2xModel(CgmesT2xModel cgmesT2xModel, Conversion.Config altern
4444
this.end2 = new TapChangerConversion.InterpretedEnd(interpretedShunt.g2, interpretedShunt.b2,
4545
interpretedTapChanger.ratioTapChanger2, interpretedTapChanger.phaseTapChanger2,
4646
cgmesT2xModel.end2.ratedU, cgmesT2xModel.end2.terminal);
47-
this.structuralRatioAtEnd2 = structuralRatioAlternative(cgmesT2xModel, alternative);
47+
this.structuralRatioAtEnd2 = cgmesT2xModel.structuralRatioAtEnd2;
4848
this.ratedS = cgmesT2xModel.ratedS;
4949
}
5050

@@ -58,7 +58,7 @@ public InterpretedT2xModel(CgmesT2xModel cgmesT2xModel, Conversion.Config altern
5858
* X. Tap changers are mapped at end1 or end2 depending on the xIsZero attribute.
5959
*/
6060
private TapChangerConversion.AllTapChanger ratioPhaseAlternative(CgmesT2xModel cgmesT2xModel,
61-
Conversion.Config alternative, TapChangerConversion tcc) {
61+
Conversion.Config alternative, TapChangerConversion tcc) {
6262
TapChanger ratioTapChanger1 = null;
6363
TapChanger phaseTapChanger1 = null;
6464
TapChanger ratioTapChanger2 = null;
@@ -150,8 +150,8 @@ private static TapChangerConversion.AllShunt shuntAlternative(CgmesT2xModel cgme
150150
/**
151151
* return true if the structural ratio is at end2
152152
*/
153-
private static boolean structuralRatioAlternative(CgmesT2xModel cgmesT2xModel, Conversion.Config alternative) {
154-
if (cgmesT2xModel.end1.ratedU == cgmesT2xModel.end2.ratedU) {
153+
static boolean structuralRatioAlternative(double ratedU1, double ratedU2, boolean x1IsZero, Conversion.Config alternative) {
154+
if (ratedU1 == ratedU2) {
155155
return false;
156156
}
157157
switch (alternative.getXfmr2StructuralRatio()) {
@@ -160,7 +160,7 @@ private static boolean structuralRatioAlternative(CgmesT2xModel cgmesT2xModel, C
160160
case END2:
161161
return true;
162162
case X:
163-
return !cgmesT2xModel.x1IsZero;
163+
return !x1IsZero;
164164
}
165165
return false;
166166
}

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/TapChangerConversionTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.IOException;
2020
import java.io.StringWriter;
21+
import java.util.Map;
2122

2223
import static com.powsybl.cgmes.conversion.test.ConversionUtil.*;
2324
import static org.junit.jupiter.api.Assertions.*;
@@ -100,4 +101,38 @@ void currentLimiterExportTest() throws IOException {
100101
assertEquals("0", getAttribute(tapChangerControl, "RegulatingControl.targetValue"));
101102
}
102103

104+
@Test
105+
void phaseTapChangerLinearTest() {
106+
// CGMES network:
107+
// PowerTransformer PT_1 has a PhaseTapChangerLinear associated to its primary winding.
108+
// PowerTransformer PT_2 has a PhaseTapChangerLinear associated to its secondary winding.
109+
// The two TapChangers have different xMin and xMax values, but they represent in both cases
110+
// the x value and x + 10% value with x the branch reactance seen from the tap changer side.
111+
// IIDM network:
112+
// Both tap changers induce a 0% to 10% reactance deviation.
113+
Network network = readCgmesResources(DIR, "phaseTapChangerLinear.xml");
114+
115+
// Check phase tap changer on primary winding.
116+
Map<Integer, PhaseTapChangerStep> steps1 = network.getTwoWindingsTransformer("PT_1").getPhaseTapChanger().getAllSteps();
117+
assertTapStep(steps1.get(-2), 2.0, 10.0);
118+
assertTapStep(steps1.get(-1), 1.0, 2.5);
119+
assertTapStep(steps1.get(-0), 0.0, 0.0);
120+
assertTapStep(steps1.get(1), -1.0, 2.5);
121+
assertTapStep(steps1.get(2), -2.0, 10.0);
122+
123+
// Check phase tap changer on secondary winding.
124+
Map<Integer, PhaseTapChangerStep> steps2 = network.getTwoWindingsTransformer("PT_2").getPhaseTapChanger().getAllSteps();
125+
assertTapStep(steps2.get(-2), -2.0, 10.0);
126+
assertTapStep(steps2.get(-1), -1.0, 2.5);
127+
assertTapStep(steps2.get(-0), 0.0, 0.0);
128+
assertTapStep(steps2.get(1), 1.0, 2.5);
129+
assertTapStep(steps2.get(2), 2.0, 10.0);
130+
}
131+
132+
private void assertTapStep(PhaseTapChangerStep step, double alpha, double x) {
133+
double tolerance = 1e-3;
134+
assertEquals(alpha, step.getAlpha(), tolerance);
135+
assertEquals(x, step.getX(), tolerance);
136+
}
137+
103138
}
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
<rdf:RDF xmlns:cim="http://iec.ch/TC57/2013/CIM-schema-cim16#" xmlns:md="http://iec.ch/TC57/61970-552/ModelDescription/1#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
2+
<md:FullModel rdf:about="urn:uuid:phaseTapChangerLinear_EQ">
3+
<md:Model.scenarioTime>2021-03-01T23:00:00Z</md:Model.scenarioTime>
4+
<md:Model.created>2021-03-02T10:22:58Z</md:Model.created>
5+
<md:Model.description>Phase tap changer linear</md:Model.description>
6+
<md:Model.version>001</md:Model.version>
7+
<md:Model.profile>http://entsoe.eu/CIM/EquipmentCore/3/1</md:Model.profile>
8+
<md:Model.profile>http://entsoe.eu/CIM/EquipmentOperation/3/1</md:Model.profile>
9+
<md:Model.modelingAuthoritySet>powsybl.org</md:Model.modelingAuthoritySet>
10+
</md:FullModel>
11+
<cim:GeographicalRegion rdf:ID="_GR">
12+
<cim:IdentifiedObject.name>Geographical region</cim:IdentifiedObject.name>
13+
</cim:GeographicalRegion>
14+
<cim:SubGeographicalRegion rdf:ID="_SGR">
15+
<cim:IdentifiedObject.name>Subgeographical region</cim:IdentifiedObject.name>
16+
<cim:SubGeographicalRegion.Region rdf:resource="#_GR"/>
17+
</cim:SubGeographicalRegion>
18+
<cim:Substation rdf:ID="_ST">
19+
<cim:IdentifiedObject.name>Substation</cim:IdentifiedObject.name>
20+
<cim:Substation.Region rdf:resource="#_SGR"/>
21+
</cim:Substation>
22+
<cim:VoltageLevel rdf:ID="_VL_1">
23+
<cim:IdentifiedObject.name>Voltage level 1</cim:IdentifiedObject.name>
24+
<cim:VoltageLevel.BaseVoltage rdf:resource="#_BV_1"/>
25+
<cim:VoltageLevel.Substation rdf:resource="#_ST"/>
26+
</cim:VoltageLevel>
27+
<cim:ConnectivityNode rdf:ID="_CN_1">
28+
<cim:IdentifiedObject.name>Node 1</cim:IdentifiedObject.name>
29+
<cim:ConnectivityNode.ConnectivityNodeContainer rdf:resource="#_VL_1"/>
30+
</cim:ConnectivityNode>
31+
<cim:VoltageLevel rdf:ID="_VL_2">
32+
<cim:IdentifiedObject.name>Voltage level 2</cim:IdentifiedObject.name>
33+
<cim:VoltageLevel.BaseVoltage rdf:resource="#_BV_2"/>
34+
<cim:VoltageLevel.Substation rdf:resource="#_ST"/>
35+
</cim:VoltageLevel>
36+
<cim:ConnectivityNode rdf:ID="_CN_2">
37+
<cim:IdentifiedObject.name>Node 2</cim:IdentifiedObject.name>
38+
<cim:ConnectivityNode.ConnectivityNodeContainer rdf:resource="#_VL_2"/>
39+
</cim:ConnectivityNode>
40+
<cim:PowerTransformer rdf:ID="_PT_1">
41+
<cim:IdentifiedObject.name>Power transformer 1</cim:IdentifiedObject.name>
42+
<cim:Equipment.EquipmentContainer rdf:resource="#_ST"/>
43+
</cim:PowerTransformer>
44+
<cim:PowerTransformerEnd rdf:ID="_PTE_11">
45+
<cim:IdentifiedObject.name>Power transformer end 11</cim:IdentifiedObject.name>
46+
<cim:PowerTransformerEnd.r>1.6</cim:PowerTransformerEnd.r>
47+
<cim:PowerTransformerEnd.x>16.0</cim:PowerTransformerEnd.x>
48+
<cim:PowerTransformerEnd.b>0.0</cim:PowerTransformerEnd.b>
49+
<cim:PowerTransformerEnd.g>0.0</cim:PowerTransformerEnd.g>
50+
<cim:PowerTransformerEnd.ratedU>400.0</cim:PowerTransformerEnd.ratedU>
51+
<cim:TransformerEnd.endNumber>1</cim:TransformerEnd.endNumber>
52+
<cim:TransformerEnd.BaseVoltage rdf:resource="#_BV_1"/>
53+
<cim:PowerTransformerEnd.PowerTransformer rdf:resource="#_PT_1"/>
54+
<cim:TransformerEnd.Terminal rdf:resource="#_T_PTE_11"/>
55+
</cim:PowerTransformerEnd>
56+
<cim:PowerTransformerEnd rdf:ID="_PTE_12">
57+
<cim:IdentifiedObject.name>Power transformer end 12</cim:IdentifiedObject.name>
58+
<cim:PowerTransformerEnd.r>0.0</cim:PowerTransformerEnd.r>
59+
<cim:PowerTransformerEnd.x>0.0</cim:PowerTransformerEnd.x>
60+
<cim:PowerTransformerEnd.b>0.0</cim:PowerTransformerEnd.b>
61+
<cim:PowerTransformerEnd.g>0.0</cim:PowerTransformerEnd.g>
62+
<cim:PowerTransformerEnd.ratedU>100.0</cim:PowerTransformerEnd.ratedU>
63+
<cim:TransformerEnd.endNumber>2</cim:TransformerEnd.endNumber>
64+
<cim:TransformerEnd.BaseVoltage rdf:resource="#_BV_2"/>
65+
<cim:PowerTransformerEnd.PowerTransformer rdf:resource="#_PT_1"/>
66+
<cim:TransformerEnd.Terminal rdf:resource="#_T_PTE_12"/>
67+
</cim:PowerTransformerEnd>
68+
<cim:Terminal rdf:ID="_T_PTE_11">
69+
<cim:Terminal.ConductingEquipment rdf:resource="#_PT_1"/>
70+
<cim:Terminal.ConnectivityNode rdf:resource="#_CN_1"/>
71+
</cim:Terminal>
72+
<cim:Terminal rdf:ID="_T_PTE_12">
73+
<cim:Terminal.ConductingEquipment rdf:resource="#_PT_1"/>
74+
<cim:Terminal.ConnectivityNode rdf:resource="#_CN_2"/>
75+
</cim:Terminal>
76+
<cim:PhaseTapChangerLinear rdf:ID="_PTCL_1">
77+
<cim:IdentifiedObject.name>Phase tap changer linear 1</cim:IdentifiedObject.name>
78+
<cim:TapChanger.neutralU>400.0</cim:TapChanger.neutralU>
79+
<cim:TapChanger.lowStep>-2</cim:TapChanger.lowStep>
80+
<cim:TapChanger.highStep>2</cim:TapChanger.highStep>
81+
<cim:TapChanger.neutralStep>0</cim:TapChanger.neutralStep>
82+
<cim:TapChanger.normalStep>1</cim:TapChanger.normalStep>
83+
<cim:PhaseTapChangerLinear.stepPhaseShiftIncrement>1.0</cim:PhaseTapChangerLinear.stepPhaseShiftIncrement>
84+
<cim:PhaseTapChangerLinear.xMin>16.0</cim:PhaseTapChangerLinear.xMin>
85+
<cim:PhaseTapChangerLinear.xMax>17.6</cim:PhaseTapChangerLinear.xMax>
86+
<cim:PhaseTapChanger.TransformerEnd rdf:resource="#_PTE_11"/>
87+
<cim:TapChanger.ltcFlag>true</cim:TapChanger.ltcFlag>
88+
<cim:TapChanger.TapChangerControl rdf:resource="#_TCC_1"/>
89+
</cim:PhaseTapChangerLinear>
90+
<cim:TapChangerControl rdf:ID="_TCC_1">
91+
<cim:IdentifiedObject.name>Tap changer control 1</cim:IdentifiedObject.name>
92+
<cim:RegulatingControl.mode rdf:resource="http://iec.ch/TC57/2013/CIM-schema-cim16#RegulatingControlModeKind.activePower"/>
93+
<cim:RegulatingControl.Terminal rdf:resource="#_T_PTE_11"/>
94+
</cim:TapChangerControl>
95+
<cim:PowerTransformer rdf:ID="_PT_2">
96+
<cim:IdentifiedObject.name>Power transformer 1</cim:IdentifiedObject.name>
97+
<cim:Equipment.EquipmentContainer rdf:resource="#_ST"/>
98+
</cim:PowerTransformer>
99+
<cim:PowerTransformerEnd rdf:ID="_PTE_21">
100+
<cim:IdentifiedObject.name>Power transformer end 21</cim:IdentifiedObject.name>
101+
<cim:PowerTransformerEnd.r>1.6</cim:PowerTransformerEnd.r>
102+
<cim:PowerTransformerEnd.x>16.0</cim:PowerTransformerEnd.x>
103+
<cim:PowerTransformerEnd.b>0.0</cim:PowerTransformerEnd.b>
104+
<cim:PowerTransformerEnd.g>0.0</cim:PowerTransformerEnd.g>
105+
<cim:PowerTransformerEnd.ratedU>400.0</cim:PowerTransformerEnd.ratedU>
106+
<cim:TransformerEnd.endNumber>1</cim:TransformerEnd.endNumber>
107+
<cim:TransformerEnd.BaseVoltage rdf:resource="#_BV_1"/>
108+
<cim:PowerTransformerEnd.PowerTransformer rdf:resource="#_PT_2"/>
109+
<cim:TransformerEnd.Terminal rdf:resource="#_T_PTE_21"/>
110+
</cim:PowerTransformerEnd>
111+
<cim:PowerTransformerEnd rdf:ID="_PTE_22">
112+
<cim:IdentifiedObject.name>Power transformer end 22</cim:IdentifiedObject.name>
113+
<cim:PowerTransformerEnd.r>0.0</cim:PowerTransformerEnd.r>
114+
<cim:PowerTransformerEnd.x>0.0</cim:PowerTransformerEnd.x>
115+
<cim:PowerTransformerEnd.b>0.0</cim:PowerTransformerEnd.b>
116+
<cim:PowerTransformerEnd.g>0.0</cim:PowerTransformerEnd.g>
117+
<cim:PowerTransformerEnd.ratedU>100.0</cim:PowerTransformerEnd.ratedU>
118+
<cim:TransformerEnd.endNumber>2</cim:TransformerEnd.endNumber>
119+
<cim:TransformerEnd.BaseVoltage rdf:resource="#_BV_2"/>
120+
<cim:PowerTransformerEnd.PowerTransformer rdf:resource="#_PT_2"/>
121+
<cim:TransformerEnd.Terminal rdf:resource="#_T_PTE_22"/>
122+
</cim:PowerTransformerEnd>
123+
<cim:Terminal rdf:ID="_T_PTE_21">
124+
<cim:Terminal.ConductingEquipment rdf:resource="#_PT_2"/>
125+
<cim:Terminal.ConnectivityNode rdf:resource="#_CN_1"/>
126+
</cim:Terminal>
127+
<cim:Terminal rdf:ID="_T_PTE_22">
128+
<cim:Terminal.ConductingEquipment rdf:resource="#_PT_2"/>
129+
<cim:Terminal.ConnectivityNode rdf:resource="#_CN_2"/>
130+
</cim:Terminal>
131+
<cim:PhaseTapChangerLinear rdf:ID="_PTCL_2">
132+
<cim:IdentifiedObject.name>Phase tap changer linear 2</cim:IdentifiedObject.name>
133+
<cim:TapChanger.neutralU>100.0</cim:TapChanger.neutralU>
134+
<cim:TapChanger.lowStep>-2</cim:TapChanger.lowStep>
135+
<cim:TapChanger.highStep>2</cim:TapChanger.highStep>
136+
<cim:TapChanger.neutralStep>0</cim:TapChanger.neutralStep>
137+
<cim:TapChanger.normalStep>1</cim:TapChanger.normalStep>
138+
<cim:PhaseTapChangerLinear.stepPhaseShiftIncrement>1.0</cim:PhaseTapChangerLinear.stepPhaseShiftIncrement>
139+
<cim:PhaseTapChangerLinear.xMin>1.0</cim:PhaseTapChangerLinear.xMin>
140+
<cim:PhaseTapChangerLinear.xMax>1.1</cim:PhaseTapChangerLinear.xMax>
141+
<cim:PhaseTapChanger.TransformerEnd rdf:resource="#_PTE_22"/>
142+
<cim:TapChanger.ltcFlag>true</cim:TapChanger.ltcFlag>
143+
<cim:TapChanger.TapChangerControl rdf:resource="#_TCC_2"/>
144+
</cim:PhaseTapChangerLinear>
145+
<cim:TapChangerControl rdf:ID="_TCC_2">
146+
<cim:IdentifiedObject.name>Tap changer control 2</cim:IdentifiedObject.name>
147+
<cim:RegulatingControl.mode rdf:resource="http://iec.ch/TC57/2013/CIM-schema-cim16#RegulatingControlModeKind.activePower"/>
148+
<cim:RegulatingControl.Terminal rdf:resource="#_T_PTE_22"/>
149+
</cim:TapChangerControl>
150+
<cim:BaseVoltage rdf:ID="_BV_1">
151+
<cim:IdentifiedObject.name>400 kV</cim:IdentifiedObject.name>
152+
<cim:BaseVoltage.nominalVoltage>400</cim:BaseVoltage.nominalVoltage>
153+
</cim:BaseVoltage>
154+
<cim:BaseVoltage rdf:ID="_BV_2">
155+
<cim:IdentifiedObject.name>100 kV</cim:IdentifiedObject.name>
156+
<cim:BaseVoltage.nominalVoltage>100</cim:BaseVoltage.nominalVoltage>
157+
</cim:BaseVoltage>
158+
</rdf:RDF>

computation-local/src/main/java/com/powsybl/computation/local/ProcessHelper.java

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,46 +17,28 @@
1717
*/
1818
public final class ProcessHelper {
1919

20-
private static final long DEFAULT_FAST_POLLING = 500_000_000; // 0.5 seconds
21-
private static final long BEGINING_NANO = 3_000_000_000L; // 3 seconds
20+
public static final int TIMEOUT_EXIT_CODE = 124;
2221

2322
/**
24-
* It requests for exit code by {@link java.lang.Process#exitValue()} every half second at the begining of 3 seconds.
25-
* Then it will no more request for exit code until 80% of {@code timeoutInSeconds}.
23+
* This method blocks the current thread until either:
24+
* <ul>
25+
* <li>The process terminates, in which case it returns the exit code from {@link Process#exitValue()}</li>
26+
* <li>The timeout is reached, in which case the process is destroyed and the exit code {@value #TIMEOUT_EXIT_CODE} is returned</li>
27+
* </ul>
2628
* @param process The process to run
27-
* @return Returns exit code for the process. Returns 124 if process timeout.
29+
* @return Returns exit code for the process, or {@value #TIMEOUT_EXIT_CODE} if the process timeouts.
2830
* @throws InterruptedException
2931
* @throws IOException
3032
*/
3133
static int runWithTimeout(long timeoutInSeconds, Process process) throws InterruptedException, IOException {
3234
Preconditions.checkArgument(timeoutInSeconds > 0, "negative timeout: %s", timeoutInSeconds);
33-
int exitCode;
34-
long startTimeNano = System.nanoTime();
35-
while (true) {
36-
try {
37-
exitCode = process.exitValue();
38-
closeStream(process);
39-
return exitCode;
40-
} catch (IllegalThreadStateException ex) {
41-
long running = System.nanoTime() - startTimeNano;
42-
if (running > TimeUnit.SECONDS.toNanos(timeoutInSeconds)) {
43-
break;
44-
}
45-
TimeUnit.NANOSECONDS.sleep(smartWait(running, startTimeNano, timeoutInSeconds));
46-
}
35+
if (process.waitFor(timeoutInSeconds, TimeUnit.SECONDS)) {
36+
closeStream(process);
37+
return process.exitValue();
4738
}
4839
process.destroy();
49-
exitCode = 124;
50-
5140
closeStream(process);
52-
return exitCode;
53-
}
54-
55-
private static long smartWait(long running, long startTime, long timeout) {
56-
if (running < BEGINING_NANO || running > 0.8 * TimeUnit.SECONDS.toNanos(timeout)) {
57-
return DEFAULT_FAST_POLLING;
58-
}
59-
return (long) (TimeUnit.SECONDS.toNanos(timeout) * 0.8) - running;
41+
return TIMEOUT_EXIT_CODE;
6042
}
6143

6244
private static void closeStream(Process process) throws IOException {

0 commit comments

Comments
 (0)