You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/08/21 16:46:19 UTC

[camel] 01/01: CAMEL-19771: camel-core-model - RouteConfigurationsDefinition should be id and resource

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

davsclaus pushed a commit to branch CAMEL-19771
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 288d552853a3aa716fdb63b97990c3afa24fcc2f
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Aug 21 18:42:01 2023 +0200

    CAMEL-19771: camel-core-model - RouteConfigurationsDefinition should be id and resource
---
 .../org/apache/camel/spi/DumpRoutesStrategy.java   |  3 +-
 .../camel/impl/DefaultDumpRoutesStrategy.java      | 66 ++++++++++++++++++++++
 .../apache/camel/model/routeConfigurations.json    |  3 +-
 .../camel/model/RouteConfigurationDefinition.java  | 17 +++++-
 .../camel/model/RouteConfigurationsDefinition.java | 30 +++++++++-
 .../org/apache/camel/model/RoutesDefinition.java   |  2 +-
 .../camel-main-configuration-metadata.json         |  2 +-
 core/camel-main/src/main/docs/main.adoc            |  2 +-
 .../camel/main/DefaultConfigurationProperties.java |  6 +-
 .../java/org/apache/camel/xml/in/ModelParser.java  |  4 +-
 .../java/org/apache/camel/xml/out/ModelWriter.java |  2 +
 .../org/apache/camel/yaml/out/ModelWriter.java     |  2 +
 12 files changed, 128 insertions(+), 11 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/DumpRoutesStrategy.java b/core/camel-api/src/main/java/org/apache/camel/spi/DumpRoutesStrategy.java
index a9c3e04691d..9b9ae13a96b 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/DumpRoutesStrategy.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/DumpRoutesStrategy.java
@@ -40,7 +40,8 @@ public interface DumpRoutesStrategy extends StaticService {
     /**
      * Controls what to include in output.
      *
-     * Possible values: routes, rests, routeTemplates. Multiple values can be separated by comma. Default is routes.
+     * Possible values: all, routes, rests, routeConfigurations, routeTemplates. Multiple values can be separated by comma.
+     * Default is routes.
      */
     void setInclude(String include);
 
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultDumpRoutesStrategy.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultDumpRoutesStrategy.java
index b002b0211ca..efbf597efe0 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultDumpRoutesStrategy.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultDumpRoutesStrategy.java
@@ -27,6 +27,8 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.NamedNode;
 import org.apache.camel.model.Model;
+import org.apache.camel.model.RouteConfigurationDefinition;
+import org.apache.camel.model.RouteConfigurationsDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RouteTemplateDefinition;
 import org.apache.camel.model.RouteTemplatesDefinition;
@@ -160,6 +162,38 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
             }
         }
 
+        if (include.contains("*") || include.contains("all") || include.contains("routeConfigurations")
+                || include.contains("route-configurations")) {
+            int size = model.getRouteConfigurationDefinitions().size();
+            if (size > 0) {
+                Map<Resource, RouteConfigurationsDefinition> groups = new LinkedHashMap<>();
+                for (RouteConfigurationDefinition config : model.getRouteConfigurationDefinitions()) {
+                    Resource res = config.getResource();
+                    if (res == null) {
+                        res = dummy;
+                    }
+                    RouteConfigurationsDefinition routes
+                            = groups.computeIfAbsent(res, resource -> new RouteConfigurationsDefinition());
+                    routes.getRouteConfigurations().add(config);
+                }
+                StringBuilder sbLog = new StringBuilder();
+                for (Map.Entry<Resource, RouteConfigurationsDefinition> entry : groups.entrySet()) {
+                    RouteConfigurationsDefinition def = entry.getValue();
+                    Resource resource = entry.getKey();
+
+                    StringBuilder sbLocal = new StringBuilder();
+                    doDumpYaml(camelContext, def, resource == dummy ? null : resource, dumper, "route-configurations", sbLocal,
+                            sbLog);
+                    // dump each resource into its own file
+                    doDumpToDirectory(resource, sbLocal, "route-configurations", "yaml");
+                }
+                if (!sbLog.isEmpty() && log) {
+                    LOG.info("Dumping {} route-configurations as YAML", size);
+                    LOG.info("{}", sbLog);
+                }
+            }
+        }
+
         if (include.contains("*") || include.contains("all") || include.contains("rests")) {
             int size = model.getRestDefinitions().size();
             if (size > 0) {
@@ -268,6 +302,38 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
             }
         }
 
