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