JulianFeinauer closed pull request #21: Made PlcInvalidFieldException.java 
checked.
URL: https://github.com/apache/incubator-plc4x/pull/21
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git 
a/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSinkTask.java
 
b/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSinkTask.java
index 648a32e4a..83c75ac25 100644
--- 
a/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSinkTask.java
+++ 
b/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSinkTask.java
@@ -26,6 +26,8 @@ Licensed to the Apache Software Foundation (ASF) under one
 import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.connection.PlcWriter;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.api.exceptions.UncheckedPlcInvalidFieldException;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.kafka.util.VersionUtil;
 
@@ -66,7 +68,13 @@ public void put(Collection<SinkRecord> records) {
             String query = record.key().toString();
             Object value = record.value();
             PlcWriteRequest.Builder builder = plcWriter.writeRequestBuilder();
-            PlcWriteRequest plcRequest = addToBuilder(builder, query, 
value).build();
+            PlcWriteRequest plcRequest = null;
+            try {
+                plcRequest = addToBuilder(builder, query, value).build();
+            } catch (PlcInvalidFieldException e) {
+                // TODO How should this be handled?
+                throw new UncheckedPlcInvalidFieldException(e);
+            }
             doWrite(plcRequest);
         }
     }
diff --git 
a/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSourceTask.java
 
b/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSourceTask.java
index 7d0ed8621..fd29dbc3e 100644
--- 
a/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSourceTask.java
+++ 
b/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/Plc4xSourceTask.java
@@ -29,6 +29,8 @@ Licensed to the Apache Software Foundation (ASF) under one
 import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.connection.PlcReader;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.api.exceptions.UncheckedPlcInvalidFieldException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
