You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/02/16 08:19:36 UTC

[incubator-plc4x] branch feature/Beckhoff_ADS_protocol updated: use AbstractPlcConnection and improved implementation of it.

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch feature/Beckhoff_ADS_protocol
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/feature/Beckhoff_ADS_protocol by this push:
     new 2a582d0  use AbstractPlcConnection and improved implementation of it.
2a582d0 is described below

commit 2a582d0304937230bdcb672866cde862b2a6733f
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Feb 16 09:19:32 2018 +0100

    use AbstractPlcConnection and improved implementation of it.
---
 plc4j/protocols/ads/pom.xml                        |  5 ++
 .../java/ads/connection/ADSPlcConnection.java      | 95 ++++++----------------
 .../java/ads/connection/ADSPlcConnectionTests.java |  7 +-
 .../base/connection/AbstractPlcConnection.java     | 25 ++++--
 .../plc4x/java/s7/connection/S7PlcConnection.java  | 21 +++--
 5 files changed, 60 insertions(+), 93 deletions(-)

diff --git a/plc4j/protocols/ads/pom.xml b/plc4j/protocols/ads/pom.xml
index cce37d3..3e1339f 100644
--- a/plc4j/protocols/ads/pom.xml
+++ b/plc4j/protocols/ads/pom.xml
@@ -41,6 +41,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-core</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <scope>runtime</scope>
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/ADSPlcConnection.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/ADSPlcConnection.java
index 3e6c9ce..1d050d9 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/ADSPlcConnection.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/ADSPlcConnection.java
@@ -18,35 +18,30 @@ under the License.
 */
 package org.apache.plc4x.java.ads.connection;
 
-import io.netty.bootstrap.Bootstrap;
-import io.netty.channel.*;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelPipeline;
 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.apache.plc4x.java.ads.netty.ADSProtocol;
 import org.apache.plc4x.java.ads.netty.Plc4XADSProtocol;
-import org.apache.plc4x.java.api.connection.AbstractPlcConnection;
 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.PlcException;
 import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.model.Address;
+import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory;
 
 import java.net.InetAddress;
-import java.net.UnknownHostException;
 import java.util.concurrent.CompletableFuture;
 
 public class ADSPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
 
     public static final int TCP_PORT = 48898;
 
-    private final String hostName;
-
-    private final Integer suppliedPort;
-
     private final AMSNetId targetAmsNetId;
 
     private final AMSPort targetAmsPort;
@@ -55,35 +50,25 @@ public class ADSPlcConnection extends AbstractPlcConnection implements PlcReader
 
     private final AMSPort sourceAmsPort;
 
