Skip to content

Commit ccbba80

Browse files
committed
Add useTags to kotlin-server JAXRS code generator
1 parent 73dcdd6 commit ccbba80

4 files changed

Lines changed: 60 additions & 1 deletion

File tree

docs/generators/kotlin-server.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
4545
|sourceFolder|source folder for generated code| |src/main/kotlin|
4646
|useBeanValidation|Use BeanValidation API annotations. This option is currently supported only when using jaxrs-spec library.| |false|
4747
|useCoroutines|Whether to use the Coroutines. This option is currently supported only when using jaxrs-spec library.| |false|
48+
|useTags|use tags for creating interface and controller classnames. This option is currently supported only when using jaxrs-spec library.| |false|
4849
|useJakartaEe|whether to use Jakarta EE namespace instead of javax| |false|
4950
|useMutiny|Whether to use Mutiny (should not be used with useCoroutines). This option is currently supported only when using jaxrs-spec library.| |false|
5051

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co
5656

5757
public static final String JAVAX_PACKAGE = "javaxPackage";
5858
public static final String USE_JAKARTA_EE = "useJakartaEe";
59+
public static final String USE_TAGS = "useTags";
60+
public static final String USE_TAGS_DESC = "use tags for creating interface and controller classnames";
5961
public static final String SCHEMA_IMPLEMENTS = "schemaImplements";
6062
public static final String SCHEMA_IMPLEMENTS_FIELDS = "schemaImplementsFields";
6163
public static final String X_KOTLIN_IMPLEMENTS_SKIP = "xKotlinImplementsSkip";

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.openapitools.codegen.languages;
1919

