This is an automated email from the ASF dual-hosted git repository. cdutz pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
commit e60f924c69be29890d62f3df6df4aeace6575965 Author: Andrey Skorikov <andrey.skori...@codecentric.de> AuthorDate: Thu Oct 4 15:22:12 2018 +0200 moved Request Builder factories to PlcConnection --- .../azure/iothub/S7PlcToAzureIoTHubSample.java | 2 +- .../dummydriver/connection/DummyConnection.java | 32 +++++++++++++-------- .../google/iotcore/S7PlcToGoogleIoTCoreSample.java | 2 +- .../plc4x/java/examples/helloplc4x/HelloPlc4x.java | 2 +- .../plc4x/java/examples/plclogger/PlcLogger.java | 4 +-- .../java/org/apache/plc4x/camel/Plc4XConsumer.java | 5 ++-- .../apache/plc4x/camel/Plc4XPollingConsumer.java | 2 +- .../java/org/apache/plc4x/camel/Plc4XProducer.java | 7 +++-- .../java/org/apache/plc4x/camel/MockDriver.java | 7 +++++ .../org/apache/plc4x/camel/Plc4XEndpointTest.java | 1 + .../org/apache/plc4x/camel/Plc4XProducerTest.java | 7 +++++ .../apache/plc4x/edgent/PlcConnectionAdapter.java | 8 +++--- .../apache/plc4x/edgent/mock/MockConnection.java | 9 +++--- .../java/org/apache/plc4x/kafka/Plc4xSinkTask.java | 2 +- .../org/apache/plc4x/kafka/Plc4xSourceTask.java | 2 +- .../org/apache/plc4x/nifi/Plc4xSinkProcessor.java | 6 ++-- .../apache/plc4x/nifi/Plc4xSourceProcessor.java | 6 ++-- .../plc4x/java/api/connection/PlcConnection.java | 6 ++-- .../java/api/connection/PlcProprietarySender.java | 1 - .../plc4x/java/api/connection/PlcReader.java | 2 +- .../plc4x/java/api/connection/PlcSubscriber.java | 4 +-- .../plc4x/java/api/connection/PlcWriter.java | 2 +- .../org/apache/plc4x/java/mock/MockConnection.java | 26 +++++++++++++++++ .../ads/connection/AdsAbstractPlcConnection.java | 29 +++++++++++++------ .../ads/connection/AdsSerialPlcConnection.java | 3 ++ .../java/ads/connection/AdsTcpPlcConnection.java | 14 +++++---- .../apache/plc4x/java/ads/ManualPlc4XAdsTest.java | 6 ++-- .../ads/connection/AdsSerialPlcConnectionTest.java | 2 +- .../plc4x/java/base/connection/MockConnection.java | 26 ++++++++++++++++- .../connection/BaseEtherNetIpPlcConnection.java | 20 +++++++------ .../connection/EtherNetIpTcpPlcConnection.java | 13 +++++++++ .../java/ethernetip/ManualPlc4XEtherNetIpTest.java | 2 +- .../modbus/connection/BaseModbusPlcConnection.java | 30 ++++++++++++-------- .../modbus/connection/ModbusTcpPlcConnection.java | 3 ++ .../plc4x/java/modbus/ManualPlc4XModbusTest.java | 10 +++---- .../connection/ModbusSerialPlcConnectionTest.java | 2 +- .../plc4x/java/s7/connection/S7PlcConnection.java | 30 ++++++++++++-------- .../apache/plc4x/java/s7/issues/PLC4X47Test.java | 2 +- .../org/apache/plc4x/java/test/TestConnection.java | 33 ++++++++++++++++------ 39 files changed, 258 insertions(+), 112 deletions(-) diff --git a/examples/azure/src/main/java/org/apache/plc4x/java/examples/azure/iothub/S7PlcToAzureIoTHubSample.java b/examples/azure/src/main/java/org/apache/plc4x/java/examples/azure/iothub/S7PlcToAzureIoTHubSample.java index 7bb03ec..a4f80cc 100644 --- a/examples/azure/src/main/java/org/apache/plc4x/java/examples/azure/iothub/S7PlcToAzureIoTHubSample.java +++ b/examples/azure/src/main/java/org/apache/plc4x/java/examples/azure/iothub/S7PlcToAzureIoTHubSample.java @@ -66,7 +66,7 @@ public class S7PlcToAzureIoTHubSample { PlcReader plcReader = plcConnection.getReader().orElseThrow(IllegalStateException::new); // Prepare a read request. - PlcReadRequest request = plcReader.readRequestBuilder().addItem(FIELD_NAME, addressString).build(); + PlcReadRequest request = plcConnection.readRequestBuilder().get().addItem(FIELD_NAME, addressString).build(); while (!Thread.currentThread().isInterrupted()) { // Simulate telemetry. diff --git a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java b/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java index 4b7c00a..8fc73b4 100644 --- a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java +++ b/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java @@ -23,10 +23,7 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelInitializer; import org.apache.plc4x.java.api.connection.PlcReader; import org.apache.plc4x.java.api.connection.PlcWriter; -import org.apache.plc4x.java.api.messages.PlcReadRequest; -import org.apache.plc4x.java.api.messages.PlcReadResponse; -import org.apache.plc4x.java.api.messages.PlcWriteRequest; -import org.apache.plc4x.java.api.messages.PlcWriteResponse; +import org.apache.plc4x.java.api.messages.*; import org.apache.plc4x.java.base.connection.AbstractPlcConnection; import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory; import org.apache.plc4x.java.base.messages.*; @@ -34,6 +31,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetAddress; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public class DummyConnection extends AbstractPlcConnection implements PlcReader, PlcWriter { @@ -58,9 +56,25 @@ public class DummyConnection extends AbstractPlcConnection implements PlcReader, } @Override - public PlcReadRequest.Builder readRequestBuilder() { + public Optional<PlcReadRequest.Builder> readRequestBuilder() { // TODO: Implement this ... - return null; + return Optional.empty(); + } + + @Override + public Optional<PlcWriteRequest.Builder> writeRequestBuilder() { + // TODO: Implement this ... + return Optional.empty(); + } + + @Override + public Optional<PlcSubscriptionRequest.Builder> subscriptionRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder() { + return Optional.empty(); } @Override @@ -74,12 +88,6 @@ public class DummyConnection extends AbstractPlcConnection implements PlcReader, } @Override - public PlcWriteRequest.Builder writeRequestBuilder() { - // TODO: Implement this ... - return null; - } - - @Override public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) { CompletableFuture<InternalPlcWriteResponse> writeFuture = new CompletableFuture<>(); PlcRequestContainer<InternalPlcWriteRequest, InternalPlcWriteResponse> container = diff --git a/examples/google/src/main/java/org/apache/plc4x/java/examples/google/iotcore/S7PlcToGoogleIoTCoreSample.java b/examples/google/src/main/java/org/apache/plc4x/java/examples/google/iotcore/S7PlcToGoogleIoTCoreSample.java index 29d25a3..fba969c 100644 --- a/examples/google/src/main/java/org/apache/plc4x/java/examples/google/iotcore/S7PlcToGoogleIoTCoreSample.java +++ b/examples/google/src/main/java/org/apache/plc4x/java/examples/google/iotcore/S7PlcToGoogleIoTCoreSample.java @@ -235,7 +235,7 @@ public class S7PlcToGoogleIoTCoreSample { PlcReader plcReader = plcConnection.getReader().orElseThrow(IllegalAccessError::new); - PlcReadRequest readRequest = plcReader.readRequestBuilder().addItem("outputs", "OUTPUTS/0").build(); + PlcReadRequest readRequest = plcConnection.readRequestBuilder().get().addItem("outputs", "OUTPUTS/0").build(); while (!Thread.currentThread().isInterrupted()) { diff --git a/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java b/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java index d149ba5..402c856 100644 --- a/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java +++ b/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java @@ -57,7 +57,7 @@ public class HelloPlc4x { // Create a new read request: // - Give the single item requested the alias name "value" - PlcReadRequest.Builder builder = plcReader.readRequestBuilder(); + PlcReadRequest.Builder builder = plcConnection.readRequestBuilder().get(); for (int i = 1; i < args.length; i++) { builder.addItem("value-" + i, args[i]); } diff --git a/examples/plclogger/src/main/java/org/apache/plc4x/java/examples/plclogger/PlcLogger.java b/examples/plclogger/src/main/java/org/apache/plc4x/java/examples/plclogger/PlcLogger.java index ffc14ec..bd2a066 100644 --- a/examples/plclogger/src/main/java/org/apache/plc4x/java/examples/plclogger/PlcLogger.java +++ b/examples/plclogger/src/main/java/org/apache/plc4x/java/examples/plclogger/PlcLogger.java @@ -18,8 +18,6 @@ under the License. */ package org.apache.plc4x.java.examples.plclogger; -import java.util.concurrent.TimeUnit; - import org.apache.edgent.function.Supplier; import org.apache.edgent.providers.direct.DirectProvider; import org.apache.edgent.topology.TStream; @@ -27,6 +25,8 @@ import org.apache.edgent.topology.Topology; import org.apache.plc4x.edgent.PlcConnectionAdapter; import org.apache.plc4x.edgent.PlcFunctions; +import java.util.concurrent.TimeUnit; + public class PlcLogger { public static void main(String[] args) throws Exception { diff --git a/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java b/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java index 7887f02..9ec281c 100644 --- a/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java +++ b/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java @@ -27,7 +27,6 @@ import org.apache.plc4x.java.api.connection.PlcConnection; import org.apache.plc4x.java.api.connection.PlcSubscriber; import org.apache.plc4x.java.api.exceptions.PlcException; import org.apache.plc4x.java.api.messages.*; -import org.apache.plc4x.java.api.model.PlcSubscriptionHandle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -84,7 +83,7 @@ public class Plc4XConsumer extends ServiceSupport implements Consumer, java.util PlcSubscriber plcSubscriber = plcConnection.getSubscriber().orElseThrow( () -> new PlcException("Connection doesn't support subscriptions.")); // TODO: Is it correct to only support one field? - PlcSubscriptionRequest request = plcSubscriber.subscriptionRequestBuilder() + PlcSubscriptionRequest request = plcConnection.subscriptionRequestBuilder().get() .addCyclicField("default", fieldQuery, Duration.of(3, ChronoUnit.SECONDS)).build(); PlcSubscriptionResponse plcSubscriptionResponse = plcSubscriber.subscribe(request).get(); // TODO: we need to return the plcSubscriptionResponse here too as we need this to unsubscribe... @@ -95,7 +94,7 @@ public class Plc4XConsumer extends ServiceSupport implements Consumer, java.util protected void doStop() throws InterruptedException, ExecutionException, TimeoutException, PlcException { PlcSubscriber plcSubscriber = plcConnection.getSubscriber().orElseThrow( () -> new PlcException("Connection doesn't support subscriptions.")); - PlcUnsubscriptionRequest request = plcSubscriber.unsubscriptionRequestBuilder().addHandles(subscriptionResponse.getSubscriptionHandles()).build(); + PlcUnsubscriptionRequest request = plcConnection.unsubscriptionRequestBuilder().get().addHandles(subscriptionResponse.getSubscriptionHandles()).build(); CompletableFuture<PlcUnsubscriptionResponse> unsubscriptionFuture = plcSubscriber.unsubscribe(request); PlcUnsubscriptionResponse unsubscriptionResponse = unsubscriptionFuture.get(5, TimeUnit.SECONDS); // TODO: Handle the response ... diff --git a/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java b/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java index 395398e..4aee7ad 100644 --- a/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java +++ b/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java @@ -55,7 +55,7 @@ public class Plc4XPollingConsumer extends ServiceSupport implements PollingConsu String plc4xURI = endpoint.getEndpointUri().replaceFirst("plc4x:/?/?", ""); this.plcConnection = endpoint.getPlcDriverManager().getConnection(plc4xURI); this.plcReader = plcConnection.getReader().orElseThrow(() -> new PlcException("This connection doesn't support reading.")); - readRequest = plcReader.readRequestBuilder().addItem("default", endpoint.getAddress()).build(); + readRequest = plcConnection.readRequestBuilder().get().addItem("default", endpoint.getAddress()).build(); } @Override diff --git a/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java b/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java index 01acff0..b4adbcc 100644 --- a/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java +++ b/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java @@ -34,14 +34,15 @@ import java.util.concurrent.atomic.AtomicInteger; public class Plc4XProducer extends DefaultAsyncProducer { private PlcConnection plcConnection; - private PlcWriter plcWriter; private AtomicInteger openRequests; public Plc4XProducer(Plc4XEndpoint endpoint) throws PlcException { super(endpoint); String plc4xURI = endpoint.getEndpointUri().replaceFirst("plc4x:/?/?", ""); plcConnection = endpoint.getPlcDriverManager().getConnection(plc4xURI); - plcWriter = plcConnection.getWriter().orElseThrow(() -> new PlcException("This connection doesn't support writing.")); + if (!plcConnection.writeRequestBuilder().isPresent()) { + throw new PlcException("This connection (" + plc4xURI + ") doesn't support writing."); + } openRequests = new AtomicInteger(); } @@ -51,7 +52,6 @@ public class Plc4XProducer extends DefaultAsyncProducer { String fieldName = in.getHeader(Constants.FIELD_NAME_HEADER, String.class); String fieldQuery = in.getHeader(Constants.FIELD_QUERY_HEADER, String.class); Object body = in.getBody(); - PlcWriteRequest.Builder builder = plcWriter.writeRequestBuilder(); if (body instanceof List) { List<?> bodyList = in.getBody(List.class); Object[] values = bodyList.toArray(); @@ -61,6 +61,7 @@ public class Plc4XProducer extends DefaultAsyncProducer { // builder.addItem(fieldName, fieldQuery, value); } PlcWriter plcWriter = plcConnection.getWriter().orElseThrow(() -> new IllegalArgumentException("Writer for driver not found")); + PlcWriteRequest.Builder builder = plcConnection.writeRequestBuilder().orElseThrow(() -> new IllegalArgumentException("Writer for driver not found")); CompletableFuture<? extends PlcWriteResponse> completableFuture = plcWriter.write(builder.build()); int currentlyOpenRequests = openRequests.incrementAndGet(); try { diff --git a/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/MockDriver.java b/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/MockDriver.java index fb99abe..9a3ea9e 100644 --- a/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/MockDriver.java +++ b/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/MockDriver.java @@ -21,10 +21,13 @@ package org.apache.plc4x.camel; import org.apache.plc4x.java.api.PlcDriver; import org.apache.plc4x.java.api.authentication.PlcAuthentication; import org.apache.plc4x.java.api.connection.PlcConnection; +import org.apache.plc4x.java.api.connection.PlcReader; import org.apache.plc4x.java.api.connection.PlcSubscriber; import org.apache.plc4x.java.api.connection.PlcWriter; +import org.apache.plc4x.java.api.messages.PlcReadRequest; import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest; import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse; +import org.apache.plc4x.java.api.messages.PlcWriteRequest; import org.apache.plc4x.java.base.messages.DefaultPlcSubscriptionResponse; import org.apache.plc4x.java.base.messages.InternalPlcSubscriptionRequest; import org.slf4j.Logger; @@ -59,6 +62,10 @@ public class MockDriver implements PlcDriver { // Mock a connection. PlcConnection plcConnectionMock = mock(PlcConnection.class, RETURNS_DEEP_STUBS); when(plcConnectionMock.getWriter()).thenReturn(Optional.of(mock(PlcWriter.class, RETURNS_DEEP_STUBS))); + when(plcConnectionMock.getReader()).thenReturn(Optional.of(mock(PlcReader.class, RETURNS_DEEP_STUBS))); + when(plcConnectionMock.readRequestBuilder()).thenReturn(Optional.of(mock(PlcReadRequest.Builder.class, RETURNS_DEEP_STUBS))); + when(plcConnectionMock.writeRequestBuilder()).thenReturn(Optional.of(mock(PlcWriteRequest.Builder.class, RETURNS_DEEP_STUBS))); + when(plcConnectionMock.subscriptionRequestBuilder()).thenReturn(Optional.of(mock(PlcSubscriptionRequest.Builder.class, RETURNS_DEEP_STUBS))); // Mock a typical subscriber. PlcSubscriber plcSubscriber = mock(PlcSubscriber.class, RETURNS_DEEP_STUBS); diff --git a/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XEndpointTest.java b/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XEndpointTest.java index d29b148..b849e2c 100644 --- a/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XEndpointTest.java +++ b/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XEndpointTest.java @@ -37,6 +37,7 @@ public class Plc4XEndpointTest { SUT = new Plc4XEndpoint("plc4x:mock:10.10.10.1/1/1", mock(Component.class)); } + // TODO: figure out what this is @Test public void createProducer() throws Exception { assertThat(SUT.createProducer(), notNullValue()); diff --git a/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XProducerTest.java b/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XProducerTest.java index f35ce3d..60706d6 100644 --- a/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XProducerTest.java +++ b/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XProducerTest.java @@ -23,6 +23,8 @@ import org.apache.camel.ExchangePattern; import org.apache.plc4x.java.PlcDriverManager; import org.apache.plc4x.java.api.connection.PlcConnection; import org.apache.plc4x.java.api.connection.PlcWriter; +import org.apache.plc4x.java.api.messages.PlcReadRequest; +import org.apache.plc4x.java.api.messages.PlcWriteRequest; import org.junit.Before; import org.junit.Test; @@ -45,8 +47,13 @@ public class Plc4XProducerTest { Plc4XEndpoint endpointMock = mock(Plc4XEndpoint.class, RETURNS_DEEP_STUBS); when(endpointMock.getEndpointUri()).thenReturn("plc4x:mock:10.10.10.1/1/1"); PlcDriverManager plcDriverManagerMock = mock(PlcDriverManager.class, RETURNS_DEEP_STUBS); + when(plcDriverManagerMock.getConnection(anyString()).getWriter()) .thenReturn(Optional.of(mock(PlcWriter.class, RETURNS_DEEP_STUBS))); + + when(plcDriverManagerMock.getConnection(anyString()).writeRequestBuilder()) + .thenReturn(Optional.of(mock(PlcWriteRequest.Builder.class, RETURNS_DEEP_STUBS))); + when(endpointMock.getPlcDriverManager()).thenReturn(plcDriverManagerMock); SUT = new Plc4XProducer(endpointMock); testExchange = mock(Exchange.class, RETURNS_DEEP_STUBS); diff --git a/integrations/apache-edgent/src/main/java/org/apache/plc4x/edgent/PlcConnectionAdapter.java b/integrations/apache-edgent/src/main/java/org/apache/plc4x/edgent/PlcConnectionAdapter.java index 9ce5d92..4e1fbcd 100644 --- a/integrations/apache-edgent/src/main/java/org/apache/plc4x/edgent/PlcConnectionAdapter.java +++ b/integrations/apache-edgent/src/main/java/org/apache/plc4x/edgent/PlcConnectionAdapter.java @@ -104,8 +104,8 @@ public class PlcConnectionAdapter implements AutoCloseable { } public PlcReadRequest.Builder readRequestBuilder() throws PlcException { - return getConnection().getReader().orElseThrow( - () -> new PlcException("This connection doesn't support reading")).readRequestBuilder(); + return getConnection().readRequestBuilder().orElseThrow( + () -> new PlcException("This connection doesn't support reading")); } Supplier<PlcReadResponse> newSupplier(PlcReadRequest readRequest) { @@ -156,7 +156,7 @@ public class PlcConnectionAdapter implements AutoCloseable { connection = getConnection(); PlcReader reader = connection.getReader() .orElseThrow(() -> new PlcException("This connection doesn't support reading")); - PlcReadRequest readRequest = reader.readRequestBuilder().addItem(FIELD_NAME, fieldQuery).build(); + PlcReadRequest readRequest = connection.readRequestBuilder().orElseThrow(() -> new PlcException("This connection doesn't support reading")).addItem(FIELD_NAME, fieldQuery).build(); PlcReadResponse readResponse = reader.read(readRequest).get(); Object value = null; switch (clientDatatype) { @@ -221,7 +221,7 @@ public class PlcConnectionAdapter implements AutoCloseable { connection = getConnection(); PlcWriter writer = connection.getWriter() .orElseThrow(() -> new PlcException("This connection doesn't support writing")); - PlcWriteRequest.Builder builder = writer.writeRequestBuilder(); + PlcWriteRequest.Builder builder = connection.writeRequestBuilder().orElseThrow(() -> new PlcException("This connection doesn't support writing")); PlcWriteRequest writeRequest = builder.build(); addItem(builder, clientDatatype, fieldQuery, fieldValue); writer.write(writeRequest).get(); diff --git a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockConnection.java b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockConnection.java index e569e1e..f6de8d4 100644 --- a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockConnection.java +++ b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockConnection.java @@ -36,6 +36,7 @@ import org.apache.plc4x.java.base.messages.items.FieldItem; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public class MockConnection extends org.apache.plc4x.java.base.connection.MockConnection implements PlcReader, PlcWriter { @@ -67,8 +68,8 @@ public class MockConnection extends org.apache.plc4x.java.base.connection.MockCo } @Override - public PlcReadRequest.Builder readRequestBuilder() { - return new DefaultPlcReadRequest.Builder(this, new MockFieldHandler()); + public Optional<PlcReadRequest.Builder> readRequestBuilder() { + return Optional.of(new DefaultPlcReadRequest.Builder(this, new MockFieldHandler())); } @Override @@ -90,8 +91,8 @@ public class MockConnection extends org.apache.plc4x.java.base.connection.MockCo } @Override - public PlcWriteRequest.Builder writeRequestBuilder() { - return new DefaultPlcWriteRequest.Builder(this, new MockFieldHandler()); + public Optional<PlcWriteRequest.Builder> writeRequestBuilder() { + return Optional.of(new DefaultPlcWriteRequest.Builder(this, new MockFieldHandler())); } @SuppressWarnings("unchecked") diff --git a/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSinkTask.java b/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSinkTask.java index 648a32e..6829294 100644 --- a/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSinkTask.java +++ b/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSinkTask.java @@ -65,7 +65,7 @@ public class Plc4xSinkTask extends SinkTask { for (SinkRecord record: records) { String query = record.key().toString(); Object value = record.value(); - PlcWriteRequest.Builder builder = plcWriter.writeRequestBuilder(); + PlcWriteRequest.Builder builder = plcConnection.writeRequestBuilder().get(); PlcWriteRequest plcRequest = addToBuilder(builder, query, value).build(); doWrite(plcRequest); } diff --git a/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSourceTask.java b/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSourceTask.java index 62fbb12..08b3ec1 100644 --- a/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSourceTask.java +++ b/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSourceTask.java @@ -86,7 +86,7 @@ public class Plc4xSourceTask extends SourceTask { .orElseThrow(() -> new ConnectException("PlcReader not available for this type of connection")); - PlcReadRequest.Builder builder = plcReader.readRequestBuilder(); + PlcReadRequest.Builder builder = plcConnection.readRequestBuilder().get(); for (String query : queries) { builder.addItem(query, query); } diff --git a/integrations/apache-nifi/nifi-plc4x-processors/src/main/java/org/apache/plc4x/nifi/Plc4xSinkProcessor.java b/integrations/apache-nifi/nifi-plc4x-processors/src/main/java/org/apache/plc4x/nifi/Plc4xSinkProcessor.java index ab7b0a0..973855b 100644 --- a/integrations/apache-nifi/nifi-plc4x-processors/src/main/java/org/apache/plc4x/nifi/Plc4xSinkProcessor.java +++ b/integrations/apache-nifi/nifi-plc4x-processors/src/main/java/org/apache/plc4x/nifi/Plc4xSinkProcessor.java @@ -28,6 +28,7 @@ import org.apache.nifi.flowfile.FlowFile; import org.apache.nifi.processor.ProcessContext; import org.apache.nifi.processor.ProcessSession; import org.apache.nifi.processor.exception.ProcessException; +import org.apache.plc4x.java.api.connection.PlcConnection; import org.apache.plc4x.java.api.connection.PlcWriter; import org.apache.plc4x.java.api.messages.PlcWriteRequest; import org.apache.plc4x.java.api.messages.PlcWriteResponse; @@ -51,11 +52,12 @@ public class Plc4xSinkProcessor extends BasePlc4xProcessor { } // Get an instance of a component able to write to a PLC. - PlcWriter writer = getConnection().getWriter().orElseThrow( + PlcConnection connection = getConnection(); + PlcWriter writer = connection.getWriter().orElseThrow( () -> new ProcessException("Writing not supported by connection")); // Prepare the request. - PlcWriteRequest.Builder builder = writer.writeRequestBuilder(); + PlcWriteRequest.Builder builder = connection.writeRequestBuilder().get(); flowFile.getAttributes().forEach((field, value) -> { String address = getAddress(field); if(address != null) { diff --git a/integrations/apache-nifi/nifi-plc4x-processors/src/main/java/org/apache/plc4x/nifi/Plc4xSourceProcessor.java b/integrations/apache-nifi/nifi-plc4x-processors/src/main/java/org/apache/plc4x/nifi/Plc4xSourceProcessor.java index f3dbb59..190a00d 100644 --- a/integrations/apache-nifi/nifi-plc4x-processors/src/main/java/org/apache/plc4x/nifi/Plc4xSourceProcessor.java +++ b/integrations/apache-nifi/nifi-plc4x-processors/src/main/java/org/apache/plc4x/nifi/Plc4xSourceProcessor.java @@ -27,6 +27,7 @@ import org.apache.nifi.flowfile.FlowFile; import org.apache.nifi.processor.ProcessContext; import org.apache.nifi.processor.ProcessSession; import org.apache.nifi.processor.exception.ProcessException; +import org.apache.plc4x.java.api.connection.PlcConnection; import org.apache.plc4x.java.api.connection.PlcReader; import org.apache.plc4x.java.api.messages.PlcReadRequest; import org.apache.plc4x.java.api.messages.PlcReadResponse; @@ -45,11 +46,12 @@ public class Plc4xSourceProcessor extends BasePlc4xProcessor { @Override public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException { // Get an instance of a component able to read from a PLC. - PlcReader reader = getConnection().getReader().orElseThrow( + PlcConnection connection = getConnection(); + PlcReader reader = connection.getReader().orElseThrow( () -> new ProcessException("Writing not supported by connection")); // Prepare the request. - PlcReadRequest.Builder builder = reader.readRequestBuilder(); + PlcReadRequest.Builder builder = connection.readRequestBuilder().get(); getFields().forEach(field -> { String address = getAddress(field); if(address != null) { diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcConnection.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcConnection.java index 4c2b197..66a3778 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcConnection.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcConnection.java @@ -57,13 +57,15 @@ public interface PlcConnection extends AutoCloseable { @Override void close() throws Exception; - /*Optional<PlcReadRequest.Builder> readRequestBuilder(); + Optional<PlcReadRequest.Builder> readRequestBuilder(); Optional<PlcWriteRequest.Builder> writeRequestBuilder(); Optional<PlcSubscriptionRequest.Builder> subscriptionRequestBuilder(); - Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder();*/ + Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder(); + + // the following methods should be moved to the SPI Optional<PlcReader> getReader(); diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcProprietarySender.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcProprietarySender.java index 2a053cb..80db408 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcProprietarySender.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcProprietarySender.java @@ -24,6 +24,5 @@ import org.apache.plc4x.java.api.messages.PlcProprietaryResponse; import java.util.concurrent.CompletableFuture; public interface PlcProprietarySender { - <T> CompletableFuture<PlcProprietaryResponse<T>> send(PlcProprietaryRequest proprietaryRequest); } diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcReader.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcReader.java index b78d306..6d50da0 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcReader.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcReader.java @@ -37,6 +37,6 @@ public interface PlcReader { */ CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest); - PlcReadRequest.Builder readRequestBuilder(); + //PlcReadRequest.Builder readRequestBuilder(); } diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcSubscriber.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcSubscriber.java index 1f582cb..d1c97ba 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcSubscriber.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcSubscriber.java @@ -62,8 +62,8 @@ public interface PlcSubscriber { */ void unregister(PlcConsumerRegistration registration); - PlcSubscriptionRequest.Builder subscriptionRequestBuilder(); + //PlcSubscriptionRequest.Builder subscriptionRequestBuilder(); - PlcUnsubscriptionRequest.Builder unsubscriptionRequestBuilder(); + //PlcUnsubscriptionRequest.Builder unsubscriptionRequestBuilder(); } diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcWriter.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcWriter.java index b22977f..a4e44bf 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcWriter.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcWriter.java @@ -37,6 +37,6 @@ public interface PlcWriter { */ CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest); - PlcWriteRequest.Builder writeRequestBuilder(); + //PlcWriteRequest.Builder writeRequestBuilder(); } diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java index 0be37f9..fc52100 100644 --- a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java +++ b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java @@ -22,10 +22,15 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelInitializer; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.messages.PlcReadRequest; +import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest; +import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest; +import org.apache.plc4x.java.api.messages.PlcWriteRequest; import org.apache.plc4x.java.api.model.PlcField; import org.apache.plc4x.java.base.connection.AbstractPlcConnection; import org.apache.plc4x.java.base.connection.TestChannelFactory; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public class MockConnection extends AbstractPlcConnection { @@ -38,6 +43,27 @@ public class MockConnection extends AbstractPlcConnection { } @Override + public Optional<PlcReadRequest.Builder> readRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcWriteRequest.Builder> writeRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcSubscriptionRequest.Builder> subscriptionRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder() { + return Optional.empty(); + } + + + @Override protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) { return new ChannelInitializer() { @Override 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 5795a6f..de0e75d 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 @@ -43,6 +43,7 @@ import org.apache.plc4x.java.base.messages.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Optional; import java.util.concurrent.*; public abstract class AdsAbstractPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter, PlcProprietarySender { @@ -106,8 +107,23 @@ public abstract class AdsAbstractPlcConnection extends AbstractPlcConnection imp } @Override - public PlcReadRequest.Builder readRequestBuilder() { - return new DefaultPlcReadRequest.Builder(this, new AdsPlcFieldHandler()); + public Optional<PlcReadRequest.Builder> readRequestBuilder() { + return Optional.of(new DefaultPlcReadRequest.Builder(this, new AdsPlcFieldHandler())); + } + + @Override + public Optional<PlcWriteRequest.Builder> writeRequestBuilder() { + return Optional.of(new DefaultPlcWriteRequest.Builder(this, new AdsPlcFieldHandler())); + } + + @Override + public Optional<PlcSubscriptionRequest.Builder> subscriptionRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder() { + return Optional.empty(); } @Override @@ -125,13 +141,8 @@ public abstract class AdsAbstractPlcConnection extends AbstractPlcConnection imp } @Override - public PlcWriteRequest.Builder writeRequestBuilder() { - return new DefaultPlcWriteRequest.Builder(this, new AdsPlcFieldHandler()); - } - - @Override - public <PROP_RESPONSE> CompletableFuture<PlcProprietaryResponse<PROP_RESPONSE>> send(PlcProprietaryRequest proprietaryRequest) { - CompletableFuture<InternalPlcProprietaryResponse<PROP_RESPONSE>> sendFuture = new CompletableFuture<>(); + public <T> CompletableFuture<PlcProprietaryResponse<T>> send(PlcProprietaryRequest proprietaryRequest) { + CompletableFuture<InternalPlcProprietaryResponse<T>> sendFuture = new CompletableFuture<>(); ChannelFuture channelFuture = channel.writeAndFlush(new PlcRequestContainer<>((InternalPlcProprietaryRequest) proprietaryRequest, sendFuture)); channelFuture.addListener(future -> { if (!future.isSuccess()) { 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 cb2d00a..3d4c8ba 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 @@ -28,9 +28,12 @@ import org.apache.plc4x.java.ads.protocol.Ads2PayloadProtocol; import org.apache.plc4x.java.ads.protocol.Payload2SerialProtocol; import org.apache.plc4x.java.ads.protocol.Plc4x2AdsProtocol; import org.apache.plc4x.java.ads.protocol.util.SingleMessageRateLimiter; +import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest; +import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest; import org.apache.plc4x.java.base.connection.SerialChannelFactory; import org.apache.plc4x.java.base.protocol.SingleItemToSingleRequestProtocol; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public class AdsSerialPlcConnection extends AdsAbstractPlcConnection { 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 d88dee7..4d582e7 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 @@ -43,7 +43,6 @@ import org.apache.plc4x.java.api.model.PlcSubscriptionHandle; import org.apache.plc4x.java.api.types.PlcResponseCode; import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory; import org.apache.plc4x.java.base.messages.*; -import org.apache.plc4x.java.base.model.DefaultPlcConsumerRegistration; import org.apache.plc4x.java.base.model.InternalPlcConsumerRegistration; import org.apache.plc4x.java.base.model.InternalPlcSubscriptionHandle; import org.apache.plc4x.java.base.protocol.SingleItemToSingleRequestProtocol; @@ -53,7 +52,10 @@ import org.slf4j.LoggerFactory; import java.net.Inet4Address; import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; @@ -311,13 +313,13 @@ public class AdsTcpPlcConnection extends AdsAbstractPlcConnection implements Plc } @Override - public PlcSubscriptionRequest.Builder subscriptionRequestBuilder() { - return new DefaultPlcSubscriptionRequest.Builder(this, new AdsPlcFieldHandler()); + public Optional<PlcSubscriptionRequest.Builder> subscriptionRequestBuilder() { + return Optional.of(new DefaultPlcSubscriptionRequest.Builder(this, new AdsPlcFieldHandler())); } @Override - public PlcUnsubscriptionRequest.Builder unsubscriptionRequestBuilder() { - return new DefaultPlcUnsubscriptionRequest.Builder(this); + public Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder() { + return Optional.of(new DefaultPlcUnsubscriptionRequest.Builder(this)); } @Override diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ManualPlc4XAdsTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ManualPlc4XAdsTest.java index ad56e01..6e99861 100644 --- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ManualPlc4XAdsTest.java +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ManualPlc4XAdsTest.java @@ -45,7 +45,7 @@ public class ManualPlc4XAdsTest { PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found")); - PlcReadRequest readRequest = reader.readRequestBuilder().addItem("station", "Allgemein_S2.Station:BYTE").build(); + PlcReadRequest readRequest = plcConnection.readRequestBuilder().get().addItem("station", "Allgemein_S2.Station:BYTE").build(); CompletableFuture<PlcReadResponse> response = reader.read(readRequest); PlcReadResponse readResponse = response.get(); System.out.println("Response " + readResponse); @@ -54,7 +54,7 @@ public class ManualPlc4XAdsTest { PlcSubscriber plcSubscriber = plcConnection.getSubscriber().orElseThrow(() -> new RuntimeException("Subscribe not available")); - PlcSubscriptionRequest subscriptionRequest = plcSubscriber.subscriptionRequestBuilder().addChangeOfStateField("stationChange", "Allgemein_S2.Station:BYTE").build(); + PlcSubscriptionRequest subscriptionRequest = plcConnection.subscriptionRequestBuilder().get().addChangeOfStateField("stationChange", "Allgemein_S2.Station:BYTE").build(); CompletableFuture<PlcSubscriptionResponse> subscribeResponse = plcSubscriber.subscribe(subscriptionRequest); PlcSubscriptionResponse plcSubscriptionResponse = subscribeResponse.get(); @@ -63,7 +63,7 @@ public class ManualPlc4XAdsTest { TimeUnit.SECONDS.sleep(5); plcSubscriber.unregister(plcConsumerRegistration); - PlcUnsubscriptionRequest unsubscriptionRequest = plcSubscriber.unsubscriptionRequestBuilder().addHandles(plcSubscriptionResponse.getSubscriptionHandles()).build(); + PlcUnsubscriptionRequest unsubscriptionRequest = plcConnection.unsubscriptionRequestBuilder().get().addHandles(plcSubscriptionResponse.getSubscriptionHandles()).build(); CompletableFuture<PlcUnsubscriptionResponse> unsubscriptionResponse = plcSubscriber.unsubscribe(unsubscriptionRequest); unsubscriptionResponse 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 9b0a7f4..624e607 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 @@ -76,7 +76,7 @@ public class AdsSerialPlcConnectionTest { @Test public void testRead() throws Exception { prepareSerialSimulator(); - PlcReadRequest request = SUT.readRequestBuilder().addItem("test", "0/0:BYTE").build(); + PlcReadRequest request = SUT.readRequestBuilder().get().addItem("test", "0/0:BYTE").build(); CompletableFuture<PlcReadResponse> read = SUT.read(request); PlcReadResponse plcReadResponse = read.get(30, TimeUnit.SECONDS); assertNotNull(plcReadResponse); diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java index 3c64768..21d19d2 100644 --- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java +++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java @@ -19,8 +19,12 @@ under the License. package org.apache.plc4x.java.base.connection; import io.netty.channel.ChannelHandler; -import org.apache.plc4x.java.api.model.PlcField; +import org.apache.plc4x.java.api.messages.PlcReadRequest; +import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest; +import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest; +import org.apache.plc4x.java.api.messages.PlcWriteRequest; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public class MockConnection extends AbstractPlcConnection { @@ -34,6 +38,26 @@ public class MockConnection extends AbstractPlcConnection { } @Override + public Optional<PlcReadRequest.Builder> readRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcWriteRequest.Builder> writeRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcSubscriptionRequest.Builder> subscriptionRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder() { + return Optional.empty(); + } + + @Override protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) { return null; } diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java index ee81291..269b676 100644 --- a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java +++ b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java @@ -21,7 +21,10 @@ package org.apache.plc4x.java.ethernetip.connection; 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.messages.*; +import org.apache.plc4x.java.api.messages.PlcReadRequest; +import org.apache.plc4x.java.api.messages.PlcReadResponse; +import org.apache.plc4x.java.api.messages.PlcWriteRequest; +import org.apache.plc4x.java.api.messages.PlcWriteResponse; import org.apache.plc4x.java.base.connection.AbstractPlcConnection; import org.apache.plc4x.java.base.connection.ChannelFactory; import org.apache.plc4x.java.base.messages.*; @@ -29,6 +32,7 @@ import org.apache.plc4x.java.ethernetip.netty.util.EnipPlcFieldHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public abstract class BaseEtherNetIpPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter { @@ -56,8 +60,13 @@ public abstract class BaseEtherNetIpPlcConnection extends AbstractPlcConnection } @Override - public PlcReadRequest.Builder readRequestBuilder() { - return new DefaultPlcReadRequest.Builder(this, new EnipPlcFieldHandler()); + public Optional<PlcReadRequest.Builder> readRequestBuilder() { + return Optional.of(new DefaultPlcReadRequest.Builder(this, new EnipPlcFieldHandler())); + } + + @Override + public Optional<PlcWriteRequest.Builder> writeRequestBuilder() { + return Optional.of(new DefaultPlcWriteRequest.Builder(this, new EnipPlcFieldHandler())); } @Override @@ -75,11 +84,6 @@ public abstract class BaseEtherNetIpPlcConnection extends AbstractPlcConnection } @Override - public PlcWriteRequest.Builder writeRequestBuilder() { - return new DefaultPlcWriteRequest.Builder(this, new EnipPlcFieldHandler()); - } - - @Override public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) { CompletableFuture<InternalPlcWriteResponse> future = new CompletableFuture<>(); PlcRequestContainer<InternalPlcWriteRequest, InternalPlcWriteResponse> container = diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/EtherNetIpTcpPlcConnection.java b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/EtherNetIpTcpPlcConnection.java index e14ac19..3f0ed79 100644 --- a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/EtherNetIpTcpPlcConnection.java +++ b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/EtherNetIpTcpPlcConnection.java @@ -19,6 +19,8 @@ under the License. package org.apache.plc4x.java.ethernetip.connection; import io.netty.channel.*; +import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest; +import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest; import org.apache.plc4x.java.base.connection.ChannelFactory; import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory; import org.apache.plc4x.java.base.events.ConnectEvent; @@ -29,6 +31,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetAddress; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public class EtherNetIpTcpPlcConnection extends BaseEtherNetIpPlcConnection { @@ -53,6 +56,16 @@ public class EtherNetIpTcpPlcConnection extends BaseEtherNetIpPlcConnection { } @Override + public Optional<PlcSubscriptionRequest.Builder> subscriptionRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder() { + return Optional.empty(); + } + + @Override protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) { return new ChannelInitializer() { @Override diff --git a/plc4j/protocols/ethernetip/src/test/java/org/apache/plc4x/java/ethernetip/ManualPlc4XEtherNetIpTest.java b/plc4j/protocols/ethernetip/src/test/java/org/apache/plc4x/java/ethernetip/ManualPlc4XEtherNetIpTest.java index ba08d13..949eaeb 100644 --- a/plc4j/protocols/ethernetip/src/test/java/org/apache/plc4x/java/ethernetip/ManualPlc4XEtherNetIpTest.java +++ b/plc4j/protocols/ethernetip/src/test/java/org/apache/plc4x/java/ethernetip/ManualPlc4XEtherNetIpTest.java @@ -37,7 +37,7 @@ public class ManualPlc4XEtherNetIpTest { // Get a reader instance. PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found")); - PlcReadRequest readRequest = reader.readRequestBuilder() + PlcReadRequest readRequest = plcConnection.readRequestBuilder().get() .addItem("field", "#4#105#3").build(); // Execute the read operation. 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 68e38a2..69e99fd 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 @@ -21,10 +21,7 @@ package org.apache.plc4x.java.modbus.connection; 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.messages.PlcReadRequest; -import org.apache.plc4x.java.api.messages.PlcReadResponse; -import org.apache.plc4x.java.api.messages.PlcWriteRequest; -import org.apache.plc4x.java.api.messages.PlcWriteResponse; +import org.apache.plc4x.java.api.messages.*; import org.apache.plc4x.java.base.connection.AbstractPlcConnection; import org.apache.plc4x.java.base.connection.ChannelFactory; import org.apache.plc4x.java.base.messages.*; @@ -32,6 +29,7 @@ import org.apache.plc4x.java.modbus.util.ModbusPlcFieldHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public abstract class BaseModbusPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter { @@ -59,8 +57,23 @@ public abstract class BaseModbusPlcConnection extends AbstractPlcConnection impl } @Override - public PlcReadRequest.Builder readRequestBuilder() { - return new DefaultPlcReadRequest.Builder(this, new ModbusPlcFieldHandler()); + public Optional<PlcReadRequest.Builder> readRequestBuilder() { + return Optional.of(new DefaultPlcReadRequest.Builder(this, new ModbusPlcFieldHandler())); + } + + @Override + public Optional<PlcWriteRequest.Builder> writeRequestBuilder() { + return Optional.of(new DefaultPlcWriteRequest.Builder(this, new ModbusPlcFieldHandler())); + } + + @Override + public Optional<PlcSubscriptionRequest.Builder> subscriptionRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder() { + return Optional.empty(); } @Override @@ -78,11 +91,6 @@ public abstract class BaseModbusPlcConnection extends AbstractPlcConnection impl } @Override - public PlcWriteRequest.Builder writeRequestBuilder() { - return new DefaultPlcWriteRequest.Builder(this, new ModbusPlcFieldHandler()); - } - - @Override public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) { CompletableFuture<InternalPlcWriteResponse> future = new CompletableFuture<>(); PlcRequestContainer<InternalPlcWriteRequest, InternalPlcWriteResponse> container = diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java index 5e5be0c..8df399e 100644 --- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java +++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java @@ -24,6 +24,8 @@ import com.digitalpetri.modbus.codec.ModbusTcpCodec; import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelInitializer; +import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest; +import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest; import org.apache.plc4x.java.base.connection.ChannelFactory; import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory; import org.apache.plc4x.java.base.protocol.SingleItemToSingleRequestProtocol; @@ -32,6 +34,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetAddress; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public class ModbusTcpPlcConnection extends BaseModbusPlcConnection { diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java index 401c872..3f6c786 100644 --- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java +++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java @@ -52,7 +52,7 @@ public class ManualPlc4XModbusTest { { PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found")); - PlcReadRequest readRequest = reader.readRequestBuilder().addItem("randomRegister", "register:7[3]").build(); + PlcReadRequest readRequest = plcConnection.readRequestBuilder().get().addItem("randomRegister", "register:7[3]").build(); PlcReadResponse readResponse = reader.read(readRequest).get(); System.out.println("Response " + readResponse); readResponse.getAllByteArrays("randomRegister").stream() @@ -66,7 +66,7 @@ public class ManualPlc4XModbusTest { PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found")); // Just dump the actual values - PlcReadRequest readRequest = reader.readRequestBuilder().addItem("randomRegister", "register:3[2]").build(); + PlcReadRequest readRequest = plcConnection.readRequestBuilder().get().addItem("randomRegister", "register:3[2]").build(); PlcReadResponse readResponse = reader.read(readRequest).get(); System.out.println("Response " + readResponse); Collection<Byte[]> randomRegisters = readResponse.getAllByteArrays("randomRegister"); @@ -90,7 +90,7 @@ public class ManualPlc4XModbusTest { PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found")); // Just dump the actual values - PlcReadRequest readRequest = reader.readRequestBuilder() + PlcReadRequest readRequest = plcConnection.readRequestBuilder().get() .addItem("randomRegister1", "register:1[2]") .addItem("randomRegister2", "register:10[3]") .addItem("randomRegister3", "register:20[4]") @@ -120,7 +120,7 @@ public class ManualPlc4XModbusTest { { PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found")); - PlcReadRequest readRequest = reader.readRequestBuilder().addItem("randomCoil", "coil:1[9]").build(); + PlcReadRequest readRequest = plcConnection.readRequestBuilder().get().addItem("randomCoil", "coil:1[9]").build(); PlcReadResponse readResponse = reader.read(readRequest).get(); System.out.println("Response " + readResponse); readResponse.getAllBooleans("randomCoil").stream() @@ -131,7 +131,7 @@ public class ManualPlc4XModbusTest { { PlcWriter writer = plcConnection.getWriter().orElseThrow(() -> new RuntimeException("No Writer found")); - PlcWriteRequest writeRequest = writer.writeRequestBuilder().addItem("randomCoilField", "coil:1", true).build(); + PlcWriteRequest writeRequest = plcConnection.writeRequestBuilder().get().addItem("randomCoilField", "coil:1", true).build(); PlcWriteResponse writeResponse = writer.write(writeRequest).get(); System.out.println("Response " + writeResponse); } 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 519d4b9..1179ee0 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 @@ -66,7 +66,7 @@ public class ModbusSerialPlcConnectionTest { @Test public void testRead() throws Exception { prepareSerialSimulator(); - PlcReadRequest readRequest = SUT.readRequestBuilder().addItem("randomRead", "0/0").build(); + PlcReadRequest readRequest = SUT.readRequestBuilder().get().addItem("randomRead", "0/0").build(); CompletableFuture<PlcReadResponse> read = SUT.read(readRequest); PlcReadResponse plcReadResponse = read.get(30, TimeUnit.SECONDS); assertNotNull(plcReadResponse); 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 05c815a..090f803 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 @@ -25,10 +25,7 @@ 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.PlcConnectionException; -import org.apache.plc4x.java.api.messages.PlcReadRequest; -import org.apache.plc4x.java.api.messages.PlcReadResponse; -import org.apache.plc4x.java.api.messages.PlcWriteRequest; -import org.apache.plc4x.java.api.messages.PlcWriteResponse; +import org.apache.plc4x.java.api.messages.*; import org.apache.plc4x.java.base.connection.AbstractPlcConnection; import org.apache.plc4x.java.base.connection.ChannelFactory; import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory; @@ -51,6 +48,7 @@ import org.slf4j.LoggerFactory; import java.net.InetAddress; import java.util.Collections; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -237,8 +235,23 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader, } @Override - public PlcReadRequest.Builder readRequestBuilder() { - return new DefaultPlcReadRequest.Builder(this, new S7PlcFieldHandler()); + public Optional<PlcReadRequest.Builder> readRequestBuilder() { + return Optional.of(new DefaultPlcReadRequest.Builder(this, new S7PlcFieldHandler())); + } + + @Override + public Optional<PlcWriteRequest.Builder> writeRequestBuilder() { + return Optional.of(new DefaultPlcWriteRequest.Builder(this, new S7PlcFieldHandler())); + } + + @Override + public Optional<PlcSubscriptionRequest.Builder> subscriptionRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder() { + return Optional.empty(); } @Override @@ -256,11 +269,6 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader, } @Override - public PlcWriteRequest.Builder writeRequestBuilder() { - return new DefaultPlcWriteRequest.Builder(this, new S7PlcFieldHandler()); - } - - @Override public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) { CompletableFuture<InternalPlcWriteResponse> future = new CompletableFuture<>(); PlcRequestContainer<InternalPlcWriteRequest, InternalPlcWriteResponse> container = diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/issues/PLC4X47Test.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/issues/PLC4X47Test.java index 3683f83..100a677 100644 --- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/issues/PLC4X47Test.java +++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/issues/PLC4X47Test.java @@ -38,7 +38,7 @@ public class PLC4X47Test { EmbeddedChannel channel = channelFactory.getChannel();*/ S7PlcConnection connection = (S7PlcConnection) new PlcDriverManager().getConnection("s7://10.10.64.20/1/1"); - PlcReadRequest.Builder builder = connection.readRequestBuilder(); + PlcReadRequest.Builder builder = connection.readRequestBuilder().get(); for (int i = 1; i <= 30; i++) { // just the first byte of each db builder.addItem("field-" + i, "%DB3.DB" + i + ":SINT"); diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java index 1937676..68b1ba3 100644 --- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java +++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java @@ -20,13 +20,18 @@ package org.apache.plc4x.java.test; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import org.apache.plc4x.java.api.connection.*; +import org.apache.plc4x.java.api.connection.PlcConnection; +import org.apache.plc4x.java.api.connection.PlcReader; +import org.apache.plc4x.java.api.connection.PlcSubscriber; +import org.apache.plc4x.java.api.connection.PlcWriter; import org.apache.plc4x.java.api.messages.*; import org.apache.plc4x.java.api.types.PlcResponseCode; import org.apache.plc4x.java.base.messages.*; import org.apache.plc4x.java.base.messages.items.FieldItem; -import java.util.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import java.util.concurrent.CompletableFuture; /** @@ -72,8 +77,23 @@ class TestConnection implements PlcConnection, PlcReader, PlcWriter { } @Override - public PlcReadRequest.Builder readRequestBuilder() { - return new DefaultPlcReadRequest.Builder(this, new TestFieldHandler()); + public Optional<PlcReadRequest.Builder> readRequestBuilder() { + return Optional.of(new DefaultPlcReadRequest.Builder(this, new TestFieldHandler())); + } + + @Override + public Optional<PlcWriteRequest.Builder> writeRequestBuilder() { + return Optional.of(new DefaultPlcWriteRequest.Builder(this, new TestFieldHandler())); + } + + @Override + public Optional<PlcSubscriptionRequest.Builder> subscriptionRequestBuilder() { + return Optional.empty(); + } + + @Override + public Optional<PlcUnsubscriptionRequest.Builder> unsubscriptionRequestBuilder() { + return Optional.empty(); } @Override @@ -98,11 +118,6 @@ class TestConnection implements PlcConnection, PlcReader, PlcWriter { } @Override - public PlcWriteRequest.Builder writeRequestBuilder() { - return new DefaultPlcWriteRequest.Builder(this, new TestFieldHandler()); - } - - @Override public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) { if(!(writeRequest instanceof InternalPlcWriteRequest)) { throw new IllegalArgumentException("Read request doesn't implement InternalPlcWriteRequest");