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 2421de1 added AdsConnectionFactory + added some tests for serialPlcConnection 2421de1 is described below commit 2421de1c341a7388e1546c1d0df00d668f52aef0 Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Thu Mar 8 17:22:10 2018 +0100 added AdsConnectionFactory + added some tests for serialPlcConnection --- .../org/apache/plc4x/java/ads/AdsPlcDriver.java | 33 ++++------- .../java/ads/connection/AdsConnectionFactory.java | 51 ++++++++++++++++ .../ads/connection/AdsSerialPlcConnection.java | 12 +++- .../java/ads/connection/AdsTcpPlcConnection.java | 24 ++++++-- .../apache/plc4x/java/ads/AdsPlcDriverTest.java | 22 +++++++ .../ads/connection/AdsSerialPlcConnectionTest.java | 69 ++++++++++++++++++++++ .../ads/connection/AdsTcpPlcConnectionTests.java | 2 +- 7 files changed, 186 insertions(+), 27 deletions(-) diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java index bab0506..24f23d6 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java @@ -21,8 +21,7 @@ package org.apache.plc4x.java.ads; import org.apache.commons.lang3.StringUtils; import org.apache.plc4x.java.ads.api.generic.types.AmsNetId; import org.apache.plc4x.java.ads.api.generic.types.AmsPort; -import org.apache.plc4x.java.ads.connection.AdsSerialPlcConnection; -import org.apache.plc4x.java.ads.connection.AdsTcpPlcConnection; +import org.apache.plc4x.java.ads.connection.AdsConnectionFactory; import org.apache.plc4x.java.api.PlcDriver; import org.apache.plc4x.java.api.authentication.PlcAuthentication; import org.apache.plc4x.java.api.connection.PlcConnection; @@ -49,6 +48,16 @@ public class AdsPlcDriver implements PlcDriver { public static final Pattern SERIAL_PATTERN = Pattern.compile("(?<serialDefinition>serial:.*)"); public static final Pattern ADS_URI_PATTERN = Pattern.compile("^ads:/?/?(" + INET_ADDRESS_PATTERN + "|" + SERIAL_PATTERN + ")/" + ADS_ADDRESS_PATTERN); + private AdsConnectionFactory adsConnectionFactory; + + public AdsPlcDriver() { + this.adsConnectionFactory = new AdsConnectionFactory(); + } + + public AdsPlcDriver(AdsConnectionFactory adsConnectionFactory) { + this.adsConnectionFactory = adsConnectionFactory; + } + @Override public String getProtocolCode() { return "ads"; @@ -79,26 +88,10 @@ public class AdsPlcDriver implements PlcDriver { if (serialDefinition != null) { String serialPort = serialDefinition.substring(serialDefinition.indexOf(':')); - if (sourceAmsNetId == null || sourceAmsPort == null) { - return new AdsSerialPlcConnection(serialPort, targetAmsNetId, targetAmsPort); - } else { - return new AdsSerialPlcConnection(serialPort, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); - } + return adsConnectionFactory.adsSerialPlcConnectionOf(serialPort, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); } else { try { - if (sourceAmsNetId == null || sourceAmsPort == null) { - if (port == null) { - return new AdsTcpPlcConnection(InetAddress.getByName(host), targetAmsNetId, targetAmsPort); - } else { - return new AdsTcpPlcConnection(InetAddress.getByName(host), port, targetAmsNetId, targetAmsPort); - } - } else { - if (port == null) { - return new AdsTcpPlcConnection(InetAddress.getByName(host), targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); - } else { - return new AdsTcpPlcConnection(InetAddress.getByName(host), port, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); - } - } + return adsConnectionFactory.adsTcpPlcConnectionOf(InetAddress.getByName(host), port, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); } catch (UnknownHostException e) { throw new PlcConnectionException(e); } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactory.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactory.java new file mode 100644 index 0000000..c383529 --- /dev/null +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactory.java @@ -0,0 +1,51 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.plc4x.java.ads.connection; + +import org.apache.plc4x.java.ads.api.generic.types.AmsNetId; +import org.apache.plc4x.java.ads.api.generic.types.AmsPort; + +import java.net.InetAddress; + +public class AdsConnectionFactory { + + public AdsTcpPlcConnection adsTcpPlcConnectionOf(InetAddress address, Integer port, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { + if (sourceAmsNetId == null || sourceAmsPort == null) { + if (port == null) { + return AdsTcpPlcConnection.of(address, targetAmsNetId, targetAmsPort); + } else { + return AdsTcpPlcConnection.of(address, port, targetAmsNetId, targetAmsPort); + } + } else { + if (port == null) { + return AdsTcpPlcConnection.of(address, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); + } else { + return AdsTcpPlcConnection.of(address, port, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); + } + } + } + + public AdsSerialPlcConnection adsSerialPlcConnectionOf(String serialPort, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { + if (sourceAmsNetId == null || sourceAmsPort == null) { + return AdsSerialPlcConnection.of(serialPort, targetAmsNetId, targetAmsPort); + } else { + return AdsSerialPlcConnection.of(serialPort, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); + } + } +} diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnection.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnection.java index 13d14e2..1786e1a 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnection.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnection.java @@ -32,14 +32,22 @@ import java.util.concurrent.CompletableFuture; public class AdsSerialPlcConnection extends AdsAbstractPlcConnection { - public AdsSerialPlcConnection(String serialPort, AmsNetId targetAmsNetId, AmsPort targetAmsPort) { + private AdsSerialPlcConnection(String serialPort, AmsNetId targetAmsNetId, AmsPort targetAmsPort) { this(serialPort, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort()); } - public AdsSerialPlcConnection(String serialPort, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { + private AdsSerialPlcConnection(String serialPort, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { super(new SerialChannelFactory(serialPort), targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); } + public static AdsSerialPlcConnection of(String serialPort, AmsNetId targetAmsNetId, AmsPort targetAmsPort) { + return new AdsSerialPlcConnection(serialPort, targetAmsNetId, targetAmsPort); + } + + public static AdsSerialPlcConnection of(String serialPort, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { + return new AdsSerialPlcConnection(serialPort, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); + } + @Override protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) { return new ChannelInitializer() { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnection.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnection.java index 47a9f10..ad502c3 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnection.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnection.java @@ -35,22 +35,38 @@ public class AdsTcpPlcConnection extends AdsAbstractPlcConnection { private static final int TCP_PORT = 48898; - public AdsTcpPlcConnection(InetAddress address, AmsNetId targetAmsNetId, AmsPort targetAmsPort) { + private AdsTcpPlcConnection(InetAddress address, AmsNetId targetAmsNetId, AmsPort targetAmsPort) { this(address, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort()); } - public AdsTcpPlcConnection(InetAddress address, Integer port, AmsNetId targetAmsNetId, AmsPort targetAmsPort) { + private AdsTcpPlcConnection(InetAddress address, Integer port, AmsNetId targetAmsNetId, AmsPort targetAmsPort) { this(address, port, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort()); } - public AdsTcpPlcConnection(InetAddress address, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { + private AdsTcpPlcConnection(InetAddress address, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { this(address, null, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); } - public AdsTcpPlcConnection(InetAddress address, Integer port, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { + private AdsTcpPlcConnection(InetAddress address, Integer port, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { super(new TcpSocketChannelFactory(address, port != null ? port : TCP_PORT), targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); } + public static AdsTcpPlcConnection of(InetAddress address, AmsNetId targetAmsNetId, AmsPort targetAmsPort) { + return new AdsTcpPlcConnection(address, targetAmsNetId, targetAmsPort); + } + + public static AdsTcpPlcConnection of(InetAddress address, Integer port, AmsNetId targetAmsNetId, AmsPort targetAmsPort) { + return new AdsTcpPlcConnection(address, port, targetAmsNetId, targetAmsPort); + } + + public static AdsTcpPlcConnection of(InetAddress address, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { + return new AdsTcpPlcConnection(address, null, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); + } + + public static AdsTcpPlcConnection of(InetAddress address, Integer port, AmsNetId targetAmsNetId, AmsPort targetAmsPort, AmsNetId sourceAmsNetId, AmsPort sourceAmsPort) { + return new AdsTcpPlcConnection(address, port, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort); + } + @Override protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) { return new ChannelInitializer() { diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/AdsPlcDriverTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/AdsPlcDriverTest.java index 99e47c7..d873f6a 100644 --- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/AdsPlcDriverTest.java +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/AdsPlcDriverTest.java @@ -20,19 +20,23 @@ package org.apache.plc4x.java.ads; import org.apache.plc4x.java.PlcDriverManager; +import org.apache.plc4x.java.ads.connection.AdsConnectionFactory; import org.apache.plc4x.java.ads.connection.AdsTcpPlcConnection; import org.apache.plc4x.java.ads.util.TcpHexDumper; import org.apache.plc4x.java.api.authentication.PlcUsernamePasswordAuthentication; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.api.exceptions.PlcException; +import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.junit.Rule; import org.junit.Test; import java.util.regex.Pattern; +import java.util.stream.Stream; import static org.apache.plc4x.java.ads.AdsPlcDriver.*; import static org.hamcrest.Matchers.is; import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; public class AdsPlcDriverTest { @@ -60,6 +64,24 @@ public class AdsPlcDriverTest { assertMatching(ADS_URI_PATTERN, "ads://serial:/dev/ttyUSB0/0.0.0.0.0.0:13"); } + @Test + public void testDriverWithCompleteUrls() throws Exception { + AdsPlcDriver SUT = new AdsPlcDriver(mock(AdsConnectionFactory.class)); + Stream.of( + "ads://www.google.de/0.0.0.0.0.0:13", + "ads://www.google.de:443/0.0.0.0.0.0:13", + "ads://serial:/dev/com1/0.0.0.0.0.0:13", + "ads://serial:COM1/0.0.0.0.0.0:13", + "ads://serial:/dev/ttyUSB0/0.0.0.0.0.0:13" + ).forEach(url -> { + try { + SUT.connect(url); + } catch (PlcConnectionException e) { + throw new PlcRuntimeException(e); + } + }); + } + private void assertMatching(Pattern pattern, String match) { if (!pattern.matcher(match).matches()) { fail(pattern + "doesn't match " + match); 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 new file mode 100644 index 0000000..0df3ce5 --- /dev/null +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnectionTest.java @@ -0,0 +1,69 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.plc4x.java.ads.connection; + +import org.apache.plc4x.java.ads.api.generic.types.AmsNetId; +import org.apache.plc4x.java.ads.api.generic.types.AmsPort; +import org.apache.plc4x.java.ads.model.AdsAddress; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class AdsSerialPlcConnectionTest { + + private AdsSerialPlcConnection SUT; + + @Before + public void setUp() throws Exception { + SUT = AdsSerialPlcConnection.of("/dev/tty0", AmsNetId.of("0.0.0.0.0.0"), AmsPort.of(13)); + } + + @After + public void tearDown() { + SUT = null; + } + + @Test + public void initialState() { + assertEquals(SUT.getTargetAmsNetId().toString(), "0.0.0.0.0.0"); + assertEquals(SUT.getTargetAmsPort().toString(), "13"); + } + + @Test + public void emptyParseAddress() throws Exception { + try { + SUT.parseAddress(""); + } catch (IllegalArgumentException exception) { + assertTrue("Unexpected exception", exception.getMessage().startsWith("address doesn't match ")); + } + } + + @Test + public void parseAddress() throws Exception { + try { + AdsAddress address = (AdsAddress) SUT.parseAddress("1/1"); + assertEquals(address.getIndexGroup(), 1); + assertEquals(address.getIndexOffset(), 1); + } catch (IllegalArgumentException exception) { + fail("valid data block address"); + } + } +} \ No newline at end of file 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 1ebb6d8..b56cb75 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 @@ -36,7 +36,7 @@ public class AdsTcpPlcConnectionTests { @Before public void setUp() throws Exception { - adsTcpPlcConnection = new AdsTcpPlcConnection(InetAddress.getByName("localhost"), AmsNetId.of("0.0.0.0.0.0"), AmsPort.of(13)); + adsTcpPlcConnection = AdsTcpPlcConnection.of(InetAddress.getByName("localhost"), AmsNetId.of("0.0.0.0.0.0"), AmsPort.of(13)); } @After -- To stop receiving notification emails like this one, please contact sru...@apache.org.