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 00000000000..9c14c09a21e --- /dev/null +++ b/kogito-workitems/kogito-jackson-utils/src/main/java/org/kie/kogito/jackson/utils/CommonObjectModule.java @@ -0,0 +1,64 @@ +/* + * 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; +import com.fasterxml.jackson.databind.node.ObjectNode; + +class CommonObjectModule extends SimpleModule { + + private static final long serialVersionUID = 1L; + + public CommonObjectModule() { + this.addDeserializer(URI.class, new JsonDeserializer() { + @Override + public URI deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + return URI.create(fromNode(p)); + } + }); + + this.addDeserializer(File.class, new JsonDeserializer() { + @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.isTextual()) { + return node.asText(); + } else if (node.isObject()) { + return ((ObjectNode) node).iterator().next().asText(); + } else if (node.isArray()) { + return node.get(0).asText(); + } else { + throw new IOException("Cannot extract string from node " + node); + } + } +} 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 747a0aaf054..dcc12089e8c 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 @@ private static class DefaultObjectMapper { .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 f596a202af5..0e3cf6705bb 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,6 +18,8 @@ */ package org.kie.kogito.jackson.utils; +import java.io.File; +import java.net.URI; import java.util.Arrays; import java.util.Collections; @@ -28,6 +30,7 @@ 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; @@ -82,4 +85,27 @@ void testJavaByteArray() { 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().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)); + } + + 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 7f6bc505df8..00000000000 --- 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; - } -}