diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringCodegen.java index bee47cbbafb..350c44bc00a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringCodegen.java @@ -7,6 +7,8 @@ import io.swagger.codegen.languages.features.NotNullAnnotationFeatures; import io.swagger.codegen.languages.features.IgnoreUnknownJacksonFeatures; import io.swagger.codegen.languages.features.OptionalFeatures; +import io.swagger.codegen.mustache.SplitStringLambda; +import io.swagger.codegen.mustache.TrimWhitespaceLambda; import io.swagger.models.Operation; import io.swagger.models.Path; import io.swagger.models.Swagger; @@ -376,6 +378,10 @@ public void execute(Template.Fragment fragment, Writer writer) throws IOExceptio writer.write(fragment.execute().replaceAll("\\r|\\n", "")); } }); + + additionalProperties.put("lambdaTrimWhitespace", new TrimWhitespaceLambda()); + + additionalProperties.put("lambdaSplitString", new SplitStringLambda()); } @Override diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/mustache/SplitStringLambda.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/mustache/SplitStringLambda.java new file mode 100644 index 00000000000..06c81332a9d --- /dev/null +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/mustache/SplitStringLambda.java @@ -0,0 +1,86 @@ +package io.swagger.codegen.mustache; + +import java.io.IOException; +import java.io.Writer; + +import com.samskivert.mustache.Mustache; +import com.samskivert.mustache.Template.Fragment; + +/** + * Splits long fragments into smaller strings and uses a StringBuilder to merge + * them back. + * + * Register: + * + *
+ * additionalProperties.put("lambdaSplitString", new SplitStringLambda());
+ *
+ *
+ * Use:
+ *
+ *
+ * {{#lambdaSplitString}}{{summary}}{{/lambdaSplitString}}
+ *
+ */
+public class SplitStringLambda implements Mustache.Lambda {
+ private static final int DEFAULT_MAX_LENGTH = 65535;
+
+ private static final String SPLIT_INIT = "new StringBuilder(%d)";
+
+ private static final String SPLIT_PART = ".append(\"%s\")";
+
+ private static final String SPLIT_SUFFIX = ".toString()";
+
+ private final int maxLength;
+
+ public SplitStringLambda() {
+ this(DEFAULT_MAX_LENGTH);
+ }
+
+ public SplitStringLambda(int maxLength) {
+ this.maxLength = maxLength;
+ }
+
+ @Override
+ public void execute(Fragment fragment, Writer writer) throws IOException {
+ String input = fragment.execute();
+ int inputLength = input.length();
+
+ StringBuilder builder = new StringBuilder();
+ if (inputLength > maxLength) {
+
+ // Initialize a StringBuilder
+ builder.append(String.format(SPLIT_INIT, inputLength));
+
+ int currentPosition = 0;
+ int currentStringLength = 0;
+ char currentLastChar = '\\';
+
+ // Split input into parts of at most maxLength and not ending with an escape character
+ // Append each part to the StringBuilder
+ while (currentPosition + maxLength < input.length()) {
+ currentStringLength = maxLength;
+ currentLastChar = input.charAt(currentPosition + currentStringLength - 1);
+ if (currentLastChar == '\\') {
+ --currentStringLength;
+ }
+
+ builder.append(String.format(SPLIT_PART, input.substring(currentPosition, currentPosition + currentStringLength)));
+ currentPosition += currentStringLength;
+ }
+
+ // Append last part if necessary
+ if (currentPosition < input.length()) {
+ builder.append(String.format(SPLIT_PART, input.substring(currentPosition)));
+ }
+
+ // Close the builder and merge everything back to a string
+ builder.append(SPLIT_SUFFIX);
+ } else {
+ builder.append(String.format("\"%s\"", input));
+ }
+
+ writer.write(builder.toString());
+ }
+
+}
diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/mustache/TrimWhitespaceLambda.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/mustache/TrimWhitespaceLambda.java
new file mode 100644
index 00000000000..c88490322ee
--- /dev/null
+++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/mustache/TrimWhitespaceLambda.java
@@ -0,0 +1,34 @@
+package io.swagger.codegen.mustache;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import com.samskivert.mustache.Mustache;
+import com.samskivert.mustache.Template.Fragment;
+
+/**
+ * Replaces duplicate whitespace characters in a fragment with single space.
+ *
+ * Register:
+ *
+ *
+ * additionalProperties.put("lambdaTrimWhitespace", new TrimWhitespaceLambda());
+ *
+ *
+ * Use:
+ *
+ *
+ * {{#lambdaTrimWhitespace}}{{summary}}{{/lambdaTrimWhitespace}}
+ *
+ */
+public class TrimWhitespaceLambda implements Mustache.Lambda {
+ private static final String SINGLE_SPACE = " ";
+
+ private static final String WHITESPACE_REGEX = "\\s+";
+
+ @Override
+ public void execute(Fragment fragment, Writer writer) throws IOException {
+ writer.write(fragment.execute().replaceAll(WHITESPACE_REGEX, SINGLE_SPACE));
+ }
+
+}
diff --git a/modules/swagger-codegen/src/main/resources/JavaSpring/api.mustache b/modules/swagger-codegen/src/main/resources/JavaSpring/api.mustache
index 2abc833dfee..d106b6eba4a 100644
--- a/modules/swagger-codegen/src/main/resources/JavaSpring/api.mustache
+++ b/modules/swagger-codegen/src/main/resources/JavaSpring/api.mustache
@@ -123,7 +123,8 @@ public interface {{classname}} {
{{#examples}}
if (getAcceptHeader().get().contains("{{{contentType}}}")) {
try {
- return {{#async}}CompletableFuture.completedFuture({{/async}}new ResponseEntity<>(getObjectMapper().get().readValue("{{#lambdaRemoveLineBreak}}{{#lambdaEscapeDoubleQuote}}{{{example}}}{{/lambdaEscapeDoubleQuote}}{{/lambdaRemoveLineBreak}}", {{>exampleReturnTypes}}.class), HttpStatus.NOT_IMPLEMENTED){{#async}}){{/async}};
+ String exampleString = {{#lambdaSplitString}}{{#lambdaRemoveLineBreak}}{{#lambdaEscapeDoubleQuote}}{{#lambdaTrimWhitespace}}{{{example}}}{{/lambdaTrimWhitespace}}{{/lambdaEscapeDoubleQuote}}{{/lambdaRemoveLineBreak}}{{/lambdaSplitString}};
+ return {{#async}}CompletableFuture.completedFuture({{/async}}new ResponseEntity<>(getObjectMapper().get().readValue(exampleString, {{>exampleReturnTypes}}.class), HttpStatus.NOT_IMPLEMENTED){{#async}}){{/async}};
} catch (IOException e) {
log.error("Couldn't serialize response for content type {{{contentType}}}", e);
return {{#async}}CompletableFuture.completedFuture({{/async}}new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR){{#async}}){{/async}};
@@ -142,4 +143,4 @@ public interface {{classname}} {
{{/operation}}
}
-{{/operations}}
\ No newline at end of file
+{{/operations}}
diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/mustache/SplitStringLambdaTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/mustache/SplitStringLambdaTest.java
new file mode 100644
index 00000000000..9d9eeed8f16
--- /dev/null
+++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/mustache/SplitStringLambdaTest.java
@@ -0,0 +1,85 @@
+package io.swagger.codegen.mustache;
+
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.samskivert.mustache.Template.Fragment;
+
+public class SplitStringLambdaTest {
+ private static final String INPUT_STRING = "1112223334";
+
+ private static final Map