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]