From db9102a440550be252735ff69183db67a8b9bb88 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Mon, 14 Jan 2019 09:49:39 -0500 Subject: [PATCH] Clean up file output handling (#1895) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Clean up file output handling This attempts to normalize all generators to use OS agnostic File.separator. It also cleans up some areas in code where we replace "." in full file output path with File.separator. We should only be modifying directory names we own, and should avoid modifying anything that can be provided by a user. It would probably be better to use Paths.get(…).toString() in all cases. * Fix missed path separators in java codegen * Adjust Java codegen path replacements * Convert / in full path replacements, as / is forbidden in Windows, and noop elsewhere * Use Paths.get where files are written, to better handle Windows path constraints --- .../org/openapitools/codegen/cmd/ConfigHelp.java | 3 ++- .../org/openapitools/codegen/AbstractGenerator.java | 5 ++++- .../org/openapitools/codegen/DefaultGenerator.java | 2 +- .../codegen/languages/AbstractJavaCodegen.java | 12 ++++++------ .../codegen/languages/AbstractScalaCodegen.java | 4 ++-- .../languages/AbstractTypeScriptClientCodegen.java | 4 ++-- .../openapitools/codegen/languages/AdaCodegen.java | 4 ++-- .../codegen/languages/AdaServerCodegen.java | 4 ++-- .../codegen/languages/AndroidClientCodegen.java | 8 ++++---- .../languages/CSharpDotNet2ClientCodegen.java | 4 ++-- .../codegen/languages/DartClientCodegen.java | 4 ++-- .../codegen/languages/ElmClientCodegen.java | 4 ++-- .../codegen/languages/FlashClientCodegen.java | 6 +++--- .../codegen/languages/JMeterClientCodegen.java | 4 ++-- .../JavascriptClosureAngularClientCodegen.java | 4 ++-- .../codegen/languages/ScalaGatlingCodegen.java | 4 ++-- 16 files changed, 40 insertions(+), 36 deletions(-) diff --git a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/ConfigHelp.java b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/ConfigHelp.java index de79af407f4..4e51cc7c76e 100644 --- a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/ConfigHelp.java +++ b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/ConfigHelp.java @@ -28,6 +28,7 @@ import org.slf4j.LoggerFactory; import java.io.*; import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; import static org.apache.commons.lang3.StringUtils.isEmpty; import static org.apache.commons.lang3.StringUtils.isNotEmpty; @@ -65,7 +66,7 @@ public class ConfigHelp implements Runnable { generatePlainTextHelp(sb, config); if (!isEmpty(outputFile)) { - File out = new File(outputFile); + File out = Paths.get(outputFile).toFile(); //noinspection ResultOfMethodCallIgnored out.mkdirs(); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/AbstractGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/AbstractGenerator.java index 88ee01f77e8..176cc3480a4 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/AbstractGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/AbstractGenerator.java @@ -27,6 +27,7 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; +import java.nio.file.Paths; import java.util.Scanner; import java.util.regex.Pattern; @@ -40,7 +41,9 @@ public abstract class AbstractGenerator { @SuppressWarnings("static-method") public File writeToFile(String filename, String contents) throws IOException { LOGGER.info("writing file " + filename); - File output = new File(filename); + + // Use Paths.get here to normalize path (for Windows file separator, space escaping on Linux/Mac, etc) + File output = Paths.get(filename).toFile(); if (output.getParent() != null && !new File(output.getParent()).exists()) { File parent = new File(output.getParent()); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 935d15050da..649227fdf33 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -800,7 +800,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } protected File writeInputStreamToFile(String filename, InputStream in, String templateFile) throws FileNotFoundException, IOException { - File outputFile = new File(filename); + File outputFile = java.nio.file.Paths.get(filename).toFile(); if (in != null) { OutputStream out = new FileOutputStream(outputFile, false); LOGGER.info("writing file " + outputFile); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index 008bc034042..64dd04c8d94 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -536,32 +536,32 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code @Override public String apiFileFolder() { - return (outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); + return (outputFolder + File.separator + sourceFolder + File.separator + apiPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); } @Override public String apiTestFileFolder() { - return (outputFolder + "/" + testFolder + "/" + apiPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); + return (outputFolder + File.separator + testFolder + File.separator + apiPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); } @Override public String modelTestFileFolder() { - return (outputFolder + "/" + testFolder + "/" + modelPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); + return (outputFolder + File.separator + testFolder + File.separator + modelPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); } @Override public String modelFileFolder() { - return (outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); + return (outputFolder + File.separator + sourceFolder + File.separator + modelPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); } @Override public String apiDocFileFolder() { - return (outputFolder + "/" + apiDocPath).replace('/', File.separatorChar); + return (outputFolder + File.separator + apiDocPath).replace('/', File.separatorChar); } @Override public String modelDocFileFolder() { - return (outputFolder + "/" + modelDocPath).replace('/', File.separatorChar); + return (outputFolder + File.separator + modelDocPath).replace('/', File.separatorChar); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java index 1e5f9e1867b..19a45238713 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java @@ -174,12 +174,12 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { @Override public String apiFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + sourceFolder + File.separator + apiPackage().replace('.', File.separatorChar); } @Override public String modelFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + sourceFolder + File.separator + modelPackage().replace('.', File.separatorChar); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java index 3e0db4a7c7c..e6082564364 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java @@ -153,12 +153,12 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp @Override public String apiFileFolder() { - return outputFolder + "/" + apiPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + apiPackage().replace('.', File.separatorChar); } @Override public String modelFileFolder() { - return outputFolder + "/" + modelPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + modelPackage().replace('.', File.separatorChar); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaCodegen.java index 3a0731106f3..0099e790987 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaCodegen.java @@ -121,11 +121,11 @@ public class AdaCodegen extends AbstractAdaCodegen implements CodegenConfig { @Override public String apiFileFolder() { - return outputFolder + "/" + apiPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + apiPackage().replace('.', File.separatorChar); } @Override public String modelFileFolder() { - return outputFolder + "/model/" + modelPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + "model" + File.separator + modelPackage().replace('.', File.separatorChar); } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaServerCodegen.java index 1e273095181..0ee5bb6c43e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaServerCodegen.java @@ -123,11 +123,11 @@ public class AdaServerCodegen extends AbstractAdaCodegen implements CodegenConfi @Override public String apiFileFolder() { - return outputFolder + "/" + apiPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + apiPackage().replace('.', File.separatorChar); } @Override public String modelFileFolder() { - return outputFolder + "/model/" + modelPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + "model" + File.separator + modelPackage().replace('.', File.separatorChar); } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java index 73e359075d7..88640f7de77 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java @@ -156,22 +156,22 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi @Override public String apiFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + sourceFolder + File.separator + apiPackage().replace('.', File.separatorChar); } @Override public String modelFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + sourceFolder + File.separator + modelPackage().replace('.', File.separatorChar); } @Override public String apiDocFileFolder() { - return (outputFolder + "/" + apiDocPath).replace('/', File.separatorChar); + return outputFolder + File.separator + apiDocPath.replace('/', File.separatorChar); } @Override public String modelDocFileFolder() { - return (outputFolder + "/" + modelDocPath).replace('/', File.separatorChar); + return outputFolder + File.separator + modelDocPath.replace('/', File.separatorChar); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpDotNet2ClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpDotNet2ClientCodegen.java index 3995cb20996..54f43579dd9 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpDotNet2ClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpDotNet2ClientCodegen.java @@ -130,12 +130,12 @@ public class CSharpDotNet2ClientCodegen extends AbstractCSharpCodegen { @Override public String apiDocFileFolder() { - return (outputFolder + "/" + apiDocPath).replace('/', File.separatorChar); + return outputFolder + File.separator + apiDocPath.replace('/', File.separatorChar); } @Override public String modelDocFileFolder() { - return (outputFolder + "/" + modelDocPath).replace('/', File.separatorChar); + return outputFolder + File.separator + modelDocPath.replace('/', File.separatorChar); } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java index 4ef3879a000..cf488829506 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java @@ -246,12 +246,12 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String apiDocFileFolder() { - return (outputFolder + "/" + apiDocPath).replace('/', File.separatorChar); + return outputFolder + File.separator + apiDocPath.replace('/', File.separatorChar); } @Override public String modelDocFileFolder() { - return (outputFolder + "/" + modelDocPath).replace('/', File.separatorChar); + return outputFolder + File.separator + modelDocPath.replace('/', File.separatorChar); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java index 13e811fa1be..51467c8f8e1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java @@ -314,12 +314,12 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String apiFileFolder() { - return outputFolder + "/src/Request/" + apiPackage().replace('.', File.separatorChar); + return outputFolder + ("/src/Request/" + apiPackage().replace('.', File.separatorChar)).replace("/", File.separator); } @Override public String modelFileFolder() { - return outputFolder + "/src/Data/" + modelPackage().replace('.', File.separatorChar); + return outputFolder + ("/src/Data/" + modelPackage().replace('.', File.separatorChar)).replace("/", File.separator); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/FlashClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/FlashClientCodegen.java index a91571f77cf..750353accef 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/FlashClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/FlashClientCodegen.java @@ -131,7 +131,7 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig //modelPackage = invokerPackage + File.separatorChar + "client" + File.separatorChar + "model"; //apiPackage = invokerPackage + File.separatorChar + "client" + File.separatorChar + "api"; - final String invokerFolder = (sourceFolder + File.separator + "src/" + invokerPackage + File.separator).replace(".", File.separator).replace('.', File.separatorChar); + final String invokerFolder = (sourceFolder + File.separator + "src" + File.separator + invokerPackage + File.separator).replace(".", File.separator).replace('.', File.separatorChar); supportingFiles.add(new SupportingFile("ApiInvoker.as", invokerFolder + "common", "ApiInvoker.as")); supportingFiles.add(new SupportingFile("ApiUrlHelper.as", invokerFolder + "common", "ApiUrlHelper.as")); @@ -193,13 +193,13 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig @Override public String apiFileFolder() { - return (outputFolder + File.separatorChar + sourceFolder + File.separatorChar + "src/" + return outputFolder + File.separatorChar + sourceFolder + File.separatorChar + ("src/" + apiPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); } @Override public String modelFileFolder() { - return (outputFolder + File.separatorChar + sourceFolder + File.separatorChar + "src/" + return outputFolder + File.separatorChar + sourceFolder + File.separatorChar + ("src/" + modelPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JMeterClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JMeterClientCodegen.java index 912ad43a7e4..fdb2a197971 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JMeterClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JMeterClientCodegen.java @@ -149,7 +149,7 @@ public class JMeterClientCodegen extends DefaultCodegen implements CodegenConfig */ @Override public String modelFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + sourceFolder + File.separator + modelPackage().replace('.', File.separatorChar); } /** @@ -158,7 +158,7 @@ public class JMeterClientCodegen extends DefaultCodegen implements CodegenConfig */ @Override public String apiFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + sourceFolder + File.separator + apiPackage().replace('.', File.separatorChar); } /** diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java index 250e2ed344f..efab56fc8d6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java @@ -167,11 +167,11 @@ public class JavascriptClosureAngularClientCodegen extends DefaultCodegen implem @Override public String apiFileFolder() { - return outputFolder + "/" + apiPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + apiPackage().replace('.', File.separatorChar); } public String modelFileFolder() { - return outputFolder + "/" + modelPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + modelPackage().replace('.', File.separatorChar); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaGatlingCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaGatlingCodegen.java index bf7b0beccf9..765b291e37f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaGatlingCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaGatlingCodegen.java @@ -214,7 +214,7 @@ public class ScalaGatlingCodegen extends AbstractScalaCodegen implements Codegen * instantiated */ public String modelFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + sourceFolder + File.separator + modelPackage().replace('.', File.separatorChar); } /** @@ -223,7 +223,7 @@ public class ScalaGatlingCodegen extends AbstractScalaCodegen implements Codegen */ @Override public String apiFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); + return outputFolder + File.separator + sourceFolder + File.separator + apiPackage().replace('.', File.separatorChar); } /**