@@ -93,7 +95,12 @@ public void start(Map<String, String> props) {
         for (String query : queries) {
             builder.addItem(query, query);
         }
-        plcRequest = builder.build();
+        try {
+            plcRequest = builder.build();
+        } catch (PlcInvalidFieldException e) {
+            // TODO how should this be handled?
+            throw new UncheckedPlcInvalidFieldException(e);
+        }
 
         int rate = 
Integer.valueOf(props.get(Plc4xSourceConnector.RATE_CONFIG));
         scheduler = Executors.newScheduledThreadPool(1);
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 d32640963..5aabbf031 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
@@ -18,6 +18,7 @@ Licensed to the Apache Software Foundation (ASF) under one
 */
 package org.apache.plc4x.java.api.connection;
 
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 
@@ -43,7 +44,7 @@ Licensed to the Apache Software Foundation (ASF) under one
      * @param readRequestBuilderConsumer consumer which can be used to build 
requests.
      * @return a {@link CompletableFuture} giving async access to the returned 
value.
      */
-    default CompletableFuture<PlcReadResponse<?>> 
read(Consumer<PlcReadRequest.Builder> readRequestBuilderConsumer) {
+    default CompletableFuture<PlcReadResponse<?>> 
read(Consumer<PlcReadRequest.Builder> readRequestBuilderConsumer) throws 
PlcInvalidFieldException {
         PlcReadRequest.Builder requestBuilder = readRequestBuilder();
         readRequestBuilderConsumer.accept(requestBuilder);
         return read(requestBuilder.build());
diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcSubscriber.java
 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcSubscriber.java
index 0581bd690..17cecd91d 100644
--- 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcSubscriber.java
+++ 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcSubscriber.java
@@ -18,6 +18,7 @@ Licensed to the Apache Software Foundation (ASF) under one
  */
 package org.apache.plc4x.java.api.connection;
 
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
 import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
@@ -47,7 +48,7 @@ Licensed to the Apache Software Foundation (ASF) under one
      * @param plcSubscriptionRequestBuilderConsumer consumer which can be used 
to build requests.
      * @return subscription response containing a subscription response item 
for each subscription request item.
      */
-    default CompletableFuture<PlcSubscriptionResponse> 
subscribe(Consumer<PlcSubscriptionRequest.Builder> 
plcSubscriptionRequestBuilderConsumer) {
+    default CompletableFuture<PlcSubscriptionResponse> 
subscribe(Consumer<PlcSubscriptionRequest.Builder> 
plcSubscriptionRequestBuilderConsumer) throws PlcInvalidFieldException {
         PlcSubscriptionRequest.Builder builder = subscriptionRequestBuilder();
         plcSubscriptionRequestBuilderConsumer.accept(builder);
         return subscribe(builder.build());
@@ -69,7 +70,7 @@ Licensed to the Apache Software Foundation (ASF) under one
      * @param plcSubscriptionRequestBuilderConsumer consumer which can be used 
to build requests.
      * @return unsubscription response containing a unsubscription response 
item for each unsubscription request item.
      */
-    default CompletableFuture<PlcUnsubscriptionResponse> 
unsubscribe(Consumer<PlcUnsubscriptionRequest.Builder> 
plcSubscriptionRequestBuilderConsumer) {
+    default CompletableFuture<PlcUnsubscriptionResponse> 
unsubscribe(Consumer<PlcUnsubscriptionRequest.Builder> 
plcSubscriptionRequestBuilderConsumer) throws PlcInvalidFieldException {
         PlcUnsubscriptionRequest.Builder builder = 
unsubscriptionRequestBuilder();
         plcSubscriptionRequestBuilderConsumer.accept(builder);
         return unsubscribe(builder.build());
@@ -99,7 +100,7 @@ default PlcConsumerRegistration 
register(PlcSubscriptionRequest subscriptionRequ
      * @throws ExecutionException   something went wrong.
      * @throws InterruptedException something went wrong.
      */
-    default PlcConsumerRegistration 
register(Consumer<PlcSubscriptionRequest.Builder> 
subscriptionRequestBuilderConsumer, Consumer<PlcSubscriptionEvent> consumer) 
throws ExecutionException, InterruptedException {
+    default PlcConsumerRegistration 
register(Consumer<PlcSubscriptionRequest.Builder> 
subscriptionRequestBuilderConsumer, Consumer<PlcSubscriptionEvent> consumer) 
throws ExecutionException, InterruptedException, PlcInvalidFieldException {
         PlcSubscriptionRequest.Builder builder = subscriptionRequestBuilder();
         subscriptionRequestBuilderConsumer.accept(builder);
         return register(builder.build(), consumer);
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 e974939f7..466f7bac7 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
@@ -18,6 +18,7 @@ Licensed to the Apache Software Foundation (ASF) under one
 */
 package org.apache.plc4x.java.api.connection;
 
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 
@@ -43,7 +44,7 @@ Licensed to the Apache Software Foundation (ASF) under one
      * @param writeRequestBuilderConsumer consumer which can be used to build 
requests.
      * @return a {@link CompletableFuture} giving async access to the response 
of the write operation.
      */
-    default CompletableFuture<PlcWriteResponse<?>> 
write(Consumer<PlcWriteRequest.Builder> writeRequestBuilderConsumer) {
+    default CompletableFuture<PlcWriteResponse<?>> 
write(Consumer<PlcWriteRequest.Builder> writeRequestBuilderConsumer) throws 
PlcInvalidFieldException {
         PlcWriteRequest.Builder requestBuilder = writeRequestBuilder();
         writeRequestBuilderConsumer.accept(requestBuilder);
         return write(requestBuilder.build());
diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java
 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java
index 0c873e84a..43a224062 100644
--- 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java
+++ 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java
@@ -23,7 +23,7 @@ Licensed to the Apache Software Foundation (ASF) under one
 /**
  * Indicates an invalid field address.
  */
-public class PlcInvalidFieldException extends PlcRuntimeException {
+public class PlcInvalidFieldException extends PlcException {
 
     private static final long serialVersionUID = 1L;
 
diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/UncheckedPlcInvalidFieldException.java
 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/UncheckedPlcInvalidFieldException.java
new file mode 100644
index 000000000..4ed0e8946
--- /dev/null
+++ 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/UncheckedPlcInvalidFieldException.java
@@ -0,0 +1,19 @@
+package org.apache.plc4x.java.api.exceptions;
+
+/**
+ * Wrapper for {@link PlcInvalidFieldException} as this is used in lambdas and 
stream apis.
+ *
+ * @see java.io.UncheckedIOException
+ */
+public class UncheckedPlcInvalidFieldException extends RuntimeException {
+
+    private PlcInvalidFieldException wrappedException;
+
+    public UncheckedPlcInvalidFieldException(PlcInvalidFieldException 
wrappedException) {
+        this.wrappedException = wrappedException;
+    }
+
+    public PlcInvalidFieldException getWrappedException() {
+        return wrappedException;
+    }
+}
diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessageBuilder.java
 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessageBuilder.java
index fd2d20ed5..dd57d599e 100644
--- 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessageBuilder.java
+++ 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessageBuilder.java
@@ -18,8 +18,10 @@ Licensed to the Apache Software Foundation (ASF) under one
 */
 package org.apache.plc4x.java.api.messages;
 
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+
 public interface PlcMessageBuilder<T> {
 
-    T build();
+    T build() throws PlcInvalidFieldException;
 
 }
diff --git 
a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java
 
b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java
index 69ca500da..2916bdc4f 100644
--- 
a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java
+++ 
b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java
@@ -31,6 +31,7 @@ Licensed to the Apache Software Foundation (ASF) under one
 import org.apache.plc4x.java.ads.api.generic.types.AmsPort;
 import org.apache.plc4x.java.ads.model.DirectAdsField;
 import org.apache.plc4x.java.ads.model.SymbolicAdsField;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.messages.PlcFieldRequest;
 import org.apache.plc4x.java.api.messages.PlcProprietaryResponse;
@@ -178,7 +179,7 @@ public void mapFields() {
 
     @Ignore("Currently broken // TODO // FIXME")
     @Test
-    public void mapField() {
+    public void mapField() throws PlcInvalidFieldException {
         // positive
         {
             
when(channel.writeAndFlush(any(PlcRequestContainer.class))).then(invocation -> {
diff --git 
a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/model/DirectAdsFieldTest.java
 
b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/model/DirectAdsFieldTest.java
index dc781d44f..1c6831b0f 100644
--- 
a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/model/DirectAdsFieldTest.java
+++ 
b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/model/DirectAdsFieldTest.java
@@ -27,7 +27,7 @@ Licensed to the Apache Software Foundation (ASF) under one
 public class DirectAdsFieldTest {
 
     @Test
-    public void of() {
+    public void of() throws PlcInvalidFieldException {
         DirectAdsField field = DirectAdsField.of("1/10:BYTE[2]");
         assertThat(field.getIndexGroup(), is(1L));
         assertThat(field.getIndexOffset(), is(10L));
@@ -36,7 +36,7 @@ public void of() {
     }
 
     @Test
-    public void ofHex() {
+    public void ofHex() throws PlcInvalidFieldException {
         DirectAdsField field = DirectAdsField.of("0x1/0xff:BYTE[2]");
         assertThat(field.getIndexGroup(), is(1L));
         assertThat(field.getIndexOffset(), is(255L));
@@ -45,17 +45,17 @@ public void ofHex() {
     }
 
     @Test(expected = PlcInvalidFieldException.class)
-    public void stringInField() {
+    public void stringInField() throws PlcInvalidFieldException {
         DirectAdsField field = DirectAdsField.of("group/offset");
     }
 
     @Test(expected = PlcInvalidFieldException.class)
-    public void singleNumberField() {
+    public void singleNumberField() throws PlcInvalidFieldException {
         DirectAdsField field = DirectAdsField.of("10");
     }
 
     @Test(expected = PlcInvalidFieldException.class)
-    public void wrongSeperator() {
+    public void wrongSeperator() throws PlcInvalidFieldException {
         DirectAdsField field = DirectAdsField.of("1:10");
     }
 
diff --git 
a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/Plc4x2AdsProtocolTest.java
 
b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/Plc4x2AdsProtocolTest.java
index a97be106f..cd02cb96b 100644
--- 
a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/Plc4x2AdsProtocolTest.java
+++ 
b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/Plc4x2AdsProtocolTest.java
@@ -33,6 +33,8 @@ Licensed to the Apache Software Foundation (ASF) under one
 import org.apache.plc4x.java.ads.api.generic.types.Invoke;
 import org.apache.plc4x.java.ads.model.AdsDataType;
 import org.apache.plc4x.java.ads.model.AdsPlcFieldHandler;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.api.exceptions.UncheckedPlcInvalidFieldException;
 import org.apache.plc4x.java.base.messages.*;
 import org.apache.plc4x.java.base.protocol.Plc4XSupportedDataTypes;
 import org.junit.Before;
@@ -103,22 +105,28 @@ Licensed to the Apache Software Foundation (ASF) under one
             .filter(o -> o.getDataTypeClass() != Byte[].class)
             .filter(o -> o.getDataTypeClass() != byte[].class)
             .map(Plc4x2AdsProtocolTest::mapToAdsDataType)
-            .map(pair -> Stream.of(
-                ImmutablePair.of(
-                    new PlcRequestContainer<>(
-                        (InternalPlcRequest) new 
DefaultPlcWriteRequest.Builder(new AdsPlcFieldHandler())
-                            .addItem(RandomStringUtils.randomAscii(10), "1/1:" 
+ pair.adsDataType, pair.getValue())
-                            .build(), new CompletableFuture<>()),
-                    AdsWriteResponse.of(targetAmsNetId, targetAmsPort, 
sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0))
-                ),
-                ImmutablePair.of(
-                    new PlcRequestContainer<>(
-                        (InternalPlcRequest) new 
DefaultPlcReadRequest.Builder(new AdsPlcFieldHandler())
-                            .addItem(RandomStringUtils.randomAscii(10), "1/1:" 
+ pair.adsDataType)
-                            .build(), new CompletableFuture<>()),
-                    AdsReadResponse.of(targetAmsNetId, targetAmsPort, 
sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0), 
Data.of(pair.getByteRepresentation()))
-                )
-            ))
+            .map(pair -> {
+                try {
+                    return Stream.of(
+                        ImmutablePair.of(
+                            new PlcRequestContainer<>(
+                                (InternalPlcRequest) new 
DefaultPlcWriteRequest.Builder(new AdsPlcFieldHandler())
+                                    
.addItem(RandomStringUtils.randomAscii(10), "1/1:" + pair.adsDataType, 
pair.getValue())
+                                    .build(), new CompletableFuture<>()),
+                            AdsWriteResponse.of(targetAmsNetId, targetAmsPort, 
sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0))
+                        ),
+                        ImmutablePair.of(
+                            new PlcRequestContainer<>(
+                                (InternalPlcRequest) new 
DefaultPlcReadRequest.Builder(new AdsPlcFieldHandler())
+                                    
.addItem(RandomStringUtils.randomAscii(10), "1/1:" + pair.adsDataType)
+                                    .build(), new CompletableFuture<>()),
+                            AdsReadResponse.of(targetAmsNetId, targetAmsPort, 
sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0), 
Data.of(pair.getByteRepresentation()))
+                        )
+                    );
+                } catch (PlcInvalidFieldException e) {
+                    throw new UncheckedPlcInvalidFieldException(e);
+                }
+            })
             .flatMap(stream -> stream)
             // TODO: request doesn't know its type anymore... fixme
             .map(pair -> new Object[]{Object.class.getSimpleName(), pair.left, 
pair.left.getResponseFuture(), 
pair.left.getRequest().getClass().getSimpleName(), pair.right, 
pair.right.getClass().getSimpleName()}).collect(Collectors.toList());
diff --git 
a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadRequest.java
 
b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadRequest.java
index 352d514c3..ccca592e3 100644
--- 
a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadRequest.java
+++ 
b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadRequest.java
@@ -18,7 +18,9 @@ Licensed to the Apache Software Foundation (ASF) under one
 */
 package org.apache.plc4x.java.base.messages;
 
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.api.exceptions.UncheckedPlcInvalidFieldException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.PlcFieldHandler;
@@ -74,12 +76,21 @@ public Builder(PlcFieldHandler fieldHandler) {
         }
 
         @Override
-        public PlcReadRequest build() {
+        public PlcReadRequest build() throws PlcInvalidFieldException {
             LinkedHashMap<String, PlcField> parsedFields = new 
LinkedHashMap<>();
-            fields.forEach((name, fieldQuery) -> {
-                PlcField parsedField = fieldHandler.createField(fieldQuery);
-                parsedFields.put(name, parsedField);
-            });
+            try {
+                fields.forEach((name, fieldQuery) -> {
+                    PlcField parsedField = null;
+                    try {
+                        parsedField = fieldHandler.createField(fieldQuery);
+                    } catch (PlcInvalidFieldException e) {
+                        throw new RuntimeException(e);
+                    }
+                    parsedFields.put(name, parsedField);
+                });
+            } catch (UncheckedPlcInvalidFieldException e) {
+                throw e.getWrappedException();
+            }
             return new DefaultPlcReadRequest(parsedFields);
         }
 
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 357dd8f8b..ad5681b3b 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
@@ -20,6 +20,8 @@ Licensed to the Apache Software Foundation (ASF) under one
 
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.api.exceptions.UncheckedPlcInvalidFieldException;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcSubscriptionType;
@@ -83,16 +85,25 @@ public Builder(PlcFieldHandler fieldHandler) {
         }
 
         @Override
-        public PlcSubscriptionRequest build() {
+        public PlcSubscriptionRequest build() throws PlcInvalidFieldException {
             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));
-            });
+            try {
+                fields.forEach((name, builderItem) -> {
+                    // Compile the query string.
+                    PlcField parsedField = null;
+                    try {
+                        parsedField = 
fieldHandler.createField(builderItem.fieldQuery);
+                    } catch (PlcInvalidFieldException e) {
+                        throw new UncheckedPlcInvalidFieldException(e);
+                    }
+                    // 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));
+                });
+            } catch (UncheckedPlcInvalidFieldException e) {
+                throw e.getWrappedException();
+            }
             return new DefaultPlcSubscriptionRequest();
         }
 
diff --git 
a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
 
b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
index 263505f2c..2dc02cbc3 100644
--- 
a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
+++ 
b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
@@ -20,7 +20,9 @@ Licensed to the Apache Software Foundation (ASF) under one
 
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.api.exceptions.UncheckedPlcInvalidFieldException;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.PlcFieldHandler;
@@ -181,16 +183,25 @@ public Builder addItem(String name, String fieldQuery, 
LocalDateTime... values)
         }
 
         @Override
-        public PlcWriteRequest build() {
+        public PlcWriteRequest build() throws PlcInvalidFieldException {
             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, 
builderItem.values);
-                parsedFields.put(name, new ImmutablePair<>(parsedField, 
fieldItem));
-            });
+            try {
+                fields.forEach((name, builderItem) -> {
+                    // Compile the query string.
+                    PlcField parsedField = null;
+                    try {
+                        parsedField = 
fieldHandler.createField(builderItem.fieldQuery);
+                    } catch (PlcInvalidFieldException e) {
+                        throw new UncheckedPlcInvalidFieldException(e);
+                    }
+                    // Encode the payload.
+                    // TODO: Depending on the field type, handle the FieldItem 
creation differently.
+                    FieldItem fieldItem = 
builderItem.encoder.apply(parsedField, builderItem.values);
+                    parsedFields.put(name, new ImmutablePair<>(parsedField, 
fieldItem));
+                });
+            } catch (UncheckedPlcInvalidFieldException e) {
+                throw e.getWrappedException();
+            }
             return new DefaultPlcWriteRequest(parsedFields);
         }
 
diff --git 
a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
 
b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
index d6c11d9ca..0da4bc68c 100644
--- 
a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
+++ 
b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
@@ -19,6 +19,7 @@ Licensed to the Apache Software Foundation (ASF) under one
 
 package org.apache.plc4x.java.s7.model;
 
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.s7.netty.model.types.MemoryArea;
 import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
@@ -63,7 +64,7 @@ Licensed to the Apache Software Foundation (ASF) under one
     @Category(FastTests.class)
     @MethodSource("validFieldQueries")
     void testValidFieldQueryParsing(String fieldQuery, TransportSize 
expectedClientType, MemoryArea expectedMemoryArea,
-                                    int expectedMemoryBlockNumber, int 
expectedByteOffset, int expectedBitOffset) {
+                                    int expectedMemoryBlockNumber, int 
expectedByteOffset, int expectedBitOffset) throws PlcInvalidFieldException {
         S7Field field = S7Field.of(fieldQuery);
         assertThat(field, notNullValue());
         assertThat(field.getDataType(), equalTo(expectedClientType));
@@ -80,7 +81,7 @@ void testInvalidFieldQueryParsing(String fieldQuery) {
         try {
             S7Field.of(fieldQuery);
             fail("Should have thrown an exception");
-        } catch (PlcRuntimeException e) {
+        } catch (PlcRuntimeException | PlcInvalidFieldException e) {
             // This was expected.
         }
     }
diff --git 
a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
 
b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
index d938fc097..ee67c02b5 100644
--- 
a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
+++ 
b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
@@ -18,9 +18,7 @@ Licensed to the Apache Software Foundation (ASF) under one
 */
 package org.apache.plc4x.java.s7.netty.util;
 
-import static org.junit.jupiter.api.Assertions.fail;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.messages.items.FieldItem;
 import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
@@ -39,17 +37,64 @@ Licensed to the Apache Software Foundation (ASF) under one
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
+
 class S7PlcFieldHandlerTest {
 
     private static S7PlcFieldHandler SUT = new S7PlcFieldHandler();
 
-    @ParameterizedTest
-    @ValueSource(strings = {
-        "%DB1.DBX1.0:BOOL",
-        "%DB1.DBW1.0:WORD"
-    })
-    void createField(String fieldQuery) {
-        SUT.createField(fieldQuery);
+    private static Stream<Arguments> createInputArrays() throws 
PlcInvalidFieldException {
+        // Generate valid fields for each s7 type.
+        Map<TransportSize, PlcField> fields = new HashMap<>();
+        for (TransportSize s7Type : TransportSize.values()) {
+            String sizeCode = (s7Type.getSizeCode() != null) ? 
s7Type.getSizeCode() : "X";
+            String fieldQuery = "%DB1.DB" + sizeCode + "1";
+            if (s7Type == TransportSize.BOOL) {
+                fieldQuery += ".0";
+            }
+            fieldQuery += ":" + s7Type.name();
+            fields.put(s7Type, SUT.createField(fieldQuery));
+        }
+        // Generate output for each combination of S7 and Java type.
+        Stream<Arguments> values = null;
+        for (TransportSize s7Type : TransportSize.values()) {
+            PlcField field = fields.get(s7Type);
+            for (JavaTypes javaType : JavaTypes.values()) {
+                Object[] testValues = javaType.values;
+
+                Stream<Arguments> curValues;
+                // Min, Max
+                if (testValues.length == 2) {
+                    curValues = Stream.of(
+                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MIN", field, new Object[]{testValues[0]}),
+                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MAX", field, new Object[]{testValues[1]}));
+                }
+                // Value, Min, Max
+                else if (testValues.length == 3) {
+                    curValues = Stream.of(
+                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MIN", field, new Object[]{testValues[1]}),
+                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-VAL", field, new Object[]{testValues[0]}),
+                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MAX", field, new Object[]{testValues[2]}));
+                }
+                // Zero, Value, Min, Max
+                else if (testValues.length == 4) {
+                    curValues = Stream.of(
+                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MIN", field, new Object[]{testValues[2]}),
+                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-NIL", field, new Object[]{testValues[0]}),
+                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-VAL", field, new Object[]{testValues[1]}),
+                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MAX", field, new Object[]{testValues[3]}));
+                } else {
+                    throw new RuntimeException("Expecting 2, 3 or 4 valued 
test-input");
+                }
+                if (values == null) {
+                    values = curValues;
+                } else {
+                    values = Stream.concat(values, curValues);
+                }
+            }
+        }
+        return values;
     }
 
     @ParameterizedTest
@@ -255,57 +300,13 @@ void encodeDateTime(String name, PlcField field, Object[] 
values) {
         encode(name, field, values, expectedSuccess, SUT::encodeDateTime);
     }
 
-    private static Stream<Arguments> createInputArrays() {
-        // Generate valid fields for each s7 type.
-        Map<TransportSize, PlcField> fields = new HashMap<>();
-        for (TransportSize s7Type : TransportSize.values()) {
-            String sizeCode = (s7Type.getSizeCode() != null) ? 
s7Type.getSizeCode() : "X";
-            String fieldQuery = "%DB1.DB" + sizeCode + "1";
-            if(s7Type == TransportSize.BOOL) {
-                fieldQuery += ".0";
-            }
-            fieldQuery += ":" + s7Type.name();
-            fields.put(s7Type, SUT.createField(fieldQuery));
-        }
-        // Generate output for each combination of S7 and Java type.
-        Stream<Arguments> values = null;
-        for (TransportSize s7Type : TransportSize.values()) {
-            PlcField field = fields.get(s7Type);
-            for (JavaTypes javaType : JavaTypes.values()) {
-                Object[] testValues = javaType.values;
-
-                Stream<Arguments> curValues;
-                // Min, Max
-                if(testValues.length == 2) {
-                    curValues = Stream.of(
-                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MIN", field, new Object[]{testValues[0]}),
-                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MAX", field, new Object[]{testValues[1]}));
-                }
-                // Value, Min, Max
-                else if(testValues.length == 3) {
-                    curValues = Stream.of(
-                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MIN", field, new Object[]{testValues[1]}),
-                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-VAL", field, new Object[]{testValues[0]}),
-                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MAX", field, new Object[]{testValues[2]}));
-                }
-                // Zero, Value, Min, Max
-                else if(testValues.length == 4) {
-                    curValues = Stream.of(
-                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MIN", field, new Object[]{testValues[2]}),
-                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-NIL", field, new Object[]{testValues[0]}),
-                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-VAL", field, new Object[]{testValues[1]}),
-                        Arguments.of(s7Type.name() + "-" + javaType.name() + 
"-MAX", field, new Object[]{testValues[3]}));
-                } else {
-                    throw new RuntimeException("Expecting 2, 3 or 4 valued 
test-input");
-                }
-                if(values == null) {
-                    values = curValues;
-                } else {
-                    values = Stream.concat(values, curValues);
-                }
-            }
-        }
-        return values;
+    @ParameterizedTest
+    @ValueSource(strings = {
+        "%DB1.DBX1.0:BOOL",
+        "%DB1.DBW1.0:WORD"
+    })
+    void createField(String fieldQuery) throws PlcInvalidFieldException {
+        SUT.createField(fieldQuery);
     }
 
     enum JavaTypes {
diff --git 
a/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
 
b/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
index fa817cf8e..5e97a2b96 100644
--- 
a/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
+++ 
b/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
@@ -18,20 +18,19 @@ Licensed to the Apache Software Foundation (ASF) under one
  */
 package org.apache.plc4x.java.test;
 
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
+import org.apache.plc4x.java.base.messages.items.FieldItem;
 import org.junit.Test;
 
 import java.util.Optional;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 public class TestDeviceTest {
 
     @Test
-    public void random() {
+    public void random() throws PlcInvalidFieldException {
         TestDevice device = new TestDevice("foobar");
         TestField field = TestField.of("RANDOM/foo:INTEGER");
 
@@ -41,7 +40,7 @@ public void random() {
     }
 
     @Test
-    public void read() {
+    public void read() throws PlcInvalidFieldException {
         TestDevice device = new TestDevice("foobar");
         TestField field = TestField.of("STATE/bar:INTEGER");
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to