Skip to content

Commit 68c6017

Browse files
committed
Add possibility to use custom builder for RestMethodModel
Signed-off-by: Oleksandr Porunov <alexandr.porunov@gmail.com>
1 parent 0188fd0 commit 68c6017

File tree

9 files changed

+125
-3
lines changed

9 files changed

+125
-3
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package cz.habarta.typescript.generator;
2+
3+
import cz.habarta.typescript.generator.parser.MethodParameterModel;
4+
import cz.habarta.typescript.generator.parser.RestMethodModel;
5+
import cz.habarta.typescript.generator.parser.RestQueryParam;
6+
import java.lang.reflect.Method;
7+
import java.lang.reflect.Type;
8+
import java.util.List;
9+
10+
public class DefaultRestMethodBuilder implements RestMethodBuilder{
11+
12+
@Override
13+
public RestMethodModel build(Class<?> originClass, String name, Type returnType, Method originalMethod,
14+
Class<?> rootResource, String httpMethod, String path,
15+
List<MethodParameterModel> pathParams, List<RestQueryParam> queryParams,
16+
MethodParameterModel entityParam, List<String> comments) {
17+
18+
return new RestMethodModel(originClass, name, returnType, originalMethod, rootResource, httpMethod, path,
19+
pathParams, queryParams, entityParam, comments);
20+
}
21+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package cz.habarta.typescript.generator;
2+
3+
import cz.habarta.typescript.generator.parser.MethodParameterModel;
4+
import cz.habarta.typescript.generator.parser.RestMethodModel;
5+
import cz.habarta.typescript.generator.parser.RestQueryParam;
6+
import java.lang.reflect.Method;
7+
import java.lang.reflect.Type;
8+
import java.util.List;
9+
10+
public interface RestMethodBuilder {
11+
12+
RestMethodModel build(Class<?> originClass, String name, Type returnType, Method originalMethod,
13+
Class<?> rootResource, String httpMethod, String path, List<MethodParameterModel> pathParams, List<RestQueryParam> queryParams, MethodParameterModel entityParam,
14+
List<String> comments);
15+
16+
}

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/Settings.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ public class Settings {
110110
public boolean restOptionsTypeIsGeneric;
111111
private List<RestApplicationParser.Factory> restApplicationParserFactories;
112112
public TypeProcessor customTypeProcessor = null;
113+
public RestMethodBuilder customRestMethodBuilder = null;
113114
public boolean sortDeclarations = false;
114115
public boolean sortTypeDeclarations = false;
115116
public boolean noFileComment = false;
@@ -231,6 +232,12 @@ public void loadCustomTypeProcessor(ClassLoader classLoader, String customTypePr
231232
}
232233
}
233234

235+
public void loadCustomRestMethodBuilder(ClassLoader classLoader, String customRestMethodBuilder) {
236+
if (customRestMethodBuilder != null) {
237+
this.customRestMethodBuilder = loadInstance(classLoader, customRestMethodBuilder, RestMethodBuilder.class);
238+
}
239+
}
240+
234241
public void loadExtensions(ClassLoader classLoader, List<String> extensions, List<Settings.ConfiguredExtension> extensionsWithConfiguration) {
235242
this.extensions = new ArrayList<>();
236243
this.extensions.addAll(loadInstances(classLoader, extensions, EmitterExtension.class));

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/JaxrsApplicationParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ private void parseResourceMethod(Result result, ResourceContext context, Class<?
233233
// comments
234234
final List<String> comments = Swagger.getOperationComments(swaggerOperation);
235235
// create method
236-
model.getMethods().add(new RestMethodModel(resourceClass, method.getName(), resolvedModelReturnType, method,
236+
model.getMethods().add(restMethodBuilder.build(resourceClass, method.getName(), resolvedModelReturnType, method,
237237
context.rootResource, httpMethod.value(), context.path, pathParams, queryParams, entityParameter, comments));
238238
}
239239
// JAX-RS specification - 3.4.1 Sub Resources

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/RestApplicationParser.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11

22
package cz.habarta.typescript.generator.parser;
33

4+
import cz.habarta.typescript.generator.DefaultRestMethodBuilder;
5+
import cz.habarta.typescript.generator.RestMethodBuilder;
46
import cz.habarta.typescript.generator.Settings;
57
import cz.habarta.typescript.generator.TypeProcessor;
68
import cz.habarta.typescript.generator.util.Utils;
@@ -17,6 +19,7 @@ public abstract class RestApplicationParser {
1719
protected final Predicate<String> isClassNameExcluded;
1820
protected final TypeProcessor commonTypeProcessor;
1921
protected final RestApplicationModel model;
22+
protected final RestMethodBuilder restMethodBuilder;
2023

2124
public static abstract class Factory {
2225

@@ -33,6 +36,9 @@ public RestApplicationParser(Settings settings, TypeProcessor commonTypeProcesso
3336
this.isClassNameExcluded = settings.getExcludeFilter();
3437
this.commonTypeProcessor = commonTypeProcessor;
3538
this.model = model;
39+
this.restMethodBuilder = settings.customRestMethodBuilder == null ?
40+
new DefaultRestMethodBuilder() :
41+
settings.customRestMethodBuilder;
3642
}
3743

3844
public RestApplicationModel getModel() {

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/JaxrsApplicationTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import cz.habarta.typescript.generator.compiler.ModelCompiler;
66
import cz.habarta.typescript.generator.parser.BeanModel;
77
import cz.habarta.typescript.generator.parser.JaxrsApplicationParser;
8+
import cz.habarta.typescript.generator.parser.MethodParameterModel;
89
import cz.habarta.typescript.generator.parser.Model;
10+
import cz.habarta.typescript.generator.parser.RestMethodModel;
11+
import cz.habarta.typescript.generator.parser.RestQueryParam;
912
import cz.habarta.typescript.generator.parser.SourceType;
1013
import cz.habarta.typescript.generator.type.JGenericArrayType;
1114
import cz.habarta.typescript.generator.type.JTypeWithNullability;
@@ -40,6 +43,7 @@
4043
import java.io.File;
4144
import java.io.InputStream;
4245
import java.io.Reader;
46+
import java.lang.reflect.Method;
4347
import java.lang.reflect.Type;
4448
import java.net.URI;
4549
import java.util.ArrayList;
@@ -704,6 +708,18 @@ public void testGenericResources() {
704708
Assertions.assertTrue(output.contains("interface AccountDto"));
705709
}
706710

711+
@Test
712+
public void testCustomREstMethodBuilder() {
713+
final Settings settings = TestUtils.settings();
714+
settings.generateJaxrsApplicationClient = true;
715+
settings.outputFileType = TypeScriptFileType.implementationFile;
716+
settings.customRestMethodBuilder = new CustomRestMethodBuilder();
717+
final String output = new TypeScriptGenerator(settings).generateTypeScript(Input.from(AccountResource.class));
718+
Assertions.assertTrue(!output.contains("get(testParam: ID): RestResponse<ENTITY>"));
719+
Assertions.assertTrue(output.contains("get(testParam: string): RestResponse<AccountDto>"));
720+
Assertions.assertTrue(output.contains("interface AccountDto"));
721+
}
722+
707723
public static class AccountDto {
708724
public Integer id;
709725
public String name;
@@ -728,4 +744,16 @@ public static void main(String[] args) {
728744
System.out.println("Jersey started.");
729745
}
730746

747+
public class CustomRestMethodBuilder implements RestMethodBuilder{
748+
749+
@Override
750+
public RestMethodModel build(Class<?> originClass, String name, Type returnType,
751+
Method originalMethod, Class<?> rootResource, String httpMethod,
752+
String path, List<MethodParameterModel> pathParams, List<RestQueryParam> queryParams,
753+
MethodParameterModel entityParam, List<String> comments) {
754+
755+
return new RestMethodModel(originClass, name, returnType, originalMethod, rootResource, httpMethod, path,
756+
Arrays.asList(new MethodParameterModel("testParam", String.class)), queryParams, entityParam, comments);
757+
}
758+
}
731759
}

typescript-generator-maven-plugin/src/main/java/cz/habarta/typescript/generator/maven/GenerateMojo.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import cz.habarta.typescript.generator.OptionalProperties;
1717
import cz.habarta.typescript.generator.OptionalPropertiesDeclaration;
1818
import cz.habarta.typescript.generator.Output;
19+
import cz.habarta.typescript.generator.RestMethodBuilder;
1920
import cz.habarta.typescript.generator.RestNamespacing;
2021
import cz.habarta.typescript.generator.Settings;
2122
import cz.habarta.typescript.generator.StringQuotes;
@@ -625,6 +626,15 @@ public class GenerateMojo extends AbstractMojo {
625626
@Parameter
626627
private String customTypeProcessor;
627628

629+
/**
630+
* Specifies custom class implementing {@link RestMethodBuilder}.
631+
* This allows to customize how Rest methods are mapped to TypeScript.
632+
* For example, it is possible to implement RestMethodBuilder to filter or add some query parameters or
633+
* change the returned type, etc.
634+
*/
635+
@Parameter
636+
private String customRestMethodBuilder;
637+
628638
/**
629639
* If <code>true</code> TypeScript declarations (interfaces, properties) will be sorted alphabetically.
630640
*/
@@ -949,6 +959,7 @@ private Settings createSettings(URLClassLoader classLoader) {
949959
settings.restResponseType = restResponseType;
950960
settings.setRestOptionsType(restOptionsType);
951961
settings.loadCustomTypeProcessor(classLoader, customTypeProcessor);
962+
settings.loadCustomRestMethodBuilder(classLoader, customRestMethodBuilder);
952963
settings.sortDeclarations = sortDeclarations;
953964
settings.sortTypeDeclarations = sortTypeDeclarations;
954965
settings.noFileComment = noFileComment;

typescript-generator-spring/src/main/java/cz/habarta/typescript/generator/spring/SpringApplicationParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ private void parseControllerMethod(JaxrsApplicationParser.Result result, JaxrsAp
348348
final Type modelReturnType = parseReturnType(controllerClass, method);
349349
foundType(result, modelReturnType, controllerClass, method.getName());
350350

351-
model.getMethods().add(new RestMethodModel(controllerClass, method.getName(), modelReturnType, method,
351+
model.getMethods().add(restMethodBuilder.build(controllerClass, method.getName(), modelReturnType, method,
352352
controllerClass, httpMethod.name(), context.path, pathParams, queryParams, entityParameter, null));
353353
}
354354
}

typescript-generator-spring/src/test/java/cz/habarta/typescript/generator/spring/SpringTest.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,23 @@
22
package cz.habarta.typescript.generator.spring;
33

44
import cz.habarta.typescript.generator.Input;
5+
import cz.habarta.typescript.generator.RestMethodBuilder;
56
import cz.habarta.typescript.generator.Settings;
67
import cz.habarta.typescript.generator.TestUtils;
78
import cz.habarta.typescript.generator.TypeScriptFileType;
89
import cz.habarta.typescript.generator.TypeScriptGenerator;
10+
import cz.habarta.typescript.generator.parser.MethodParameterModel;
11+
import cz.habarta.typescript.generator.parser.RestMethodModel;
12+
import cz.habarta.typescript.generator.parser.RestQueryParam;
913
import cz.habarta.typescript.generator.util.Utils;
1014
import io.swagger.annotations.ApiOperation;
1115
import io.swagger.v3.oas.annotations.Operation;
16+
import java.lang.annotation.ElementType;
1217
import java.lang.annotation.Retention;
1318
import java.lang.annotation.RetentionPolicy;
19+
import java.lang.annotation.Target;
1420
import java.lang.reflect.Method;
21+
import java.lang.reflect.Type;
1522
import java.util.Arrays;
1623
import java.util.Collection;
1724
import java.util.List;
@@ -35,7 +42,6 @@
3542
import org.springframework.web.bind.annotation.RequestParam;
3643
import org.springframework.web.bind.annotation.RestController;
3744

38-
3945
public class SpringTest {
4046

4147
@Test
@@ -169,6 +175,17 @@ public void testInheritance() {
169175
Assertions.assertFalse(output.contains("uriEncoding`test/b`"));
170176
}
171177

178+
@Test
179+
public void testCustomRestMethodBuilder() {
180+
final Settings settings = TestUtils.settings();
181+
settings.outputFileType = TypeScriptFileType.implementationFile;
182+
settings.generateSpringApplicationClient = true;
183+
settings.customRestMethodBuilder = new CustomRestMethodBuilder();
184+
final String output = new TypeScriptGenerator(settings).generateTypeScript(Input.from(Controller3.class));
185+
Assertions.assertTrue(output.contains("testName(data: Data1, queryParams: { testParam1: string; testParam2?: number; }): RestResponse<void>"));
186+
Assertions.assertTrue(output.contains("interface Data1"));
187+
}
188+
172189
@RestController
173190
@RequestMapping("/owners/{ownerId}")
174191
public static class Controller1 {
@@ -488,4 +505,20 @@ public String shouldBeExcluded() {
488505
}
489506
}
490507

508+
public class CustomRestMethodBuilder implements RestMethodBuilder{
509+
510+
@Override
511+
public RestMethodModel build(Class<?> originClass, String name, Type returnType,
512+
Method originalMethod, Class<?> rootResource, String httpMethod,
513+
String path, List<MethodParameterModel> pathParams, List<RestQueryParam> queryParams,
514+
MethodParameterModel entityParam, List<String> comments) {
515+
516+
RestQueryParam.Single queryParam1 = new RestQueryParam.Single(new MethodParameterModel("testParam1", String.class), true);
517+
RestQueryParam.Single queryParam2 = new RestQueryParam.Single(new MethodParameterModel("testParam2", Integer.class), false);
518+
519+
return new RestMethodModel(originClass, "testName", returnType, originalMethod, rootResource, httpMethod, path,
520+
pathParams, Arrays.asList(queryParam1, queryParam2), entityParam, comments);
521+
}
522+
}
523+
491524
}

0 commit comments

Comments
 (0)