Skip to content

Commit ec5632d

Browse files
authored
Merge pull request #1707 from OSGP/feature/SMHE-2342_Sign_off2_Job_Clear_Alarm_Register_alleen_bij_alarm
SMHE-2342 Job Clear Alarm Register overschrijft Alarm Registers allee…
2 parents 03fef52 + 0f436a7 commit ec5632d

File tree

2 files changed

+136
-65
lines changed

2 files changed

+136
-65
lines changed

osgp/protocol-adapter-dlms/osgp-protocol-adapter-dlms/src/main/java/org/opensmartgridplatform/adapter/protocol/dlms/domain/commands/alarm/ClearAlarmRegisterCommandExecutor.java

Lines changed: 63 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
package org.opensmartgridplatform.adapter.protocol.dlms.domain.commands.alarm;
66

77
import java.io.IOException;
8+
import java.util.List;
89
import java.util.Optional;
910
import lombok.extern.slf4j.Slf4j;
1011
import org.openmuc.jdlms.AccessResultCode;
1112
import org.openmuc.jdlms.AttributeAddress;
13+
import org.openmuc.jdlms.GetResult;
1214
import org.openmuc.jdlms.SetParameter;
1315
import org.openmuc.jdlms.datatypes.DataObject;
1416
import org.opensmartgridplatform.adapter.protocol.dlms.domain.commands.AbstractCommandExecutor;
@@ -31,9 +33,13 @@
3133
public class ClearAlarmRegisterCommandExecutor
3234
extends AbstractCommandExecutor<ClearAlarmRegisterRequestDto, AccessResultCode> {
3335

34-
final ObjectConfigServiceHelper objectConfigServiceHelper;
35-
36-
private static final int ALARM_CODE = 0;
36+
private final ObjectConfigServiceHelper objectConfigServiceHelper;
37+
private static final int ALARM_CODE_NO_ALARM = 0;
38+
private static final List<DlmsObjectType> ALARM_REGISTERS =
39+
List.of(
40+
DlmsObjectType.ALARM_REGISTER_1,
41+
DlmsObjectType.ALARM_REGISTER_2,
42+
DlmsObjectType.ALARM_REGISTER_3);
3743

3844
public ClearAlarmRegisterCommandExecutor(
3945
final ObjectConfigServiceHelper objectConfigServiceHelper) {
@@ -44,18 +50,14 @@ public ClearAlarmRegisterCommandExecutor(
4450
@Override
4551
public ActionResponseDto asBundleResponse(final AccessResultCode executionResult)
4652
throws ProtocolAdapterException {
47-
4853
this.checkAccessResultCode(executionResult);
49-
5054
return new ActionResponseDto("Clear alarm register was successful");
5155
}
5256

5357
@Override
5458
public ClearAlarmRegisterRequestDto fromBundleRequestInput(final ActionRequestDto bundleInput)
5559
throws ProtocolAdapterException {
56-
5760
this.checkActionRequestType(bundleInput);
58-
5961
return (ClearAlarmRegisterRequestDto) bundleInput;
6062
}
6163

@@ -67,71 +69,66 @@ public AccessResultCode execute(
6769
final MessageMetadata messageMetadata)
6870
throws ProtocolAdapterException {
6971

70-
// Clear alarm 1
71-
final Optional<AccessResultCode> optionalResultCodeAlarm1 =
72-
this.clearAlarmRegister(conn, device, DlmsObjectType.ALARM_REGISTER_1);
73-
if (optionalResultCodeAlarm1.isEmpty()) {
74-
throw new ProtocolAdapterException("Unable to find alarm register 1.");
75-
}
76-
final AccessResultCode resultCodeAlarmRegister1 = optionalResultCodeAlarm1.get();
77-
if (resultCodeAlarmRegister1 != AccessResultCode.SUCCESS) {
78-
return resultCodeAlarmRegister1;
79-
}
72+
AccessResultCode previousResult = null;
73+
for (final DlmsObjectType alarmType : ALARM_REGISTERS) {
74+
final Optional<AccessResultCode> result =
75+
this.clearSingleAlarmRegister(conn, device, alarmType);
8076

81-
// Clear alarm 2
82-
final Optional<AccessResultCode> optionalResultCodeAlarm2 =
83-
this.clearAlarmRegister(conn, device, DlmsObjectType.ALARM_REGISTER_2);
84-
if (optionalResultCodeAlarm2.isEmpty()) {
85-
return resultCodeAlarmRegister1;
86-
}
87-
final AccessResultCode resultCodeAlarmRegister2 = optionalResultCodeAlarm2.get();
88-
if (resultCodeAlarmRegister2 != AccessResultCode.SUCCESS) {
89-
return resultCodeAlarmRegister2;
77+
if (result.isEmpty()) {
78+
if (alarmType == DlmsObjectType.ALARM_REGISTER_1) {
79+
throw new ProtocolAdapterException("Unable to find alarm register 1.");
80+
}
81+
return previousResult;
82+
}
83+
previousResult = result.get();
84+
if (result.get() != AccessResultCode.SUCCESS) {
85+
return result.get();
86+
}
9087
}
91-
92-
// Clear alarm 3
93-
final Optional<AccessResultCode> optionalResultCodeAlarm3 =
94-
this.clearAlarmRegister(conn, device, DlmsObjectType.ALARM_REGISTER_3);
95-
return optionalResultCodeAlarm3.orElse(resultCodeAlarmRegister2);
88+
return AccessResultCode.SUCCESS;
9689
}
9790

98-
private Optional<AccessResultCode> clearAlarmRegister(
99-
final DlmsConnectionManager conn, final DlmsDevice device, final DlmsObjectType objectType)
91+
private Optional<AccessResultCode> clearSingleAlarmRegister(
92+
final DlmsConnectionManager conn, final DlmsDevice device, final DlmsObjectType alarmType)
10093
throws ProtocolAdapterException {
101-
log.debug("clearAlarmRegister {}", objectType);
94+
10295
final Optional<AttributeAddress> optAlarmRegisterAttributeAddress =
10396
this.objectConfigServiceHelper.findOptionalDefaultAttributeAddress(
104-
Protocol.forDevice(device), objectType);
97+
Protocol.forDevice(device), alarmType);
10598

10699
if (optAlarmRegisterAttributeAddress.isEmpty()) {
107100
return Optional.empty();
101+
}
102+
103+
if (!this.alarmIsPresent(conn, optAlarmRegisterAttributeAddress.get())) {
104+
return Optional.of(AccessResultCode.SUCCESS);
105+
}
106+
107+
final AccessResultCode result =
108+
this.executeClearForAlarmRegister(conn, optAlarmRegisterAttributeAddress.get());
109+
110+
if (result != null) {
111+
return Optional.of(result);
108112
} else {
109-
final AccessResultCode resultCodeAlarmRegister =
110-
this.executeForAlarmRegister(conn, optAlarmRegisterAttributeAddress.get());
111-
112-
if (resultCodeAlarmRegister != null) {
113-
return Optional.of(resultCodeAlarmRegister);
114-
} else {
115-
throw new ProtocolAdapterException(
116-
"Error occurred for clear alarm register: ." + objectType.name());
117-
}
113+
throw new ProtocolAdapterException(
114+
"Error occurred for clear alarm register: " + alarmType.name());
118115
}
119116
}
120117

121-
public AccessResultCode executeForAlarmRegister(
118+
private AccessResultCode executeClearForAlarmRegister(
122119
final DlmsConnectionManager conn, final AttributeAddress alarmRegisterAttributeAddress) {
123120

124121
log.info(
125122
"Clear alarm register {}",
126123
JdlmsObjectToStringUtil.describeAttributes(alarmRegisterAttributeAddress));
127124

128-
final DataObject data = DataObject.newUInteger32Data(ALARM_CODE);
125+
final DataObject data = DataObject.newUInteger32Data(ALARM_CODE_NO_ALARM);
129126
final SetParameter setParameter = new SetParameter(alarmRegisterAttributeAddress, data);
130127

131128
conn.getDlmsMessageListener()
132129
.setDescription(
133130
"ClearAlarmRegister, with alarm code = "
134-
+ ALARM_CODE
131+
+ ALARM_CODE_NO_ALARM
135132
+ JdlmsObjectToStringUtil.describeAttributes(alarmRegisterAttributeAddress));
136133

137134
try {
@@ -140,4 +137,23 @@ public AccessResultCode executeForAlarmRegister(
140137
throw new ConnectionException(e);
141138
}
142139
}
140+
141+
private boolean alarmIsPresent(
142+
final DlmsConnectionManager conn, final AttributeAddress alarmRegisterAttributeAddress) {
143+
144+
conn.getDlmsMessageListener()
145+
.setDescription(
146+
"ReadAlarmRegister, retrieve attribute: "
147+
+ JdlmsObjectToStringUtil.describeAttributes(alarmRegisterAttributeAddress));
148+
149+
try {
150+
final GetResult getResult = conn.getConnection().get(alarmRegisterAttributeAddress);
151+
return getResult != null
152+
&& getResult.getResultCode() == AccessResultCode.SUCCESS
153+
&& ((Number) getResult.getResultData().getValue()).intValue() != ALARM_CODE_NO_ALARM;
154+
155+
} catch (final IOException e) {
156+
throw new ConnectionException(e);
157+
}
158+
}
143159
}

osgp/protocol-adapter-dlms/osgp-protocol-adapter-dlms/src/test/java/org/opensmartgridplatform/adapter/protocol/dlms/domain/commands/alarm/ClearAlarmRegisterCommandExecutorTest.java

Lines changed: 73 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
import org.junit.jupiter.api.BeforeEach;
1515
import org.junit.jupiter.api.Test;
1616
import org.junit.jupiter.api.extension.ExtendWith;
17+
import org.junit.jupiter.params.ParameterizedTest;
18+
import org.junit.jupiter.params.provider.EnumSource;
19+
import org.junit.jupiter.params.provider.EnumSource.Mode;
1720
import org.mockito.ArgumentCaptor;
1821
import org.mockito.Captor;
1922
import org.mockito.Mock;
@@ -22,8 +25,10 @@
2225
import org.openmuc.jdlms.AccessResultCode;
2326
import org.openmuc.jdlms.AttributeAddress;
2427
import org.openmuc.jdlms.DlmsConnection;
28+
import org.openmuc.jdlms.GetResult;
2529
import org.openmuc.jdlms.ObisCode;
2630
import org.openmuc.jdlms.SetParameter;
31+
import org.openmuc.jdlms.datatypes.DataObject;
2732
import org.opensmartgridplatform.adapter.protocol.dlms.domain.commands.utils.ObjectConfigServiceHelper;
2833
import org.opensmartgridplatform.adapter.protocol.dlms.domain.entities.DlmsDevice;
2934
import org.opensmartgridplatform.adapter.protocol.dlms.domain.entities.Protocol;
@@ -61,6 +66,8 @@ class ClearAlarmRegisterCommandExecutorTest {
6166

6267
@Mock private MessageMetadata messageMetadata;
6368

69+
@Mock private GetResult getResult;
70+
6471
@Captor private ArgumentCaptor<SetParameter> setParameterArgumentCaptor;
6572

6673
private ClearAlarmRegisterCommandExecutor executor;
@@ -111,7 +118,7 @@ void shouldExecuteForProtocolSmr55() throws ProtocolAdapterException, IOExceptio
111118
}
112119

113120
@Test
114-
void connectionProblemAlarmRegister1() throws IOException, ProtocolAdapterException {
121+
void connectionProblemAlarmRegister1() throws IOException {
115122
when(this.dlmsConnection.set(this.setParameterArgumentCaptor.capture()))
116123
.thenThrow(new IOException());
117124

@@ -126,7 +133,7 @@ void connectionProblemAlarmRegister1() throws IOException, ProtocolAdapterExcept
126133
}
127134

128135
@Test
129-
void nullResultAlarmRegister1() throws IOException, ProtocolAdapterException {
136+
void nullResultAlarmRegister1() throws IOException {
130137
when(this.dlmsConnection.set(this.setParameterArgumentCaptor.capture())).thenReturn(null);
131138

132139
final DlmsDevice dlmsDevice = new DlmsDevice("SMR 5.2 device");
@@ -140,7 +147,7 @@ void nullResultAlarmRegister1() throws IOException, ProtocolAdapterException {
140147
}
141148

142149
@Test
143-
void connectionProblemAlarmRegister2() throws IOException, ProtocolAdapterException {
150+
void connectionProblemAlarmRegister2() throws IOException {
144151
when(this.dlmsConnection.set(any(SetParameter.class)))
145152
.thenReturn(AccessResultCode.SUCCESS)
146153
.thenThrow(new IOException());
@@ -156,7 +163,7 @@ void connectionProblemAlarmRegister2() throws IOException, ProtocolAdapterExcept
156163
}
157164

158165
@Test
159-
void nullResultAlarmRegister2() throws IOException, ProtocolAdapterException {
166+
void successRegister1AndNullResultAlarmRegister2() throws IOException {
160167
when(this.dlmsConnection.set(this.setParameterArgumentCaptor.capture()))
161168
.thenReturn(AccessResultCode.SUCCESS)
162169
.thenReturn(null);
@@ -211,7 +218,7 @@ void resultAlarmRegister2() throws ProtocolAdapterException, IOException {
211218
}
212219

213220
@Test
214-
void connectionProblemAlarmRegister3() throws IOException, ProtocolAdapterException {
221+
void connectionProblemAlarmRegister3() throws IOException {
215222
when(this.dlmsConnection.set(any(SetParameter.class)))
216223
.thenReturn(AccessResultCode.SUCCESS)
217224
.thenReturn(AccessResultCode.SUCCESS)
@@ -228,7 +235,7 @@ void connectionProblemAlarmRegister3() throws IOException, ProtocolAdapterExcept
228235
}
229236

230237
@Test
231-
void nullResultAlarmRegister3() throws IOException, ProtocolAdapterException {
238+
void successRegister1And2AndNullResultAlarmRegister3() throws IOException {
232239
when(this.dlmsConnection.set(this.setParameterArgumentCaptor.capture()))
233240
.thenReturn(AccessResultCode.SUCCESS)
234241
.thenReturn(AccessResultCode.SUCCESS)
@@ -286,16 +293,33 @@ void resultAlarmRegister3() throws ProtocolAdapterException, IOException {
286293
assertThat(accessResultCode).isEqualTo(AccessResultCode.SUCCESS);
287294
}
288295

289-
void setupAlarmRegister1(final DlmsDevice dlmsDevice) throws ProtocolAdapterException {
296+
@ParameterizedTest
297+
@EnumSource(
298+
value = DlmsObjectType.class,
299+
names = {"ALARM_REGISTER_1", "ALARM_REGISTER_2", "ALARM_REGISTER_3"},
300+
mode = Mode.INCLUDE)
301+
void noAlarmPresentInRegister(final DlmsObjectType alarmType)
302+
throws IOException, ProtocolAdapterException {
303+
final DlmsDevice dlmsDevice = new DlmsDevice("SMR 5.2 device");
304+
this.setupAlarmRegisterWithNoAlarmPresent(dlmsDevice, alarmType);
305+
final AccessResultCode accessResultCode =
306+
this.executor.execute(this.connectionManager, dlmsDevice, this.dto, this.messageMetadata);
307+
assertThat(accessResultCode).isEqualTo(AccessResultCode.SUCCESS);
308+
}
309+
310+
void setupAlarmRegister1(final DlmsDevice dlmsDevice) throws IOException {
290311

291312
this.mockAlarmCosemObject(
292313
dlmsDevice, OBIS_CODE_ALARM_REGISTER_1, DlmsObjectType.ALARM_REGISTER_1.name());
293314

294315
when(this.connectionManager.getDlmsMessageListener()).thenReturn(this.dlmsMessageListener);
295316
when(this.connectionManager.getConnection()).thenReturn(this.dlmsConnection);
317+
when(this.dlmsConnection.get(any(AttributeAddress.class))).thenReturn(this.getResult);
318+
when(this.getResult.getResultCode()).thenReturn(AccessResultCode.SUCCESS);
319+
when(this.getResult.getResultData()).thenReturn(DataObject.newUInteger32Data(1L));
296320
}
297321

298-
void setupAlarmRegister2(final DlmsDevice dlmsDevice) throws ProtocolAdapterException {
322+
void setupAlarmRegister2(final DlmsDevice dlmsDevice) throws IOException {
299323

300324
this.mockAlarmCosemObject(
301325
dlmsDevice, OBIS_CODE_ALARM_REGISTER_1, DlmsObjectType.ALARM_REGISTER_1.name());
@@ -304,6 +328,9 @@ void setupAlarmRegister2(final DlmsDevice dlmsDevice) throws ProtocolAdapterExce
304328

305329
when(this.connectionManager.getDlmsMessageListener()).thenReturn(this.dlmsMessageListener);
306330
when(this.connectionManager.getConnection()).thenReturn(this.dlmsConnection);
331+
when(this.dlmsConnection.get(any(AttributeAddress.class))).thenReturn(this.getResult);
332+
when(this.getResult.getResultCode()).thenReturn(AccessResultCode.SUCCESS);
333+
when(this.getResult.getResultData()).thenReturn(DataObject.newUInteger32Data(1L));
307334
}
308335

309336
private void mockAlarmCosemObject(
@@ -321,24 +348,43 @@ private void mockAlarmCosemObject(
321348
.thenReturn(Optional.of(attributeAddress));
322349
}
323350

324-
void setupAlarmRegister3(final DlmsDevice dlmsDevice) throws ProtocolAdapterException {
351+
void setupAlarmRegister3(final DlmsDevice dlmsDevice) throws IOException {
325352
dlmsDevice.setProtocol("SMR", "5.5");
326353

327354
this.mockAlarmCosemObject(
328-
dlmsDevice,
329-
OBIS_CODE_ALARM_REGISTER_1,
330-
org.opensmartgridplatform.dlms.objectconfig.DlmsObjectType.ALARM_REGISTER_1.name());
355+
dlmsDevice, OBIS_CODE_ALARM_REGISTER_1, DlmsObjectType.ALARM_REGISTER_1.name());
356+
this.mockAlarmCosemObject(
357+
dlmsDevice, OBIS_CODE_ALARM_REGISTER_2, DlmsObjectType.ALARM_REGISTER_2.name());
331358
this.mockAlarmCosemObject(
332-
dlmsDevice,
333-
OBIS_CODE_ALARM_REGISTER_2,
334-
org.opensmartgridplatform.dlms.objectconfig.DlmsObjectType.ALARM_REGISTER_2.name());
359+
dlmsDevice, OBIS_CODE_ALARM_REGISTER_3, DlmsObjectType.ALARM_REGISTER_3.name());
360+
361+
when(this.connectionManager.getDlmsMessageListener()).thenReturn(this.dlmsMessageListener);
362+
when(this.connectionManager.getConnection()).thenReturn(this.dlmsConnection);
363+
when(this.dlmsConnection.get(any(AttributeAddress.class))).thenReturn(this.getResult);
364+
when(this.getResult.getResultCode()).thenReturn(AccessResultCode.SUCCESS);
365+
when(this.getResult.getResultData()).thenReturn(DataObject.newUInteger32Data(1L));
366+
}
367+
368+
void setupAlarmRegisterWithNoAlarmPresent(
369+
final DlmsDevice dlmsDevice, final DlmsObjectType alarmType) throws IOException {
370+
335371
this.mockAlarmCosemObject(
336-
dlmsDevice,
337-
OBIS_CODE_ALARM_REGISTER_3,
338-
org.opensmartgridplatform.dlms.objectconfig.DlmsObjectType.ALARM_REGISTER_3.name());
372+
dlmsDevice, OBIS_CODE_ALARM_REGISTER_1, DlmsObjectType.ALARM_REGISTER_1.name());
373+
if (alarmType == DlmsObjectType.ALARM_REGISTER_2
374+
|| alarmType == DlmsObjectType.ALARM_REGISTER_3) {
375+
this.mockAlarmCosemObject(
376+
dlmsDevice, OBIS_CODE_ALARM_REGISTER_2, DlmsObjectType.ALARM_REGISTER_2.name());
377+
}
378+
if (alarmType == DlmsObjectType.ALARM_REGISTER_3) {
379+
this.mockAlarmCosemObject(
380+
dlmsDevice, OBIS_CODE_ALARM_REGISTER_3, DlmsObjectType.ALARM_REGISTER_3.name());
381+
}
339382

340383
when(this.connectionManager.getDlmsMessageListener()).thenReturn(this.dlmsMessageListener);
341384
when(this.connectionManager.getConnection()).thenReturn(this.dlmsConnection);
385+
when(this.dlmsConnection.get(any(AttributeAddress.class))).thenReturn(this.getResult);
386+
when(this.getResult.getResultCode()).thenReturn(AccessResultCode.SUCCESS);
387+
when(this.getResult.getResultData()).thenReturn(DataObject.newUInteger32Data(0L));
342388
}
343389

344390
void assertForOneRegister(final String protocol, final String protocolVersion)
@@ -353,6 +399,9 @@ void assertForOneRegister(final String protocol, final String protocolVersion)
353399
when(this.connectionManager.getConnection()).thenReturn(this.dlmsConnection);
354400
when(this.dlmsConnection.set(this.setParameterArgumentCaptor.capture()))
355401
.thenReturn(AccessResultCode.SUCCESS);
402+
when(this.dlmsConnection.get(any(AttributeAddress.class))).thenReturn(this.getResult);
403+
when(this.getResult.getResultCode()).thenReturn(AccessResultCode.SUCCESS);
404+
when(this.getResult.getResultData()).thenReturn(DataObject.newUInteger32Data(1L));
356405

357406
this.executor.execute(this.connectionManager, dlmsDevice, this.dto, this.messageMetadata);
358407

@@ -380,6 +429,9 @@ void assertForTwoRegisters(final String protocol, final String protocolVersion)
380429
when(this.connectionManager.getConnection()).thenReturn(this.dlmsConnection);
381430
when(this.dlmsConnection.set(this.setParameterArgumentCaptor.capture()))
382431
.thenReturn(AccessResultCode.SUCCESS);
432+
when(this.dlmsConnection.get(any(AttributeAddress.class))).thenReturn(this.getResult);
433+
when(this.getResult.getResultCode()).thenReturn(AccessResultCode.SUCCESS);
434+
when(this.getResult.getResultData()).thenReturn(DataObject.newUInteger32Data(1L));
383435

384436
this.executor.execute(this.connectionManager, dlmsDevice, this.dto, this.messageMetadata);
385437

@@ -417,6 +469,9 @@ void assertForThreeRegisters(final String protocol, final String protocolVersion
417469
when(this.connectionManager.getConnection()).thenReturn(this.dlmsConnection);
418470
when(this.dlmsConnection.set(this.setParameterArgumentCaptor.capture()))
419471
.thenReturn(AccessResultCode.SUCCESS);
472+
when(this.dlmsConnection.get(any(AttributeAddress.class))).thenReturn(this.getResult);
473+
when(this.getResult.getResultCode()).thenReturn(AccessResultCode.SUCCESS);
474+
when(this.getResult.getResultData()).thenReturn(DataObject.newUInteger32Data(1L));
420475

421476
this.executor.execute(this.connectionManager, dlmsDevice, this.dto, this.messageMetadata);
422477

0 commit comments

Comments
 (0)