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/10/26 17:20:25 UTC

[incubator-plc4x] branch master updated: [plc4j-opm] fixed build, fixed some issues and added some tests.

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


The following commit(s) were added to refs/heads/master by this push:
     new 4ad765e  [plc4j-opm] fixed build, fixed some issues and added some tests.
4ad765e is described below

commit 4ad765e3d7328526a8bbfe7b5918645be74ca603
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Oct 26 19:18:00 2018 +0200

    [plc4j-opm] fixed build, fixed some issues and added some tests.
---
 plc4j/utils/opm/pom.xml                            |   8 +-
 .../apache/plc4x/java/opm/PlcEntityManager.java    |  69 +++++++++--
 .../plc4x/java/opm/PlcEntityManagerTest.java       | 127 ++++++++++++---------
 3 files changed, 141 insertions(+), 63 deletions(-)

diff --git a/plc4j/utils/opm/pom.xml b/plc4j/utils/opm/pom.xml
index 530a23a..7c289b3 100644
--- a/plc4j/utils/opm/pom.xml
+++ b/plc4j/utils/opm/pom.xml
@@ -46,11 +46,17 @@
       <artifactId>plc4j-core</artifactId>
       <version>${project.version}</version>
     </dependency>
+
+    <!-- Utils -->
     <dependency>
       <groupId>net.bytebuddy</groupId>
       <artifactId>byte-buddy</artifactId>
       <version>1.8.15</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
 
     <!--Testing-->
     <dependency>
@@ -66,7 +72,7 @@
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-protocol-driver-base</artifactId>
-      <version>0.0.1-SNAPSHOT</version>
+      <version>0.2.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
index 8c11042..59e6300 100644
--- a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
@@ -22,6 +22,7 @@ package org.apache.plc4x.java.opm;
 import net.bytebuddy.ByteBuddy;
 import net.bytebuddy.implementation.MethodDelegation;
 import net.bytebuddy.implementation.bind.annotation.*;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
@@ -35,6 +36,11 @@ import org.slf4j.LoggerFactory;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -332,22 +338,66 @@ public class PlcEntityManager {
     }
 
     private Object getTyped(Class<?> clazz, PlcReadResponse response, String fieldName) {
+        Object responseObject = response.getObject(fieldName);
+        if (responseObject == null) {
+            // TODO: shall we better throw an exception or is object never null?
+            return null;
+        }
         if (clazz.isPrimitive()) {
-            if (clazz == byte.class) {
+            if (clazz == boolean.class) {
+                return response.getBoolean(fieldName);
+            } else if (clazz == byte.class) {
                 return response.getByte(fieldName);
+            } else if (clazz == short.class) {
+                return response.getShort(fieldName);
             } else if (clazz == int.class) {
                 return response.getInteger(fieldName);
             } else if (clazz == long.class) {
                 return response.getLong(fieldName);
-            } else if (clazz == short.class) {
-                return response.getShort(fieldName);
             }
-            // TODO this should fail on Short, Integer, ... because it always gets a Long
-        } else if (clazz.isAssignableFrom(response.getObject(fieldName).getClass())) {
-            return response.getObject(fieldName);
         }
+
+        if (clazz == Boolean.class) {
+            return response.getBoolean(fieldName);
+        } else if (clazz == Byte.class) {
+            return response.getByte(fieldName);
+        } else if (clazz == Short.class) {
+            return response.getShort(fieldName);
+        } else if (clazz == Integer.class) {
+            return response.getInteger(fieldName);
+        } else if (clazz == Long.class) {
+            return response.getLong(fieldName);
+        } else if (clazz == BigInteger.class) {
+            return response.getBigInteger(fieldName);
+        } else if (clazz == Float.class) {
+            return response.getFloat(fieldName);
+        } else if (clazz == Double.class) {
+            return response.getDouble(fieldName);
+        } else if (clazz == BigDecimal.class) {
+            return response.getBigDecimal(fieldName);
+        } else if (clazz == String.class) {
+            return response.getString(fieldName);
+        } else if (clazz == LocalTime.class) {
+            // TODO: where are the methods for this?
+            throw new UnsupportedOperationException("no supported yet for " + clazz);
+        } else if (clazz == LocalDate.class) {
+            // TODO: where are the methods for this?
+            throw new UnsupportedOperationException("no supported yet for " + clazz);
+        } else if (clazz == LocalDateTime.class) {
+            // TODO: where are the methods for this?
+            throw new UnsupportedOperationException("no supported yet for " + clazz);
+        } else if (clazz == byte[].class) {
+            return ArrayUtils.toPrimitive(response.getByteArray(fieldName));
+        } else if (clazz == Byte[].class) {
+            return response.getByteArray(fieldName);
+        }
+
+        if (clazz.isAssignableFrom(responseObject.getClass())) {
+            return responseObject;
+        }
+
         // If nothing matched, throw
-        throw new ClassCastException("Unable to return response item " + response.getObject(fieldName) + " as instance of " + clazz);
+        throw new ClassCastException("Unable to return response item " + responseObject + "(" + responseObject.getClass() + ") as instance of " + clazz);
     }
 
     /**
@@ -358,16 +408,15 @@ public class PlcEntityManager {
      * @throws OPMException
      */
     private PlcReadResponse getPlcReadResponse(PlcReadRequest request) throws OPMException {
-        PlcReadResponse response;
         try {
-            response = request.execute().get();
+            // TODO: add configurable timeout
+            return request.execute().get();
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
             throw new OPMException("Exception during execution", e);
         } catch (ExecutionException e) {
             throw new OPMException("Exception during execution", e);
         }
-        return response;
     }
 
 }
