Skip to content

Commit afeeab1

Browse files
Spring support, refactoring (#253)
- `typescript-generator-spring` module - configuration parameters: - generateSpringApplicationInterface - generateSpringApplicationClient - scanSpringApplication - restNamespacing (deprecating jaxrsNamespacing) - restNamespacingAnnotation (deprecating jaxrsNamespacingAnnotation) - changed how parsers are instantiated and theirs `TypeProcessor`s are combined - renamed several `Jaxrs*` classes to `Rest*` - deleted `cz.habarta.typescript.generator.util.Predicate` class - `sample-maven-spring`, `sample-gradle-spring` example modules
1 parent 63ee545 commit afeeab1

File tree

39 files changed

+1424
-341
lines changed

39 files changed

+1424
-341
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ release.properties
1111
/sample-gradle/.nb-gradle/
1212
/sample-gradle/bin/
1313
/sample-gradle/build/
14+
/sample-gradle-spring/.gradle/
15+
/sample-gradle-spring/.nb-gradle/
16+
/sample-gradle-spring/bin/
17+
/sample-gradle-spring/build/
1418

1519
# npm
1620
node_modules

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<module>typescript-generator-core</module>
1515
<module>typescript-generator-maven-plugin</module>
1616
<module>typescript-generator-gradle-plugin</module>
17+
<module>typescript-generator-spring</module>
1718
</modules>
1819

1920
<licenses>

sample-gradle-spring/build.gradle

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
2+
apply plugin: 'java'
3+
apply plugin: 'cz.habarta.typescript-generator'
4+
5+
version = '2.0'
6+
sourceCompatibility = 1.8
7+
targetCompatibility = 1.8
8+
9+
repositories {
10+
jcenter()
11+
}
12+
13+
dependencies {
14+
compile 'org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE'
15+
}
16+
17+
buildscript {
18+
repositories {
19+
mavenLocal()
20+
jcenter()
21+
}
22+
23+
dependencies {
24+
classpath 'cz.habarta.typescript-generator:typescript-generator-gradle-plugin:2.12-SNAPSHOT'
25+
classpath 'cz.habarta.typescript-generator:typescript-generator-spring:2.12-SNAPSHOT'
26+
}
27+
}
28+
29+
generateTypeScript {
30+
classes = [
31+
'cz.habarta.typescript.generator.sample.spring.SpringTestApplication'
32+
]
33+
outputFileType = 'implementationFile'
34+
jsonLibrary = 'jackson2'
35+
outputKind = 'module'
36+
scanSpringApplication = true
37+
generateSpringApplicationClient = true
38+
}
39+
40+
build.dependsOn generateTypeScript
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
2+
package cz.habarta.typescript.generator.sample.spring;
3+
4+
import java.util.concurrent.atomic.AtomicLong;
5+
import org.springframework.boot.SpringApplication;
6+
import org.springframework.boot.autoconfigure.SpringBootApplication;
7+
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RequestParam;
9+
import org.springframework.web.bind.annotation.RestController;
10+
11+
12+
@SpringBootApplication
13+
public class SpringTestApplication {
14+
15+
public static void main(String[] args) {
16+
SpringApplication.run(SpringTestApplication.class, args);
17+
}
18+
19+
@RestController
20+
public static class GreetingController {
21+
22+
private static final String template = "Hello, %s!";
23+
private final AtomicLong counter = new AtomicLong();
24+
25+
@RequestMapping("/greeting")
26+
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
27+
return new Greeting(counter.incrementAndGet(), String.format(template, name));
28+
}
29+
30+
}
31+
32+
public static class Greeting {
33+
34+
private final long id;
35+
private final String content;
36+
37+
public Greeting(long id, String content) {
38+
this.id = id;
39+
this.content = content;
40+
}
41+
42+
public long getId() {
43+
return id;
44+
}
45+
46+
public String getContent() {
47+
return content;
48+
}
49+
}
50+
51+
}

