You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2020/01/27 15:47:28 UTC

[camel] 07/10: [CAMEL-14437] Move all json mapping to a single class

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

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit b46b88b3f4bcf9df862260a122cb164f316dad00
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Sat Jan 25 09:51:26 2020 +0100

    [CAMEL-14437] Move all json mapping to a single class
---
 .../apt/CoreEipAnnotationProcessorHelper.java      |   3 +-
 .../tools/apt/EndpointAnnotationProcessor.java     |   8 +-
 .../tools/apt/SpringAnnotationProcessorHelper.java |   3 +-
 .../org/apache/camel/tooling/model/BaseModel.java  |  95 +----
 .../apache/camel/tooling/model/ComponentModel.java |  70 +---
 .../camel/tooling/model/DataFormatModel.java       |  49 +--
 .../org/apache/camel/tooling/model/EipModel.java   |  73 +---
 .../org/apache/camel/tooling/model/JsonMapper.java | 417 +++++++++++++++++++++
 .../apache/camel/tooling/model/LanguageModel.java  |  49 +--
 .../org/apache/camel/tooling/model/OtherModel.java |  34 +-
 .../camel/maven/packaging/EndpointDslMojo.java     |   3 +-
 .../maven/packaging/PackageDataFormatMojo.java     |   6 +-
 .../camel/maven/packaging/PackageLanguageMojo.java |   6 +-
 .../camel/maven/packaging/PackageOtherMojo.java    |   3 +-
 .../maven/packaging/PrepareUserGuideMojo.java      |   9 +-
 .../packaging/UpdateDocComponentListMojo.java      |   9 +-
 .../camel/maven/packaging/UpdateReadmeMojo.java    |   9 +-
 17 files changed, 474 insertions(+), 372 deletions(-)

diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreEipAnnotationProcessorHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreEipAnnotationProcessorHelper.java
index 08c52ab..7892cb2 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreEipAnnotationProcessorHelper.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreEipAnnotationProcessorHelper.java
@@ -46,6 +46,7 @@ import javax.xml.bind.annotation.XmlValue;
 
 import org.apache.camel.spi.AsPredicate;
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.camel.tooling.util.Strings;
 import org.apache.camel.tooling.model.EipModel;
@@ -162,7 +163,7 @@ public class CoreEipAnnotationProcessorHelper {
         }
 
         // write json schema file
-        String json = EipModel.createParameterJsonSchema(eipModel);
+        String json = JsonMapper.createParameterJsonSchema(eipModel);
         writer.println(json);
 
         // generate property placeholder provider java source code
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
index 71c5810..8a76626 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
@@ -54,11 +54,11 @@ import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriParams;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.spi.annotations.Component;
-import org.apache.camel.tooling.model.BaseModel;
 import org.apache.camel.tooling.model.BaseOptionModel;
 import org.apache.camel.tooling.model.ComponentModel;
 import org.apache.camel.tooling.model.ComponentModel.ComponentOptionModel;
 import org.apache.camel.tooling.model.ComponentModel.EndpointOptionModel;
+import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.camel.tooling.util.Strings;
 import org.apache.camel.tools.apt.helper.EndpointHelper;
@@ -158,7 +158,7 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso
                 res = processingEnv.getFiler().getResource(StandardLocation.CLASS_PATH,
                         packageName, parentScheme + PackageHelper.JSON_SUFIX);
                 String json = res.getCharContent(false).toString();
-                parentData = ComponentModel.generateComponentModel(json);
+                parentData = JsonMapper.generateComponentModel(json);
             } catch (Exception e) {
                 // ignore
                 if (!Objects.equals(parentScheme, extendsScheme)) {
@@ -184,7 +184,7 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso
             generateComponentConfigurer(roundEnv, uriEndpoint, scheme, schemes, componentModel);
         }
 
-        String json = ComponentModel.createParameterJsonSchema(componentModel);
+        String json = JsonMapper.createParameterJsonSchema(componentModel);
         writer.println(json);
         generateEndpointConfigurer(roundEnv, classElement, uriEndpoint, scheme, schemes, componentModel);
     }
@@ -222,7 +222,7 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso
 
         if (isNullOrEmpty(doc)) {
             throw new IllegalStateException("Empty doc for option: " + option.getName() + ", parent options:\n" +
-                    (parentOptions != null ? Jsoner.serialize(BaseModel.asJsonObject(parentOptions)) : "<null>"));
+                    (parentOptions != null ? Jsoner.serialize(JsonMapper.asJsonObject(parentOptions)) : "<null>"));
         }
     }
 
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpringAnnotationProcessorHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpringAnnotationProcessorHelper.java
index 88d2012..b09ac90 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpringAnnotationProcessorHelper.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpringAnnotationProcessorHelper.java
@@ -41,6 +41,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.camel.tooling.util.Strings;
 import org.apache.camel.tooling.model.EipModel;
