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 +