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

cdutz pushed a commit to branch feature/alternate-PLC4X-108
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/feature/alternate-PLC4X-108 by 
this push:
     new 2cfe5f2  PLC4X-108 - Add ping() method to PlcConnection
2cfe5f2 is described below

commit 2cfe5f2fd93869c416db71c634a85aaa6c7dce5b
Author: Christofer Dutz <[email protected]>
AuthorDate: Tue Apr 9 20:56:41 2019 +0200

    PLC4X-108 - Add ping() method to PlcConnection
    
    - Implemented the "ping" method for different base types.
---
 .../plc4x/java/base/connection/ChannelFactory.java |  3 +++
 .../java/base/connection/NettyPlcConnection.java   | 16 +++++++++++++
 .../base/connection/NettyPlcConnectionTest.java    |  6 +++++
 .../base/connection/RawSocketChannelFactory.java   | 26 ++++++++++++++++++++++
 .../java/base/connection/SerialChannelFactory.java |  5 +++++
 .../base/connection/TcpSocketChannelFactory.java   | 18 +++++++++++++++
 .../java/base/connection/TestChannelFactory.java   |  5 +++++
 7 files changed, 79 insertions(+)

diff --git 
a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
 
b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
index b3e3e6b..b03daee 100644
--- 
a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
+++ 
b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
@@ -21,10 +21,13 @@ package org.apache.plc4x.java.base.connection;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandler;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.exceptions.PlcException;
 
 public interface ChannelFactory {
 
     Channel createChannel(ChannelHandler channelHandler)
         throws PlcConnectionException;
 
+    void ping() throws PlcException;
+
 }
diff --git 
a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
 
b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
index 42b370d..3ccd294 100644
--- 
a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
+++ 
b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
@@ -23,6 +23,7 @@ import io.netty.channel.ChannelHandler;
 import io.netty.util.HashedWheelTimer;
 import io.netty.util.Timer;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.exceptions.PlcException;
 import org.apache.plc4x.java.api.exceptions.PlcIoException;
 
 import java.util.concurrent.CompletableFuture;
@@ -89,6 +90,21 @@ public abstract class NettyPlcConnection extends 
AbstractPlcConnection {
     }
 
     @Override
+    public CompletableFuture<Void> ping() {
+        CompletableFuture<Void> future = new CompletableFuture<>();
+        try {
+            // Relay the actual pinging to the channel factory ...
+            channelFactory.ping();
+            // If we got here, the ping was successful.
+            future.complete(null);
+        } catch(PlcException e) {
+            // If we got here, something went wrong.
+            future.completeExceptionally(e);
+        }
+        return future;
+    }
+
+    @Override
     public void close() throws PlcConnectionException {
         channel = null;
         connected = false;
diff --git 
a/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/connection/NettyPlcConnectionTest.java
 
b/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/connection/NettyPlcConnectionTest.java
index 8fe40ea..9625502 100644
--- 
a/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/connection/NettyPlcConnectionTest.java
+++ 
b/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/connection/NettyPlcConnectionTest.java
@@ -38,6 +38,12 @@ public class NettyPlcConnectionTest implements 
WithAssertions {
         public Channel createChannel(ChannelHandler channelHandler) throws 
PlcConnectionException {
             return new EmbeddedChannel();
         }
+
+        @Override
+        public void ping() {
+            // Ignore ...
+        }
+
     };
 
     NettyPlcConnection SUT = new NettyPlcConnection(channelFactory, true) {
diff --git 
a/plc4j/protocols/driver-bases/raw-socket/src/main/java/org/apache/plc4x/java/base/connection/RawSocketChannelFactory.java
 
b/plc4j/protocols/driver-bases/raw-socket/src/main/java/org/apache/plc4x/java/base/connection/RawSocketChannelFactory.java
index a6fe95e..d80194f 100644
--- 
a/plc4j/protocols/driver-bases/raw-socket/src/main/java/org/apache/plc4x/java/base/connection/RawSocketChannelFactory.java
+++ 
b/plc4j/protocols/driver-bases/raw-socket/src/main/java/org/apache/plc4x/java/base/connection/RawSocketChannelFactory.java
@@ -21,11 +21,16 @@ package org.apache.plc4x.java.base.connection;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandler;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.exceptions.PlcException;
 
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
 
 public class RawSocketChannelFactory implements ChannelFactory {
 
+    private static final int PING_TIMEOUT_MS = 1_000;
+
     private final InetAddress address;
     private final int port;
     private final int protocolId;
@@ -58,4 +63,25 @@ public class RawSocketChannelFactory implements 
ChannelFactory {
         return null;
     }
 
+    @Override
+    public void ping() throws PlcException {
+        // TODO: Replace this check with a more accurate one ...
+        InetSocketAddress address = new InetSocketAddress(getAddress(), 
getPort());
+        try (Socket s = new Socket()) {
+            s.connect(address, PING_TIMEOUT_MS);
+            // TODO keep the address for a (timely) next request???
+            s.setReuseAddress(true);
+        } catch (Exception e) {
+            throw new PlcConnectionException("Unable to ping remote host");
+        }
+    }
+
+    public InetAddress getAddress() {
+        return address;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
 }
diff --git 
a/plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java
 
b/plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java
index cdfea8f..6f93828 100644
--- 
a/plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java
+++ 
b/plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java
@@ -59,6 +59,11 @@ public class SerialChannelFactory implements ChannelFactory {
         }
     }
 
+    @Override
+    public void ping() {
+        // TODO: Do some sort of check as soon as we know how ...
+    }
+
     public String getSerialPort() {
         return serialPort;
     }
diff --git 
a/plc4j/protocols/driver-bases/tcp/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
 
b/plc4j/protocols/driver-bases/tcp/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
index 44e4835..8f3f101 100644
--- 
a/plc4j/protocols/driver-bases/tcp/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
+++ 
b/plc4j/protocols/driver-bases/tcp/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
@@ -26,11 +26,16 @@ import io.netty.channel.ChannelOption;
 import io.netty.channel.nio.NioEventLoopGroup;
 import io.netty.channel.socket.nio.NioSocketChannel;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.exceptions.PlcException;
 
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
 
 public class TcpSocketChannelFactory implements ChannelFactory {
 
+    private static final int PING_TIMEOUT_MS = 1_000;
+
     private final InetAddress address;
     private final int port;
 
@@ -62,6 +67,19 @@ public class TcpSocketChannelFactory implements 
ChannelFactory {
         }
     }
 
+    @Override
+    public void ping() throws PlcException {
+        // TODO: Replace this check with a more accurate one ...
+        InetSocketAddress address = new InetSocketAddress(getAddress(), 
getPort());
+        try (Socket s = new Socket()) {
+            s.connect(address, PING_TIMEOUT_MS);
+            // TODO keep the address for a (timely) next request???
+            s.setReuseAddress(true);
+        } catch (Exception e) {
+            throw new PlcConnectionException("Unable to ping remote host");
+        }
+    }
+
     public InetAddress getAddress() {
         return address;
     }
diff --git 
a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
 
b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
index be58968..2b01d74 100644
--- 
a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
+++ 
b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
@@ -32,6 +32,11 @@ public class TestChannelFactory implements ChannelFactory {
         return channel;
     }
 
+    @Override
+    public void ping() {
+        // Ignore ...
+    }
+
     public EmbeddedChannel getChannel() {
         return channel;
     }

Reply via email to