gnodet-bot commented on code in PR #27168:
URL: https://github.com/apache/camel/pull/27168#discussion_r4152149220


##########
components/camel-odata/src/main/java/org/apache/camel/component/odata/ODataConfiguration.java:
##########
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.odata;
+
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.support.jsse.SSLContextParameters;
+
+@UriParams
+public class ODataConfiguration {
+
+    @UriParam(label = "producer", description = "The OData operation to 
perform")
+    private ODataOperation operation = ODataOperation.READ_SET;
+
+    @UriParam(label = "producer", description = "The OData $filter query 
parameter")
+    private String filter;
+
+    @UriParam(label = "producer", description = "The OData $select query 
parameter")
+    private String select;
+
+    @UriParam(label = "producer", description = "The OData $expand query 
parameter")
+    private String expand;
+
+    @UriParam(label = "producer", description = "The OData $orderby query 
parameter")
+    private String orderBy;
+
+    @UriParam(label = "producer", description = "The OData $top query 
parameter")
+    private Integer top;
+
+    @UriParam(label = "producer", description = "The OData $skip query 
parameter")
+    private Integer skip;
+
+    @UriParam(label = "producer", description = "The OData $count query 
parameter")
+    private Boolean count;
+
+    @UriParam(label = "security", description = "Authentication method to use 
(e.g., Basic, Bearer)")
+    private String authMethod;
+
+    @UriParam(label = "security", description = "Username for Basic 
authentication")
+    private String authUsername;
+
+    @UriParam(label = "security", description = "Password for Basic 
authentication")
+    private String authPassword;

Review Comment:
   🔴 **NOT addressed (re-raised):** `authPassword` is still not annotated with 
`secret = true`. The password will appear in plain text in endpoint URIs, logs, 
JMX, and management APIs. The generated `odata.json` still has `"secret": 
false` and `SECRET_PROPERTY_NAMES` is empty.
   
   ```suggestion
       @UriParam(label = "security", secret = true, description = "Password for 
Basic authentication")
       private String authPassword;
   ```



##########
components/camel-odata/src/main/java/org/apache/camel/component/odata/ODataConfiguration.java:
##########
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.odata;
+
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.support.jsse.SSLContextParameters;
+
+@UriParams
+public class ODataConfiguration {
+
+    @UriParam(label = "producer", description = "The OData operation to 
perform")
+    private ODataOperation operation = ODataOperation.READ_SET;
+
+    @UriParam(label = "producer", description = "The OData $filter query 
parameter")
+    private String filter;
+
+    @UriParam(label = "producer", description = "The OData $select query 
parameter")
+    private String select;
+
+    @UriParam(label = "producer", description = "The OData $expand query 
parameter")
+    private String expand;
+
+    @UriParam(label = "producer", description = "The OData $orderby query 
parameter")
+    private String orderBy;
+
+    @UriParam(label = "producer", description = "The OData $top query 
parameter")
+    private Integer top;
+
+    @UriParam(label = "producer", description = "The OData $skip query 
parameter")
+    private Integer skip;
+
+    @UriParam(label = "producer", description = "The OData $count query 
parameter")
+    private Boolean count;
+
+    @UriParam(label = "security", description = "Authentication method to use 
(e.g., Basic, Bearer)")
+    private String authMethod;
+
+    @UriParam(label = "security", description = "Username for Basic 
authentication")
+    private String authUsername;
+
+    @UriParam(label = "security", description = "Password for Basic 
authentication")
+    private String authPassword;
+
+    @UriParam(label = "security", description = "Bearer token for Bearer 
authentication")
+    private String authBearerToken;
+
+    @UriParam(label = "security", description = "To use a custom 
SSLContextParameters")

Review Comment:
   🔴 **NOT addressed (re-raised):** `authBearerToken` is still not annotated 
with `secret = true`. Same exposure risk as `authPassword`.
   
   ```suggestion
       @UriParam(label = "security", secret = true, description = "Bearer token 
for Bearer authentication")
       private String authBearerToken;
   ```



##########
components/camel-odata/src/main/java/org/apache/camel/component/odata/ODataHelper.java:
##########
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.odata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.util.json.DeserializationException;
+import org.apache.camel.util.json.Jsoner;
+
+public final class ODataHelper {
+
+    private ODataHelper() {
+    }
+
+    public static String toJson(Object value) {
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof String string) {
+            return string;
+        }
+
+        return Jsoner.serialize(value);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static Map<String, Object> parseJsonObject(String value) throws 
DeserializationException {
+        if (value == null || value.isBlank()) {
+            return Map.of();
+        }
+
+        Object parsed = Jsoner.deserialize(value);
+        if (!(parsed instanceof Map)) {
+            throw new IllegalArgumentException("Expected an OData JSON object 
response");
+        }
+
+        return (Map<String, Object>) parsed;
+    }
+
+    @SuppressWarnings("unchecked")
+    public static List<Map<String, Object>> extractValueList(Map<String, 
Object> response) {
+        Object value = response.get("value");
+
+        if (!(value instanceof List)) {
+            throw new IllegalArgumentException("OData response does not 
contain a value array");
+        }
+
+        return (List<Map<String, Object>>) value;
+    }

Review Comment:
   ⚠️ **NOT addressed (re-raised):** `extractValueList()` is not called 
anywhere in the codebase. Either use it in `ODataProducer.process()` to parse 
`READ_SET` responses, or remove it.



##########
components/camel-odata/pom.xml:
##########
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>4.23.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-odata</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: OData</name>
+    <description>Camel OData Component</description>
+
+    <properties>
+        <firstVersion>4.23.0-SNAPSHOT</firstVersion>

Review Comment:
   ⚠️ **NOT addressed (re-raised):** `firstVersion` should be `4.23.0`, not 
`4.23.0-SNAPSHOT`. This will persist the SNAPSHOT suffix in release artifacts.
   
   ```suggestion
           <firstVersion>4.23.0</firstVersion>
   ```



##########
components/camel-odata/src/main/docs/odata-component.adoc:
##########
@@ -0,0 +1,359 @@
+= OData Component
+:doctitle: OData
+:shortname: odata
+:artifactid: camel-odata
+:description: Camel OData Component
+:since: 4.23
+:supportlevel: Preview
+:tabs-sync-option:
+:component-header: Only producer is supported
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The OData component allows you to interact with OData (Open Data Protocol) 
services using standard OData CRUD operations.
+
+The component delegates HTTP transport to Camel HTTP while providing 
OData-specific operation, key, query option, authentication, and response 
handling.
+
+Maven users will need to add the following dependency to their `pom.xml` for 
this component:
+
+## [source,xml]

Review Comment:
   🔴 **NOT addressed (re-raised):** Every code block in this file uses `## 
[source,xml]` / `## [source,java]` instead of the correct AsciiDoc syntax 
`[source,xml]`. The `##` prefix is a Markdown heading marker and will render as 
literal text or garbled headings in the Antora-generated docs. This affects all 
~17 code blocks in the file.
   
   Additionally, the ETag examples at lines 278 and 308 still have unescaped 
quotes in the Java code. The entire AsciiDoc file needs a formatting pass.



##########
components/camel-odata/src/main/java/org/apache/camel/component/odata/ODataComponent.java:
##########
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.odata;
+
+import java.net.URI;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+
+@Component("odata")
+public class ODataComponent extends DefaultComponent {
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters)
+            throws Exception {
+
+        ODataEndpoint endpoint = new ODataEndpoint(uri, this);
+
+        endpoint.setHttpUri(new URI(remaining));
+
+        // Create a copy of parameters before setProperties consumes known 
properties
+        Map<String, Object> customParams = new LinkedHashMap<>(parameters);

Review Comment:
   ⚠️ **NOT addressed (re-raised):** `customParams` is assigned but never read 
— remove the dead copy.
   
   ```suggestion
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to