-    private EventLoopGroup workerGroup;
-    private Channel channel;
-    private boolean connected;
-
-    public ADSPlcConnection(String hostName, AMSNetId targetAmsNetId, AMSPort targetAmsPort) {
-        this(hostName, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort());
+    public ADSPlcConnection(InetAddress address, AMSNetId targetAmsNetId, AMSPort targetAmsPort) {
+        this(address, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort());
     }
 
-    public ADSPlcConnection(String hostName, Integer port, AMSNetId targetAmsNetId, AMSPort targetAmsPort) {
-        this(hostName, port, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort());
+    public ADSPlcConnection(InetAddress address, Integer port, AMSNetId targetAmsNetId, AMSPort targetAmsPort) {
+        this(address, port, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort());
     }
 
 
-    public ADSPlcConnection(String hostName, AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort) {
-        this(hostName, null, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort);
+    public ADSPlcConnection(InetAddress address, AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort) {
+        this(address, null, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort);
     }
 
-    public ADSPlcConnection(String hostName, Integer port, AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort) {
-        this.hostName = hostName;
-        this.suppliedPort = port;
+    public ADSPlcConnection(InetAddress address, Integer port, AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort) {
+        super(new TcpSocketChannelFactory(address, port));
         this.targetAmsNetId = targetAmsNetId;
         this.targetAmsPort = targetAmsPort;
         this.sourceAmsNetId = sourceAmsNetId;
         this.sourceAmsPort = sourceAmsPort;
-        connected = false;
-    }
-
-    public String getHostName() {
-        return hostName;
     }
 
     public AMSNetId getTargetAmsNetId() {
@@ -103,48 +88,16 @@ public class ADSPlcConnection extends AbstractPlcConnection implements PlcReader
     }
 
     @Override
-    public void connect() throws PlcConnectionException {
-        workerGroup = new NioEventLoopGroup();
-
-        try {
-            InetAddress serverInetAddress = InetAddress.getByName(hostName);
-
-            Bootstrap bootstrap = new Bootstrap();
-            bootstrap.group(workerGroup);
-            bootstrap.channel(NioSocketChannel.class);
-            bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
-            bootstrap.option(ChannelOption.TCP_NODELAY, true);
-            bootstrap.handler(new ChannelInitializer() {
-                @Override
-                protected void initChannel(Channel channel) throws Exception {
-                    // Build the protocol stack for communicating with the ads protocol.
-                    ChannelPipeline pipeline = channel.pipeline();
-                    pipeline.addLast(new Plc4XADSProtocol(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort));
-                    pipeline.addLast(new ADSProtocol());
-                }
-            });
-            // Start the client.
-            ChannelFuture f = bootstrap.connect(serverInetAddress, suppliedPort != null ? suppliedPort : TCP_PORT).sync();
-            f.awaitUninterruptibly();
-            // Wait till the session is finished initializing.
-            channel = f.channel();
-            connected = true;
-        } catch (UnknownHostException e) {
-            throw new PlcConnectionException("Unknown Host " + hostName, e);
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            throw new PlcConnectionException(e);
-        }
-    }
-
-    @Override
-    public boolean isConnected() {
-        return connected;
-    }
-
-    @Override
-    public void close() throws Exception {
-        workerGroup.shutdownGracefully();
+    protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) {
+        return new ChannelInitializer() {
+            @Override
+            protected void initChannel(Channel channel) {
+                // Build the protocol stack for communicating with the ads protocol.
+                ChannelPipeline pipeline = channel.pipeline();
+                pipeline.addLast(new Plc4XADSProtocol(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort));
+                pipeline.addLast(new ADSProtocol());
+            }
+        };
     }
 
     @Override
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/ADSPlcConnectionTests.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/ADSPlcConnectionTests.java
index 5045643..c29008b 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/ADSPlcConnectionTests.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/ADSPlcConnectionTests.java
@@ -26,6 +26,8 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.net.InetAddress;
+
 import static org.junit.Assert.*;
 
 public class ADSPlcConnectionTests {
@@ -33,8 +35,8 @@ public class ADSPlcConnectionTests {
     private ADSPlcConnection adsPlcConnection;
 
     @Before
-    public void setUp() {
-        adsPlcConnection = new ADSPlcConnection("localhost", AMSNetId.of("0.0.0.0.0.0"), AMSPort.of(13));
+    public void setUp() throws Exception {
+        adsPlcConnection = new ADSPlcConnection(InetAddress.getByName("localhost"), AMSNetId.of("0.0.0.0.0.0"), AMSPort.of(13));
     }
 
     @After
@@ -44,7 +46,6 @@ public class ADSPlcConnectionTests {
 
     @Test
     public void initialState() {
-        assertTrue("Hostname is incorrect", adsPlcConnection.getHostName().equalsIgnoreCase("localhost"));
         assertEquals(adsPlcConnection.getTargetAmsNetId().toString(), "0.0.0.0.0.0");
         assertEquals(adsPlcConnection.getTargetAmsPort().toString(), "13");
     }
diff --git a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java b/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
index 1545802..fa8adfa 100644
--- a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
+++ b/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
@@ -32,15 +32,22 @@ import java.util.concurrent.ExecutionException;
 
 public abstract class AbstractPlcConnection implements PlcConnection {
 
-    private final ChannelFactory channelFactory;
-    private Channel channel;
-    private boolean connected;
+    protected final ChannelFactory channelFactory;
+    protected final boolean awaitSessionSetupComplete;
+    protected Channel channel;
+    protected boolean connected;
 
-    public AbstractPlcConnection(ChannelFactory channelFactory) {
+    protected AbstractPlcConnection(ChannelFactory channelFactory) {
+        this(channelFactory, false);
+    }
+
+    protected AbstractPlcConnection(ChannelFactory channelFactory, boolean awaitSessionSetupComplete) {
         this.channelFactory = channelFactory;
+        this.awaitSessionSetupComplete = awaitSessionSetupComplete;
         this.connected = false;
     }
 
+
     @Override
     public void connect() throws PlcConnectionException {
         try {
@@ -56,7 +63,9 @@ public abstract class AbstractPlcConnection implements PlcConnection {
             sendChannelCreatedEvent();
 
             // Wait till the connection is established.
-            sessionSetupCompleteFuture.get();
+            if (awaitSessionSetupComplete) {
+                sessionSetupCompleteFuture.get();
+            }
 
             // Set the connection to "connected"
             connected = true;
@@ -91,7 +100,7 @@ public abstract class AbstractPlcConnection implements PlcConnection {
 
     @Override
     public Optional<PlcLister> getLister() {
-        if(this instanceof PlcLister) {
+        if (this instanceof PlcLister) {
             return Optional.of((PlcLister) this);
         }
         return Optional.empty();
@@ -99,7 +108,7 @@ public abstract class AbstractPlcConnection implements PlcConnection {
 
     @Override
     public Optional<PlcReader> getReader() {
-        if(this instanceof PlcReader) {
+        if (this instanceof PlcReader) {
             return Optional.of((PlcReader) this);
         }
         return Optional.empty();
@@ -107,7 +116,7 @@ public abstract class AbstractPlcConnection implements PlcConnection {
 
     @Override
     public Optional<PlcWriter> getWriter() {
-        if(this instanceof PlcWriter) {
+        if (this instanceof PlcWriter) {
             return Optional.of((PlcWriter) this);
         }
         return Optional.empty();
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
index b63e3ad..6581abf 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
@@ -73,12 +73,12 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
         this(new TcpSocketChannelFactory(address, ISO_ON_TCP_PORT), rack, slot, params);
 
         logger.info("Configured S7cConnection with: host-name {}, rack {}, slot {}, pdu-size {}, max-amq-caller {}, " +
-            "max-amq-callee {}", address.getHostAddress(), rack, slot,
+                "max-amq-callee {}", address.getHostAddress(), rack, slot,
             paramPduSize, paramMaxAmqCaller, paramMaxAmqCallee);
     }
 
     public S7PlcConnection(ChannelFactory channelFactory, int rack, int slot, String params) {
-        super(channelFactory);
+        super(channelFactory, true);
 
         this.rack = rack;
         this.slot = slot;
@@ -87,11 +87,11 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
         short paramMaxAmqCaller = 8;
         short paramMaxAmqCallee = 8;
 
-        if(!StringUtils.isEmpty(params)) {
+        if (!StringUtils.isEmpty(params)) {
             for (String param : params.split("&")) {
                 String[] paramElements = param.split("=");
                 String paramName = paramElements[0];
-                if(paramElements.length == 2) {
+                if (paramElements.length == 2) {
                     String paramValue = paramElements[1];
                     switch (paramName) {
                         case "pdu-size":
@@ -129,7 +129,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
                 pipeline.addLast(new ChannelInboundHandlerAdapter() {
                     @Override
                     public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
-                        if(evt instanceof S7ConnectionEvent &&
+                        if (evt instanceof S7ConnectionEvent &&
                             ((S7ConnectionEvent) evt).getState() == S7ConnectionState.SETUP_COMPLETE) {
                             sessionSetupCompleteFuture.complete(null);
                         } else {
@@ -148,7 +148,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
     @Override
     protected void sendChannelCreatedEvent() {
         // Send an event to the pipeline telling the Protocol filters what's going on.
-        getChannel().pipeline().fireUserEventTriggered(new S7ConnectionEvent());
+        channel.pipeline().fireUserEventTriggered(new S7ConnectionEvent());
     }
 
     public int getRack() {
@@ -173,8 +173,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
 
     @Override
     public void close() {
-        Channel channel = getChannel();
-        if((channel != null) && channel.isOpen()) {
+        if ((channel != null) && channel.isOpen()) {
             // Send the PLC a message that the connection is being closed.
             DisconnectRequestTpdu disconnectRequest = new DisconnectRequestTpdu(
                 (short) 0x0000, (short) 0x000F, DisconnectReason.NORMAL, Collections.emptyList(),
@@ -206,7 +205,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
         }
         MemoryArea memoryArea = MemoryArea.valueOf(addressMatcher.group("memoryArea"));
         int byteOffset = Integer.parseInt(addressMatcher.group("byteOffset"));
-        String bitOffset =  addressMatcher.group("bitOffset");
+        String bitOffset = addressMatcher.group("bitOffset");
         if (bitOffset != null) {
             return new S7BitAddress(memoryArea, (short) byteOffset, Byte.valueOf(bitOffset));
         }
@@ -218,7 +217,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
         CompletableFuture<PlcReadResponse> readFuture = new CompletableFuture<>();
         PlcRequestContainer<PlcReadRequest, PlcReadResponse> container =
             new PlcRequestContainer<>(readRequest, readFuture);
-        getChannel().writeAndFlush(container);
+        channel.writeAndFlush(container);
         return readFuture;
     }
 
@@ -227,7 +226,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
         CompletableFuture<PlcWriteResponse> writeFuture = new CompletableFuture<>();
         PlcRequestContainer<PlcWriteRequest, PlcWriteResponse> container =
             new PlcRequestContainer<>(writeRequest, writeFuture);
-        getChannel().writeAndFlush(container);
+        channel.writeAndFlush(container);
         return writeFuture;
     }
 

-- 
To stop receiving notification emails like this one, please contact
sruehl@apache.org.