diff --git a/camel-route-support/src/test/java/io/kaoto/backend/api/service/step/parser/camelroute/CamelRouteStepParserServiceTest.java b/camel-route-support/src/test/java/io/kaoto/backend/api/service/step/parser/camelroute/CamelRouteStepParserServiceTest.java index 55bd374a5..4f8776d11 100644 --- a/camel-route-support/src/test/java/io/kaoto/backend/api/service/step/parser/camelroute/CamelRouteStepParserServiceTest.java +++ b/camel-route-support/src/test/java/io/kaoto/backend/api/service/step/parser/camelroute/CamelRouteStepParserServiceTest.java @@ -68,7 +68,8 @@ void deepParse() throws IOException { @ParameterizedTest @ValueSource(strings = {"route.yaml", "route2-complex-expressions.yaml", - "route3-complex-expressions.yaml", "route-ids.yaml", "route4-pathparams.yaml", "route5-placeholders.yaml"}) + "route3-complex-expressions.yaml", "route-ids.yaml", "route4-pathparams.yaml", "route5-placeholders.yaml", + "route6-un-marshal.yaml"}) void deepParseParametrized(String file) throws IOException { var route = new String(this.getClass().getResourceAsStream(file).readAllBytes(), StandardCharsets.UTF_8); diff --git a/camel-route-support/src/test/resources/io/kaoto/backend/api/service/step/parser/camelroute/route6-un-marshal.yaml b/camel-route-support/src/test/resources/io/kaoto/backend/api/service/step/parser/camelroute/route6-un-marshal.yaml new file mode 100644 index 000000000..fdadd0c15 --- /dev/null +++ b/camel-route-support/src/test/resources/io/kaoto/backend/api/service/step/parser/camelroute/route6-un-marshal.yaml @@ -0,0 +1,12 @@ +- from: + uri: timer:null + steps: + - marshal: + data-format: + json: + library: Gson + - unmarshal: + data-format: + json: + property: something + another: whatever diff --git a/kamelet-support/src/main/java/io/kaoto/backend/KamelPopulator.java b/kamelet-support/src/main/java/io/kaoto/backend/KamelPopulator.java index b63eb2796..ba27dfa21 100644 --- a/kamelet-support/src/main/java/io/kaoto/backend/KamelPopulator.java +++ b/kamelet-support/src/main/java/io/kaoto/backend/KamelPopulator.java @@ -63,7 +63,6 @@ import io.kaoto.backend.model.deployment.kamelet.step.ValidateFlowStep; import io.kaoto.backend.model.deployment.kamelet.step.WireTapFlowStep; import io.kaoto.backend.model.deployment.kamelet.step.dataformat.DataFormat; -import io.kaoto.backend.model.parameter.ArrayParameter; import io.kaoto.backend.model.parameter.Parameter; import io.kaoto.backend.model.parameter.StringParameter; import io.kaoto.backend.model.step.Branch; @@ -559,24 +558,9 @@ private FlowStep getUnmarshalStep(final Step step) { } private void assignParameters(final Step step, final MarshalFlowStep marshal) { - marshal.setDataFormat(new DataFormat()); - marshal.getDataFormat().setProperties(new HashMap<>()); - for (Parameter p : step.getParameters()) { - if (null == p.getValue()) { - continue; - } - - if ("dataformat".equalsIgnoreCase(p.getId())) { - marshal.getDataFormat().setFormat(p.getValue().toString()); - } else if ("properties".equalsIgnoreCase(p.getId())) { - for (var param : ((ArrayParameter) p).getValue()) { - if (param instanceof Object[] array) { - marshal.getDataFormat().getProperties().put(array[0].toString(), array[1].toString()); - } else if (param instanceof List list) { - marshal.getDataFormat().getProperties().put(list.get(0).toString(), list.get(1).toString()); - } - } + if (null != p.getValue() && "dataformat".equalsIgnoreCase(p.getId())) { + marshal.setDataFormat(new DataFormat(p.getValue())); } } } diff --git a/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/MarshalFlowStep.java b/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/MarshalFlowStep.java index 93fab54c7..bff3aaeb6 100644 --- a/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/MarshalFlowStep.java +++ b/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/MarshalFlowStep.java @@ -30,7 +30,9 @@ public Map getRepresenterProperties() { Map step = new HashMap<>(); Map properties = new HashMap<>(); step.put("marshal", properties); - properties.put(dataFormat.getFormat(), dataFormat.getProperties()); + if (dataFormat != null) { + properties.put(dataFormat.getFormat(), dataFormat.getProperties()); + } return step; } @@ -48,15 +50,7 @@ public Step getStep(final StepCatalog catalog, final KameletStepParserService ka protected void assignParameters(final Step res) { for (var param : res.getParameters()) { if ("dataformat".equalsIgnoreCase(param.getId())) { - param.setValue(this.getDataFormat().getFormat()); - } else if ("properties".equalsIgnoreCase(param.getId()) - && this.getDataFormat().getProperties() != null) { - Object[] array = new Object[this.getDataFormat().getProperties().size()]; - int i = 0; - for (var entry : this.getDataFormat().getProperties().entrySet()) { - array[i++] = new Object[]{entry.getKey(), entry.getValue()}; - } - param.setValue(array); + param.setValue(this.getDataFormat()); } } } @@ -66,8 +60,7 @@ public DataFormat getDataFormat() { return dataFormat; } - public void setDataFormat( - final DataFormat dataFormat) { + public void setDataFormat(final DataFormat dataFormat) { this.dataFormat = dataFormat; } } diff --git a/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/UnmarshalFlowStep.java b/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/UnmarshalFlowStep.java index 4cd3a8371..c69815699 100644 --- a/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/UnmarshalFlowStep.java +++ b/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/UnmarshalFlowStep.java @@ -10,9 +10,7 @@ import java.util.HashMap; import java.util.Map; -@JsonDeserialize( - using = MarshalDeserializer.class -) +@JsonDeserialize(using = MarshalDeserializer.class) public class UnmarshalFlowStep extends MarshalFlowStep { @Serial private static final long serialVersionUID = 5841231681362382129L; @@ -22,7 +20,9 @@ public Map getRepresenterProperties() { Map step = new HashMap<>(); Map properties = new HashMap<>(); step.put("unmarshal", properties); - properties.put(getDataFormat().getFormat(), getDataFormat().getProperties()); + if (getDataFormat() != null) { + properties.put(getDataFormat().getFormat(), getDataFormat().getProperties()); + } return step; } diff --git a/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/dataformat/DataFormat.java b/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/dataformat/DataFormat.java index 975aab556..ce75596d1 100644 --- a/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/dataformat/DataFormat.java +++ b/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/dataformat/DataFormat.java @@ -2,6 +2,7 @@ import java.io.Serial; import java.io.Serializable; +import java.util.HashMap; import java.util.Map; public class DataFormat implements Serializable { @@ -10,7 +11,26 @@ public class DataFormat implements Serializable { private static final long serialVersionUID = 239784528129L; private String format; - private Map properties; + private Map properties; + + public DataFormat() { + //Needed for serialization + } + + public DataFormat(Object dataformat) { + this.setProperties(new HashMap<>()); + if (dataformat instanceof DataFormat df) { + this.setFormat(df.getFormat()); + this.setProperties(df.getProperties()); + } else if (dataformat instanceof Map map) { + this.setFormat(String.valueOf(map.getOrDefault("format", ""))); + + final var potentialProperties = map.getOrDefault("properties", null); + if (potentialProperties instanceof Map) { + this.setProperties((Map) potentialProperties); + } + } + } public String getFormat() { return format; @@ -20,12 +40,11 @@ public void setFormat(final String format) { this.format = format; } - public Map getProperties() { + public Map getProperties() { return properties; } - public void setProperties( - final Map properties) { + public void setProperties(final Map properties) { this.properties = properties; } } diff --git a/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/marshal/MarshalDeserializer.java b/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/marshal/MarshalDeserializer.java index cb85830cb..1f67a8966 100644 --- a/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/marshal/MarshalDeserializer.java +++ b/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/marshal/MarshalDeserializer.java @@ -4,12 +4,18 @@ import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.TextNode; +import com.fasterxml.jackson.databind.node.ValueNode; import io.kaoto.backend.model.deployment.kamelet.step.MarshalFlowStep; import io.kaoto.backend.model.deployment.kamelet.step.UnmarshalFlowStep; import io.kaoto.backend.model.deployment.kamelet.step.dataformat.DataFormat; import org.jboss.logging.Logger; +import javax.json.JsonNumber; +import javax.json.JsonString; import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; public class MarshalDeserializer extends JsonDeserializer { private final Logger log = Logger.getLogger(MarshalDeserializer.class); @@ -33,13 +39,8 @@ public Object deserialize(final JsonParser jsonParser, var field = fields.next(); dataFormat.setFormat(field.getKey()); - dataFormat.setProperties(new HashMap<>()); - field.getValue().fields().forEachRemaining(e -> { - dataFormat.getProperties().put( - e.getKey(), - e.getValue().asText()); - }); - + dataFormat.setProperties(new LinkedHashMap<>()); + extractProperties(dataFormat.getProperties(), field); } if (fields.hasNext()) { log.error("Found a second data format on this marshal? " @@ -52,4 +53,23 @@ public Object deserialize(final JsonParser jsonParser, return step; } + + private static void extractProperties(final Map properties, + final Map.Entry field) { + if (field.getValue() instanceof ValueNode v) { + properties.put(field.getKey(), v.asText()); + } else { + field.getValue().fields().forEachRemaining(e -> { + if (e.getValue() instanceof ValueNode v) { + properties.put(e.getKey(), v.asText()); + } else { + Map innerProperties = new LinkedHashMap<>(); + JsonNode node = e.getValue(); + node.fields().forEachRemaining( + stringJsonNodeEntry -> extractProperties(innerProperties, stringJsonNodeEntry)); + properties.put(e.getKey(), innerProperties); + } + }); + } + } } diff --git a/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/marshal/MarshalSerializer.java b/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/marshal/MarshalSerializer.java index 9e5cc7003..6a9ae7c3d 100644 --- a/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/marshal/MarshalSerializer.java +++ b/kamelet-support/src/main/java/io/kaoto/backend/model/deployment/kamelet/step/marshal/MarshalSerializer.java @@ -33,7 +33,7 @@ private void writeDataFormat(final JsonGenerator gen, if (df.getProperties() != null) { gen.writeStartObject(); for (var property : df.getProperties().entrySet()) { - gen.writeStringField(property.getKey(), property.getValue()); + gen.writeStringField(property.getKey(), property.getValue().toString()); } gen.writeEndObject(); }