This is an automated email from the ASF dual-hosted git repository. sruehl pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
The following commit(s) were added to refs/heads/master by this push: new b01792d adjusted ADS and Modbus to new exception type b01792d is described below commit b01792dddc71ec7925512df0a97291de84baaa17 Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Thu Aug 23 13:11:51 2018 +0200 adjusted ADS and Modbus to new exception type --- .../ads/connection/AdsAbstractPlcConnection.java | 6 ++-- .../apache/plc4x/java/ads/model/AdsAddress.java | 6 ++-- .../plc4x/java/ads/model/SymbolicAdsAddress.java | 6 ++-- .../connection/AdsAbstractPlcConnectionTest.java | 4 +-- .../ads/connection/AdsSerialPlcConnectionTest.java | 14 +++++---- .../ads/connection/AdsTcpPlcConnectionTests.java | 10 ++++--- .../plc4x/java/ads/model/AdsAddressTest.java | 17 +++++------ .../modbus/connection/BaseModbusPlcConnection.java | 5 ++-- .../plc4x/java/modbus/model/CoilModbusAddress.java | 6 ++-- .../model/MaskWriteRegisterModbusAddress.java | 6 ++-- .../model/ReadDiscreteInputsModbusAddress.java | 6 ++-- .../model/ReadHoldingRegistersModbusAddress.java | 6 ++-- .../model/ReadInputRegistersModbusAddress.java | 6 ++-- .../java/modbus/model/RegisterModbusAddress.java | 6 ++-- .../connection/ModbusSerialPlcConnectionTest.java | 14 ++++----- .../connection/ModbusTcpPlcConnectionTests.java | 18 ++++++------ .../java/modbus/netty/Plc4XModbusProtocolTest.java | 33 ++++++++++++++++------ 17 files changed, 97 insertions(+), 72 deletions(-) diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java index 9b394b8..b346a4c 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java @@ -34,6 +34,7 @@ import org.apache.plc4x.java.api.connection.PlcProprietarySender; import org.apache.plc4x.java.api.connection.PlcReader; import org.apache.plc4x.java.api.connection.PlcWriter; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.api.messages.*; import org.apache.plc4x.java.api.messages.items.RequestItem; @@ -94,12 +95,13 @@ public abstract class AdsAbstractPlcConnection extends AbstractPlcConnection imp @Override - public Address parseAddress(String addressString) { + public Address parseAddress(String addressString) throws PlcInvalidAddressException { if (AdsAddress.matches(addressString)) { return AdsAddress.of(addressString); - } else { + } else if (SymbolicAdsAddress.matches(addressString)) { return SymbolicAdsAddress.of(addressString); } + throw new PlcInvalidAddressException(addressString); } @Override diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsAddress.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsAddress.java index 2f6c6a2..905c448 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsAddress.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsAddress.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.ads.model; import org.apache.plc4x.java.ads.api.util.ByteValue; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import org.apache.plc4x.java.api.model.Address; import java.util.Objects; @@ -47,11 +48,10 @@ public class AdsAddress implements Address { return new AdsAddress(indexGroup, indexOffset); } - public static AdsAddress of(String address) { + public static AdsAddress of(String address) throws PlcInvalidAddressException { Matcher matcher = RESOURCE_ADDRESS_PATTERN.matcher(address); if (!matcher.matches()) { - throw new IllegalArgumentException( - "address " + address + " doesn't match '{indexGroup}/{indexOffset}' RAW:" + RESOURCE_ADDRESS_PATTERN); + throw new PlcInvalidAddressException(address, RESOURCE_ADDRESS_PATTERN, "{indexGroup}/{indexOffset}"); } String indexGroupStringHex = matcher.group("indexGroupHex"); diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/SymbolicAdsAddress.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/SymbolicAdsAddress.java index 2bf000c..e997690 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/SymbolicAdsAddress.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/SymbolicAdsAddress.java @@ -18,6 +18,7 @@ */ package org.apache.plc4x.java.ads.model; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import org.apache.plc4x.java.api.model.Address; import java.util.Objects; @@ -36,11 +37,10 @@ public class SymbolicAdsAddress implements Address { this.symbolicAddress = Objects.requireNonNull(symbolicAddress); } - public static SymbolicAdsAddress of(String address) { + public static SymbolicAdsAddress of(String address) throws PlcInvalidAddressException { Matcher matcher = SYMBOLIC_ADDRESS_PATTERN.matcher(address); if (!matcher.matches()) { - throw new IllegalArgumentException( - "address " + address + " doesn't match '{address}' RAW:" + SYMBOLIC_ADDRESS_PATTERN); + throw new PlcInvalidAddressException(address, SYMBOLIC_ADDRESS_PATTERN, "{address}"); } String symbolicAddress = matcher.group("symbolicAddress"); diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java index 1445363..dccbf4c 100644 --- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java @@ -123,7 +123,7 @@ public class AdsAbstractPlcConnectionTest { } @Test - public void parseAddress() { + public void parseAddress() throws Exception { Address address = SUT.parseAddress("0/0"); assertNotNull(address); Address SymbolicAddress = SUT.parseAddress("Main.byByte[0]"); @@ -192,7 +192,7 @@ public class AdsAbstractPlcConnectionTest { } @Test - public void mapAddress() { + public void mapAddress() throws Exception { // positive { when(channel.writeAndFlush(any(PlcRequestContainer.class))).then(invocation -> { diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnectionTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnectionTest.java index 703c205..6555d5a 100644 --- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnectionTest.java +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnectionTest.java @@ -30,10 +30,12 @@ import org.apache.plc4x.java.ads.api.serial.AmsSerialFrame; import org.apache.plc4x.java.ads.api.serial.types.*; import org.apache.plc4x.java.ads.model.AdsAddress; import org.apache.plc4x.java.ads.model.SymbolicAdsAddress; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import org.apache.plc4x.java.api.messages.PlcReadRequest; import org.apache.plc4x.java.api.messages.PlcReadResponse; import org.apache.plc4x.java.base.connection.AbstractPlcConnection; import org.apache.plc4x.java.base.connection.SerialChannelFactory; +import org.hamcrest.Matchers; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -77,13 +79,13 @@ public class AdsSerialPlcConnectionTest { public void emptyParseAddress() { try { SUT.parseAddress(""); - } catch (IllegalArgumentException exception) { - assertTrue("Unexpected exception", exception.getMessage().startsWith("address doesn't match ")); + } catch (PlcInvalidAddressException exception) { + assertThat(exception.getMessage(), Matchers.startsWith(" invalid")); } } @Test - public void parseAddress() { + public void parseAddress() throws Exception { try { AdsAddress address = (AdsAddress) SUT.parseAddress("0/1"); assertEquals(address.getIndexGroup(), 0); @@ -94,7 +96,7 @@ public class AdsSerialPlcConnectionTest { } @Test - public void parseSymbolicAddress() { + public void parseSymbolicAddress() throws Exception { try { SymbolicAdsAddress address = (SymbolicAdsAddress) SUT.parseAddress("Main.variable"); assertEquals(address.getSymbolicAddress(), "Main.variable"); @@ -180,7 +182,7 @@ public class AdsSerialPlcConnectionTest { FragmentNumber.of((byte) 0) ).getByteBuf(); try { - MethodUtils.invokeMethod(byteBuf, true,"setRefCnt", 2); + MethodUtils.invokeMethod(byteBuf, true, "setRefCnt", 2); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } @@ -210,7 +212,7 @@ public class AdsSerialPlcConnectionTest { ) ).getByteBuf(); try { - MethodUtils.invokeMethod(byteBuf, true,"setRefCnt", 2); + MethodUtils.invokeMethod(byteBuf, true, "setRefCnt", 2); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnectionTests.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnectionTests.java index aa56d79..cebfc31 100644 --- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnectionTests.java +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnectionTests.java @@ -29,6 +29,7 @@ import org.apache.plc4x.java.ads.api.generic.types.AmsPort; import org.apache.plc4x.java.ads.model.AdsAddress; import org.apache.plc4x.java.ads.model.SymbolicAdsAddress; import org.apache.plc4x.java.ads.protocol.Plc4x2AdsProtocol; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import org.apache.plc4x.java.api.messages.PlcProprietaryRequest; import org.apache.plc4x.java.api.messages.PlcProprietaryResponse; import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest; @@ -36,6 +37,7 @@ import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse; import org.apache.plc4x.java.api.messages.items.SubscriptionEventItem; import org.apache.plc4x.java.api.messages.items.SubscriptionRequestChangeOfStateItem; import org.apache.plc4x.java.base.messages.PlcRequestContainer; +import org.hamcrest.Matchers; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -93,13 +95,13 @@ public class AdsTcpPlcConnectionTests { public void emptyParseAddress() { try { SUT.parseAddress(""); - } catch (IllegalArgumentException exception) { - assertTrue("Unexpected exception", exception.getMessage().startsWith("address doesn't match ")); + } catch (PlcInvalidAddressException exception) { + assertThat(exception.getMessage(), Matchers.startsWith(" invalid")); } } @Test - public void parseAddress() { + public void parseAddress() throws Exception { try { AdsAddress address = (AdsAddress) SUT.parseAddress("1/1"); assertEquals(address.getIndexGroup(), 1); @@ -110,7 +112,7 @@ public class AdsTcpPlcConnectionTests { } @Test - public void parseSymbolicAddress() { + public void parseSymbolicAddress() throws Exception { try { SymbolicAdsAddress address = (SymbolicAdsAddress) SUT.parseAddress("Main.variable"); assertEquals(address.getSymbolicAddress(), "Main.variable"); diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/model/AdsAddressTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/model/AdsAddressTest.java index f3348da..e92331c 100644 --- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/model/AdsAddressTest.java +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/model/AdsAddressTest.java @@ -18,6 +18,7 @@ */ package org.apache.plc4x.java.ads.model; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import org.junit.Test; import static org.hamcrest.CoreMatchers.is; @@ -26,31 +27,31 @@ import static org.junit.Assert.assertThat; public class AdsAddressTest { @Test - public void of() { + public void of() throws Exception { AdsAddress address = AdsAddress.of("1/10"); assertThat(address.getIndexGroup(), is(1L)); assertThat(address.getIndexOffset(), is(10L)); } @Test - public void ofHex() { + public void ofHex() throws Exception { AdsAddress address = AdsAddress.of("0x1/0xff"); assertThat(address.getIndexGroup(), is(1L)); assertThat(address.getIndexOffset(), is(255L)); } - @Test(expected = IllegalArgumentException.class) - public void stringInAddress() { + @Test(expected = PlcInvalidAddressException.class) + public void stringInAddress() throws Exception { AdsAddress address = AdsAddress.of("group/offset"); } - @Test(expected = IllegalArgumentException.class) - public void singleNumberAddress() { + @Test(expected = PlcInvalidAddressException.class) + public void singleNumberAddress() throws Exception { AdsAddress address = AdsAddress.of("10"); } - @Test(expected = IllegalArgumentException.class) - public void wrongSeperator() { + @Test(expected = PlcInvalidAddressException.class) + public void wrongSeperator() throws Exception { AdsAddress address = AdsAddress.of("1:10"); } diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java index e8a671c..1d59692 100644 --- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java +++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java @@ -22,6 +22,7 @@ import io.netty.channel.ChannelFuture; import org.apache.commons.lang3.StringUtils; import org.apache.plc4x.java.api.connection.PlcReader; import org.apache.plc4x.java.api.connection.PlcWriter; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import org.apache.plc4x.java.api.messages.PlcReadRequest; import org.apache.plc4x.java.api.messages.PlcReadResponse; import org.apache.plc4x.java.api.messages.PlcWriteRequest; @@ -61,7 +62,7 @@ public abstract class BaseModbusPlcConnection extends AbstractPlcConnection impl } @Override - public Address parseAddress(String addressString) { + public Address parseAddress(String addressString) throws PlcInvalidAddressException { if (MaskWriteRegisterModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) { return MaskWriteRegisterModbusAddress.of(addressString); } else if (ReadDiscreteInputsModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) { @@ -75,7 +76,7 @@ public abstract class BaseModbusPlcConnection extends AbstractPlcConnection impl } else if (RegisterModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) { return RegisterModbusAddress.of(addressString); } - return null; + throw new PlcInvalidAddressException(addressString); } @Override diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilModbusAddress.java index bfbd06a..0a71f1d 100644 --- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilModbusAddress.java +++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilModbusAddress.java @@ -18,7 +18,7 @@ */ package org.apache.plc4x.java.modbus.model; -import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -31,10 +31,10 @@ public class CoilModbusAddress extends ModbusAddress { super(address); } - public static CoilModbusAddress of(String addressString) { + public static CoilModbusAddress of(String addressString) throws PlcInvalidAddressException { Matcher matcher = ADDRESS_PATTERN.matcher(addressString); if (!matcher.matches()) { - throw new PlcRuntimeException(addressString + " doesn't match " + ADDRESS_PATTERN); + throw new PlcInvalidAddressException(addressString, ADDRESS_PATTERN); } int address = Integer.parseInt(matcher.group("address")); return new CoilModbusAddress(address); diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MaskWriteRegisterModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MaskWriteRegisterModbusAddress.java index afff67a..87f1587 100644 --- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MaskWriteRegisterModbusAddress.java +++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MaskWriteRegisterModbusAddress.java @@ -18,7 +18,7 @@ */ package org.apache.plc4x.java.modbus.model; -import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import java.util.Objects; import java.util.regex.Matcher; @@ -37,10 +37,10 @@ public class MaskWriteRegisterModbusAddress extends ModbusAddress { this.orMask = orMask; } - public static MaskWriteRegisterModbusAddress of(String addressString) { + public static MaskWriteRegisterModbusAddress of(String addressString) throws PlcInvalidAddressException { Matcher matcher = ADDRESS_PATTERN.matcher(addressString); if (!matcher.matches()) { - throw new PlcRuntimeException(addressString + " doesn't match " + ADDRESS_PATTERN); + throw new PlcInvalidAddressException(addressString, ADDRESS_PATTERN); } int address = Integer.parseInt(matcher.group("address")); int andMask = Integer.parseInt(matcher.group("andMask")); diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusAddress.java index 8e0c17e..0e521b6 100644 --- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusAddress.java +++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusAddress.java @@ -18,7 +18,7 @@ */ package org.apache.plc4x.java.modbus.model; -import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -31,10 +31,10 @@ public class ReadDiscreteInputsModbusAddress extends ModbusAddress { super(address); } - public static ReadDiscreteInputsModbusAddress of(String addressString) { + public static ReadDiscreteInputsModbusAddress of(String addressString) throws PlcInvalidAddressException { Matcher matcher = ADDRESS_PATTERN.matcher(addressString); if (!matcher.matches()) { - throw new PlcRuntimeException(addressString + " doesn't match " + ADDRESS_PATTERN); + throw new PlcInvalidAddressException(addressString, ADDRESS_PATTERN); } int address = Integer.parseInt(matcher.group("address")); return new ReadDiscreteInputsModbusAddress(address); diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusAddress.java index a8dd8f3..5a6c952 100644 --- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusAddress.java +++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusAddress.java @@ -18,7 +18,7 @@ */ package org.apache.plc4x.java.modbus.model; -import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -31,10 +31,10 @@ public class ReadHoldingRegistersModbusAddress extends ModbusAddress { super(address); } - public static ReadHoldingRegistersModbusAddress of(String addressString) { + public static ReadHoldingRegistersModbusAddress of(String addressString) throws PlcInvalidAddressException { Matcher matcher = ADDRESS_PATTERN.matcher(addressString); if (!matcher.matches()) { - throw new PlcRuntimeException(addressString + " doesn't match " + ADDRESS_PATTERN); + throw new PlcInvalidAddressException(addressString, ADDRESS_PATTERN); } int address = Integer.parseInt(matcher.group("address")); return new ReadHoldingRegistersModbusAddress(address); diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusAddress.java index 9f3fe0c..27434e3 100644 --- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusAddress.java +++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusAddress.java @@ -18,7 +18,7 @@ */ package org.apache.plc4x.java.modbus.model; -import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -31,10 +31,10 @@ public class ReadInputRegistersModbusAddress extends ModbusAddress { super(address); } - public static ReadInputRegistersModbusAddress of(String addressString) { + public static ReadInputRegistersModbusAddress of(String addressString) throws PlcInvalidAddressException { Matcher matcher = ADDRESS_PATTERN.matcher(addressString); if (!matcher.matches()) { - throw new PlcRuntimeException(addressString + " doesn't match " + ADDRESS_PATTERN); + throw new PlcInvalidAddressException(addressString, ADDRESS_PATTERN); } int address = Integer.parseInt(matcher.group("address")); return new ReadInputRegistersModbusAddress(address); diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterModbusAddress.java index 290f7de..7aa6c7b 100644 --- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterModbusAddress.java +++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterModbusAddress.java @@ -18,7 +18,7 @@ */ package org.apache.plc4x.java.modbus.model; -import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -32,10 +32,10 @@ public class RegisterModbusAddress extends ModbusAddress { super(address); } - public static RegisterModbusAddress of(String addressString) { + public static RegisterModbusAddress of(String addressString) throws PlcInvalidAddressException { Matcher matcher = ADDRESS_PATTERN.matcher(addressString); if (!matcher.matches()) { - throw new PlcRuntimeException(addressString + " doesn't match " + ADDRESS_PATTERN); + throw new PlcInvalidAddressException(addressString, ADDRESS_PATTERN); } int address = Integer.parseInt(matcher.group("address")); return new RegisterModbusAddress(address); diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java index ce2fe47..8ce248a 100644 --- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java +++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java @@ -65,7 +65,7 @@ public class ModbusSerialPlcConnectionTest { } @Test - public void emptyParseAddress() { + public void emptyParseAddress() throws Exception { try { SUT.parseAddress(""); } catch (IllegalArgumentException exception) { @@ -74,7 +74,7 @@ public class ModbusSerialPlcConnectionTest { } @Test - public void parseCoilModbusAddress() { + public void parseCoilModbusAddress() throws Exception { try { CoilModbusAddress address = (CoilModbusAddress) SUT.parseAddress("0/1"); assertEquals(address.getAddress(), 0); @@ -84,7 +84,7 @@ public class ModbusSerialPlcConnectionTest { } @Test - public void parseMaskWriteRegisterModbusAddress() { + public void parseMaskWriteRegisterModbusAddress() throws Exception { try { MaskWriteRegisterModbusAddress address = (MaskWriteRegisterModbusAddress) SUT.parseAddress("0/1"); assertEquals(address.getAddress(), 0); @@ -94,7 +94,7 @@ public class ModbusSerialPlcConnectionTest { } @Test - public void parseReadDiscreteInputsModbusAddress() { + public void parseReadDiscreteInputsModbusAddress() throws Exception { try { ReadDiscreteInputsModbusAddress address = (ReadDiscreteInputsModbusAddress) SUT.parseAddress("0/1"); assertEquals(address.getAddress(), 0); @@ -104,7 +104,7 @@ public class ModbusSerialPlcConnectionTest { } @Test - public void parseReadHoldingRegistersModbusAddress() { + public void parseReadHoldingRegistersModbusAddress() throws Exception { try { ReadHoldingRegistersModbusAddress address = (ReadHoldingRegistersModbusAddress) SUT.parseAddress("0/1"); assertEquals(address.getAddress(), 0); @@ -114,7 +114,7 @@ public class ModbusSerialPlcConnectionTest { } @Test - public void parseReadInputRegistersModbusAddress() { + public void parseReadInputRegistersModbusAddress() throws Exception { try { ReadInputRegistersModbusAddress address = (ReadInputRegistersModbusAddress) SUT.parseAddress("0/1"); assertEquals(address.getAddress(), 0); @@ -124,7 +124,7 @@ public class ModbusSerialPlcConnectionTest { } @Test - public void parseRegisterAddress() { + public void parseRegisterAddress() throws Exception { try { RegisterModbusAddress address = (RegisterModbusAddress) SUT.parseAddress("0/1"); assertEquals(address.getAddress(), 0); diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnectionTests.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnectionTests.java index 3640e34..3334cfe 100644 --- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnectionTests.java +++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnectionTests.java @@ -21,7 +21,9 @@ package org.apache.plc4x.java.modbus.connection; import io.netty.channel.Channel; import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import org.apache.plc4x.java.modbus.model.*; +import org.hamcrest.Matchers; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -64,13 +66,13 @@ public class ModbusTcpPlcConnectionTests { public void emptyParseAddress() { try { SUT.parseAddress(""); - } catch (IllegalArgumentException exception) { - assertTrue("Unexpected exception", exception.getMessage().startsWith("address doesn't match ")); + } catch (PlcInvalidAddressException exception) { + assertThat(exception.getMessage(), Matchers.startsWith(" invalid")); } } @Test - public void parseCoilModbusAddress() { + public void parseCoilModbusAddress() throws Exception { try { CoilModbusAddress address = (CoilModbusAddress) SUT.parseAddress("coil:0"); assertEquals(address.getAddress(), 0); @@ -80,7 +82,7 @@ public class ModbusTcpPlcConnectionTests { } @Test - public void parseMaskWriteRegisterModbusAddress() { + public void parseMaskWriteRegisterModbusAddress() throws Exception { try { MaskWriteRegisterModbusAddress address = (MaskWriteRegisterModbusAddress) SUT.parseAddress("maskwrite:1/2/3"); assertEquals(address.getAddress(), 1); @@ -92,7 +94,7 @@ public class ModbusTcpPlcConnectionTests { } @Test - public void parseReadDiscreteInputsModbusAddress() { + public void parseReadDiscreteInputsModbusAddress() throws Exception { try { ReadDiscreteInputsModbusAddress address = (ReadDiscreteInputsModbusAddress) SUT.parseAddress("readdiscreteinputs:0"); assertEquals(address.getAddress(), 0); @@ -102,7 +104,7 @@ public class ModbusTcpPlcConnectionTests { } @Test - public void parseReadHoldingRegistersModbusAddress() { + public void parseReadHoldingRegistersModbusAddress() throws Exception { try { ReadHoldingRegistersModbusAddress address = (ReadHoldingRegistersModbusAddress) SUT.parseAddress("readholdingregisters:0"); assertEquals(address.getAddress(), 0); @@ -112,7 +114,7 @@ public class ModbusTcpPlcConnectionTests { } @Test - public void parseReadInputRegistersModbusAddress() { + public void parseReadInputRegistersModbusAddress() throws Exception { try { ReadInputRegistersModbusAddress address = (ReadInputRegistersModbusAddress) SUT.parseAddress("readinputregisters:0"); assertEquals(address.getAddress(), 0); @@ -122,7 +124,7 @@ public class ModbusTcpPlcConnectionTests { } @Test - public void parseRegisterAddress() { + public void parseRegisterAddress() throws Exception { try { RegisterModbusAddress address = (RegisterModbusAddress) SUT.parseAddress("register:0"); assertEquals(address.getAddress(), 0); diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java index dc60d22..867d368 100644 --- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java +++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java @@ -25,6 +25,7 @@ import com.digitalpetri.modbus.responses.*; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.plc4x.java.api.exceptions.PlcInvalidAddressException; import org.apache.plc4x.java.api.messages.PlcReadRequest; import org.apache.plc4x.java.api.messages.PlcRequest; import org.apache.plc4x.java.api.messages.PlcResponse; @@ -110,23 +111,36 @@ public class Plc4XModbusProtocolTest { } }) .map(dataTypePair -> Stream.of( - producePair(dataTypePair.getDataTypeClass(), CoilModbusAddress.of("coil:1"), new ReadCoilsResponse(Unpooled.wrappedBuffer(new byte[]{(byte) 0x1}))), - producePair(CoilModbusAddress.of("coil:1"), new WriteSingleCoilResponse(1, 1), mapDataTypePairForCoil(dataTypePair).getValue()), + producePair(dataTypePair.getDataTypeClass(), st(() -> CoilModbusAddress.of("coil:1")), new ReadCoilsResponse(Unpooled.wrappedBuffer(new byte[]{(byte) 0x1}))), + producePair(st(() -> CoilModbusAddress.of("coil:1")), new WriteSingleCoilResponse(1, 1), mapDataTypePairForCoil(dataTypePair).getValue()), /* Read request no supported on maskwrite so how to handle? producePair(pair.getDataTypeClass(), MaskWriteRegisterModbusAddress.of("maskwrite:1/1/2"), new MaskWriteRegisterResponse(1, 1, 2)), */ - producePair(MaskWriteRegisterModbusAddress.of("maskwrite:1/1/2"), new MaskWriteRegisterResponse(1, 1, 2), mapDataTypePairForRegister(dataTypePair).getValue()), - producePair(dataTypePair.getDataTypeClass(), ReadDiscreteInputsModbusAddress.of("readdiscreteinputs:1"), new ReadDiscreteInputsResponse(Unpooled.wrappedBuffer(new byte[]{(byte) 0x01}))), - producePair(dataTypePair.getDataTypeClass(), ReadHoldingRegistersModbusAddress.of("readholdingregisters:1"), new ReadHoldingRegistersResponse(Unpooled.wrappedBuffer(cutRegister(mapDataTypePairForRegister(dataTypePair).getByteRepresentation())))), - producePair(dataTypePair.getDataTypeClass(), ReadInputRegistersModbusAddress.of("readinputregisters:1"), new ReadInputRegistersResponse(Unpooled.wrappedBuffer(cutRegister(mapDataTypePairForRegister(dataTypePair).getByteRepresentation())))), - producePair(CoilModbusAddress.of("coil:1"), new WriteMultipleCoilsResponse(1, 3), mapDataTypePairForCoil(dataTypePair).getValue(), mapDataTypePairForCoil(dataTypePair).getValue(), mapDataTypePairForCoil(dataTypePair).getValue()), - producePair(RegisterModbusAddress.of("register:1"), new WriteMultipleRegistersResponse(1, 3), mapDataTypePairForRegister(dataTypePair).getValue(), mapDataTypePairForRegister(dataTypePair).getValue(), mapDataTypePairForRegister(dataTypePair).getValue()), - producePair(RegisterModbusAddress.of("register:1"), new WriteSingleRegisterResponse(1, cutRegister(mapDataTypePairForRegister(dataTypePair).getByteRepresentation())[0]), mapDataTypePairForRegister(dataTypePair).getValue()) + producePair(st(() -> MaskWriteRegisterModbusAddress.of("maskwrite:1/1/2")), new MaskWriteRegisterResponse(1, 1, 2), mapDataTypePairForRegister(dataTypePair).getValue()), + producePair(dataTypePair.getDataTypeClass(), st(() -> ReadDiscreteInputsModbusAddress.of("readdiscreteinputs:1")), new ReadDiscreteInputsResponse(Unpooled.wrappedBuffer(new byte[]{(byte) 0x01}))), + producePair(dataTypePair.getDataTypeClass(), st(() -> ReadHoldingRegistersModbusAddress.of("readholdingregisters:1")), new ReadHoldingRegistersResponse(Unpooled.wrappedBuffer(cutRegister(mapDataTypePairForRegister(dataTypePair).getByteRepresentation())))), + producePair(dataTypePair.getDataTypeClass(), st(() -> ReadInputRegistersModbusAddress.of("readinputregisters:1")), new ReadInputRegistersResponse(Unpooled.wrappedBuffer(cutRegister(mapDataTypePairForRegister(dataTypePair).getByteRepresentation())))), + producePair(st(() -> CoilModbusAddress.of("coil:1")), new WriteMultipleCoilsResponse(1, 3), mapDataTypePairForCoil(dataTypePair).getValue(), mapDataTypePairForCoil(dataTypePair).getValue(), mapDataTypePairForCoil(dataTypePair).getValue()), + producePair(st(() -> RegisterModbusAddress.of("register:1")), new WriteMultipleRegistersResponse(1, 3), mapDataTypePairForRegister(dataTypePair).getValue(), mapDataTypePairForRegister(dataTypePair).getValue(), mapDataTypePairForRegister(dataTypePair).getValue()), + producePair(st(() -> RegisterModbusAddress.of("register:1")), new WriteSingleRegisterResponse(1, cutRegister(mapDataTypePairForRegister(dataTypePair).getByteRepresentation())[0]), mapDataTypePairForRegister(dataTypePair).getValue()) )) .flatMap(stream -> stream) .map(pair -> new Object[]{pair.left.getRequest().getRequestItem().orElseThrow(IllegalStateException::new).getDatatype().getSimpleName(), pair.left, pair.left.getResponseFuture(), pair.left.getRequest().getClass().getSimpleName(), pair.right, pair.right.getModbusPdu().getClass().getSimpleName()}).collect(Collectors.toList()); } + @FunctionalInterface + public interface AddressSupplier<T> { + T getAddress() throws PlcInvalidAddressException; + } + + public static <T> T st(AddressSupplier<T> supplier) { + try { + return supplier.getAddress(); + } catch (PlcInvalidAddressException e) { + throw new RuntimeException(e); + } + } + private static ImmutablePair<PlcRequestContainer<PlcReadRequest, PlcResponse>, ModbusTcpPayload> producePair(Class type, Address address, ModbusPdu modbusPdu) { return ImmutablePair.of( new PlcRequestContainer<>( @@ -167,6 +181,7 @@ public class Plc4XModbusProtocolTest { private static byte[] cutRegister(byte[] right) { return new byte[]{right.length > 1 ? right[right.length - 2] : 0x0, right[right.length - 1]}; } + @Before public void setUp() { SUT = new Plc4XModbusProtocol();