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:
[email protected]
With regards,
Apache Git Services