2020
import com.google.common.collect.ImmutableMap;
21+
import io.swagger.v3.oas.models.Operation;
2122
import lombok.Getter;
2223
import lombok.Setter;
2324
import org.apache.commons.lang3.StringUtils;
@@ -64,6 +65,7 @@ public class KotlinServerCodegen extends AbstractKotlinCodegen implements BeanVa
6465
private Boolean metricsFeatureEnabled = true;
6566
private boolean interfaceOnly = false;
6667
private boolean useBeanValidation = false;
68+
private boolean useTags = false;
6769
private boolean useCoroutines = false;
6870
private boolean useMutiny = false;
6971
private boolean returnResponse = false;
@@ -97,6 +99,7 @@ public class KotlinServerCodegen extends AbstractKotlinCodegen implements BeanVa
9799
))
98100
.put(Constants.JAXRS_SPEC, Arrays.asList(
99101
USE_BEANVALIDATION,
102+
USE_TAGS,
100103
Constants.USE_COROUTINES,
101104
Constants.USE_MUTINY,
102105
Constants.RETURN_RESPONSE,
@@ -170,6 +173,7 @@ public KotlinServerCodegen() {
170173
addSwitch(Constants.METRICS, Constants.METRICS_DESC, getMetricsFeatureEnabled());
171174
addSwitch(Constants.INTERFACE_ONLY, Constants.INTERFACE_ONLY_DESC, interfaceOnly);
172175
addSwitch(USE_BEANVALIDATION, Constants.USE_BEANVALIDATION_DESC, useBeanValidation);
176+
addSwitch(USE_TAGS, USE_TAGS_DESC, useTags);
173177
addSwitch(Constants.USE_COROUTINES, Constants.USE_COROUTINES_DESC, useCoroutines);
174178
addSwitch(Constants.USE_MUTINY, Constants.USE_MUTINY_DESC, useMutiny);
175179
addSwitch(Constants.RETURN_RESPONSE, Constants.RETURN_RESPONSE_DESC, returnResponse);
@@ -241,6 +245,10 @@ public void processOpts() {
241245
setUseBeanValidation(convertPropertyToBoolean(USE_BEANVALIDATION));
242246
}
243247

248+
if (additionalProperties.containsKey(USE_TAGS)) {
249+
useTags = Boolean.parseBoolean(additionalProperties.get(USE_TAGS).toString());
250+
}
251+
244252
if (additionalProperties.containsKey(Constants.OMIT_GRADLE_WRAPPER)) {
245253
setOmitGradleWrapper(Boolean.parseBoolean(additionalProperties.get(Constants.OMIT_GRADLE_WRAPPER).toString()));
246254
}
@@ -698,6 +706,23 @@ public void postProcess() {
698706
@Override
699707
public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<ModelMap> allModels) {
700708
OperationMap operations = objs.getOperations();
709+
// For JAXRS_SPEC library, compute commonPath similar to JavaJaxRS generators
710+
if (operations != null && Objects.equals(library, Constants.JAXRS_SPEC)) {
711+
String commonPath = null;
712+
List<CodegenOperation> ops = operations.getOperation();
713+
for (CodegenOperation operation : ops) {
714+
if (commonPath == null) {
715+
commonPath = operation.path;
716+
} else {
717+
commonPath = getCommonPath(commonPath, operation.path);
718+
}
719+
}
720+
for (CodegenOperation co : ops) {
721+
co.path = StringUtils.removeStart(co.path, commonPath);
722+
co.subresourceOperation = co.path.length() > 1;
723+
}
724+
objs.put("commonPath", "/".equals(commonPath) ? StringUtils.EMPTY : commonPath);
725+
}
701726
// The following processing breaks the JAX-RS spec, so we only do this for the other libs.
702727
if (operations != null && !Objects.equals(library, Constants.JAXRS_SPEC)) {
703728
List<CodegenOperation> ops = operations.getOperation();
@@ -758,6 +783,24 @@ public void setReturnContainer(final String returnContainer) {
758783
return objs;
759784
}
760785

786+
@Override
787+
public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map<String, List<CodegenOperation>> operations) {
788+
if (Objects.equals(library, Constants.JAXRS_SPEC) && additionalProperties.containsKey(USE_TAGS) && !useTags) {
789+
String basePath = StringUtils.substringBefore(StringUtils.removeStart(resourcePath, "/"), "/");
790+
if (!StringUtils.isEmpty(basePath)) {
791+
co.subresourceOperation = !co.path.isEmpty();
792+
}
793+
co.baseName = basePath;
794+
if (StringUtils.isEmpty(co.baseName) || StringUtils.containsAny(co.baseName, "{", "}")) {
795+
co.baseName = "default";
796+
}
797+
final List<CodegenOperation> opList = operations.computeIfAbsent(co.baseName, k -> new ArrayList<>());
798+
opList.add(co);
799+
} else {
800+
super.addOperationToGroup(tag, resourcePath, operation, co, operations);
801+
}
802+
}
803+
761804
private boolean isJavalin() {
762805
return Constants.JAVALIN5.equals(library) || Constants.JAVALIN6.equals(library);
763806
}
@@ -788,4 +831,17 @@ private boolean isKtor() {
788831
private boolean isKtor2() {
789832
return Constants.KTOR2.equals(library);
790833
}
834+
835+
private static String getCommonPath(String path1, String path2) {
836+
final String[] parts1 = StringUtils.split(path1, "/");
837+
final String[] parts2 = StringUtils.split(path2, "/");
838+
StringBuilder builder = new StringBuilder();
839+
for (int i = 0; i < Math.min(parts1.length, parts2.length); i++) {
840+
if (!parts1[i].equals(parts2[i])) {
841+
break;
842+
}
843+
builder.append("/").append(parts1[i]);
844+
}
845+
return builder.toString();
846+
}
791847
}

modules/openapi-generator/src/main/resources/kotlin-server/libraries/jaxrs-spec/api.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {{javaxPackage}}.validation.Valid{{/useBeanValidation}}
1818
@Api(description = "the {{{baseName}}} API"){{/useSwaggerAnnotations}}{{#hasConsumes}}
1919
@Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}}
2020
@Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}
21-
@Path("/")
21+
@Path("{{commonPath}}")
2222
{{>generatedAnnotation}}
2323

2424
{{#interfaceOnly}}interface{{/interfaceOnly}}{{^interfaceOnly}}class{{/interfaceOnly}} {{classname}} {

0 commit comments

Comments
 (0)