diff --git a/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java
index 341984a..dea046e 100644
--- a/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java
+++ b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java
@@ -19,26 +19,34 @@
 
 package org.apache.plc4x.java.opm;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.connection.PlcFieldHandler;
-import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
-import org.apache.plc4x.java.base.messages.items.DefaultStringFieldItem;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.DefaultPlcReadRequest;
+import org.apache.plc4x.java.base.messages.DefaultPlcReadResponse;
+import org.apache.plc4x.java.base.messages.InternalPlcReadRequest;
+import org.apache.plc4x.java.base.messages.PlcReader;
+import org.apache.plc4x.java.base.messages.items.*;
 import org.junit.Assert;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.ArgumentMatchers;
 import org.mockito.Mockito;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
 
+
 public class PlcEntityManagerTest {
 
     private PlcDriverManager driverManager;
@@ -57,11 +65,9 @@ public class PlcEntityManagerTest {
         manager.read(EntityWithBadConstructor.class);
     }
 
-    // TODO
-    @Ignore
     @Test
     public void read() throws OPMException, PlcConnectionException {
-        Map<String, FieldItem> results = new HashMap<>();
+        Map<String, BaseDefaultFieldItem> results = new HashMap<>();
         results.put("counter", new DefaultIntegerFieldItem(1));
         results.put("counter2", new DefaultIntegerFieldItem(1));
         PlcEntityManager manager = getPlcEntityManager(results);
@@ -72,16 +78,15 @@ public class PlcEntityManagerTest {
         assertEquals(1, myEntity.getCounter2());
     }
 
-    // TODO
-    @Ignore
     @Test
     public void readComplexObject() throws PlcConnectionException, OPMException {
-        Map<String, FieldItem> map = new HashMap<>();
-        map.put("byteVar", new DefaultIntegerFieldItem(1));
-        map.put("shortVar", new DefaultIntegerFieldItem(1));
+        Map<String, BaseDefaultFieldItem> map = new HashMap<>();
+        map.put("boolVar", new DefaultBooleanFieldItem(true));
+        map.put("byteVar", new DefaultByteFieldItem((byte) 1));
+        map.put("shortVar", new DefaultShortFieldItem((short) 1));
         map.put("intVar", new DefaultIntegerFieldItem(1));
-        map.put("longVar", new DefaultIntegerFieldItem(1));
-        map.put("boxedLongVar", new DefaultIntegerFieldItem(1));
+        map.put("longVar", new DefaultLongFieldItem(1l));
+        map.put("boxedLongVar", new DefaultLongFieldItem(1L));
         map.put("stringVar", new DefaultStringFieldItem("Hallo"));
         PlcEntityManager manager = getPlcEntityManager(map);
 
@@ -92,19 +97,18 @@ public class PlcEntityManagerTest {
         // Call different mehtod
         String s = connect.toString();
 
-        assertEquals("ConnectedEntity{byteVar=1, shortVar=1, intVar=1, longVar=1, boxedLongVar=1, stringVar='Hallo'}", s);
+        assertEquals("ConnectedEntity{boolVar=true, byteVar=1, shortVar=1, intVar=1, longVar=1, boxedLongVar=1, stringVar='Hallo'}", s);
     }
 
-    // TODO
-    @Ignore
     @Test
     public void connec_callComplexMethodt() throws PlcConnectionException, OPMException {
-        Map<String, FieldItem> map = new HashMap<>();
-        map.put("byteVar", new DefaultIntegerFieldItem(1));
-        map.put("shortVar", new DefaultIntegerFieldItem(1));
+        Map<String, BaseDefaultFieldItem> map = new HashMap<>();
+        map.put("boolVar", new DefaultBooleanFieldItem(true));
+        map.put("byteVar", new DefaultByteFieldItem((byte) 1));
+        map.put("shortVar", new DefaultShortFieldItem((short) 1));
         map.put("intVar", new DefaultIntegerFieldItem(1));
-        map.put("longVar", new DefaultIntegerFieldItem(1));
-        map.put("boxedLongVar", new DefaultIntegerFieldItem(1));
+        map.put("longVar", new DefaultLongFieldItem(1l));
+        map.put("boxedLongVar", new DefaultLongFieldItem(1L));
         map.put("stringVar", new DefaultStringFieldItem("Hallo"));
         PlcEntityManager manager = getPlcEntityManager(map);
 
@@ -115,14 +119,12 @@ public class PlcEntityManagerTest {
         // Call different mehtod
         String s = connect.toString();
 
-        assertEquals("ConnectedEntity{byteVar=1, shortVar=1, intVar=1, longVar=1, boxedLongVar=1, stringVar='Hallo'}", s);
+        assertEquals("ConnectedEntity{boolVar=true, byteVar=1, shortVar=1, intVar=1, longVar=1, boxedLongVar=1, stringVar='Hallo'}", s);
     }
 
-    // TODO
-    @Ignore
     @Test
     public void connect_callGetter() throws PlcConnectionException, OPMException {
-        Map<String, FieldItem> map = new HashMap<>();
+        Map<String, BaseDefaultFieldItem> map = new HashMap<>();
         map.put("getIntVar", new DefaultIntegerFieldItem(1));
         map.put("getStringVar", new DefaultStringFieldItem("Hello"));
         PlcEntityManager manager = getPlcEntityManager(map);
@@ -136,30 +138,38 @@ public class PlcEntityManagerTest {
         assertEquals("Hello", connect.getStringVar());
     }
 
-    private PlcEntityManager getPlcEntityManager(final Map<String, FieldItem> responses) throws PlcConnectionException {
+    private PlcEntityManager getPlcEntityManager(final Map<String, BaseDefaultFieldItem> responses) throws PlcConnectionException {
         driverManager = Mockito.mock(PlcDriverManager.class);
         PlcDriverManager mock = driverManager;
         PlcConnection connection = Mockito.mock(PlcConnection.class);
         when(mock.getConnection(ArgumentMatchers.anyString())).thenReturn(connection);
+        when(connection.getMetadata()).thenReturn(new PlcConnectionMetadata() {
+
+            @Override
+            public boolean canRead() {
+                return true;
+            }
 
-        // TODO: fix this
-        /*PlcReader reader = new PlcReader() {
             @Override
-            public CompletableFuture<PlcReadResponse<?>> read(PlcReadRequest readRequest) {
-                Map<String, Pair<PlcResponseCode, FieldItem>> map = readRequest.getFieldNames().stream()
-                    .collect(Collectors.toMap(
-                        Function.identity(),
-                        s -> Pair.of(PlcResponseCode.OK, responses.get(s))
-                    ));
-                return CompletableFuture.completedFuture(new DefaultPlcReadResponse(((InternalPlcReadRequest) readRequest), map));
+            public boolean canWrite() {
+                return true;
             }
 
             @Override
-            public PlcReadRequest.Builder readRequestBuilder() {
-                return new DefaultPlcReadRequest.Builder(getFieldHandler());
+            public boolean canSubscribe() {
+                return true;
             }
+        });
+
+        PlcReader reader = readRequest -> {
+            Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> map = readRequest.getFieldNames().stream()
+                .collect(Collectors.toMap(
+                    Function.identity(),
+                    s -> Pair.of(PlcResponseCode.OK, responses.get(s))
+                ));
+            return CompletableFuture.completedFuture(new DefaultPlcReadResponse(((InternalPlcReadRequest) readRequest), map));
         };
-        when(connection.getReader()).thenReturn(Optional.of(reader));*/
+        when(connection.readRequestBuilder()).thenReturn(new DefaultPlcReadRequest.Builder(reader, getFieldHandler()));
 
         return new PlcEntityManager(mock);
     }
@@ -176,62 +186,72 @@ public class PlcEntityManagerTest {
         }
 
         @Override
-        public FieldItem encodeBoolean(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeBoolean(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+            return null;
+        }
+
+        @Override
+        public BaseDefaultFieldItem encodeByte(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+            return null;
+        }
+
+        @Override
+        public BaseDefaultFieldItem encodeShort(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeByte(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeInteger(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeShort(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeBigInteger(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeInteger(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeLong(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeBigInteger(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeFloat(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeLong(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeBigDecimal(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeFloat(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeDouble(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeDouble(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeString(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeString(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeTime(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeTime(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeDate(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeDate(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeDateTime(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
 
         @Override
-        public FieldItem encodeDateTime(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
+        public BaseDefaultFieldItem encodeByteArray(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             return null;
         }
     }
@@ -277,6 +297,8 @@ public class PlcEntityManagerTest {
     @PlcEntity("s7://localhost:5555/0/0")
     public static class ConnectedEntity {
 
+        @PlcField("%DB1.DW111:BOOL")
+        private boolean boolVar;
         @PlcField("%DB1.DW111:BYTE")
         private byte byteVar;
         @PlcField("%DB1.DW111:SHORT")
@@ -326,7 +348,8 @@ public class PlcEntityManagerTest {
         @Override
         public String toString() {
             return "ConnectedEntity{" +
-                "byteVar=" + byteVar +
+                "boolVar=" + boolVar +
+                ", byteVar=" + byteVar +
                 ", shortVar=" + shortVar +
                 ", intVar=" + intVar +
                 ", longVar=" + longVar +