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 11:55:49 UTC

[camel] 10/14: CAMEL-19765: camel-core - SPI for DumpRouteStrategy.

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

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

commit 7c8d67f916ff50101fdbcb4d7ee7c840d7d04485
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Aug 21 12:46:55 2023 +0200

    CAMEL-19765: camel-core - SPI for DumpRouteStrategy.
---
 .../camel/impl/DefaultDumpRoutesStrategy.java      | 60 ++++++++++++++++++++--
 1 file changed, 57 insertions(+), 3 deletions(-)

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 6437cd23360..7c9797c8824 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
@@ -16,10 +16,12 @@
  */
 package org.apache.camel.impl;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
@@ -40,6 +42,7 @@ import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.ResourceSupport;
 import org.apache.camel.support.service.ServiceSupport;
 import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StringHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,11 +55,10 @@ import static org.apache.camel.support.LoggerHelper.stripSourceLocationLineNumbe
 @ServiceFactory("default-" + DumpRoutesStrategy.FACTORY)
 public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRoutesStrategy, CamelContextAware {
 
-    // TODO: save to disk
-
     private static final Logger LOG = LoggerFactory.getLogger(DefaultDumpRoutesStrategy.class);
     private static final String DIVIDER = "--------------------------------------------------------------------------------";
 
+    private final AtomicInteger counter = new AtomicInteger();
     private CamelContext camelContext;
 
     private String include = "routes";
@@ -136,7 +138,12 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
                 for (Map.Entry<Resource, RoutesDefinition> entry : groups.entrySet()) {
                     RoutesDefinition def = entry.getValue();
                     Resource resource = entry.getKey();
-                    doDumpYaml(camelContext, def, resource == dummy ? null : resource, dumper, "routes", sb);
+
+                    StringBuilder local = new StringBuilder();
+                    doDumpYaml(camelContext, def, resource == dummy ? null : resource, dumper, "routes", local);
+                    sb.append(local);
+                    // dump each resource into its own file
+                    doDumpTiDisk(resource, local, "routes", "yaml");
                 }
                 if (!sb.isEmpty() && log) {
                     LOG.info("Dumping {} routes as YAML", size);
@@ -161,7 +168,12 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
                 for (Map.Entry<Resource, RestsDefinition> entry : groups.entrySet()) {
                     RestsDefinition def = entry.getValue();
                     Resource resource = entry.getKey();
+
+                    StringBuilder local = new StringBuilder();
                     doDumpYaml(camelContext, def, resource == dummy ? null : resource, dumper, "rests", sb);
+                    sb.append(local);
+                    // dump each resource into its own file
+                    doDumpTiDisk(resource, local, "rests", "yaml");
                 }
                 if (!sb.isEmpty() && log) {
                     LOG.info("Dumping {} rests as YAML", size);
@@ -187,7 +199,12 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
                 for (Map.Entry<Resource, RouteTemplatesDefinition> entry : groups.entrySet()) {
                     RouteTemplatesDefinition def = entry.getValue();
                     Resource resource = entry.getKey();
+
+                    StringBuilder local = new StringBuilder();
                     doDumpYaml(camelContext, def, resource == dummy ? null : resource, dumper, "route-templates", sb);
+                    sb.append(local);
+                    // dump each resource into its own file
+                    doDumpTiDisk(resource, local, "route-templates", "yaml");
                 }
                 if (!sb.isEmpty() && log) {
                     LOG.info("Dumping {} route-templates as YAML", size);
@@ -229,7 +246,12 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
                 for (Map.Entry<Resource, RoutesDefinition> entry : groups.entrySet()) {
                     RoutesDefinition def = entry.getValue();
                     Resource resource = entry.getKey();
+
+                    StringBuilder local = new StringBuilder();
                     doDumpXml(camelContext, def, resource == dummy ? null : resource, dumper, "route", "routes", sb);
+                    sb.append(local);
+                    // dump each resource into its own file
+                    doDumpTiDisk(resource, local, "routes", "xml");
                 }
                 if (!sb.isEmpty() && log) {
                     LOG.info("Dumping {} routes as XML", size);
@@ -254,7 +276,12 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
                 for (Map.Entry<Resource, RestsDefinition> entry : groups.entrySet()) {
                     RestsDefinition def = entry.getValue();
                     Resource resource = entry.getKey();
+
+                    StringBuilder local = new StringBuilder();
                     doDumpXml(camelContext, def, resource == dummy ? null : resource, dumper, "rest", "rests", sb);
+                    sb.append(local);
+                    // dump each resource into its own file
+                    doDumpTiDisk(resource, local, "rests", "xml");
                 }
                 if (!sb.isEmpty() && log) {
                     LOG.info("Dumping {} rests as XML", size);
@@ -280,8 +307,13 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
                 for (Map.Entry<Resource, RouteTemplatesDefinition> entry : groups.entrySet()) {
                     RouteTemplatesDefinition def = entry.getValue();
                     Resource resource = entry.getKey();
+
+                    StringBuilder local = new StringBuilder();
                     doDumpXml(camelContext, def, resource == dummy ? null : resource, dumper, "routeTemplate",
                             "route-templates", sb);
+                    sb.append(local);
+                    // dump each resource into its own file
+                    doDumpTiDisk(resource, local, "route-templates", "xml");
                 }
                 if (!sb.isEmpty() && log) {
                     LOG.info("Dumping {} route-templates as XML", size);
@@ -306,6 +338,28 @@ public class DefaultDumpRoutesStrategy extends ServiceSupport implements DumpRou
         }
     }
 
+    protected void doDumpTiDisk(Resource resource, StringBuilder local, String kind, String ext) {
+        if (directory != null) {
+            // make sure directory exists
+            File dir = new File(directory);
+            dir.mkdirs();
+
+            String name = resource != null ? resource.getLocation() : "dump" + counter.incrementAndGet();
+            // strip scheme
+            if (name.contains(":")) {
+                name = StringHelper.after(name, ":");
+            }
+            name = FileUtil.onlyName(name) + "." + ext;
+            File target = new File(directory, name);
+            try {
+                IOHelper.writeText(local.toString(), target);
+                LOG.debug("Dumped {} to file: {}", target, name);
+            } catch (IOException e) {
+                throw new RuntimeException("Error dumping " + kind + " to file: " + target, e);
+            }
+        }
+    }
+
     protected void appendDump(Resource resource, String dump, StringBuilder sb) {
         String loc = null;
         if (resource != null) {