[ 
https://issues.apache.org/jira/browse/CAMEL-25919?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18137043#comment-18137043
 ] 

Urmila Unni commented on CAMEL-25919:
-------------------------------------

I opened a PR: https://github.com/apache/camel/pull/29050

> camel-core: DefaultDumpRoutesStrategy: setOutput with a directory keeps the 
> file name from a previous setOutput
> ---------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25919
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25919
>             Project: Camel
>          Issue Type: Bug
>            Reporter: James Netherton
>            Priority: Minor
>
> h3. Summary
> DefaultDumpRoutesStrategy.setOutput() does not clear a previously set output 
> file name when given a directory
> h3. Description
> {{DefaultDumpRoutesStrategy}} keeps the output location in two fields: 
> {{output}} (directory) and {{outputFileName}} (optional fixed file name). 
> {{setOutput(String)}} treats the value as a file if the last path segment 
> contains a dot and sets both fields. When given a directory it only updates 
> {{output}}, so any {{outputFileName}} from an earlier call stays in place.
> {code:java}
> public void setOutput(String output) {
>     String name = FileUtil.stripPath(output);
>     if (name != null && name.contains(".")) {
>         outputFileName = name;
>         this.output = FileUtil.onlyPath(output);
>         ...
>     } else {
>         this.output = output; // outputFileName is not reset
>     }
> }
> {code}
> The strategy is a context plugin shared by everything that uses the 
> {{CamelContext}}. So a file-style dump followed by a folder-style dump on the 
> same context keeps writing to the old file name:
> * XML/YAML: {{resolveFileName()}} returns the stale {{outputFileName}}, so 
> the dump goes to {{<new folder>/<old file name>}} instead of the usual 
> per-resource files.
> * PNG: {{doDumpRoutesDiagram()}} prefers {{outputFileName}} and calls 
> {{dumpRoutesToFile(..., new File(name))}}, so all routes are rendered into a 
> single PNG named after the old file (e.g. {{MyTest-test.xml}}) in the working 
> directory. Only the topology diagram reaches the requested folder.
> h3. Reproducer (camel-core, verified on main)
> {code:java}
> package org.apache.camel.impl;
> public class DumpRoutesStaleFileNameReproTest extends ContextTestSupport {
>     @Test
>     public void folderAfterFile() throws Exception {
>         DumpRoutesStrategy drs = 
> context.getCamelContextExtension().getContextPlugin(DumpRoutesStrategy.class);
>         drs.setInclude("*");
>         drs.setLog(false);
>         File fileDir = testDirectory().resolve("first").toFile();
>         File folder = testDirectory().resolve("second").toFile();
>         drs.setOutput(new File(fileDir, "MyTest-test.xml").getPath());
>         drs.dumpRoutes("xml");
>         drs.setOutput(folder.getPath());
>         drs.dumpRoutes("xml");
>         // fails: folder contains [MyTest-test.xml]
>         
> assertThat(folder.list()).isNotEmpty().doesNotContain("MyTest-test.xml");
>     }
>     @Override
>     protected RouteBuilder createRouteBuilder() {
>         return new RouteBuilder() {
>             @Override
>             public void configure() {
>                 from("direct:a").routeId("a").to("mock:a");
>                 from("direct:b").routeId("b").to("mock:b");
>             }
>         };
>     }
> }
> {code}
> *Actual:* {{second/}} contains {{MyTest-test.xml}}.
> *Expected:* {{second/}} contains the usual auto-named dump ({{dump1.xml}}).
> h3. Impact
> Shows up wherever a CamelContext is reused across dumps, for example:
> * camel-test-main-junit6 with both {{dumpRoute}} and 
> {{dumpRouteDiagramFolder}}
> * cached Spring Boot test contexts
> * Camel Quarkus tests, where test classes share one application
> Plain {{CamelTestSupport}} mostly avoids it because it usually creates a new 
> context per test.
> Callers cannot work around it by saving and restoring the settings. There is 
> no getter for {{outputFileName}}, {{getOutput()}} returns only the directory, 
> and {{setOutput(dir)}} cannot clear the file name.
> h3. Suggested fix
> Reset the file name when a directory is given (verified: the reproducer 
> passes with this change):
> {code:java}
> } else {
>     outputFileName = null;
>     this.output = output;
> }
> {code}
> {{setOutput(dir)}} would then start a fresh directory output, so callers no 
> longer need a getter for the file name to undo an earlier file-style dump.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to