This is an automated email from the ASF dual-hosted git repository.

fjtiradosarti pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new 0218cc3dee [Fix #3767] Supporting open api functions with File as 
parameter (#3768)
0218cc3dee is described below

commit 0218cc3dee10abfecb1f8668023b715f4dfc6754
Author: Francisco Javier Tirado Sarti 
<[email protected]>
AuthorDate: Wed Nov 13 14:16:02 2024 +0100

    [Fix #3767] Supporting open api functions with File as parameter (#3768)
    
    * [Fix #3767] Supporting open api functions with File as parameter
    
    * Add some edge cases in unit tests
    
    ---------
    
    Co-authored-by: gmunozfe <[email protected]>
---
 .../kogito/jackson/utils/CommonObjectModule.java   | 61 +++++++++++++++++++
 .../kogito/jackson/utils/ObjectMapperFactory.java  |  1 +
 .../kogito/jackson/utils/JsonObjectUtilsTest.java  | 70 ++++++++++++++++++++++
 .../java/org/kie/kogito/jackson/utils/Person.java  | 39 ------------
 4 files changed, 132 insertions(+), 39 deletions(-)

diff --git 
a/kogito-workitems/kogito-jackson-utils/src/main/java/org/kie/kogito/jackson/utils/CommonObjectModule.java
 
b/kogito-workitems/kogito-jackson-utils/src/main/java/org/kie/kogito/jackson/utils/CommonObjectModule.java
new file mode 100644
index 0000000000..09cbe9371e
--- /dev/null
+++ 
b/kogito-workitems/kogito-jackson-utils/src/main/java/org/kie/kogito/jackson/utils/CommonObjectModule.java
@@ -0,0 +1,61 @@
+/*
+ * 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.kie.kogito.jackson.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+class CommonObjectModule extends SimpleModule {
+
+    private static final long serialVersionUID = 1L;
+
+    public CommonObjectModule() {
+        this.addDeserializer(URI.class, new JsonDeserializer<URI>() {
+            @Override
+            public URI deserialize(JsonParser p, DeserializationContext ctxt) 
throws IOException {
+                return URI.create(fromNode(p));
+            }
+        });
+
+        this.addDeserializer(File.class, new JsonDeserializer<File>() {
+            @Override
+            public File deserialize(JsonParser p, DeserializationContext ctxt) 
throws IOException {
+                return new File(fromNode(p));
+            }
+        });
+    }
+
+    private static String fromNode(JsonParser p) throws IOException {
+        JsonNode node = p.readValueAsTree();
+        if (node.size() == 1) {
+            node = node.iterator().next();
+        }
+        if (node.isTextual()) {
+            return node.asText();
+        }
+        throw new IOException(node + "should be a string or have exactly one 
property of type string");
+    }
+}
diff --git 
a/kogito-workitems/kogito-jackson-utils/src/main/java/org/kie/kogito/jackson/utils/ObjectMapperFactory.java
 
b/kogito-workitems/kogito-jackson-utils/src/main/java/org/kie/kogito/jackson/utils/ObjectMapperFactory.java
index 747a0aaf05..dcc12089e8 100644
--- 
a/kogito-workitems/kogito-jackson-utils/src/main/java/org/kie/kogito/jackson/utils/ObjectMapperFactory.java
+++ 
b/kogito-workitems/kogito-jackson-utils/src/main/java/org/kie/kogito/jackson/utils/ObjectMapperFactory.java
@@ -38,6 +38,7 @@ public class ObjectMapperFactory {
                 .setSerializationInclusion(JsonInclude.Include.NON_NULL)
                 
.setTypeFactory(TypeFactory.defaultInstance().withClassLoader(Thread.currentThread().getContextClassLoader()))
                 .registerModule(JsonFormat.getCloudEventJacksonModule())
+                .registerModule(new CommonObjectModule())
                 .findAndRegisterModules();
     }
 
diff --git 
a/kogito-workitems/kogito-jackson-utils/src/test/java/org/kie/kogito/jackson/utils/JsonObjectUtilsTest.java
 
b/kogito-workitems/kogito-jackson-utils/src/test/java/org/kie/kogito/jackson/utils/JsonObjectUtilsTest.java
index f596a202af..4976954db1 100644
--- 
a/kogito-workitems/kogito-jackson-utils/src/test/java/org/kie/kogito/jackson/utils/JsonObjectUtilsTest.java
+++ 
b/kogito-workitems/kogito-jackson-utils/src/test/java/org/kie/kogito/jackson/utils/JsonObjectUtilsTest.java
@@ -18,18 +18,23 @@
  */
 package org.kie.kogito.jackson.utils;
 
+import java.io.File;
+import java.net.URI;
 import java.util.Arrays;
 import java.util.Collections;
 
 import org.junit.jupiter.api.Test;
 
 import com.fasterxml.jackson.databind.node.BinaryNode;
+import com.fasterxml.jackson.databind.node.BooleanNode;
 import com.fasterxml.jackson.databind.node.DoubleNode;
 import com.fasterxml.jackson.databind.node.FloatNode;
 import com.fasterxml.jackson.databind.node.IntNode;
 import com.fasterxml.jackson.databind.node.NullNode;
+import com.fasterxml.jackson.databind.node.TextNode;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 public class JsonObjectUtilsTest {
 
@@ -82,4 +87,69 @@ public class JsonObjectUtilsTest {
         byte[] bytes = { 1, 2, 3, 4 };
         assertThat((byte[]) 
JsonObjectUtils.toJavaValue(BinaryNode.valueOf(bytes))).isEqualTo(bytes);
     }
+
+    @Test
+    void testURI() {
+        final String uri = "www.google.com";
+        
assertThat(JsonObjectUtils.convertValue(ObjectMapperFactory.get().createObjectNode().put("uri",
 uri), URI.class)).isEqualTo(URI.create(uri));
+        assertThat(JsonObjectUtils.convertValue(new TextNode(uri), 
URI.class)).isEqualTo(URI.create(uri));
+    }
+
+    @Test
+    void testFile() {
+        final String file = "/home/myhome/sample.txt";
+        final String additionalData = "Javierito";
+        
assertThat(JsonObjectUtils.convertValue(ObjectMapperFactory.get().createObjectNode().put("file",
 file), File.class)).isEqualTo(new File(file));
+        
assertThat(JsonObjectUtils.convertValue(ObjectMapperFactory.get().createArrayNode().add(file),
 File.class)).isEqualTo(new File(file));
+        
assertThat(JsonObjectUtils.convertValue(ObjectMapperFactory.get().createObjectNode().put("file",
 file).put("additionalData", additionalData), PseudoPOJO.class))
+                .isEqualTo(new PseudoPOJO(additionalData, new File(file)));
+        assertThat(JsonObjectUtils.convertValue(new TextNode(file), 
File.class)).isEqualTo(new File(file));
+    }
+
+    @Test
+    void testFileNullInput() {
+        assertThat(JsonObjectUtils.convertValue(NullNode.getInstance(), 
File.class)).isNull();
+    }
+
+    @Test
+    void testFileEmptyPath() {
+        final String emptyPath = "";
+        assertThat(JsonObjectUtils.convertValue(new TextNode(emptyPath), 
File.class)).isEqualTo(new File(emptyPath));
+    }
+
+    @Test
+    void testFileWithSpecialCharacters() {
+        final String pathWithSpecialChars = "/home/user/my file en 
espaƱol.txt";
+        assertThat(JsonObjectUtils.convertValue(new 
TextNode(pathWithSpecialChars), File.class))
+                .isEqualTo(new File(pathWithSpecialChars));
+    }
+
+    @Test
+    void testUnsupportedNodeType() {
+        final String errorMessage = "should be a string or have exactly one 
property of type string";
+        assertThatThrownBy(() -> 
JsonObjectUtils.convertValue(BooleanNode.TRUE, URI.class))
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining(errorMessage);
+        assertThatThrownBy(() -> JsonObjectUtils.convertValue(new IntNode(1), 
URI.class))
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining(errorMessage);
+        assertThatThrownBy(() -> 
JsonObjectUtils.convertValue(ObjectMapperFactory.get().createArrayNode(), 
URI.class))
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining(errorMessage);
+        assertThatThrownBy(() -> 
JsonObjectUtils.convertValue(ObjectMapperFactory.get().createObjectNode(), 
URI.class))
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining(errorMessage);
+        assertThatThrownBy(() -> 
JsonObjectUtils.convertValue(ObjectMapperFactory.get().createObjectNode().put("name",
 1), URI.class))
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining(errorMessage);
+        assertThatThrownBy(() -> 
JsonObjectUtils.convertValue(ObjectMapperFactory.get().createArrayNode().add("first.txt").add("second.txt"),
 URI.class))
+                .isInstanceOf(IllegalArgumentException.class)
+                .hasMessageContaining(errorMessage);
+    }
+
+    private static record PseudoPOJO(String additionalData, File file) {
+    }
+
+    private static record Person(String name) {
+    }
 }
diff --git 
a/kogito-workitems/kogito-jackson-utils/src/test/java/org/kie/kogito/jackson/utils/Person.java
 
b/kogito-workitems/kogito-jackson-utils/src/test/java/org/kie/kogito/jackson/utils/Person.java
deleted file mode 100644
index 7f6bc505df..0000000000
--- 
a/kogito-workitems/kogito-jackson-utils/src/test/java/org/kie/kogito/jackson/utils/Person.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.kie.kogito.jackson.utils;
-
-public class Person {
-
-    private String name;
-
-    public Person() {
-    }
-
-    public Person(String name) {
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to