+        if (include.contains("*") || include.contains("all") || include.contains("routeConfigurations")
+                || include.contains("route-configurations")) {
+            int size = model.getRouteConfigurationDefinitions().size();
+            if (size > 0) {
+                Map<Resource, RouteConfigurationsDefinition> groups = new LinkedHashMap<>();
+                for (RouteConfigurationDefinition config : model.getRouteConfigurationDefinitions()) {
+                    Resource res = config.getResource();
+                    if (res == null) {
+                        res = dummy;
+                    }
+                    RouteConfigurationsDefinition routes
+                            = groups.computeIfAbsent(res, resource -> new RouteConfigurationsDefinition());
+                    routes.getRouteConfigurations().add(config);
+                }
+                StringBuilder sbLog = new StringBuilder();
+                for (Map.Entry<Resource, RouteConfigurationsDefinition> entry : groups.entrySet()) {
+                    RouteConfigurationsDefinition def = entry.getValue();
+                    Resource resource = entry.getKey();
+
+                    StringBuilder sbLocal = new StringBuilder();
+                    doDumpXml(camelContext, def, resource == dummy ? null : resource, dumper, "rest", "route-configurations",
+                            sbLocal, sbLog);
+                    // dump each resource into its own file
+                    doDumpToDirectory(resource, sbLocal, "route-configurations", "xml");
+                }
+                if (!sbLog.isEmpty() && log) {
+                    LOG.info("Dumping {} route-configurations as XML", size);
+                    LOG.info("{}", sbLog);
+                }
+            }
+        }
+
         if (include.contains("*") || include.contains("all") || include.contains("rests")) {
             int size = model.getRestDefinitions().size();
             if (size > 0) {
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/routeConfigurations.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routeConfigurations.json
index 79afe1f9695..053d1fce344 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/routeConfigurations.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routeConfigurations.json
@@ -12,6 +12,7 @@
     "output": false
   },
   "properties": {
-    
+    "id": { "index": 0, "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "index": 1, "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteConfigurationDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteConfigurationDefinition.java
index f039d742733..b7e9d900e8e 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteConfigurationDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteConfigurationDefinition.java
@@ -25,10 +25,13 @@ import jakarta.xml.bind.annotation.XmlAccessorType;
 import jakarta.xml.bind.annotation.XmlAttribute;
 import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.model.errorhandler.RefErrorHandlerDefinition;
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.Resource;
+import org.apache.camel.spi.ResourceAware;
 
 /**
  * Reusable configuration for Camel route(s).
@@ -37,8 +40,10 @@ import org.apache.camel.spi.Metadata;
 @XmlRootElement(name = "routeConfiguration")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class RouteConfigurationDefinition extends OptionalIdentifiedDefinition<RouteConfigurationDefinition>
-        implements PreconditionContainer {
+        implements PreconditionContainer, ResourceAware {
 
+    @XmlTransient
+    private Resource resource;
     @XmlElement
     private ErrorHandlerDefinition errorHandler;
     @XmlElement(name = "intercept")
@@ -73,6 +78,16 @@ public class RouteConfigurationDefinition extends OptionalIdentifiedDefinition<R
         return "RoutesConfiguration " + getId();
     }
 
+    @Override
+    public Resource getResource() {
+        return resource;
+    }
+
+    @Override
+    public void setResource(Resource resource) {
+        this.resource = resource;
+    }
+
     public ErrorHandlerDefinition getErrorHandler() {
         return errorHandler;
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteConfigurationsDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteConfigurationsDefinition.java
index 98177f7c78b..b9af0e77728 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteConfigurationsDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteConfigurationsDefinition.java
@@ -28,6 +28,8 @@ import jakarta.xml.bind.annotation.XmlTransient;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.Resource;
+import org.apache.camel.spi.ResourceAware;
 
 /**
  * A series of route configurations
@@ -35,10 +37,13 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "configuration")
 @XmlRootElement(name = "routeConfigurations")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class RouteConfigurationsDefinition implements RouteConfigurationContainer {
+public class RouteConfigurationsDefinition extends OptionalIdentifiedDefinition<RouteConfigurationsDefinition>
+        implements RouteConfigurationContainer, ResourceAware {
 
     @XmlTransient
     private CamelContext camelContext;
+    @XmlTransient
+    private Resource resource;
 
     @XmlElementRef
     private List<RouteConfigurationDefinition> routeConfigurations = new ArrayList<>();
@@ -46,6 +51,16 @@ public class RouteConfigurationsDefinition implements RouteConfigurationContaine
     public RouteConfigurationsDefinition() {
     }
 
+    @Override
+    public String getShortName() {
+        return "routeConfigurations";
+    }
+
+    @Override
+    public String getLabel() {
+        return "RouteConfigurations " + getId();
+    }
+
     @Override
     public String toString() {
         return "RouteConfigurations";
@@ -67,6 +82,16 @@ public class RouteConfigurationsDefinition implements RouteConfigurationContaine
         this.camelContext = camelContext;
     }
 
+    @Override
+    public Resource getResource() {
+        return resource;
+    }
+
+    @Override
+    public void setResource(Resource resource) {
+        this.resource = resource;
+    }
+
     // Fluent API
     // -------------------------------------------------------------------------
 
@@ -110,6 +135,9 @@ public class RouteConfigurationsDefinition implements RouteConfigurationContaine
         if (id != null) {
             config.setId(id);
         }
+        if (resource != null) {
+            config.setResource(resource);
+        }
         CamelContextAware.trySetCamelContext(config, camelContext);
         return config;
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
index b355efba77d..3eca50291bb 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
@@ -88,7 +88,7 @@ public class RoutesDefinition extends OptionalIdentifiedDefinition<RoutesDefinit
 
     @Override
     public String getLabel() {
-        return "Route " + getId();
+        return "Routes " + getId();
     }
 
     // Properties
diff --git a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index e49a846be05..302701cffaf 100644
--- a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -40,7 +40,7 @@
     { "name": "camel.main.devConsoleEnabled", "description": "Whether to enable developer console (requires camel-console on classpath). The developer console is only for assisting during development. This is NOT for production usage.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.dumpRoutes", "description": "If dumping is enabled then Camel will during startup dump all loaded routes (incl rests and route templates) represented as XML\/YAML DSL into the log. This is intended for trouble shooting or to assist during development. Sensitive information that may be configured in the route endpoints could potentially be included in the dump output and is therefore not recommended being used for production usage. This requires to have camel-xml [...]
     { "name": "camel.main.dumpRoutesDirectory", "description": "Whether to save route dumps to files in the given directory. The name of the files are based on original loaded resource, or an autogenerated name.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
-    { "name": "camel.main.dumpRoutesInclude", "description": "Controls what to include in output for route dumping. Possible values: routes, rests, routeTemplates. Multiple values can be separated by comma. Default is routes.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "routes" },
+    { "name": "camel.main.dumpRoutesInclude", "description": "Controls what to include in output for route dumping. Possible values: all, routes, rests, routeConfigurations, routeTemplates. Multiple values can be separated by comma. Default is routes.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "routes" },
     { "name": "camel.main.dumpRoutesLog", "description": "Whether to log route dumps to Logger", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
     { "name": "camel.main.dumpRoutesResolvePlaceholders", "description": "Whether to resolve property placeholders in the dumped output. Default is true.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
     { "name": "camel.main.dumpRoutesUriAsParameters", "description": "When dumping routes to YAML format, then this option controls whether endpoint URIs should be expanded into a key\/value parameters.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index 1764d645f0d..190214d6498 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -51,7 +51,7 @@ The camel.main supports 125 options, which are listed below.
 | *camel.main.devConsoleEnabled* | Whether to enable developer console (requires camel-console on classpath). The developer console is only for assisting during development. This is NOT for production usage. | false | boolean
 | *camel.main.dumpRoutes* | If dumping is enabled then Camel will during startup dump all loaded routes (incl rests and route templates) represented as XML/YAML DSL into the log. This is intended for trouble shooting or to assist during development. Sensitive information that may be configured in the route endpoints could potentially be included in the dump output and is therefore not recommended being used for production usage. This requires to have camel-xml-io/camel-yaml-io on the cla [...]
 | *camel.main.dumpRoutesDirectory* | Whether to save route dumps to files in the given directory. The name of the files are based on original loaded resource, or an autogenerated name. |  | String
-| *camel.main.dumpRoutesInclude* | Controls what to include in output for route dumping. Possible values: routes, rests, routeTemplates. Multiple values can be separated by comma. Default is routes. | routes | String
+| *camel.main.dumpRoutesInclude* | Controls what to include in output for route dumping. Possible values: all, routes, rests, routeConfigurations, routeTemplates. Multiple values can be separated by comma. Default is routes. | routes | String
 | *camel.main.dumpRoutesLog* | Whether to log route dumps to Logger | true | boolean
 | *camel.main.dumpRoutesResolve{zwsp}Placeholders* | Whether to resolve property placeholders in the dumped output. Default is true. | true | boolean
 | *camel.main.dumpRoutesUriAs{zwsp}Parameters* | When dumping routes to YAML format, then this option controls whether endpoint URIs should be expanded into a key/value parameters. | false | boolean
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
index c6272f5056d..e962f1a8825 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
@@ -1398,7 +1398,8 @@ public abstract class DefaultConfigurationProperties<T> {
     /**
      * Controls what to include in output for route dumping.
      *
-     * Possible values: routes, rests, routeTemplates. Multiple values can be separated by comma. Default is routes.
+     * Possible values: all, routes, rests, routeConfigurations, routeTemplates. Multiple values can be separated by
+     * comma. Default is routes.
      */
     public void setDumpRoutesInclude(String dumpRoutesInclude) {
         this.dumpRoutesInclude = dumpRoutesInclude;
@@ -2645,7 +2646,8 @@ public abstract class DefaultConfigurationProperties<T> {
     /**
      * Controls what to include in output for route dumping.
      *
-     * Possible values: routes, rests, routeTemplates. Multiple values can be separated by comma. Default is routes.
+     * Possible values: all, routes, rests, routeConfigurations, routeTemplates. Multiple values can be separated by
+     * comma. Default is routes.
      */
     public T withDumpRoutesInclude(String dumpRoutesInclude) {
         this.dumpRoutesInclude = dumpRoutesInclude;
diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
index ce19e0b8291..074c655829e 100644
--- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
+++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
@@ -987,12 +987,12 @@ public class ModelParser extends BaseParser {
     }
     protected RouteConfigurationsDefinition doParseRouteConfigurationsDefinition() throws IOException, XmlPullParserException {
         return doParse(new RouteConfigurationsDefinition(),
-            noAttributeHandler(), (def, key) -> {
+            optionalIdentifiedDefinitionAttributeHandler(), (def, key) -> {
             if ("routeConfiguration".equals(key)) {
                 doAdd(doParseRouteConfigurationDefinition(), def.getRouteConfigurations(), def::setRouteConfigurations);
                 return true;
             }
-            return false;
+            return optionalIdentifiedDefinitionElementHandler().accept(def, key);
         }, noValueHandler());
     }
     protected RouteContextRefDefinition doParseRouteContextRefDefinition() throws IOException, XmlPullParserException {
diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
index 1eb6fc5b8df..3b2487ee6d6 100644
--- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
+++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
@@ -1984,6 +1984,7 @@ public class ModelWriter extends BaseWriter {
             RouteConfigurationsDefinition def)
             throws IOException {
         startElement(name);
+        doWriteOptionalIdentifiedDefinitionAttributes(def);
         doWriteList(null, null, def.getRouteConfigurations(), this::doWriteRouteConfigurationDefinitionRef);
         endElement(name);
     }
@@ -4717,6 +4718,7 @@ public class ModelWriter extends BaseWriter {
                 case "ResumableDefinition" -> doWriteResumableDefinition("resumable", (ResumableDefinition) v);
                 case "RollbackDefinition" -> doWriteRollbackDefinition("rollback", (RollbackDefinition) v);
                 case "RouteConfigurationDefinition" -> doWriteRouteConfigurationDefinition("routeConfiguration", (RouteConfigurationDefinition) v);
+                case "RouteConfigurationsDefinition" -> doWriteRouteConfigurationsDefinition("routeConfigurations", (RouteConfigurationsDefinition) v);
                 case "RouteDefinition" -> doWriteRouteDefinition("route", (RouteDefinition) v);
                 case "RouteTemplateDefinition" -> doWriteRouteTemplateDefinition("routeTemplate", (RouteTemplateDefinition) v);
                 case "RouteTemplatesDefinition" -> doWriteRouteTemplatesDefinition("routeTemplates", (RouteTemplatesDefinition) v);
diff --git a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
index 4cc192db2e5..3ab7d56d7d0 100644
--- a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
+++ b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
@@ -1984,6 +1984,7 @@ public class ModelWriter extends BaseWriter {
             RouteConfigurationsDefinition def)
             throws IOException {
         startElement(name);
+        doWriteOptionalIdentifiedDefinitionAttributes(def);
         doWriteList(null, null, def.getRouteConfigurations(), this::doWriteRouteConfigurationDefinitionRef);
         endElement(name);
     }
@@ -4717,6 +4718,7 @@ public class ModelWriter extends BaseWriter {
                 case "ResumableDefinition" -> doWriteResumableDefinition("resumable", (ResumableDefinition) v);
                 case "RollbackDefinition" -> doWriteRollbackDefinition("rollback", (RollbackDefinition) v);
                 case "RouteConfigurationDefinition" -> doWriteRouteConfigurationDefinition("routeConfiguration", (RouteConfigurationDefinition) v);
+                case "RouteConfigurationsDefinition" -> doWriteRouteConfigurationsDefinition("routeConfigurations", (RouteConfigurationsDefinition) v);
                 case "RouteDefinition" -> doWriteRouteDefinition("route", (RouteDefinition) v);
                 case "RouteTemplateDefinition" -> doWriteRouteTemplateDefinition("routeTemplate", (RouteTemplateDefinition) v);
                 case "RouteTemplatesDefinition" -> doWriteRouteTemplatesDefinition("routeTemplates", (RouteTemplatesDefinition) v);