sample-maven-spring/pom.xml

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<groupId>cz.habarta.typescript-generator</groupId>
6+
<artifactId>sample-maven-spring</artifactId>
7+
<version>2.0-SNAPSHOT</version>
8+
<packaging>jar</packaging>
9+
<name>sample-maven-spring</name>
10+
11+
<properties>
12+
<typescript-generator.version>2.12-SNAPSHOT</typescript-generator.version>
13+
</properties>
14+
15+
<dependencies>
16+
<dependency>
17+
<groupId>org.springframework.boot</groupId>
18+
<artifactId>spring-boot-starter-web</artifactId>
19+
<version>2.1.1.RELEASE</version>
20+
</dependency>
21+
</dependencies>
22+
23+
<build>
24+
<plugins>
25+
<plugin>
26+
<groupId>org.apache.maven.plugins</groupId>
27+
<artifactId>maven-compiler-plugin</artifactId>
28+
<version>3.7.0</version>
29+
<configuration>
30+
<source>1.8</source>
31+
<target>1.8</target>
32+
<compilerArgs>
33+
<arg>-parameters</arg>
34+
</compilerArgs>
35+
</configuration>
36+
</plugin>
37+
<plugin>
38+
<groupId>cz.habarta.typescript-generator</groupId>
39+
<artifactId>typescript-generator-maven-plugin</artifactId>
40+
<version>${typescript-generator.version}</version>
41+
<executions>
42+
<execution>
43+
<id>generate</id>
44+
<goals>
45+
<goal>generate</goal>
46+
</goals>
47+
<phase>process-classes</phase>
48+
</execution>
49+
</executions>
50+
<configuration>
51+
<jsonLibrary>jackson2</jsonLibrary>
52+
<outputFileType>implementationFile</outputFileType>
53+
<outputKind>module</outputKind>
54+
<classes>
55+
<class>cz.habarta.typescript.generator.sample.spring.SpringTestApplication</class>
56+
</classes>
57+
<scanSpringApplication>true</scanSpringApplication>
58+
<generateSpringApplicationClient>true</generateSpringApplicationClient>
59+
<extensions>
60+
<extension>cz.habarta.typescript.generator.ext.AxiosClientExtension</extension>
61+
</extensions>
62+
</configuration>
63+
<dependencies>
64+
<dependency>
65+
<groupId>cz.habarta.typescript-generator</groupId>
66+
<artifactId>typescript-generator-spring</artifactId>
67+
<version>${typescript-generator.version}</version>
68+
</dependency>
69+
</dependencies>
70+
</plugin>
71+
</plugins>
72+
</build>
73+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
2+
package cz.habarta.typescript.generator.sample.spring;
3+
4+
import java.util.concurrent.atomic.AtomicLong;
5+
import org.springframework.boot.SpringApplication;
6+
import org.springframework.boot.autoconfigure.SpringBootApplication;
7+
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RequestParam;
9+
import org.springframework.web.bind.annotation.RestController;
10+
11+
12+
@SpringBootApplication
13+
public class SpringTestApplication {
14+
15+
public static void main(String[] args) {
16+
SpringApplication.run(SpringTestApplication.class, args);
17+
}
18+
19+
@RestController
20+
public static class GreetingController {
21+
22+
private static final String template = "Hello, %s!";
23+
private final AtomicLong counter = new AtomicLong();
24+
25+
@RequestMapping("/greeting")
26+
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
27+
return new Greeting(counter.incrementAndGet(), String.format(template, name));
28+
}
29+
30+
}
31+
32+
public static class Greeting {
33+
34+
private final long id;
35+
private final String content;
36+
37+
public Greeting(long id, String content) {
38+
this.id = id;
39+
this.content = content;
40+
}
41+
42+
public long getId() {
43+
return id;
44+
}
45+
46+
public String getContent() {
47+
return content;
48+
}
49+
}
50+
51+
}

typescript-generator-core/pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,17 @@
173173
</execution>
174174
</executions>
175175
</plugin>
176+
<plugin>
177+
<groupId>org.apache.maven.plugins</groupId>
178+
<artifactId>maven-jar-plugin</artifactId>
179+
<executions>
180+
<execution>
181+
<goals>
182+
<goal>test-jar</goal>
183+
</goals>
184+
</execution>
185+
</executions>
186+
</plugin>
176187
<plugin>
177188
<groupId>org.apache.maven.plugins</groupId>
178189
<artifactId>maven-checkstyle-plugin</artifactId>

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

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11

22
package cz.habarta.typescript.generator;
33