@@ -95,7 +96,7 @@ public class SpringAnnotationProcessorHelper {
         findClassProperties(processingEnv, writer, roundEnv, eipOptions, classElement, classElement, "", modelName);
 
         eipOptions.forEach(eipModel::addOption);
-        String json = EipModel.createParameterJsonSchema(eipModel);
+        String json = JsonMapper.createParameterJsonSchema(eipModel);
         writer.println(json);
     }
 
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java
index 2c4ce51..0346790 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java
@@ -28,7 +28,6 @@ import org.apache.camel.util.json.Jsoner;
 
 public abstract class BaseModel<O extends BaseOptionModel> {
 
-    protected String kind;
     protected String name;
     protected String title;
     protected String description;
@@ -43,13 +42,7 @@ public abstract class BaseModel<O extends BaseOptionModel> {
         return (m1, m2) -> m1.getTitle().compareToIgnoreCase(m2.getTitle());
     }
 
-    public String getKind() {
-        return kind;
-    }
-
-    public void setKind(String kind) {
-        this.kind = kind;
-    }
+    public abstract String getKind();
 
     public String getName() {
         return name;
@@ -128,91 +121,7 @@ public abstract class BaseModel<O extends BaseOptionModel> {
     }
 
     public String getFirstVersionShort() {
-        return Strings.cutLastZeroDigit(firstVersion);
-    }
-
-    public static void parseModel(JsonObject mobj, BaseModel<?> model) {
-        model.setTitle(mobj.getString("title"));
-        model.setName(mobj.getString("name"));
-        model.setDescription(mobj.getString("description"));
-        model.setFirstVersion(mobj.getString("firstVersion"));
-        model.setLabel(mobj.getString("label"));
-        model.setDeprecated(mobj.getBooleanOrDefault("deprecated", false));
-        model.setDeprecationNote(mobj.getString("label"));
-        model.setJavaType(mobj.getString("javaType"));
-    }
-
-    public static void parseOption(JsonObject mp, BaseOptionModel option, String name) {
-        option.setName(name);
-        option.setKind(mp.getString("kind"));
-        option.setDisplayName(mp.getString("displayName"));
-        option.setGroup(mp.getString("group"));
-        option.setLabel(mp.getString("label"));
-        option.setRequired(mp.getBooleanOrDefault("required", false));
-        option.setType(mp.getString("type"));
-        option.setJavaType(mp.getString("javaType"));
-        option.setEnums(asStringList(mp.getCollection("enum")));
-        option.setOneOfs(asStringList(mp.getCollection("oneOf")));
-        option.setPrefix(mp.getString("prefix"));
-        option.setOptionalPrefix(mp.getString("optionalPrefix"));
-        option.setMultiValue(mp.getBooleanOrDefault("multiValue", false));
-        option.setDeprecated(mp.getBooleanOrDefault("deprecated", false));
-        option.setDeprecationNote(mp.getString("deprecationNote"));
-        option.setSecret(mp.getBooleanOrDefault("secret", false));
-        option.setDefaultValue(mp.get("defaultValue"));
-        option.setAsPredicate(mp.getBooleanOrDefault("asPredicate", false));
-        option.setConfigurationClass(mp.getString("configurationClass"));
-        option.setConfigurationField(mp.getString("configurationField"));
-        option.setDescription(mp.getString("description"));
-    }
-
-    public static JsonObject asJsonObject(List<? extends BaseOptionModel> options) {
-        JsonObject json = new JsonObject();
-        options.forEach(option -> json.put(option.getName(), asJsonObject(option)));
-        return json;
-    }
-
-    public static JsonObject asJsonObject(BaseOptionModel option) {
-        JsonObject prop = new JsonObject();
-        prop.put("kind", option.getKind());
-        prop.put("displayName", option.getDisplayName());
-        prop.put("group", option.getGroup());
-        prop.put("label", option.getLabel());
-        prop.put("required", option.isRequired());
-        prop.put("type", option.getType());
-        prop.put("javaType", option.getJavaType());
-        prop.put("enums", option.getEnums());
-        prop.put("oneOfs", option.getOneOfs());
-        prop.put("prefix", option.getPrefix());
-        prop.put("optionalPrefix", option.getOptionalPrefix());
-        prop.put("multiValue", option.isMultiValue());
-        prop.put("deprecated", option.isDeprecated());
-        prop.put("deprecationNote", option.getDeprecationNote());
-        prop.put("secret", option.isSecret());
-        prop.put("defaultValue", option.getDefaultValue());
-        prop.put("asPredicate", option.isAsPredicate());
-        prop.put("configurationClass", option.getConfigurationClass());
-        prop.put("configurationField", option.getConfigurationField());
-        prop.put("description", option.getDescription());
-        prop.entrySet().removeIf(e -> e.getValue() == null);
-        return prop;
-    }
-
-    protected static JsonObject deserialize(String json) {
-        try {
-            return (JsonObject) Jsoner.deserialize(json);
-        } catch (Exception e) {
-            // wrap parsing exceptions as runtime
-            throw new RuntimeException("Cannot parse json", e);
-        }
-    }
-
-    protected static List<String> asStringList(Collection<?> col) {
-        if (col != null) {
-            return col.stream().map(Object::toString).collect(Collectors.toList());
-        } else {
-            return null;
-        }
+        return !Strings.isNullOrEmpty(firstVersion) ? Strings.cutLastZeroDigit(firstVersion) : "";
     }
 
 }
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java
index 5d137fc..3ad47cb 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java
@@ -42,74 +42,12 @@ public class ComponentModel extends BaseModel<ComponentModel.ComponentOptionMode
 
     protected final List<EndpointOptionModel> endpointOptions = new ArrayList<>();
 
-    public static ComponentModel generateComponentModel(String json) {
-        JsonObject obj = deserialize(json);
-        JsonObject mobj = (JsonObject) obj.get("component");
-        ComponentModel model = new ComponentModel();
-        parseModel(mobj, model);
-        model.setScheme(mobj.getString("scheme"));
-        model.setExtendsScheme(mobj.getString("extendsScheme"));
-        model.setAlternativeSchemes(mobj.getString("alternativeSchemes"));
-        model.setSyntax(mobj.getString("syntax"));
-        model.setAlternativeSyntax(mobj.getString("alternativeSyntax"));
-        model.setAsync(mobj.getBooleanOrDefault("async", false));
-        model.setConsumerOnly(mobj.getBooleanOrDefault("consumerOnly", false));
-        model.setProducerOnly(mobj.getBooleanOrDefault("producerOnly", false));
-        model.setLenientProperties(mobj.getBooleanOrDefault("lenientProperties", false));
-        model.setGroupId(mobj.getString("groupId"));
-        model.setArtifactId(mobj.getString("artifactId"));
-        model.setVersion(mobj.getString("version"));
-        JsonObject mcprp = (JsonObject) obj.get("componentProperties");
-        for (Map.Entry<String, Object> entry : mcprp.entrySet()) {
-            JsonObject mp = (JsonObject) entry.getValue();
-            ComponentOptionModel option = new ComponentOptionModel();
-            parseOption(mp, option, entry.getKey());
-            model.addComponentOption(option);
-        }
-        JsonObject mprp = (JsonObject) obj.get("properties");
-        for (Map.Entry<String, Object> entry : mprp.entrySet()) {
-            JsonObject mp = (JsonObject) entry.getValue();
-            EndpointOptionModel option = new EndpointOptionModel();
-            parseOption(mp, option, entry.getKey());
-            model.addEndpointOption(option);
-        }
-        return model;
-    }
-
-    public static String createParameterJsonSchema(ComponentModel model) {
-        JsonObject obj = new JsonObject();
-        obj.put("kind", model.getKind());
-        obj.put("name", model.getName());
-        obj.put("scheme", model.getScheme());
-        obj.put("extendsScheme", model.getExtendsScheme());
-        obj.put("alternativeSchemes", model.getAlternativeSchemes());
-        obj.put("syntax", model.getSyntax());
-        obj.put("alternativeSyntax", model.getAlternativeSyntax());
-        obj.put("title", model.getTitle());
-        obj.put("description", model.getDescription());
-        obj.put("label", model.getLabel());
-        obj.put("deprecated", model.isDeprecated());
-        obj.put("deprecationNote", model.getDeprecationNote());
-        obj.put("async", model.isAsync());
-        obj.put("consumerOnly", model.isConsumerOnly());
-        obj.put("producerOnly", model.isProducerOnly());
-        obj.put("lenientProperties", model.isLenientProperties());
-        obj.put("javaType", model.getJavaType());
-        obj.put("firstVersion", model.getFirstVersion());
-        obj.put("verifiers", model.getVerifiers());
-        obj.put("groupId", model.getGroupId());
-        obj.put("artifactId", model.getArtifactId());
-        obj.put("version", model.getVersion());
-        obj.entrySet().removeIf(e -> e.getValue() == null);
-        JsonObject wrapper = new JsonObject();
-        wrapper.put("component", obj);
-        wrapper.put("componentProperties", asJsonObject(model.getComponentOptions()));
-        wrapper.put("properties", asJsonObject(model.getEndpointOptions()));
-        return Jsoner.prettyPrint(Jsoner.serialize(wrapper), 2, 2);
+    public ComponentModel() {
     }
 
-    public ComponentModel() {
-        setKind("component");
+    @Override
+    public String getKind() {
+        return "component";
     }
 
     public String getScheme() {
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java
index cb50eaa..81f5ad8 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java
@@ -29,55 +29,16 @@ public class DataFormatModel extends BaseModel<DataFormatModel.DataFormatOptionM
     protected String artifactId;
     protected String version;
 
-    public static DataFormatModel generateDataFormatModel(String json) {
-        JsonObject obj = deserialize(json);
-        JsonObject mobj = (JsonObject) obj.get("dataformat");
-        DataFormatModel model = new DataFormatModel();
-        parseModel(mobj, model);
-        model.setModelName(mobj.getString("modelName"));
-        model.setModelJavaType(mobj.getString("modelJavaType"));
-        model.setGroupId(mobj.getString("groupId"));
-        model.setArtifactId(mobj.getString("artifactId"));
-        model.setVersion(mobj.getString("version"));
-        JsonObject mprp = (JsonObject) obj.get("properties");
-        for (Map.Entry<String, Object> entry : mprp.entrySet()) {
-            JsonObject mp = (JsonObject) entry.getValue();
-            DataFormatOptionModel option = new DataFormatOptionModel();
-            parseOption(mp, option, entry.getKey());
-            model.addOption(option);
-        }
-        return model;
-    }
-
-    public static String createParameterJsonSchema(DataFormatModel model) {
-        JsonObject obj = new JsonObject();
-        obj.put("kind", model.getKind());
-        obj.put("name", model.getName());
-        obj.put("modelName", model.getModelName());
-        obj.put("title", model.getTitle());
-        obj.put("description", model.getDescription());
-        obj.put("deprecated", model.isDeprecated());
-        obj.put("deprecationNote", model.getDeprecationNote());
-        obj.put("firstVersion", model.getFirstVersion());
-        obj.put("label", model.getLabel());
-        obj.put("javaType", model.getJavaType());
-        obj.put("modelJavaType", model.getModelJavaType());
-        obj.put("groupId", model.getGroupId());
-        obj.put("artifactId", model.getArtifactId());
-        obj.put("version", model.getVersion());
-        obj.entrySet().removeIf(e -> e.getValue() == null);
-        JsonObject wrapper = new JsonObject();
-        wrapper.put("dataformat", obj);
-        wrapper.put("properties", asJsonObject(model.getOptions()));
-        return Jsoner.prettyPrint(Jsoner.serialize(wrapper), 2, 2);
-    }
-
     public static class DataFormatOptionModel extends BaseOptionModel {
 
     }
 
     public DataFormatModel() {
-        setKind("dataformat");
+    }
+
+    @Override
+    public String getKind() {
+        return "dataformat";
     }
 
     public String getModelName() {
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java
index ebdf0f6..7f23e56 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java
@@ -27,77 +27,12 @@ public class EipModel extends BaseModel<EipModel.EipOptionModel> {
     protected boolean input;          // used in models from camel-core-engine
     protected boolean output;         // used in models from camel-core-engine
 
-    public static EipModel generateEipModel(String json) {
-        JsonObject obj = deserialize(json);
-        JsonObject mobj = (JsonObject) obj.get("model");
-        EipModel model = new EipModel();
-        parseModel(mobj, model);
-        model.setInput(mobj.getBooleanOrDefault("input", false));
-        model.setOutput(mobj.getBooleanOrDefault("output", false));
-        JsonObject mprp = (JsonObject) obj.get("properties");
-        for (Map.Entry<String, Object> entry : mprp.entrySet()) {
-            JsonObject mp = (JsonObject) entry.getValue();
-            EipOptionModel option = new EipOptionModel();
-            parseOption(mp, option, entry.getKey());
-            model.addOption(option);
-        }
-        return model;
-    }
-
-    public static String createParameterJsonSchema(EipModel model) {
-        JsonObject obj = new JsonObject();
-        obj.put("kind", model.getKind());
-        obj.put("name", model.getName());
-        obj.put("title", model.getTitle());
-        obj.put("description", model.getDescription());
-        obj.put("firstVersion", model.getFirstVersion());
-        obj.put("javaType", model.getJavaType());
-        obj.put("label", model.getLabel());
-        obj.put("deprecated", model.isDeprecated());
-        obj.put("deprecationNote", model.getDeprecationNote());
-        obj.put("input", model.isInput());
-        obj.put("output", model.isOutput());
-        obj.entrySet().removeIf(e -> e.getValue() == null);
-        JsonObject wrapper = new JsonObject();
-        wrapper.put("model", obj);
-        wrapper.put("properties", asJsonObject(model.getOptions()));
-        return Jsoner.prettyPrint(Jsoner.serialize(wrapper), 2, 2);
-    }
-
-    public static JsonObject asJsonObject(List<? extends BaseOptionModel> options) {
-        JsonObject json = new JsonObject();
-        options.forEach(option -> json.put(option.getName(), asJsonObject(option)));
-        return json;
-    }
-
-    public static JsonObject asJsonObject(BaseOptionModel option) {
-        JsonObject prop = new JsonObject();
-        prop.put("kind", option.getKind());
-        prop.put("displayName", option.getDisplayName());
-        prop.put("group", option.getGroup());
-        prop.put("label", option.getLabel());
-        prop.put("required", option.isRequired());
-        prop.put("type", option.getType());
-        prop.put("javaType", option.getJavaType());
-        prop.put("enums", option.getEnums());
-        prop.put("oneOfs", option.getOneOfs());
-        prop.put("prefix", option.getPrefix());
-        prop.put("optionalPrefix", option.getOptionalPrefix());
-        prop.put("multiValue", option.isMultiValue() ? Boolean.TRUE : null);
-        prop.put("deprecated", option.isDeprecated());
-        prop.put("deprecationNote", option.getDeprecationNote());
-        prop.put("secret", option.isSecret());
-        prop.put("defaultValue", option.getDefaultValue());
-        prop.put("asPredicate", option.isAsPredicate() ? Boolean.TRUE : null);
-        prop.put("configurationClass", option.getConfigurationClass());
-        prop.put("configurationField", option.getConfigurationField());
-        prop.put("description", option.getDescription());
-        prop.entrySet().removeIf(e -> e.getValue() == null);
-        return prop;
+    public EipModel() {
     }
 
-    public EipModel() {
-        setKind("model");
+    @Override
+    public String getKind() {
+        return "model";
     }
 
     public boolean isInput() {
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
new file mode 100644
index 0000000..5665758
--- /dev/null
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
@@ -0,0 +1,417 @@
+/*
+ * 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.tooling.model;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.camel.tooling.model.ComponentModel.ComponentOptionModel;
+import org.apache.camel.tooling.model.ComponentModel.EndpointOptionModel;
+import org.apache.camel.tooling.model.DataFormatModel.DataFormatOptionModel;
+import org.apache.camel.tooling.model.EipModel.EipOptionModel;
+import org.apache.camel.tooling.model.LanguageModel.LanguageOptionModel;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+
+public class JsonMapper {
+
+    public static BaseModel<?> generateModel(Path file) {
+        try {
+            String json = new String(Files.readAllBytes(file), StandardCharsets.UTF_8);
+            return generateModel(json);
+        } catch (IOException e) {
+            throw new RuntimeException("Error reading json file: " + file, e);
+        }
+    }
+
+    public static BaseModel<?> generateModel(String json) {
+        JsonObject obj = deserialize(json);
+        return generateModel(obj);
+    }
+
+    public static BaseModel<?> generateModel(JsonObject obj) {
+        if (obj.containsKey("component")) {
+            return generateComponentModel(obj);
+        } else if (obj.containsKey("language")) {
+            return generateLanguageModel(obj);
+        } else if (obj.containsKey("dataformat")) {
+            return generateDataFormatModel(obj);
+        } else if (obj.containsKey("other")) {
+            return generateOtherModel(obj);
+        } else if (obj.containsKey("model")) {
+            return generateEipModel(obj);
+        } else {
+            throw new IllegalArgumentException("Unsupported JSON");
+        }
+    }
+
+    public static ComponentModel generateComponentModel(String json) {
+        JsonObject obj = deserialize(json);
+        return generateComponentModel(obj);
+    }
+
+    public static ComponentModel generateComponentModel(JsonObject obj) {
+        JsonObject mobj = (JsonObject) obj.get("component");
+        ComponentModel model = new ComponentModel();
+        parseModel(mobj, model);
+        model.setScheme(mobj.getString("scheme"));
+        model.setExtendsScheme(mobj.getString("extendsScheme"));
+        model.setAlternativeSchemes(mobj.getString("alternativeSchemes"));
+        model.setSyntax(mobj.getString("syntax"));
+        model.setAlternativeSyntax(mobj.getString("alternativeSyntax"));
+        model.setAsync(mobj.getBooleanOrDefault("async", false));
+        model.setConsumerOnly(mobj.getBooleanOrDefault("consumerOnly", false));
+        model.setProducerOnly(mobj.getBooleanOrDefault("producerOnly", false));
+        model.setLenientProperties(mobj.getBooleanOrDefault("lenientProperties", false));
+        model.setGroupId(mobj.getString("groupId"));
+        model.setArtifactId(mobj.getString("artifactId"));
+        model.setVersion(mobj.getString("version"));
+        JsonObject mcprp = (JsonObject) obj.get("componentProperties");
+        for (Map.Entry<String, Object> entry : mcprp.entrySet()) {
+            JsonObject mp = (JsonObject) entry.getValue();
+            ComponentOptionModel option = new ComponentOptionModel();
+            parseOption(mp, option, entry.getKey());
+            model.addComponentOption(option);
+        }
+        JsonObject mprp = (JsonObject) obj.get("properties");
+        for (Map.Entry<String, Object> entry : mprp.entrySet()) {
+            JsonObject mp = (JsonObject) entry.getValue();
+            EndpointOptionModel option = new EndpointOptionModel();
+            parseOption(mp, option, entry.getKey());
+            model.addEndpointOption(option);
+        }
+        return model;
+    }
+
+    public static String createParameterJsonSchema(ComponentModel model) {
+        JsonObject wrapper = asJsonObject(model);
+        return Jsoner.prettyPrint(Jsoner.serialize(wrapper), 2, 2);
+    }
+
+    public static JsonObject asJsonObject(ComponentModel model) {
+        JsonObject obj = new JsonObject();
+        obj.put("kind", model.getKind());
+        obj.put("name", model.getName());
+        obj.put("scheme", model.getScheme());
+        obj.put("extendsScheme", model.getExtendsScheme());
+        obj.put("alternativeSchemes", model.getAlternativeSchemes());
+        obj.put("syntax", model.getSyntax());
+        obj.put("alternativeSyntax", model.getAlternativeSyntax());
+        obj.put("title", model.getTitle());
+        obj.put("description", model.getDescription());
+        obj.put("label", model.getLabel());
+        obj.put("deprecated", model.isDeprecated());
+        obj.put("deprecationNote", model.getDeprecationNote());
+        obj.put("async", model.isAsync());
+        obj.put("consumerOnly", model.isConsumerOnly());
+        obj.put("producerOnly", model.isProducerOnly());
+        obj.put("lenientProperties", model.isLenientProperties());
+        obj.put("javaType", model.getJavaType());
+        obj.put("firstVersion", model.getFirstVersion());
+        obj.put("verifiers", model.getVerifiers());
+        obj.put("groupId", model.getGroupId());
+        obj.put("artifactId", model.getArtifactId());
+        obj.put("version", model.getVersion());
+        obj.entrySet().removeIf(e -> e.getValue() == null);
+        JsonObject wrapper = new JsonObject();
+        wrapper.put("component", obj);
+        wrapper.put("componentProperties", asJsonObject(model.getComponentOptions()));
+        wrapper.put("properties", asJsonObject(model.getEndpointOptions()));
+        return wrapper;
+    }
+
+    public static DataFormatModel generateDataFormatModel(String json) {
+        JsonObject obj = deserialize(json);
+        return generateDataFormatModel(obj);
+    }
+
+    public static DataFormatModel generateDataFormatModel(JsonObject obj) {
+        JsonObject mobj = (JsonObject) obj.get("dataformat");
+        DataFormatModel model = new DataFormatModel();
+        parseModel(mobj, model);
+        model.setModelName(mobj.getString("modelName"));
+        model.setModelJavaType(mobj.getString("modelJavaType"));
+        model.setGroupId(mobj.getString("groupId"));
+        model.setArtifactId(mobj.getString("artifactId"));
+        model.setVersion(mobj.getString("version"));
+        JsonObject mprp = (JsonObject) obj.get("properties");
+        for (Map.Entry<String, Object> entry : mprp.entrySet()) {
+            JsonObject mp = (JsonObject) entry.getValue();
+            DataFormatOptionModel option = new DataFormatOptionModel();
+            parseOption(mp, option, entry.getKey());
+            model.addOption(option);
+        }
+        return model;
+    }
+
+    public static String createParameterJsonSchema(DataFormatModel model) {
+        JsonObject wrapper = asJsonObject(model);
+        return Jsoner.prettyPrint(Jsoner.serialize(wrapper), 2, 2);
+    }
+
+    public static JsonObject asJsonObject(DataFormatModel model) {
+        JsonObject obj = new JsonObject();
+        obj.put("kind", model.getKind());
+        obj.put("name", model.getName());
+        obj.put("modelName", model.getModelName());
+        obj.put("title", model.getTitle());
+        obj.put("description", model.getDescription());
+        obj.put("deprecated", model.isDeprecated());
+        obj.put("deprecationNote", model.getDeprecationNote());
+        obj.put("firstVersion", model.getFirstVersion());
+        obj.put("label", model.getLabel());
+        obj.put("javaType", model.getJavaType());
+        obj.put("modelJavaType", model.getModelJavaType());
+        obj.put("groupId", model.getGroupId());
+        obj.put("artifactId", model.getArtifactId());
+        obj.put("version", model.getVersion());
+        obj.entrySet().removeIf(e -> e.getValue() == null);
+        JsonObject wrapper = new JsonObject();
+        wrapper.put("dataformat", obj);
+        wrapper.put("properties", asJsonObject(model.getOptions()));
+        return wrapper;
+    }
+
+    public static EipModel generateEipModel(String json) {
+        JsonObject obj = deserialize(json);
+        return generateEipModel(obj);
+    }
+
+    public static EipModel generateEipModel(JsonObject obj) {
+        JsonObject mobj = (JsonObject) obj.get("model");
+        EipModel model = new EipModel();
+        parseModel(mobj, model);
+        model.setInput(mobj.getBooleanOrDefault("input", false));
+        model.setOutput(mobj.getBooleanOrDefault("output", false));
+        JsonObject mprp = (JsonObject) obj.get("properties");
+        for (Map.Entry<String, Object> entry : mprp.entrySet()) {
+            JsonObject mp = (JsonObject) entry.getValue();
+            EipOptionModel option = new EipOptionModel();
+            parseOption(mp, option, entry.getKey());
+            model.addOption(option);
+        }
+        return model;
+    }
+
+    public static String createParameterJsonSchema(EipModel model) {
+        JsonObject wrapper = asJsonObject(model);
+        return Jsoner.prettyPrint(Jsoner.serialize(wrapper), 2, 2);
+    }
+
+    public static JsonObject asJsonObject(EipModel model) {
+        JsonObject obj = new JsonObject();
+        obj.put("kind", model.getKind());
+        obj.put("name", model.getName());
+        obj.put("title", model.getTitle());
+        obj.put("description", model.getDescription());
+        obj.put("firstVersion", model.getFirstVersion());
+        obj.put("javaType", model.getJavaType());
+        obj.put("label", model.getLabel());
+        obj.put("deprecated", model.isDeprecated());
+        obj.put("deprecationNote", model.getDeprecationNote());
+        obj.put("input", model.isInput());
+        obj.put("output", model.isOutput());
+        obj.entrySet().removeIf(e -> e.getValue() == null);
+        JsonObject wrapper = new JsonObject();
+        wrapper.put("model", obj);
+        wrapper.put("properties", asJsonObject(model.getOptions()));
+        return wrapper;
+    }
+
+    public static LanguageModel generateLanguageModel(String json) {
+        JsonObject obj = deserialize(json);
+        return generateLanguageModel(obj);
+    }
+
+    public static LanguageModel generateLanguageModel(JsonObject obj) {
+        JsonObject mobj = (JsonObject) obj.get("language");
+        LanguageModel model = new LanguageModel();
+        parseModel(mobj, model);
+        model.setModelName(mobj.getString("modelName"));
+        model.setModelJavaType(mobj.getString("modelJavaType"));
+        model.setGroupId(mobj.getString("groupId"));
+        model.setArtifactId(mobj.getString("artifactId"));
+        model.setVersion(mobj.getString("version"));
+        JsonObject mprp = (JsonObject) obj.get("properties");
+        for (Map.Entry<String, Object> entry : mprp.entrySet()) {
+            JsonObject mp = (JsonObject) entry.getValue();
+            LanguageOptionModel option = new LanguageOptionModel();
+            parseOption(mp, option, entry.getKey());
+            model.addOption(option);
+        }
+        return model;
+    }
+
+    public static String createParameterJsonSchema(LanguageModel model) {
+        JsonObject wrapper = asJsonObject(model);
+        return Jsoner.prettyPrint(Jsoner.serialize(wrapper), 2, 2);
+    }
+
+    public static JsonObject asJsonObject(LanguageModel model) {
+        JsonObject obj = new JsonObject();
+        obj.put("kind", model.getKind());
+        obj.put("name", model.getName());
+        obj.put("modelName", model.getModelName());
+        obj.put("title", model.getTitle());
+        obj.put("description", model.getDescription());
+        obj.put("deprecated", model.isDeprecated());
+        obj.put("deprecationNote", model.getDeprecationNote());
+        obj.put("firstVersion", model.getFirstVersion());
+        obj.put("label", model.getLabel());
+        obj.put("javaType", model.getJavaType());
+        obj.put("modelJavaType", model.getModelJavaType());
+        obj.put("groupId", model.getGroupId());
+        obj.put("artifactId", model.getArtifactId());
+        obj.put("version", model.getVersion());
+        obj.entrySet().removeIf(e -> e.getValue() == null);
+        JsonObject wrapper = new JsonObject();
+        wrapper.put("language", obj);
+        wrapper.put("properties", asJsonObject(model.getOptions()));
+        return wrapper;
+    }
+
+    public static OtherModel generateOtherModel(String json) {
+        JsonObject obj = deserialize(json);
+        return generateOtherModel(obj);
+    }
+
+    public static OtherModel generateOtherModel(JsonObject obj) {
+        JsonObject mobj = (JsonObject) obj.get("other");
+        OtherModel model = new OtherModel();
+        parseModel(mobj, model);
+        model.setGroupId(mobj.getString("groupId"));
+        model.setArtifactId(mobj.getString("artifactId"));
+        model.setVersion(mobj.getString("version"));
+        return model;
+    }
+
+    public static String createJsonSchema(OtherModel model) {
+        JsonObject wrapper = asJsonObject(model);
+        return Jsoner.prettyPrint(Jsoner.serialize(wrapper), 2, 2);
+    }
+
+    public static JsonObject asJsonObject(OtherModel model) {
+        JsonObject obj = new JsonObject();
+        obj.put("kind", model.getKind());
+        obj.put("name", model.getName());
+        obj.put("title", model.getTitle());
+        obj.put("description", model.getDescription());
+        obj.put("deprecated", model.isDeprecated());
+        obj.put("deprecationNote", model.getDeprecationNote());
+        obj.put("firstVersion", model.getFirstVersion());
+        obj.put("label", model.getLabel());
+        obj.put("groupId", model.getGroupId());
+        obj.put("artifactId", model.getArtifactId());
+        obj.put("version", model.getVersion());
+        obj.entrySet().removeIf(e -> e.getValue() == null);
+        JsonObject wrapper = new JsonObject();
+        wrapper.put("other", obj);
+        return wrapper;
+    }
+
+    private static void parseModel(JsonObject mobj, BaseModel<?> model) {
+        model.setTitle(mobj.getString("title"));
+        model.setName(mobj.getString("name"));
+        model.setDescription(mobj.getString("description"));
+        model.setFirstVersion(mobj.getString("firstVersion"));
+        model.setLabel(mobj.getString("label"));
+        model.setDeprecated(mobj.getBooleanOrDefault("deprecated", false));
+        model.setDeprecationNote(mobj.getString("label"));
+        model.setJavaType(mobj.getString("javaType"));
+    }
+
+    private static void parseOption(JsonObject mp, BaseOptionModel option, String name) {
+        option.setName(name);
+        option.setKind(mp.getString("kind"));
+        option.setDisplayName(mp.getString("displayName"));
+        option.setGroup(mp.getString("group"));
+        option.setLabel(mp.getString("label"));
+        option.setRequired(mp.getBooleanOrDefault("required", false));
+        option.setType(mp.getString("type"));
+        option.setJavaType(mp.getString("javaType"));
+        option.setEnums(asStringList(mp.getCollection("enum")));
+        option.setOneOfs(asStringList(mp.getCollection("oneOf")));
+        option.setPrefix(mp.getString("prefix"));
+        option.setOptionalPrefix(mp.getString("optionalPrefix"));
+        option.setMultiValue(mp.getBooleanOrDefault("multiValue", false));
+        option.setDeprecated(mp.getBooleanOrDefault("deprecated", false));
+        option.setDeprecationNote(mp.getString("deprecationNote"));
+        option.setSecret(mp.getBooleanOrDefault("secret", false));
+        option.setDefaultValue(mp.get("defaultValue"));
+        option.setAsPredicate(mp.getBooleanOrDefault("asPredicate", false));
+        option.setConfigurationClass(mp.getString("configurationClass"));
+        option.setConfigurationField(mp.getString("configurationField"));
+        option.setDescription(mp.getString("description"));
+    }
+
+    public static JsonObject asJsonObject(List<? extends BaseOptionModel> options) {
+        JsonObject json = new JsonObject();
+        options.forEach(option -> json.put(option.getName(), asJsonObject(option)));
+        return json;
+    }
+
+    public static JsonObject asJsonObject(BaseOptionModel option) {
+        JsonObject prop = new JsonObject();
+        prop.put("kind", option.getKind());
+        prop.put("displayName", option.getDisplayName());
+        prop.put("group", option.getGroup());
+        prop.put("label", option.getLabel());
+        prop.put("required", option.isRequired());
+        prop.put("type", option.getType());
+        prop.put("javaType", option.getJavaType());
+        prop.put("enums", option.getEnums());
+        prop.put("oneOfs", option.getOneOfs());
+        prop.put("prefix", option.getPrefix());
+        prop.put("optionalPrefix", option.getOptionalPrefix());
+        prop.put("multiValue", option.isMultiValue());
+        prop.put("deprecated", option.isDeprecated());
+        prop.put("deprecationNote", option.getDeprecationNote());
+        prop.put("secret", option.isSecret());
+        prop.put("defaultValue", option.getDefaultValue());
+        prop.put("asPredicate", option.isAsPredicate());
+        prop.put("configurationClass", option.getConfigurationClass());
+        prop.put("configurationField", option.getConfigurationField());
+        prop.put("description", option.getDescription());
+        prop.entrySet().removeIf(e -> e.getValue() == null);
+        prop.remove("multiValue", Boolean.FALSE);
+        prop.remove("asPredicate", Boolean.FALSE);
+        return prop;
+    }
+
+    public static JsonObject deserialize(String json) {
+        try {
+            return (JsonObject) Jsoner.deserialize(json);
+        } catch (Exception e) {
+            // wrap parsing exceptions as runtime
+            throw new RuntimeException("Cannot parse json", e);
+        }
+    }
+
+    protected static List<String> asStringList(Collection<?> col) {
+        if (col != null) {
+            return col.stream().map(Object::toString).collect(Collectors.toList());
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java
index 068ecca..6cb6f83 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java
@@ -29,55 +29,16 @@ public class LanguageModel extends BaseModel<LanguageModel.LanguageOptionModel>
     protected String artifactId;
     protected String version;
 
-    public static LanguageModel generateLanguageModel(String json) {
-        JsonObject obj = deserialize(json);
-        JsonObject mobj = (JsonObject) obj.get("language");
-        LanguageModel model = new LanguageModel();
-        parseModel(mobj, model);
-        model.setModelName(mobj.getString("modelName"));
-        model.setModelJavaType(mobj.getString("modelJavaType"));
-        model.setGroupId(mobj.getString("groupId"));
-        model.setArtifactId(mobj.getString("artifactId"));
-        model.setVersion(mobj.getString("version"));
-        JsonObject mprp = (JsonObject) obj.get("properties");
-        for (Map.Entry<String, Object> entry : mprp.entrySet()) {
-            JsonObject mp = (JsonObject) entry.getValue();
-            LanguageOptionModel option = new LanguageOptionModel();
-            parseOption(mp, option, entry.getKey());
-            model.addOption(option);
-        }
-        return model;
-    }
-
-    public static String createParameterJsonSchema(LanguageModel model) {
-        JsonObject obj = new JsonObject();
-        obj.put("kind", model.getKind());
-        obj.put("name", model.getName());
-        obj.put("modelName", model.getModelName());
-        obj.put("title", model.getTitle());
-        obj.put("description", model.getDescription());
-        obj.put("deprecated", model.isDeprecated());
-        obj.put("deprecationNote", model.getDeprecationNote());
-        obj.put("firstVersion", model.getFirstVersion());
-        obj.put("label", model.getLabel());
-        obj.put("javaType", model.getJavaType());
-        obj.put("modelJavaType", model.getModelJavaType());
-        obj.put("groupId", model.getGroupId());
-        obj.put("artifactId", model.getArtifactId());
-        obj.put("version", model.getVersion());
-        obj.entrySet().removeIf(e -> e.getValue() == null);
-        JsonObject wrapper = new JsonObject();
-        wrapper.put("language", obj);
-        wrapper.put("properties", asJsonObject(model.getOptions()));
-        return Jsoner.prettyPrint(Jsoner.serialize(wrapper), 2, 2);
-    }
-
     public static class LanguageOptionModel extends BaseOptionModel {
 
     }
 
     public LanguageModel() {
-        setKind("language");
+    }
+
+    @Override
+    public String getKind() {
+        return "language";
     }
 
     public String getModelName() {
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java
index db3398f..9730781 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java
@@ -25,38 +25,12 @@ public class OtherModel extends BaseModel<BaseOptionModel> {
     protected String artifactId;
     protected String version;
 
-    public static OtherModel generateOtherModel(String json) {
-        JsonObject obj = deserialize(json);
-        JsonObject mobj = (JsonObject) obj.get("other");
-        OtherModel model = new OtherModel();
-        parseModel(mobj, model);
-        model.setGroupId(mobj.getString("groupId"));
-        model.setArtifactId(mobj.getString("artifactId"));
-        model.setVersion(mobj.getString("version"));
-        return model;
-    }
-
-    public static String createJsonSchema(OtherModel model) {
-        JsonObject obj = new JsonObject();
-        obj.put("kind", "other");
-        obj.put("name", model.getName());
-        obj.put("title", model.getTitle());
-        obj.put("description", model.getDescription());
-        obj.put("deprecated", model.isDeprecated());
-        obj.put("deprecationNote", model.getDeprecationNote());
-        obj.put("firstVersion", model.getFirstVersion());
-        obj.put("label", model.getLabel());
-        obj.put("groupId", model.getGroupId());
-        obj.put("artifactId", model.getArtifactId());
-        obj.put("version", model.getVersion());
-        obj.entrySet().removeIf(e -> e.getValue() == null);
-        JsonObject wrapper = new JsonObject();
-        wrapper.put("other", obj);
-        return Jsoner.prettyPrint(Jsoner.serialize(wrapper), 2, 2);
+    public OtherModel() {
     }
 
-    public OtherModel() {
-        setKind("other");
+    @Override
+    public String getKind() {
+        return "other";
     }
 
     public String getGroupId() {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
index 41e2226..1a92a62 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
@@ -45,6 +45,7 @@ import org.apache.camel.spi.UriParams;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.tooling.model.ComponentModel;
 import org.apache.camel.tooling.model.ComponentModel.EndpointOptionModel;
+import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.camel.tooling.util.Strings;
 import org.apache.camel.tooling.util.srcgen.GenericType;
@@ -211,7 +212,7 @@ public class EndpointDslMojo extends AbstractMojo {
             for (String componentName : componentNames) {
                 String json = loadComponentJson(jsonFiles, componentName);
                 if (json != null) {
-                    ComponentModel model = ComponentModel.generateComponentModel(json);
+                    ComponentModel model = JsonMapper.generateComponentModel(json);
                     allModels.add(model);
                 }
             }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java
index e5bca21..7e7bcbb 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java
@@ -29,6 +29,7 @@ import org.apache.camel.tooling.model.DataFormatModel;
 import org.apache.camel.tooling.model.DataFormatModel.DataFormatOptionModel;
 import org.apache.camel.tooling.model.EipModel;
 import org.apache.camel.tooling.model.EipModel.EipOptionModel;
+import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.camel.tooling.util.Strings;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -140,7 +141,7 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo {
                         if (log.isDebugEnabled()) {
                             log.debug("Model: " + dataFormatModel);
                         }
-                        String schema = DataFormatModel.createParameterJsonSchema(dataFormatModel);
+                        String schema = JsonMapper.createParameterJsonSchema(dataFormatModel);
                         if (log.isDebugEnabled()) {
                             log.debug("JSon schema:\n" + schema);
                         }
@@ -187,9 +188,8 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo {
     }
 
     private static DataFormatModel extractDataFormatModel(MavenProject project, String json, String name, String javaType) {
-        EipModel def = EipModel.generateEipModel(json);
+        EipModel def = JsonMapper.generateEipModel(json);
         DataFormatModel model = new DataFormatModel();
-        model.setKind("dataformat");
         model.setName(name);
         model.setTitle(asModelTitle(name, def.getTitle()));
         model.setDescription(def.getDescription());
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java
index 2343814..bdc2622 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java
@@ -25,6 +25,7 @@ import java.util.Map;
 
 import org.apache.camel.tooling.model.EipModel;
 import org.apache.camel.tooling.model.EipModel.EipOptionModel;
+import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.LanguageModel.LanguageOptionModel;
 import org.apache.camel.tooling.util.PackageHelper;
@@ -138,7 +139,7 @@ public class PackageLanguageMojo extends AbstractGeneratorMojo {
                         }
 
                         // build json schema for the data format
-                        String schema = LanguageModel.createParameterJsonSchema(languageModel);
+                        String schema = JsonMapper.createParameterJsonSchema(languageModel);
                         if (log.isDebugEnabled()) {
                             log.debug("JSon schema\n" + schema);
                         }
@@ -174,9 +175,8 @@ public class PackageLanguageMojo extends AbstractGeneratorMojo {
     }
 
     protected static LanguageModel extractLanguageModel(MavenProject project, String json, String name, String javaType) {
-        EipModel def = EipModel.generateEipModel(json);
+        EipModel def = JsonMapper.generateEipModel(json);
         LanguageModel model = new LanguageModel();
-        model.setKind("language");
         model.setName(name);
         model.setTitle(asTitle(name, def.getTitle()));
         model.setDescription(asDescription(name, def.getDescription()));
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java
index bf1e5da..c7f8850 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java
@@ -20,6 +20,7 @@ import java.io.File;
 import java.nio.file.Path;
 import java.util.Collections;
 
+import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.model.OtherModel;
 import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.camel.tooling.util.Strings;
@@ -114,7 +115,7 @@ public class PackageOtherMojo extends AbstractGeneratorMojo {
                 log.debug("Model: " + otherModel);
             }
 
-            String schema = OtherModel.createJsonSchema(otherModel);
+            String schema = JsonMapper.createJsonSchema(otherModel);
 
             // write this to the directory
             Path out = schemaOutDir.toPath().resolve(name + PackageHelper.JSON_SUFIX);
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java
index 2f25e7f..ef66838 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java
@@ -27,6 +27,7 @@ import java.util.TreeSet;
 import org.apache.camel.tooling.model.BaseModel;
 import org.apache.camel.tooling.model.ComponentModel;
 import org.apache.camel.tooling.model.DataFormatModel;
+import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.OtherModel;
 import org.apache.camel.tooling.util.PackageHelper;
@@ -118,7 +119,7 @@ public class PrepareUserGuideMojo extends AbstractMojo {
             List<ComponentModel> models = new ArrayList<>();
             for (File file : componentFiles) {
                 String json =  PackageHelper.loadText(file);
-                ComponentModel model = ComponentModel.generateComponentModel(json);
+                ComponentModel model = JsonMapper.generateComponentModel(json);
 
                 // filter out alternative schemas which reuses documentation
                 boolean add = true;
@@ -186,7 +187,7 @@ public class PrepareUserGuideMojo extends AbstractMojo {
             List<OtherModel> models = new ArrayList<>();
             for (File file : otherFiles) {
                 String json =  PackageHelper.loadText(file);
-                OtherModel model = OtherModel.generateOtherModel(json);
+                OtherModel model = JsonMapper.generateOtherModel(json);
                 models.add(model);
             }
 
@@ -230,7 +231,7 @@ public class PrepareUserGuideMojo extends AbstractMojo {
             List<DataFormatModel> models = new ArrayList<>();
             for (File file : dataFormatFiles) {
                 String json =  PackageHelper.loadText(file);
-                DataFormatModel model = DataFormatModel.generateDataFormatModel(json);
+                DataFormatModel model = JsonMapper.generateDataFormatModel(json);
                 models.add(model);
             }
 
@@ -274,7 +275,7 @@ public class PrepareUserGuideMojo extends AbstractMojo {
             List<LanguageModel> models = new ArrayList<>();
             for (File file : languageFiles) {
                 String json =  PackageHelper.loadText(file);
-                LanguageModel model = LanguageModel.generateLanguageModel(json);
+                LanguageModel model = JsonMapper.generateLanguageModel(json);
                 models.add(model);
             }
 
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateDocComponentListMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateDocComponentListMojo.java
index ba6951e..c6fd072 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateDocComponentListMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateDocComponentListMojo.java
@@ -30,6 +30,7 @@ import java.util.TreeSet;
 import org.apache.camel.tooling.model.BaseModel;
 import org.apache.camel.tooling.model.ComponentModel;
 import org.apache.camel.tooling.model.DataFormatModel;
+import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.OtherModel;
 import org.apache.camel.tooling.util.PackageHelper;
@@ -122,7 +123,7 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
             List<ComponentModel> models = new ArrayList<>();
             for (File file : componentFiles) {
                 String json = PackageHelper.loadText(file);
-                ComponentModel model = ComponentModel.generateComponentModel(json);
+                ComponentModel model = JsonMapper.generateComponentModel(json);
 
                 // filter out alternative schemas which reuses documentation
                 boolean add = true;
@@ -184,7 +185,7 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
             List<OtherModel> models = new ArrayList<>();
             for (File file : otherFiles) {
                 String json = PackageHelper.loadText(file);
-                OtherModel model = OtherModel.generateOtherModel(json);
+                OtherModel model = JsonMapper.generateOtherModel(json);
                 models.add(model);
             }
 
@@ -229,7 +230,7 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
             List<DataFormatModel> models = new ArrayList<>();
             for (File file : dataFormatFiles) {
                 String json = PackageHelper.loadText(file);
-                DataFormatModel model = DataFormatModel.generateDataFormatModel(json);
+                DataFormatModel model = JsonMapper.generateDataFormatModel(json);
 
                 // special for bindy as we have one common file
                 if (model.getName().startsWith("bindy")) {
@@ -280,7 +281,7 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
             List<LanguageModel> models = new ArrayList<>();
             for (File file : languageFiles) {
                 String json = PackageHelper.loadText(file);
-                LanguageModel model = LanguageModel.generateLanguageModel(json);
+                LanguageModel model = JsonMapper.generateLanguageModel(json);
                 models.add(model);
             }
 
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java
index e1f3078..483173c 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java
@@ -35,6 +35,7 @@ import org.apache.camel.tooling.model.ComponentModel;
 import org.apache.camel.tooling.model.DataFormatModel;
 import org.apache.camel.tooling.model.EipModel;
 import org.apache.camel.tooling.model.EipModel.EipOptionModel;
+import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.camel.tooling.util.Strings;
@@ -256,7 +257,7 @@ public class UpdateReadmeMojo extends AbstractMojo {
                 if (json != null) {
                     File file = new File(docDir, languageName + "-language.adoc");
 
-                    LanguageModel model = LanguageModel.generateLanguageModel(json);
+                    LanguageModel model = JsonMapper.generateLanguageModel(json);
                     // skip option named id
                     model.getOptions().removeIf(opt -> Objects.equals(opt.getName(), "id")
                                                     || Objects.equals(opt.getName(), "expression"));
@@ -327,7 +328,7 @@ public class UpdateReadmeMojo extends AbstractMojo {
             for (File jsonFile : jsonFiles) {
                 String json = loadEipJson(jsonFile);
                 if (json != null) {
-                    EipModel model = EipModel.generateEipModel(json);
+                    EipModel model = JsonMapper.generateEipModel(json);
                     // skip option named id/description/expression/outputs
                     model.getOptions().removeIf(option -> "id".equals(option.getName())
                             || "description".equals(option.getName())
@@ -722,7 +723,7 @@ public class UpdateReadmeMojo extends AbstractMojo {
     }
 
     private static ComponentModel generateComponentModel(String json) {
-        ComponentModel component = ComponentModel.generateComponentModel(json);
+        ComponentModel component = JsonMapper.generateComponentModel(json);
         Stream.concat(component.getComponentOptions().stream(),
                       component.getEndpointOptions().stream())
                 .filter(BaseOptionModel::isRequired)
@@ -747,7 +748,7 @@ public class UpdateReadmeMojo extends AbstractMojo {
     }
 
     private static DataFormatModel generateDataFormatModel(String json) {
-        DataFormatModel model = DataFormatModel.generateDataFormatModel(json);
+        DataFormatModel model = JsonMapper.generateDataFormatModel(json);
         // skip option named id
         model.getOptions().removeIf(opt -> Objects.equals(opt.getName(), "id"));
         // enhance description for deprecated options