Skip to content

Commit

Permalink
Spring support, refactoring (vojtechhabarta#253)
Browse files Browse the repository at this point in the history
- `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
  • Loading branch information
vojtechhabarta committed Mar 13, 2019
1 parent 63ee545 commit afeeab1
Show file tree
Hide file tree
Showing 39 changed files with 1,424 additions and 341 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ release.properties
/sample-gradle/.nb-gradle/
/sample-gradle/bin/
/sample-gradle/build/
/sample-gradle-spring/.gradle/
/sample-gradle-spring/.nb-gradle/
/sample-gradle-spring/bin/
/sample-gradle-spring/build/

# npm
node_modules
Expand Down
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<module>typescript-generator-core</module>
<module>typescript-generator-maven-plugin</module>
<module>typescript-generator-gradle-plugin</module>
<module>typescript-generator-spring</module>
</modules>

<licenses>
Expand Down
40 changes: 40 additions & 0 deletions sample-gradle-spring/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@

apply plugin: 'java'
apply plugin: 'cz.habarta.typescript-generator'

version = '2.0'
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
jcenter()
}

dependencies {
compile 'org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE'
}

buildscript {
repositories {
mavenLocal()
jcenter()
}

dependencies {
classpath 'cz.habarta.typescript-generator:typescript-generator-gradle-plugin:2.12-SNAPSHOT'
classpath 'cz.habarta.typescript-generator:typescript-generator-spring:2.12-SNAPSHOT'
}
}

generateTypeScript {
classes = [
'cz.habarta.typescript.generator.sample.spring.SpringTestApplication'
]
outputFileType = 'implementationFile'
jsonLibrary = 'jackson2'
outputKind = 'module'
scanSpringApplication = true
generateSpringApplicationClient = true
}

build.dependsOn generateTypeScript
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@

package cz.habarta.typescript.generator.sample.spring;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


@SpringBootApplication
public class SpringTestApplication {

public static void main(String[] args) {
SpringApplication.run(SpringTestApplication.class, args);
}

@RestController
public static class GreetingController {

private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();

@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}

}

public static class Greeting {

private final long id;
private final String content;

public Greeting(long id, String content) {
this.id = id;
this.content = content;
}

public long getId() {
return id;
}

public String getContent() {
return content;
}
}

}
73 changes: 73 additions & 0 deletions sample-maven-spring/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<modelVersion>4.0.0</modelVersion>

<groupId>cz.habarta.typescript-generator</groupId>
<artifactId>sample-maven-spring</artifactId>
<version>2.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>sample-maven-spring</name>

<properties>
<typescript-generator.version>2.12-SNAPSHOT</typescript-generator.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<plugin>
<groupId>cz.habarta.typescript-generator</groupId>
<artifactId>typescript-generator-maven-plugin</artifactId>
<version>${typescript-generator.version}</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
<phase>process-classes</phase>
</execution>
</executions>
<configuration>
<jsonLibrary>jackson2</jsonLibrary>
<outputFileType>implementationFile</outputFileType>
<outputKind>module</outputKind>
<classes>
<class>cz.habarta.typescript.generator.sample.spring.SpringTestApplication</class>
</classes>
<scanSpringApplication>true</scanSpringApplication>
<generateSpringApplicationClient>true</generateSpringApplicationClient>
<extensions>
<extension>cz.habarta.typescript.generator.ext.AxiosClientExtension</extension>
</extensions>
</configuration>
<dependencies>
<dependency>
<groupId>cz.habarta.typescript-generator</groupId>
<artifactId>typescript-generator-spring</artifactId>
<version>${typescript-generator.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@

package cz.habarta.typescript.generator.sample.spring;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


@SpringBootApplication
public class SpringTestApplication {

public static void main(String[] args) {
SpringApplication.run(SpringTestApplication.class, args);
}

@RestController
public static class GreetingController {

private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();

@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}

}

public static class Greeting {

private final long id;
private final String content;

public Greeting(long id, String content) {
this.id = id;
this.content = content;
}

public long getId() {
return id;
}

public String getContent() {
return content;
}
}

}
11 changes: 11 additions & 0 deletions typescript-generator-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,17 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@

package cz.habarta.typescript.generator;

import cz.habarta.typescript.generator.parser.JaxrsApplicationParser;
import cz.habarta.typescript.generator.util.UnionType;
import cz.habarta.typescript.generator.util.Utils;
import java.lang.reflect.*;
import java.math.*;
import java.time.temporal.Temporal;
import java.util.*;
import java.util.stream.Collectors;
import javax.xml.bind.JAXBElement;
Expand All @@ -18,27 +17,10 @@ public Result processType(Type javaType, Context context) {
if (KnownTypes.containsKey(javaType)) return new Result(KnownTypes.get(javaType));
if (javaType instanceof Class) {
final Class<?> javaClass = (Class<?>) javaType;
if (JavaTimeTemporal != null && JavaTimeTemporal.isAssignableFrom(javaClass)) {
if (Temporal.class.isAssignableFrom(javaClass)) {
return new Result(TsType.Date);
}
}
if (javaType instanceof ParameterizedType) {
final ParameterizedType parameterizedType = (ParameterizedType) javaType;
if (parameterizedType.getRawType() instanceof Class) {
final Class<?> javaClass = (Class<?>) parameterizedType.getRawType();
if (JAXBElement.class.isAssignableFrom(javaClass)) {
final Result result = context.processType(parameterizedType.getActualTypeArguments()[0]);
return new Result(result.getTsType(), result.getDiscoveredClasses());
}
}
}
// map JAX-RS standard types to `any`
for (Class<?> cls : JaxrsApplicationParser.getStandardEntityClasses()) {
final Class<?> rawClass = Utils.getRawClassOrNull(javaType);
if (rawClass != null && cls.isAssignableFrom(rawClass)) {
return new Result(TsType.Any);
}
}
if (javaType instanceof Class) {
final Class<?> javaClass = (Class<?>) javaType;
if (javaClass.isArray()) {
Expand All @@ -54,11 +36,14 @@ public Result processType(Type javaType, Context context) {
if (Map.class.isAssignableFrom(javaClass)) {
return new Result(new TsType.IndexedArrayType(TsType.String, TsType.Any));
}
if (javaClass.getName().equals("java.util.OptionalInt") ||
javaClass.getName().equals("java.util.OptionalLong") ||
javaClass.getName().equals("java.util.OptionalDouble")) {
if (OptionalInt.class.isAssignableFrom(javaClass) ||
OptionalLong.class.isAssignableFrom(javaClass) ||
OptionalDouble.class.isAssignableFrom(javaClass)) {
return new Result(TsType.Number.optional());
}
if (JAXBElement.class.isAssignableFrom(javaClass)) {
return new Result(TsType.Any);
}
// generic structural type used without type arguments
if (javaClass.getTypeParameters().length > 0) {
final List<TsType> tsTypeArguments = new ArrayList<>();
Expand All @@ -82,10 +67,14 @@ public Result processType(Type javaType, Context context) {
final Result result = context.processType(parameterizedType.getActualTypeArguments()[1]);
return new Result(new TsType.IndexedArrayType(TsType.String, result.getTsType()), result.getDiscoveredClasses());
}
if (javaClass.getName().equals("java.util.Optional")) {
if (Optional.class.isAssignableFrom(javaClass)) {
final Result result = context.processType(parameterizedType.getActualTypeArguments()[0]);
return new Result(result.getTsType().optional(), result.getDiscoveredClasses());
}
if (JAXBElement.class.isAssignableFrom(javaClass)) {
final Result result = context.processType(parameterizedType.getActualTypeArguments()[0]);
return new Result(result.getTsType(), result.getDiscoveredClasses());
}
// generic structural type
final List<Class<?>> discoveredClasses = new ArrayList<>();
discoveredClasses.add(javaClass);
Expand Down Expand Up @@ -169,14 +158,4 @@ private static Map<Type, TsType> getKnownTypes() {

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

private static Class<?> getTemporalIfAvailable() {
try {
return Class.forName("java.time.temporal.Temporal");
} catch (ClassNotFoundException e) {
return null;
}
}

private static final Class<?> JavaTimeTemporal = getTemporalIfAvailable();

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@

package cz.habarta.typescript.generator;

import cz.habarta.typescript.generator.util.Predicate;
import cz.habarta.typescript.generator.util.Utils;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;


public class ExcludingTypeProcessor implements TypeProcessor {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
package cz.habarta.typescript.generator;

import cz.habarta.typescript.generator.parser.SourceType;
import cz.habarta.typescript.generator.util.Predicate;
import cz.habarta.typescript.generator.util.Utils;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ScanResult;
Expand All @@ -14,6 +13,7 @@
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
package cz.habarta.typescript.generator;

import cz.habarta.typescript.generator.parser.*;
import cz.habarta.typescript.generator.util.Predicate;
import io.github.classgraph.ScanResult;
import java.lang.reflect.*;
import java.util.*;
import java.util.function.Predicate;
import javax.ws.rs.*;
import javax.ws.rs.core.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
package cz.habarta.typescript.generator;


public enum JaxrsNamespacing {
public enum RestNamespacing {

singleObject, perResource, byAnnotation

Expand Down
Loading

0 comments on commit afeeab1

Please sign in to comment.