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;
}