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/01/11 14:40:20 UTC
[incubator-plc4x] 08/12: implement actual typesafety into
TypeSafePlc*
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
commit 9504a16cf17caf30bce9c16e4ce68546556cebe9
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Jan 11 14:57:00 2018 +0100
implement actual typesafety into TypeSafePlc*
---
.../plc4x/java/api/connection/PlcReader.java | 5 +--
.../plc4x/java/api/connection/PlcWriter.java | 3 +-
.../plc4x/java/api/messages/PlcReadResponse.java | 5 +--
.../plc4x/java/api/messages/PlcWriteResponse.java | 4 +--
.../messages/specific/TypeSafePlcReadRequest.java | 31 +++++++++++++-----
.../messages/specific/TypeSafePlcReadResponse.java | 38 ++++++++++++++++++----
.../messages/specific/TypeSafePlcWriteRequest.java | 22 ++++++++-----
.../specific/TypeSafePlcWriteResponse.java | 11 ++++---
8 files changed, 84 insertions(+), 35 deletions(-)
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 339540c..ecc0fa3 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
@@ -23,6 +23,7 @@ import org.apache.plc4x.java.api.messages.PlcReadResponse;
import org.apache.plc4x.java.api.messages.specific.TypeSafePlcReadRequest;
import org.apache.plc4x.java.api.messages.specific.TypeSafePlcReadResponse;
+import java.util.Objects;
import java.util.concurrent.CompletableFuture;
/**
@@ -45,9 +46,9 @@ public interface PlcReader {
* @param <T> type that is being requested.
* @return a {@link CompletableFuture} giving async access to the returned value.
*/
- @SuppressWarnings("unchecked")
default <T> CompletableFuture<TypeSafePlcReadResponse<T>> read(TypeSafePlcReadRequest<T> readRequest) {
- return (CompletableFuture<TypeSafePlcReadResponse<T>>) read((PlcReadRequest) readRequest);
+ Objects.requireNonNull(readRequest);
+ return read((PlcReadRequest) readRequest).thenApply(TypeSafePlcReadResponse::new);
}
}
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 cf1140a..adb81a4 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
@@ -21,6 +21,7 @@ package org.apache.plc4x.java.api.connection;
import org.apache.plc4x.java.api.messages.PlcWriteRequest;
import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.api.messages.specific.TypeSafePlcReadResponse;
import org.apache.plc4x.java.api.messages.specific.TypeSafePlcWriteRequest;
import org.apache.plc4x.java.api.messages.specific.TypeSafePlcWriteResponse;
@@ -48,7 +49,7 @@ public interface PlcWriter {
*/
@SuppressWarnings("unchecked")
default <T> CompletableFuture<TypeSafePlcWriteResponse<T>> write(TypeSafePlcWriteRequest<T> writeRequest) {
- return (CompletableFuture<TypeSafePlcWriteResponse<T>>) write((PlcWriteRequest) writeRequest);
+ return write((PlcWriteRequest) writeRequest).thenApply(TypeSafePlcWriteResponse::new);
}
}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
index 2bfd942..c0cd8c4 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
@@ -28,14 +28,15 @@ import java.util.Optional;
public class PlcReadResponse implements PlcResponse {
private final PlcReadRequest request;
- private final List<ReadResponseItem<?>> responseItems;
+
+ private final List<? extends ReadResponseItem<?>> responseItems;
public PlcReadResponse(PlcReadRequest request, ReadResponseItem<?> responseItems) {
this.request = request;
this.responseItems = Collections.singletonList(responseItems);
}
- public PlcReadResponse(PlcReadRequest request, List<ReadResponseItem<?>> responseItems) {
+ public PlcReadResponse(PlcReadRequest request, List<? extends ReadResponseItem<?>> responseItems) {
this.request = request;
this.responseItems = responseItems;
}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
index 1bc7b83..ac80b78 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
@@ -29,14 +29,14 @@ public class PlcWriteResponse implements PlcResponse {
private final PlcWriteRequest request;
- private final List<WriteResponseItem<?>> responseItems;
+ private final List<? extends WriteResponseItem<?>> responseItems;
public PlcWriteResponse(PlcWriteRequest request, WriteResponseItem<?> responseItem) {
this.request = request;
this.responseItems = Collections.singletonList(responseItem);
}
- public PlcWriteResponse(PlcWriteRequest request, List<WriteResponseItem<?>> responseItems) {
+ public PlcWriteResponse(PlcWriteRequest request, List<? extends WriteResponseItem<?>> responseItems) {
this.request = request;
this.responseItems = responseItems;
}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadRequest.java
index 9739022..5c21a07 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadRequest.java
@@ -23,18 +23,22 @@ import org.apache.plc4x.java.api.messages.items.ReadRequestItem;
import org.apache.plc4x.java.api.model.Address;
import java.util.List;
+import java.util.Objects;
import java.util.Optional;
public class TypeSafePlcReadRequest<T> extends PlcReadRequest {
- private Class<T> datatype;
+ private Class<T> dataType;
public TypeSafePlcReadRequest(Class<T> dataType) {
- this.datatype = dataType;
+ this.dataType = dataType;
}
- public TypeSafePlcReadRequest(Class<T> dataType, ReadRequestItem<T> readRequestItem) {
+ public TypeSafePlcReadRequest(Class<T> dataType, PlcReadRequest plcReadRequest) {
this(dataType);
+ for (ReadRequestItem<?> readRequestItem : plcReadRequest.getRequestItems()) {
+ addItem(readRequestItem);
+ }
}
public TypeSafePlcReadRequest(Class<T> dataType, Address address) {
@@ -47,13 +51,18 @@ public class TypeSafePlcReadRequest<T> extends PlcReadRequest {
addItem(new ReadRequestItem<>(dataType, address, size));
}
- @SuppressWarnings("unchecked")
- public void addItem(ReadRequestItem<?> readRequestItem) {
- if (readRequestItem == null) {
- return;
+ public TypeSafePlcReadRequest(Class<T> dataType, ReadRequestItem<T>... requestItems) {
+ this(dataType);
+ Objects.requireNonNull(requestItems);
+ for (ReadRequestItem<T> readRequestItem : requestItems) {
+ addItem(readRequestItem);
}
- if (readRequestItem.getDatatype() != datatype) {
- throw new IllegalArgumentException("Incompatible datatype " + readRequestItem.getDatatype());
+ }
+
+ public void addItem(ReadRequestItem<?> readRequestItem) {
+ Objects.requireNonNull(readRequestItem);
+ if (readRequestItem.getDatatype() != dataType) {
+ throw new IllegalArgumentException("Unexpected data type " + readRequestItem.getDatatype() + " on readRequestItem. Expected " + dataType);
}
super.addItem(readRequestItem);
}
@@ -68,4 +77,8 @@ public class TypeSafePlcReadRequest<T> extends PlcReadRequest {
public Optional<ReadRequestItem<T>> getRequestItem() {
return (Optional<ReadRequestItem<T>>) super.getRequestItem();
}
+
+ public Class<T> getDataType() {
+ return dataType;
+ }
}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadResponse.java
index f76271a..616d581 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadResponse.java
@@ -26,15 +26,33 @@ import java.util.Optional;
public class TypeSafePlcReadResponse<T> extends PlcReadResponse {
+ public TypeSafePlcReadResponse(PlcReadResponse plcReadResponse) {
+ super(plcReadResponse.getRequest(), plcReadResponse.getResponseItems());
+ List<? extends ReadResponseItem<?>> responseItems = plcReadResponse.getResponseItems();
+ Class type = null;
+ for (ReadResponseItem<?> responseItem : responseItems) {
+ if (responseItem.getValues().size() > 0) {
+ type = responseItem.getValues().get(0).getClass();
+ break;
+ }
+ }
+ if (type != null) {
+ for (ReadResponseItem<?> responseItem : responseItems) {
+ checkList(responseItem.getValues(), type);
+ }
+ }
+ }
+
public TypeSafePlcReadResponse(TypeSafePlcReadRequest<T> request, ReadResponseItem<T> responseItem) {
- // TODO: use checked list.
super(request, responseItem);
+ checkList(responseItem.getValues(), request.getDataType());
}
- @SuppressWarnings("unchecked")
public TypeSafePlcReadResponse(TypeSafePlcReadRequest<T> request, List<ReadResponseItem<T>> responseItems) {
- // TODO: use checked list.
- super(request, (List) responseItems);
+ super(request, responseItems);
+ for (ReadResponseItem<T> responseItem : responseItems) {
+ checkList(responseItem.getValues(), request.getDataType());
+ }
}
@SuppressWarnings("unchecked")
@@ -43,8 +61,8 @@ public class TypeSafePlcReadResponse<T> extends PlcReadResponse {
}
@SuppressWarnings("unchecked")
- public List<ReadResponseItem<T>> getResponseItems() {
- return (List<ReadResponseItem<T>>) super.getResponseItems();
+ public List<? extends ReadResponseItem<T>> getResponseItems() {
+ return (List<? extends ReadResponseItem<T>>) super.getResponseItems();
}
@SuppressWarnings("unchecked")
@@ -52,4 +70,12 @@ public class TypeSafePlcReadResponse<T> extends PlcReadResponse {
public Optional<ReadResponseItem<T>> getResponseItem() {
return (Optional<ReadResponseItem<T>>) super.getResponseItem();
}
+
+ private static void checkList(List<?> list, Class<?> type) {
+ for (Object o : list) {
+ if (!type.isAssignableFrom(o.getClass())) {
+ throw new IllegalArgumentException("Unexpected data type " + o.getClass() + " on readRequestItem. Expected " + type);
+ }
+ }
+ }
}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteRequest.java
index 2ebf88f..b05e500 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteRequest.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.java.api.messages.items.WriteRequestItem;
import org.apache.plc4x.java.api.model.Address;
import java.util.List;
+import java.util.Objects;
import java.util.Optional;
public class TypeSafePlcWriteRequest<T> extends PlcWriteRequest {
@@ -33,26 +34,29 @@ public class TypeSafePlcWriteRequest<T> extends PlcWriteRequest {
this.datatype = type;
}
- public TypeSafePlcWriteRequest(Class<T> dataType, Address address, T... values) {
+ public TypeSafePlcWriteRequest(Class<T> dataType, PlcWriteRequest plcWriteRequest) {
this(dataType);
- addItem(new WriteRequestItem<>(dataType, address, values));
+ for (WriteRequestItem<?> WriteRequestItem : plcWriteRequest.getRequestItems()) {
+ addItem(WriteRequestItem);
+ }
}
- public TypeSafePlcWriteRequest(Class<T> dataType, WriteRequestItem<T> requestItem) {
+ public TypeSafePlcWriteRequest(Class<T> dataType, Address address, T... values) {
this(dataType);
- this.getRequestItems().add(requestItem);
+ addItem(new WriteRequestItem<>(dataType, address, values));
}
- public TypeSafePlcWriteRequest(Class<T> dataType, List<WriteRequestItem<T>> requestItems) {
+ public TypeSafePlcWriteRequest(Class<T> dataType, WriteRequestItem<T>... requestItems) {
this(dataType);
- this.getRequestItems().addAll(requestItems);
+ Objects.requireNonNull(requestItems);
+ for (WriteRequestItem<T> requestItem : requestItems) {
+ getRequestItems().add(requestItem);
+ }
}
@SuppressWarnings("unchecked")
public void addItem(WriteRequestItem<?> writeRequestItem) {
- if (writeRequestItem == null) {
- return;
- }
+ Objects.requireNonNull(writeRequestItem);
if (writeRequestItem.getDatatype() != datatype) {
throw new IllegalArgumentException("Incompatible datatype " + writeRequestItem.getDatatype());
}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteResponse.java
index fa485cf..b02cd0b 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteResponse.java
@@ -26,22 +26,25 @@ import java.util.Optional;
public class TypeSafePlcWriteResponse<T> extends PlcWriteResponse {
+ public TypeSafePlcWriteResponse(PlcWriteResponse plcWriteResponse) {
+ super(plcWriteResponse.getRequest(), plcWriteResponse.getResponseItems());
+ }
+
public TypeSafePlcWriteResponse(TypeSafePlcWriteRequest<T> request, WriteResponseItem<T> responseItem) {
- // TODO: use checked type.
super(request, responseItem);
}
@SuppressWarnings("unchecked")
public TypeSafePlcWriteResponse(TypeSafePlcWriteRequest<T> request, List<WriteResponseItem<T>> responseItems) {
- // TODO: use checked list.
- super(request, (List) responseItems);
+ super(request, responseItems);
}
public TypeSafePlcWriteRequest<T> getRequest() {
return (TypeSafePlcWriteRequest<T>) super.getRequest();
}
- public List<WriteResponseItem<T>> getResponseItems() {
+ @SuppressWarnings("unchecked")
+ public List<? extends WriteResponseItem<T>> getResponseItems() {
return (List<WriteResponseItem<T>>) super.getResponseItems();
}
--
To stop receiving notification emails like this one, please contact
"commits@plc4x.apache.org" <co...@plc4x.apache.org>.