sruehl closed pull request #8: cleanup warnings in plc4j-api, plc4j-core, dummy-driver URL: https://github.com/apache/incubator-plc4x/pull/8
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/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/netty/DummyProtocol.java b/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/netty/DummyProtocol.java index bf448ea4f..3c4064551 100644 --- a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/netty/DummyProtocol.java +++ b/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/netty/DummyProtocol.java @@ -31,13 +31,13 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.List; -public class DummyProtocol extends MessageToMessageCodec<ByteBuf, PlcRequestContainer> { +public class DummyProtocol extends MessageToMessageCodec<ByteBuf, PlcRequestContainer<?, ?>> { private static final Logger logger = LoggerFactory.getLogger(DummyProtocol.class); @Override - protected void encode(ChannelHandlerContext ctx, PlcRequestContainer in, List<Object> out) throws Exception { - PlcRequest request = in.getRequest(); + protected void encode(ChannelHandlerContext ctx, PlcRequestContainer<?, ?> in, List<Object> out) throws Exception { + PlcRequest<?> request = in.getRequest(); if (request instanceof PlcReadRequest) { // Simple ICMP (Ping packet) diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java index 96db08f0e..01431edfa 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java @@ -66,7 +66,7 @@ public final Builder addItem(Class<?> dataType, Address address, int size) { return this; } - public final Builder addItem(ReadRequestItem readRequestItem) { + public final Builder addItem(ReadRequestItem<?> readRequestItem) { checkType(readRequestItem.getDatatype()); requests.add(readRequestItem); return this; @@ -82,7 +82,7 @@ public final PlcReadRequest build() { } else { plcReadRequest = new TypeSafePlcReadRequest<>(firstType); } - for (ReadRequestItem request : requests) { + for (ReadRequestItem<?> request : requests) { plcReadRequest.addItem(request); } return plcReadRequest; diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java index 78ebdea77..9a2cd5167 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java @@ -37,6 +37,9 @@ public PlcReadResponse(PlcReadRequest request, List<? extends ReadResponseItem<? @SuppressWarnings("unchecked") public <T> Optional<ReadResponseItem<T>> getValue(ReadRequestItem<T> item) { - return (Optional) super.getValue(item); + Optional<ReadResponseItem<?>> value = super.getValue(item); + // Directly casting to Optional<ReadResponseItem<T>> yields a compile time error. + // First casting to Object eliminates it. + return (Optional<ReadResponseItem<T>>) ((Object) value); } } diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java index d41453afd..aa6162dde 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java @@ -29,7 +29,7 @@ Licensed to the Apache Software Foundation (ASF) under one * Base type for all messages sent from the plc4x system to a connected plc. * @param <REQUEST_ITEM> */ -public abstract class PlcRequest<REQUEST_ITEM extends RequestItem> implements PlcMessage { +public abstract class PlcRequest<REQUEST_ITEM extends RequestItem<?>> implements PlcMessage { protected final List<REQUEST_ITEM> requestItems; @@ -88,7 +88,7 @@ public boolean isEmpty() { List<REQUEST_ITEM> requests = new LinkedList<>(); - void checkType(Class dataType) { + void checkType(Class<?> dataType) { if (firstType == null) { firstType = dataType; } diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequestContainer.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequestContainer.java index 203839910..6bdd6b026 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequestContainer.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequestContainer.java @@ -21,7 +21,7 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.Objects; import java.util.concurrent.CompletableFuture; -public class PlcRequestContainer<T extends PlcRequest, R extends PlcResponse> { +public class PlcRequestContainer<T extends PlcRequest<?>, R extends PlcResponse<?, ?, ?>> { private final T request; private final CompletableFuture<R> responseFuture; diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcResponse.java index 8f054cc44..7d98b8557 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcResponse.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcResponse.java @@ -32,7 +32,7 @@ Licensed to the Apache Software Foundation (ASF) under one * @param <RESPONSE_ITEM> * @param <REQUEST_ITEM> */ -public abstract class PlcResponse<REQUEST extends PlcRequest, RESPONSE_ITEM extends ResponseItem, REQUEST_ITEM extends RequestItem> implements PlcMessage { +public abstract class PlcResponse<REQUEST extends PlcRequest<?>, RESPONSE_ITEM extends ResponseItem<?>, REQUEST_ITEM extends RequestItem<?>> implements PlcMessage { private final REQUEST request; diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java index 4176f91a1..057a74ec9 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java @@ -82,7 +82,7 @@ public final PlcWriteRequest build() { } else { plcWriteRequest = new TypeSafePlcWriteRequest<>(firstType); } - for (WriteRequestItem request : requests) { + for (WriteRequestItem<?> request : requests) { plcWriteRequest.addItem(request); } return plcWriteRequest; diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java index 39da986bb..152cc415e 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java @@ -37,6 +37,9 @@ public PlcWriteResponse(PlcWriteRequest request, List<? extends WriteResponseIte @SuppressWarnings("unchecked") public <T> Optional<WriteResponseItem<T>> getValue(WriteRequestItem<T> item) { - return (Optional) super.getValue(item); + Optional<WriteResponseItem<?>> value = super.getValue(item); + // Directly casting to Optional<WriteResponseItem<T>> yields a compile time error. + // First casting to Object eliminates it. + return (Optional<WriteResponseItem<T>>) ((Object) value); } } diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ResponseItem.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ResponseItem.java index ad13071a5..cd6410d6f 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ResponseItem.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ResponseItem.java @@ -22,7 +22,7 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.Objects; -public abstract class ResponseItem<REQUEST_ITEM extends RequestItem> { +public abstract class ResponseItem<REQUEST_ITEM extends RequestItem<?>> { private final REQUEST_ITEM requestItem; diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadResponse.java index f32e527d8..22d85c649 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadResponse.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcReadResponse.java @@ -59,17 +59,49 @@ public TypeSafePlcReadResponse(TypeSafePlcReadRequest<T> request, List<ReadRespo return (Optional<ReadResponseItem<T>>) super.getResponseItem(); } + /** + * Cast or convert a PlcReadResponse to a TypeSafePlcReadReadResponse<T>. + * + * WARNING: this is inherently a non-type-safe operation. It was introduced + * to serve the implementation of PlcReader.read(TypeSafePlcReadRequest<T>). + * Additional use of it is not recommended. This interface is subject to change. + * + * @param plcReadResponse the response implicitly with items of type T + * @return TypeSafePlcReadReadResponse<T> + */ @SuppressWarnings("unchecked") public static <T> TypeSafePlcReadResponse<T> of(PlcReadResponse plcReadResponse) { + // BUG: there seems to be no checking that the readResponse/items + // in fact are for type T. + // I don't even think it's possible to do that with the current 'of()' signature + // and plcReadResponse content. + // + // The only consolation is that currently, 'of()' is only really used in the + // impl of PlcReader.read(TypeSafePlcReadRequest<T>) and that case guarantees + // that all items are a T. plcReadResponse isa TypeSafePlcReadResponse in + // this case. + // + // Maybe we just need to doc that this conversion is unsafe and/or rename + // the method to "unsafeOf()"? + // Or, if there were an AbstractPlcReader<T>, that could internally implement + // this method without exposing this generally it, the PlcReader interface + // could remove the default implementation of read(TypeSafePlcReadRequest<T>), + // and protocol implementations could extend AbstractPlcReader. + // + // FWIW, in one case there is some checking that all of the items in a response + // are at least of the same type. + if (plcReadResponse instanceof TypeSafePlcReadResponse) { - return (TypeSafePlcReadResponse) plcReadResponse; + // Warning: no validation that everything in the response is a T. + return (TypeSafePlcReadResponse<T>) plcReadResponse; } if (plcReadResponse.getRequest() instanceof TypeSafePlcReadRequest) { - return new TypeSafePlcReadResponse((TypeSafePlcReadRequest) plcReadResponse.getRequest(), plcReadResponse.getResponseItems()); + // Warning: no validation that everything in the response is a T. + return new TypeSafePlcReadResponse<T>((TypeSafePlcReadRequest<T>) plcReadResponse.getRequest(), (List<ReadResponseItem<T>>) plcReadResponse.getResponseItems()); } List<? extends ReadResponseItem<?>> responseItems = plcReadResponse.getResponseItems(); Objects.requireNonNull(responseItems, "Response items on " + plcReadResponse + " must not be null"); - Class type = null; + Class<?> type = null; for (ReadResponseItem<?> responseItem : responseItems) { if (!responseItem.getValues().isEmpty()) { type = responseItem.getValues().get(0).getClass(); @@ -84,7 +116,9 @@ public TypeSafePlcReadResponse(TypeSafePlcReadRequest<T> request, List<ReadRespo if (type == null) { type = Object.class; } - return new TypeSafePlcReadResponse(new TypeSafePlcReadRequest(type, plcReadResponse.getRequest()), responseItems); + // Warning: no validation that everything in the response is a T. + // Verified that everything in the response was the same type, but why bother? + return new TypeSafePlcReadResponse<T>(new TypeSafePlcReadRequest<T>((Class<T>) type, plcReadResponse.getRequest()), (List<ReadResponseItem<T>>) responseItems); } private static void checkList(List<?> list, Class<?> type) { diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteRequest.java index d5de7f767..e6d4d0906 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteRequest.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/specific/TypeSafePlcWriteRequest.java @@ -71,7 +71,9 @@ public void addItem(WriteRequestItem<?> writeRequestItem) { @SuppressWarnings("unchecked") public List<WriteRequestItem<T>> getCheckedRequestItems() { - return (List) getRequestItems(); + // Directly casting to List<WriteRequestItem<T>> yields a compile time error. + // First casting to Object eliminates it. + return (List<WriteRequestItem<T>>) ((Object) getRequestItems()); } @Override diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java b/plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java index 7897b76fe..42e6b3b00 100644 --- a/plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java +++ b/plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java @@ -39,7 +39,7 @@ Licensed to the Apache Software Foundation (ASF) under one public class PlcDriverManagerTest { - /** + /* * Tries to get the mock plc driver which is part of this testsuite. */ @Test @@ -51,7 +51,7 @@ public void getExistingDriverTest() throws PlcException { assertThat(mockConnection.isClosed(), is(false)); } - /** + /* * Tries to get the mock plc driver with authentication which is part of this testsuite. */ @Test @@ -67,7 +67,7 @@ public void getExistingDriverWithAuthenticationTest() throws PlcException { assertThat(mockConnection.isClosed(), is(false)); } - /** + /* * In this test case a driver is requested which is not registered with the {@link PlcDriverManager}. */ @Test(expected = PlcConnectionException.class) @@ -76,7 +76,7 @@ public void getNotExistingDriverTest() throws PlcConnectionException { new PlcDriverManager().getConnection("non-existing-protocol://some-cool-url"); } - /** + /* * In this test case a driver is requested which is not registered with the {@link PlcDriverManager}. */ @Test(expected = PlcConnectionException.class) @@ -85,7 +85,7 @@ public void getInvalidUriTest() throws PlcConnectionException { new PlcDriverManager().getConnection("The quick brown fox jumps over the lazy dog"); } - /** + /* * In this test the {@link PlcDriverManager} will be configured with a service list that * contains multiple implementation instances of the same protocol. This should result in * an error. diff --git a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/RawSocket.java b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/RawSocket.java index 3d23d1fbe..a1395255b 100644 --- a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/RawSocket.java +++ b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/RawSocket.java @@ -336,7 +336,7 @@ private FirstHop getFirstHop(InetAddress remoteAddress) throws RawSocketExceptio * * @return InetAddress representing the address of the internet gateway. */ - @SuppressWarnings("squid:S1313") + @SuppressWarnings("squid:S1313") // silence sonar warning private InetAddress getDefaultGatewayAddress() { try { Runtime rt = Runtime.getRuntime(); diff --git a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/netty/RawSocketChannelOption.java b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/netty/RawSocketChannelOption.java index a1793bea3..a860f76c3 100644 --- a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/netty/RawSocketChannelOption.java +++ b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/netty/RawSocketChannelOption.java @@ -24,6 +24,7 @@ Licensed to the Apache Software Foundation (ASF) under one public static final ChannelOption<Boolean> SOME_OPTION = valueOf(RawSocketChannelOption.class, "SOME_OPTION"); + @SuppressWarnings("deprecation") protected RawSocketChannelOption() { super(null); } ---------------------------------------------------------------- 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