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/09/13 09:43:36 UTC
[incubator-plc4x] 03/05: adjusted subscription api to new API
requirements
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch feature/api-redesign-chris-c
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
commit f16b6715002fafe85c521afc86fd7930c448b9d7
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Sep 13 10:59:48 2018 +0200
adjusted subscription api to new API requirements
---
.../java/api/messages/PlcSubscriptionRequest.java | 2 -
.../java/api/model/PlcSubscriptionHandle.java | 2 +-
.../base/connection/AbstractPlcConnection.java | 25 ++++++-
.../base/messages/DefaultPlcSubscriptionEvent.java | 6 ++
.../messages/DefaultPlcSubscriptionRequest.java | 76 ++++++++++++++++------
.../messages/DefaultPlcSubscriptionResponse.java | 28 ++++++--
.../messages/DefaultPlcUnsubscriptionRequest.java | 57 +++++++++++++++-
.../messages/InternalPlcSubscriptionRequest.java | 2 +
.../messages/InternalPlcUnsubscriptionRequest.java | 4 ++
.../base/model/DefaultPlcConsumerRegistration.java | 73 +++++++++++++++++++++
.../InternalPlcConsumerRegistration.java} | 9 ++-
.../InternalPlcSubscriptionHandle.java} | 8 +--
12 files changed, 251 insertions(+), 41 deletions(-)
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionRequest.java
index 77a124c..19cd66e 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionRequest.java
@@ -22,8 +22,6 @@ import java.time.Duration;
public interface PlcSubscriptionRequest extends PlcFieldRequest {
- PlcSubscriptionRequest.Builder builder();
-
interface Builder extends PlcMessageBuilder<PlcSubscriptionRequest> {
/**
* Adds a new field to the to be constructed request which should be polled cyclically.
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java
index f2fea40..d295e9e 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java
@@ -23,7 +23,7 @@ package org.apache.plc4x.java.api.model;
* different data is used to identify a subscription. This interface is
* to be implemented in the individual Driver implementations to contain
* all information needed to pull or unsubscribe any form of subscription.
- *
+ * <p>
* For every subscribed item, a separate {@link PlcSubscriptionHandle} object is
* returned in order to allow fine granular unsubscriptions.
*/
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
index bb1b11f..7c8ce2c 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
@@ -20,10 +20,14 @@ package org.apache.plc4x.java.base.connection;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
-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.exceptions.PlcConnectionException;
import org.apache.plc4x.java.api.exceptions.PlcIoException;
+import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@@ -101,7 +105,7 @@ public abstract class AbstractPlcConnection implements PlcConnection {
}
@Override
- public Optional<PlcReader>getReader() {
+ public Optional<PlcReader> getReader() {
if (this instanceof PlcReader) {
return Optional.of((PlcReader) this);
}
@@ -124,4 +128,21 @@ public abstract class AbstractPlcConnection implements PlcConnection {
return Optional.empty();
}
+ /**
+ * Can be used to check and cast a parameter to its required internal type (can be used for general type checking too).
+ *
+ * @param o the object to be checked against target {@code clazz}.
+ * @param clazz the expected {@code clazz}.
+ * @param <T> the type of the expected {@code clazz}.
+ * @return the cast type of {@code clazz}.
+ */
+ protected <T> T checkInternal(Object o, Class<T> clazz) {
+ Objects.requireNonNull(o);
+ Objects.requireNonNull(clazz);
+ if (!clazz.isInstance(o)) {
+ throw new IllegalArgumentException("illegal type " + o.getClass() + ". Expected " + clazz);
+ }
+ return clazz.cast(o);
+ }
+
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java
index ce5790f..dbfcd4c 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java
@@ -26,10 +26,16 @@ import org.apache.plc4x.java.api.types.PlcResponseCode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
+import java.util.Calendar;
import java.util.Collection;
public class DefaultPlcSubscriptionEvent implements InternalPlcSubscriptionEvent {
+
+ public DefaultPlcSubscriptionEvent(Calendar timeStamp, byte[] bytes) {
+ // TODO: move to instant
+ }
+
@Override
public int getNumberOfValues(String name) {
return 0;
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionRequest.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionRequest.java
index 2a50cc4..357dd8f 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionRequest.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionRequest.java
@@ -18,12 +18,17 @@ under the License.
*/
package org.apache.plc4x.java.base.messages;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.api.types.PlcSubscriptionType;
+import org.apache.plc4x.java.base.connection.PlcFieldHandler;
+import org.apache.plc4x.java.base.messages.items.FieldItem;
import java.time.Duration;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
+import java.util.*;
+import java.util.function.BiFunction;
public class DefaultPlcSubscriptionRequest implements InternalPlcSubscriptionRequest {
@@ -48,28 +53,59 @@ public class DefaultPlcSubscriptionRequest implements InternalPlcSubscriptionReq
}
@Override
- public Builder builder() {
- return new Builder() {
- @Override
- public Builder addCyclicField(String name, String fieldQuery, Duration pollingInterval) {
- return null;
- }
+ public PlcSubscriptionType getPlcSubscriptionType() {
+ return null;
+ }
- @Override
- public Builder addChangeOfStateField(String name, String fieldQuery) {
- return null;
- }
+ public static class Builder implements PlcSubscriptionRequest.Builder {
- @Override
- public Builder addEventField(String name, String fieldQuery) {
- return null;
- }
+ private final PlcFieldHandler fieldHandler;
+ private final Map<String, BuilderItem<Object>> fields;
+
+ public Builder(PlcFieldHandler fieldHandler) {
+ this.fieldHandler = fieldHandler;
+ fields = new TreeMap<>();
+ }
- @Override
- public PlcSubscriptionRequest build() {
- return null;
+ @Override
+ public PlcSubscriptionRequest.Builder addCyclicField(String name, String fieldQuery, Duration pollingInterval) {
+ return null;
+ }
+
+ @Override
+ public PlcSubscriptionRequest.Builder addChangeOfStateField(String name, String fieldQuery) {
+ return null;
+ }
+
+ @Override
+ public PlcSubscriptionRequest.Builder addEventField(String name, String fieldQuery) {
+ return null;
+ }
+
+ @Override
+ public PlcSubscriptionRequest build() {
+ LinkedHashMap<String, Pair<PlcField, FieldItem>> parsedFields = new LinkedHashMap<>();
+ fields.forEach((name, builderItem) -> {
+ // Compile the query string.
+ PlcField parsedField = fieldHandler.createField(builderItem.fieldQuery);
+ // Encode the payload.
+ // TODO: Depending on the field type, handle the FieldItem creation differently.
+ FieldItem fieldItem = builderItem.encoder.apply(parsedField, null);
+ parsedFields.put(name, new ImmutablePair<>(parsedField, fieldItem));
+ });
+ return new DefaultPlcSubscriptionRequest();
+ }
+
+ private static class BuilderItem<T> {
+ private final String fieldQuery;
+ private final BiFunction<PlcField, T[], FieldItem> encoder;
+
+ private BuilderItem(String fieldQuery, BiFunction<PlcField, T[], FieldItem> encoder) {
+ this.fieldQuery = fieldQuery;
+ this.encoder = encoder;
}
- };
+ }
+
}
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionResponse.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionResponse.java
index 0993c64..a8924e9 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionResponse.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionResponse.java
@@ -18,43 +18,59 @@
*/
package org.apache.plc4x.java.base.messages;
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.commons.lang3.tuple.Pair;
import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
import org.apache.plc4x.java.api.model.PlcField;
import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
import org.apache.plc4x.java.api.types.PlcResponseCode;
import java.util.Collection;
+import java.util.Map;
+import java.util.stream.Collectors;
public class DefaultPlcSubscriptionResponse implements InternalPlcSubscriptionResponse {
+ private final InternalPlcSubscriptionRequest request;
+
+ private final Map<String, Pair<PlcResponseCode, PlcSubscriptionHandle>> values;
+
+ public DefaultPlcSubscriptionResponse(InternalPlcSubscriptionRequest request, Map<String, Pair<PlcResponseCode, PlcSubscriptionHandle>> values) {
+ this.request = request;
+ this.values = values;
+ }
+
@Override
public PlcSubscriptionHandle getSubscriptionHandle(String name) {
- return null;
+ // TODO: add safety
+ return values.get(name).getValue();
}
@Override
public Collection<String> getFieldNames() {
- return null;
+ return values.keySet();
}
@Override
public PlcField getField(String name) {
- return null;
+ // TODO: or should subscription handle be a successor of PlcField?
+ throw new NotImplementedException("field access not implemented");
}
@Override
public PlcResponseCode getResponseCode(String name) {
- return null;
+ // TODO: add safety
+ return values.get(name).getKey();
}
@Override
public PlcSubscriptionRequest getRequest() {
- return null;
+ return request;
}
@Override
public Collection<PlcSubscriptionHandle> getSubscriptionHandles() {
- return null;
+ return values.values().stream().map(Pair::getValue).collect(Collectors.toList());
}
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcUnsubscriptionRequest.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcUnsubscriptionRequest.java
index 801a4d1..cfbf1e1 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcUnsubscriptionRequest.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcUnsubscriptionRequest.java
@@ -18,10 +18,17 @@
*/
package org.apache.plc4x.java.base.messages;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
+import org.apache.plc4x.java.base.connection.PlcFieldHandler;
+import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.model.InternalPlcSubscriptionHandle;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
+import java.util.*;
+import java.util.function.BiFunction;
public class DefaultPlcUnsubscriptionRequest implements InternalPlcUnsubscriptionRequest {
@@ -45,4 +52,50 @@ public class DefaultPlcUnsubscriptionRequest implements InternalPlcUnsubscriptio
return null;
}
+ @Override
+ public Collection<? extends InternalPlcSubscriptionHandle> getInternalPlcSubscriptionHandles() {
+ return null;
+ }
+
+ public static class Builder implements PlcUnsubscriptionRequest.Builder {
+
+ private final PlcFieldHandler fieldHandler;
+ private final Map<String, BuilderItem<Object>> fields;
+
+ public Builder(PlcFieldHandler fieldHandler) {
+ this.fieldHandler = fieldHandler;
+ fields = new TreeMap<>();
+ }
+
+ @Override
+ public PlcUnsubscriptionRequest.Builder addField(String name, PlcSubscriptionHandle handle) {
+ return null;
+ }
+
+ @Override
+ public PlcUnsubscriptionRequest build() {
+ LinkedHashMap<String, Pair<PlcField, FieldItem>> parsedFields = new LinkedHashMap<>();
+ fields.forEach((name, builderItem) -> {
+ // Compile the query string.
+ PlcField parsedField = fieldHandler.createField(builderItem.fieldQuery);
+ // Encode the payload.
+ // TODO: Depending on the field type, handle the FieldItem creation differently.
+ FieldItem fieldItem = builderItem.encoder.apply(parsedField, null);
+ parsedFields.put(name, new ImmutablePair<>(parsedField, fieldItem));
+ });
+ return new DefaultPlcUnsubscriptionRequest();
+ }
+
+ private static class BuilderItem<T> {
+ private final String fieldQuery;
+ private final BiFunction<PlcField, T[], FieldItem> encoder;
+
+ private BuilderItem(String fieldQuery, BiFunction<PlcField, T[], FieldItem> encoder) {
+ this.fieldQuery = fieldQuery;
+ this.encoder = encoder;
+ }
+ }
+
+ }
+
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcSubscriptionRequest.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcSubscriptionRequest.java
index ec912a3..7cd2167 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcSubscriptionRequest.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcSubscriptionRequest.java
@@ -19,8 +19,10 @@
package org.apache.plc4x.java.base.messages;
import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
+import org.apache.plc4x.java.api.types.PlcSubscriptionType;
public interface InternalPlcSubscriptionRequest extends PlcSubscriptionRequest {
+ PlcSubscriptionType getPlcSubscriptionType();
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcUnsubscriptionRequest.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcUnsubscriptionRequest.java
index 3bd3545..18b1ce5 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcUnsubscriptionRequest.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcUnsubscriptionRequest.java
@@ -19,7 +19,11 @@
package org.apache.plc4x.java.base.messages;
import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
+import org.apache.plc4x.java.base.model.InternalPlcSubscriptionHandle;
+
+import java.util.Collection;
public interface InternalPlcUnsubscriptionRequest extends PlcUnsubscriptionRequest {
+ Collection<? extends InternalPlcSubscriptionHandle> getInternalPlcSubscriptionHandles();
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/model/DefaultPlcConsumerRegistration.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/model/DefaultPlcConsumerRegistration.java
new file mode 100644
index 0000000..28583b3
--- /dev/null
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/model/DefaultPlcConsumerRegistration.java
@@ -0,0 +1,73 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+package org.apache.plc4x.java.base.model;
+
+import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Objects;
+import java.util.function.Consumer;
+
+public class DefaultPlcConsumerRegistration implements InternalPlcConsumerRegistration {
+
+ private final Collection<? extends InternalPlcSubscriptionHandle> handles;
+ private final int consumerHash;
+
+ public DefaultPlcConsumerRegistration(Consumer<PlcSubscriptionEvent> consumer, InternalPlcSubscriptionHandle... handles) {
+ consumerHash = Objects.requireNonNull(consumer).hashCode();
+ this.handles = Arrays.asList(Objects.requireNonNull(handles));
+ }
+
+ @Override
+ public int getConsumerHash() {
+ return consumerHash;
+ }
+
+ @Override
+ public Collection<? extends InternalPlcSubscriptionHandle> getAssociatedHandles() {
+ return handles;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof DefaultPlcConsumerRegistration)) {
+ return false;
+ }
+ DefaultPlcConsumerRegistration that = (DefaultPlcConsumerRegistration) o;
+ return consumerHash == that.consumerHash &&
+ Objects.equals(handles, that.handles);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(handles, consumerHash);
+ }
+
+ @Override
+ public String toString() {
+ return "DefaultPlcConsumerRegistration{" +
+ "handles=" + handles +
+ ", consumerHash=" + consumerHash +
+ '}';
+ }
+}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcSubscriptionRequest.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/model/InternalPlcConsumerRegistration.java
similarity index 70%
copy from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcSubscriptionRequest.java
copy to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/model/InternalPlcConsumerRegistration.java
index ec912a3..bddb889 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcSubscriptionRequest.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/model/InternalPlcConsumerRegistration.java
@@ -16,11 +16,14 @@
specific language governing permissions and limitations
under the License.
*/
-package org.apache.plc4x.java.base.messages;
+package org.apache.plc4x.java.base.model;
-import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
+import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
-public interface InternalPlcSubscriptionRequest extends PlcSubscriptionRequest {
+import java.util.Collection;
+public interface InternalPlcConsumerRegistration extends PlcConsumerRegistration {
+ int getConsumerHash();
+ Collection<? extends InternalPlcSubscriptionHandle> getAssociatedHandles();
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcSubscriptionRequest.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/model/InternalPlcSubscriptionHandle.java
similarity index 80%
copy from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcSubscriptionRequest.java
copy to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/model/InternalPlcSubscriptionHandle.java
index ec912a3..32e9000 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcSubscriptionRequest.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/model/InternalPlcSubscriptionHandle.java
@@ -16,11 +16,9 @@
specific language governing permissions and limitations
under the License.
*/
-package org.apache.plc4x.java.base.messages;
-
-import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
-
-public interface InternalPlcSubscriptionRequest extends PlcSubscriptionRequest {
+package org.apache.plc4x.java.base.model;
+import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
+public interface InternalPlcSubscriptionHandle extends PlcSubscriptionHandle {
}