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>.