4-
import cz.habarta.typescript.generator.parser.JaxrsApplicationParser;
54
import cz.habarta.typescript.generator.util.UnionType;
6-
import cz.habarta.typescript.generator.util.Utils;
75
import java.lang.reflect.*;
86
import java.math.*;
7+
import java.time.temporal.Temporal;
98
import java.util.*;
109
import java.util.stream.Collectors;
1110
import javax.xml.bind.JAXBElement;
@@ -18,27 +17,10 @@ public Result processType(Type javaType, Context context) {
1817
if (KnownTypes.containsKey(javaType)) return new Result(KnownTypes.get(javaType));
1918
if (javaType instanceof Class) {
2019
final Class<?> javaClass = (Class<?>) javaType;
21-
if (JavaTimeTemporal != null && JavaTimeTemporal.isAssignableFrom(javaClass)) {
20+
if (Temporal.class.isAssignableFrom(javaClass)) {
2221
return new Result(TsType.Date);
2322
}
2423
}
25-
if (javaType instanceof ParameterizedType) {
26-
final ParameterizedType parameterizedType = (ParameterizedType) javaType;
27-
if (parameterizedType.getRawType() instanceof Class) {
28-
final Class<?> javaClass = (Class<?>) parameterizedType.getRawType();
29-
if (JAXBElement.class.isAssignableFrom(javaClass)) {
30-
final Result result = context.processType(parameterizedType.getActualTypeArguments()[0]);
31-
return new Result(result.getTsType(), result.getDiscoveredClasses());
32-
}
33-
}
34-
}
35-
// map JAX-RS standard types to `any`
36-
for (Class<?> cls : JaxrsApplicationParser.getStandardEntityClasses()) {
37-
final Class<?> rawClass = Utils.getRawClassOrNull(javaType);
38-
if (rawClass != null && cls.isAssignableFrom(rawClass)) {
39-
return new Result(TsType.Any);
40-
}
41-
}
4224
if (javaType instanceof Class) {
4325
final Class<?> javaClass = (Class<?>) javaType;
4426
if (javaClass.isArray()) {
@@ -54,11 +36,14 @@ public Result processType(Type javaType, Context context) {
5436
if (Map.class.isAssignableFrom(javaClass)) {
5537
return new Result(new TsType.IndexedArrayType(TsType.String, TsType.Any));
5638
}
57-
if (javaClass.getName().equals("java.util.OptionalInt") ||
58-
javaClass.getName().equals("java.util.OptionalLong") ||
59-
javaClass.getName().equals("java.util.OptionalDouble")) {
39+
if (OptionalInt.class.isAssignableFrom(javaClass) ||
40+
OptionalLong.class.isAssignableFrom(javaClass) ||
41+
OptionalDouble.class.isAssignableFrom(javaClass)) {
6042
return new Result(TsType.Number.optional());
6143
}
44+
if (JAXBElement.class.isAssignableFrom(javaClass)) {
45+
return new Result(TsType.Any);
46+
}
6247
// generic structural type used without type arguments
6348
if (javaClass.getTypeParameters().length > 0) {
6449
final List<TsType> tsTypeArguments = new ArrayList<>();
@@ -82,10 +67,14 @@ public Result processType(Type javaType, Context context) {
8267
final Result result = context.processType(parameterizedType.getActualTypeArguments()[1]);
8368
return new Result(new TsType.IndexedArrayType(TsType.String, result.getTsType()), result.getDiscoveredClasses());
8469
}
85-
if (javaClass.getName().equals("java.util.Optional")) {
70+
if (Optional.class.isAssignableFrom(javaClass)) {
8671
final Result result = context.processType(parameterizedType.getActualTypeArguments()[0]);
8772
return new Result(result.getTsType().optional(), result.getDiscoveredClasses());
8873
}
74+
if (JAXBElement.class.isAssignableFrom(javaClass)) {
75+
final Result result = context.processType(parameterizedType.getActualTypeArguments()[0]);
76+
return new Result(result.getTsType(), result.getDiscoveredClasses());
77+
}
8978
// generic structural type
9079
final List<Class<?>> discoveredClasses = new ArrayList<>();
9180
discoveredClasses.add(javaClass);
@@ -169,14 +158,4 @@ private static Map<Type, TsType> getKnownTypes() {
169158

170159
private static final Map<Type, TsType> KnownTypes = getKnownTypes();
171160

172-
private static Class<?> getTemporalIfAvailable() {
173-
try {
174-
return Class.forName("java.time.temporal.Temporal");
175-
} catch (ClassNotFoundException e) {
176-
return null;
177-
}
178-
}
179-
180-
private static final Class<?> JavaTimeTemporal = getTemporalIfAvailable();
181-
182161
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11

22
package cz.habarta.typescript.generator;
33

4-
import cz.habarta.typescript.generator.util.Predicate;
54
import cz.habarta.typescript.generator.util.Utils;
65
import java.lang.reflect.Type;
76
import java.util.Collections;
87
import java.util.LinkedHashSet;
98
import java.util.List;
109
import java.util.Set;
10+
import java.util.function.Predicate;
1111

1212

1313
public class ExcludingTypeProcessor implements TypeProcessor {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
package cz.habarta.typescript.generator;
33

44
import cz.habarta.typescript.generator.parser.SourceType;
5-
import cz.habarta.typescript.generator.util.Predicate;
65
import cz.habarta.typescript.generator.util.Utils;
76
import io.github.classgraph.ClassGraph;
87
import io.github.classgraph.ScanResult;
@@ -14,6 +13,7 @@
1413
import java.util.Date;
1514
import java.util.List;
1615
import java.util.Objects;
16+
import java.util.function.Predicate;
1717
import java.util.regex.Pattern;
1818
import java.util.stream.Collectors;
1919

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
package cz.habarta.typescript.generator;
33

44
import cz.habarta.typescript.generator.parser.*;
5-
import cz.habarta.typescript.generator.util.Predicate;
65
import io.github.classgraph.ScanResult;
76
import java.lang.reflect.*;
87
import java.util.*;
8+
import java.util.function.Predicate;
99
import javax.ws.rs.*;
1010
import javax.ws.rs.core.*;
1111

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/JaxrsNamespacing.java renamed to typescript-generator-core/src/main/java/cz/habarta/typescript/generator/RestNamespacing.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
package cz.habarta.typescript.generator;
33

44

5-
public enum JaxrsNamespacing {
5+
public enum RestNamespacing {
66

77
singleObject, perResource, byAnnotation
88

0 commit comments

Comments
 (0)