public void channelRead()

in plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java [57:174]


    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        if (msg instanceof Plc4xMessage) {
            final Plc4xMessage plc4xMessage = (Plc4xMessage) msg;
            switch (plc4xMessage.getRequestType()) {
                case CONNECT_REQUEST: {
                    Plc4xConnectRequest request = (Plc4xConnectRequest) plc4xMessage;
                    try (final PlcConnection ignored = connectionManager.getConnection(request.getConnectionString())) {
                        //connection.ping().get();
                        final int connectionId = connectionIdGenerator.getAndIncrement();
                        connectionUrls.put(connectionId, request.getConnectionString());
                        Plc4xConnectResponse response = new Plc4xConnectResponse(
                            request.getRequestId(), connectionId, Plc4xResponseCode.OK);
                        ctx.writeAndFlush(response);
                    } catch (Exception e) {
                        Plc4xConnectResponse response = new Plc4xConnectResponse(
                            request.getRequestId(), 0, Plc4xResponseCode.INVALID_ADDRESS);
                        ctx.writeAndFlush(response);
                    }
                    break;
                }
                case READ_REQUEST: {
                    final Plc4xReadRequest request = (Plc4xReadRequest) plc4xMessage;
                    String connectionUrl = connectionUrls.get(request.getConnectionId());
                    try (final PlcConnection connection = connectionManager.getConnection(connectionUrl)) {
                        // Build a read request for all tags in the request.
                        final PlcReadRequest.Builder builder = connection.readRequestBuilder();
                        for (Plc4xTagRequest requestTag : request.getTags()) {
                            builder.addTagAddress(requestTag.getTag().getName(), requestTag.getTag().getTagQuery());
                        }
                        final PlcReadRequest rr = builder.build();

                        // Execute the query.
                        // (It has to be synchronously when working with the connection cache)
                        final PlcReadResponse apiReadResponse = rr.execute().get();

                        // Create the response.
                        List<Plc4xTagValueResponse> tags = new ArrayList<>(apiReadResponse.getTagNames().size());
                        for (Plc4xTagRequest plc4xRequestTag : request.getTags()) {
                            final PlcResponseCode responseCode = apiReadResponse.getResponseCode(plc4xRequestTag.getTag().getName());
                            Plc4xResponseCode resCode;
                            Plc4xValueType valueType;
                            PlcValue value;
                            if(responseCode == PlcResponseCode.OK) {
                                resCode = Plc4xResponseCode.OK;
                                value = apiReadResponse.getPlcValue(plc4xRequestTag.getTag().getName());
                                final String valueTypeName = value.getClass().getSimpleName();
                                // Cut off the "Plc" prefix to get the name of the PlcValueType.
                                valueType = Plc4xValueType.valueOf(valueTypeName.substring(3));
                            } else {
                                resCode = Plc4xResponseCode.INVALID_ADDRESS;
                                value = null;
                                valueType = Plc4xValueType.NULL;
                            }
                            tags.add(new Plc4xTagValueResponse(
                                plc4xRequestTag.getTag(), resCode, valueType, value));
                        }
                        Plc4xReadResponse response = new Plc4xReadResponse(
                            request.getRequestId(), request.getConnectionId(), Plc4xResponseCode.OK, tags);

                        // Send the response.
                        ctx.writeAndFlush(response);
                    } catch (Exception e) {
                        logger.error("Error executing request", e);
                        Plc4xReadResponse response = new Plc4xReadResponse(
                            request.getRequestId(), request.getConnectionId(),
                            Plc4xResponseCode.INVALID_ADDRESS, Collections.emptyList());
                        ctx.writeAndFlush(response);
                    }
                    break;
                }

                case WRITE_REQUEST:
                    final Plc4xWriteRequest plc4xWriteRequest = (Plc4xWriteRequest) plc4xMessage;
                    String connectionUrl = connectionUrls.get(plc4xWriteRequest.getConnectionId());
                    try (final PlcConnection connection = connectionManager.getConnection(connectionUrl)) {
                        // Build a write request for all tags in the request.
                        final PlcWriteRequest.Builder builder = connection.writeRequestBuilder();
                        for (Plc4xTagValueRequest plc4xRequestTag : plc4xWriteRequest.getTags()) {
                            builder.addTagAddress(plc4xRequestTag.getTag().getName(),
                                plc4xRequestTag.getTag().getTagQuery(), plc4xRequestTag.getValue().getObject());
                        }
                        final PlcWriteRequest apiWriteRequest = builder.build();

                        // Execute the query
                        // (It has to be synchronously when working with the connection cache)
                        final PlcWriteResponse apiWriteResponse = apiWriteRequest.execute().get();

                        // Create the response.
                        List<Plc4xTagResponse> plc4xTags =
                            new ArrayList<>(apiWriteResponse.getTagNames().size());
                        for (Plc4xTagValueRequest plc4xRequestTag : plc4xWriteRequest.getTags()) {
                            final PlcResponseCode apiResponseCode =
                                apiWriteResponse.getResponseCode(plc4xRequestTag.getTag().getName());
                            Plc4xResponseCode resCode;
                            if(apiResponseCode == PlcResponseCode.OK) {
                                resCode = Plc4xResponseCode.OK;
                            } else {
                                resCode = Plc4xResponseCode.INVALID_ADDRESS;
                            }
                            plc4xTags.add(new Plc4xTagResponse(plc4xRequestTag.getTag(), resCode));
                        }
                        Plc4xWriteResponse plc4xWriteResponse = new Plc4xWriteResponse(
                            plc4xWriteRequest.getRequestId(), plc4xWriteRequest.getConnectionId(),
                            Plc4xResponseCode.OK, plc4xTags);

                        // Send the response.
                        ctx.writeAndFlush(plc4xWriteResponse);
                    } catch (Exception e) {
                        logger.error("Error executing request", e);
                        Plc4xWriteResponse response = new Plc4xWriteResponse(
                            plc4xWriteRequest.getRequestId(), plc4xWriteRequest.getConnectionId(),
                            Plc4xResponseCode.INVALID_ADDRESS, Collections.emptyList());
                        ctx.writeAndFlush(response);
                    }
                    break;
            }
        }
    }