Skip to content

Commit 5339c67

Browse files
committed
Adding a response media type
"mediaType" has been renamed to "requestMediaType" added an additional field "responseMediaType"
1 parent 0f9c0f9 commit 5339c67

File tree

11 files changed

+108
-16
lines changed

11 files changed

+108
-16
lines changed

typescript-service-generator-core/src/main/java/com/palantir/code/ts/generator/ServiceClassParser.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import javax.ws.rs.PUT;
2323
import javax.ws.rs.Path;
2424
import javax.ws.rs.PathParam;
25+
import javax.ws.rs.Produces;
2526
import javax.ws.rs.QueryParam;
2627

2728
import org.apache.commons.lang3.reflect.MethodUtils;
@@ -125,7 +126,18 @@ private static List<ServiceEndpointModel> computeEndpointModels(Set<Method> endp
125126
if (consumes.value().length > 1) {
126127
throw new IllegalArgumentException("Don't know how to handle an endpoint with multiple consume types");
127128
}
128-
ret.endpointMediaType(consumes.value()[0]);
129+
if (consumes.value().length == 1) {
130+
ret.endpointRequestMediaType(consumes.value()[0]);
131+
}
132+
}
133+
Produces produces = endpoint.getAnnotation(Produces.class);
134+
if (produces != null) {
135+
if (produces.value().length > 1) {
136+
throw new IllegalArgumentException("Don't know how to handle an endpoint with multiple produce types");
137+
}
138+
if (produces.value().length == 1) {
139+
ret.endpointResponseMediaType(produces.value()[0]);
140+
}
129141
}
130142

131143
List<Map<Class<?>, Annotation>> annotationList = getParamterAnnotationMaps(endpoint);

typescript-service-generator-core/src/main/java/com/palantir/code/ts/generator/ServiceEmitter.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import java.util.List;
1313
import java.util.Set;
1414

15+
import javax.ws.rs.core.MediaType;
16+
1517
import org.codehaus.jackson.map.JsonSerializer;
1618
import org.codehaus.jackson.map.ObjectMapper;
1719
import org.codehaus.jackson.map.SerializationConfig;
@@ -20,6 +22,7 @@
2022
import org.codehaus.jackson.type.JavaType;
2123

2224
import com.google.common.base.Joiner;
25+
import com.google.common.base.Optional;
2326
import com.google.common.collect.Lists;
2427
import com.google.common.collect.Sets;
2528
import com.palantir.code.ts.generator.model.InnerServiceModel;
@@ -124,7 +127,8 @@ public void emitTypescriptClass() {
124127
writer.writeLine("endpointPath: \"" + getEndpointPathString(innerServiceModel, endpointModel) + "\",");
125128
writer.writeLine("endpointName: \"" + endpointModel.endpointName() + "\",");
126129
writer.writeLine("method: \"" + endpointModel.endpointMethodType() + "\",");
127-
writer.writeLine("mediaType: \"" + endpointModel.endpointMediaType() + "\",");
130+
writer.writeLine("requestMediaType: \"" + endpointModel.endpointRequestMediaType() + "\",");
131+
writer.writeLine("responseMediaType: \"" + optionalToString(endpointModel.endpointResponseMediaType()) + "\",");
128132
List<String> requiredHeaders = Lists.newArrayList();
129133
List<String> pathArguments = Lists.newArrayList();
130134
List<String> queryArguments = Lists.newArrayList();
@@ -145,7 +149,7 @@ public void emitTypescriptClass() {
145149
if (parameterModel.javaType() instanceof Class<?>) {
146150
isEnum = ((Class<?>) parameterModel.javaType()).isEnum();
147151
}
148-
if (endpointModel.endpointMediaType().equals("application/json") && (parameterModel.tsType().toString().equals("string") || isEnum)) {
152+
if (endpointModel.equals(MediaType.APPLICATION_JSON) && (parameterModel.tsType().toString().equals("string") || isEnum)) {
149153
// strings (and enums, the wire format of an enum is a string) have to be wrapped in quotes in order to be valid json
150154
dataArgument = "`\"${" + parameterModel.getParameterName() + "}\"`";
151155
}
@@ -313,4 +317,12 @@ public String getMappedName(Class<?> cls) {
313317
}
314318
return ret;
315319
}
320+
321+
private static <T> String optionalToString(Optional<T> payload) {
322+
if (payload.isPresent()) {
323+
return payload.get().toString();
324+
}
325+
return "";
326+
}
327+
316328
}

typescript-service-generator-core/src/main/java/com/palantir/code/ts/generator/model/ServiceEndpointModel.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
import java.lang.reflect.Type;
88
import java.util.List;
99

10+
import javax.ws.rs.core.MediaType;
11+
1012
import org.immutables.value.Value;
1113

1214
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
1315
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
16+
import com.google.common.base.Optional;
1417
import com.palantir.code.ts.generator.ImmutableTypescriptServiceGeneratorConfiguration;
1518

1619
import cz.habarta.typescript.generator.TsType;
@@ -26,11 +29,14 @@ public abstract class ServiceEndpointModel implements Comparable<ServiceEndpoint
2629
public abstract String endpointName();
2730
public abstract String endpointPath();
2831
public abstract String endpointMethodType();
32+
2933
@Value.Default
30-
public String endpointMediaType() {
31-
return "application/json";
34+
public String endpointRequestMediaType() {
35+
return MediaType.APPLICATION_JSON;
3236
}
3337

38+
public abstract Optional<String> endpointResponseMediaType();
39+
3440
@Override
3541
public int compareTo(ServiceEndpointModel o) {
3642
return this.endpointName().compareTo(o.endpointName());

typescript-service-generator-core/src/main/resources/httpApiBridge.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ export interface %sHttpEndpointOptions {
33
endpointPath: string;
44
endpointName: string;
55
method: string;
6-
mediaType: string;
6+
requestMediaType: string;
7+
responseMediaType: string;
78
requiredHeaders: string[];
89
pathArguments: any[];
910
queryArguments: any;

typescript-service-generator-core/src/test/java/com/palantir/code/ts/generator/ServiceClassParserTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.stream.Collectors;
1616

1717
import javax.annotation.CheckForNull;
18+
import javax.ws.rs.core.MediaType;
1819

1920
import org.junit.Before;
2021
import org.junit.Test;
@@ -40,6 +41,7 @@
4041
import com.palantir.code.ts.generator.utils.TestUtils.IgnoredParametersClass;
4142
import com.palantir.code.ts.generator.utils.TestUtils.ImmutablesObject;
4243
import com.palantir.code.ts.generator.utils.TestUtils.MyObject;
44+
import com.palantir.code.ts.generator.utils.TestUtils.PlainTextService;
4345
import com.palantir.code.ts.generator.utils.TestUtils.SimpleService1;
4446
import com.palantir.code.ts.generator.utils.TestUtils.SimpleService2;
4547
import com.palantir.code.ts.generator.utils.TestUtils.TestComplexServiceClass;
@@ -112,6 +114,7 @@ public void parseComplexClassTest() throws NoSuchMethodException, SecurityExcept
112114
.endpointName("allOptionsPost")
113115
.endpointPath("allOptionsPost/{a}")
114116
.endpointMethodType("POST")
117+
.endpointRequestMediaType(MediaType.APPLICATION_JSON)
115118
.build());
116119
}
117120
{
@@ -253,4 +256,38 @@ public void multipleServiceClassParseTest() {
253256
assertEquals(expectedServiceModel, model);
254257
}
255258

259+
@Test
260+
public void plainTextTest() {
261+
ServiceModel model = serviceClassParser.parseServiceClass(PlainTextService.class, settings);
262+
263+
ImmutableServiceEndpointParameterModel expectedParameterModel = ImmutableServiceEndpointParameterModel.builder()
264+
.javaType(String.class)
265+
.tsType(TsType.String)
266+
.build();
267+
268+
ImmutableServiceEndpointModel expectedEndpointModel = ImmutableServiceEndpointModel.builder()
269+
.javaReturnType(String.class)
270+
.tsReturnType(TsType.String)
271+
.addParameters(expectedParameterModel)
272+
.endpointName("plainText")
273+
.endpointPath("plainText")
274+
.endpointMethodType("GET")
275+
.endpointRequestMediaType(MediaType.TEXT_PLAIN)
276+
.endpointResponseMediaType(MediaType.TEXT_PLAIN)
277+
.build();
278+
InnerServiceModel innerServiceModel = ImmutableInnerServiceModel.builder()
279+
.addEndpointModels(expectedEndpointModel)
280+
.servicePath("plainTextService")
281+
.name("PlainTextService")
282+
.build();
283+
284+
ServiceModel expectedServiceModel = ImmutableServiceModel.builder()
285+
.addInnerServiceModels(innerServiceModel)
286+
.name("PlainTextService")
287+
.addReferencedTypes(String.class)
288+
.build();
289+
290+
assertEquals(expectedServiceModel, model);
291+
}
292+
256293
}

typescript-service-generator-core/src/test/java/com/palantir/code/ts/generator/ServiceEmitterTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ public void testComplexServiceClassEmitClass() {
107107
" endpointPath: \"testComplexService/allOptionsPost/{a}\",\n" +
108108
" endpointName: \"allOptionsPost\",\n" +
109109
" method: \"POST\",\n" +
110-
" mediaType: \"application/json\",\n" +
110+
" requestMediaType: \"application/json\",\n" +
111+
" responseMediaType: \"\",\n" +
111112
" requiredHeaders: [],\n" +
112113
" pathArguments: [a],\n" +
113114
" queryArguments: {\n" +
@@ -124,7 +125,8 @@ public void testComplexServiceClassEmitClass() {
124125
" endpointPath: \"testComplexService/queryGetter\",\n" +
125126
" endpointName: \"queryGetter\",\n" +
126127
" method: \"GET\",\n" +
127-
" mediaType: \"application/json\",\n" +
128+
" requestMediaType: \"application/json\",\n" +
129+
" responseMediaType: \"\",\n" +
128130
" requiredHeaders: [],\n" +
129131
" pathArguments: [],\n" +
130132
" queryArguments: {\n" +
@@ -141,7 +143,8 @@ public void testComplexServiceClassEmitClass() {
141143
" endpointPath: \"testComplexService/simplePut\",\n" +
142144
" endpointName: \"simplePut\",\n" +
143145
" method: \"PUT\",\n" +
144-
" mediaType: \"application/json\",\n" +
146+
" requestMediaType: \"application/json\",\n" +
147+
" responseMediaType: \"\",\n" +
145148
" requiredHeaders: [],\n" +
146149
" pathArguments: [],\n" +
147150
" queryArguments: {\n" +
@@ -205,7 +208,8 @@ public void testConcreteObjectService() {
205208
" endpointPath: \"concreteObject\",\n" +
206209
" endpointName: \"noPathGetter\",\n" +
207210
" method: \"GET\",\n" +
208-
" mediaType: \"application/json\",\n" +
211+
" requestMediaType: \"application/json\",\n" +
212+
" responseMediaType: \"\",\n" +
209213
" requiredHeaders: [],\n" +
210214
" pathArguments: [],\n" +
211215
" queryArguments: {\n" +

typescript-service-generator-core/src/test/java/com/palantir/code/ts/generator/utils/TestUtils.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55
package com.palantir.code.ts.generator.utils;
66

77
import javax.annotation.CheckForNull;
8+
import javax.ws.rs.Consumes;
89
import javax.ws.rs.GET;
910
import javax.ws.rs.POST;
1011
import javax.ws.rs.PUT;
1112
import javax.ws.rs.Path;
1213
import javax.ws.rs.PathParam;
14+
import javax.ws.rs.Produces;
1315
import javax.ws.rs.QueryParam;
16+
import javax.ws.rs.core.MediaType;
1417

1518
import org.immutables.value.Value;
1619

@@ -41,6 +44,7 @@ public interface TestComplexServiceClass {
4144

4245
@POST
4346
@Path("/allOptionsPost/{a}")
47+
@Consumes(MediaType.APPLICATION_JSON)
4448
GenericObject<MyObject> allOptionsPost(@PathParam("a") String a, @QueryParam("b") Integer x, DataObject dataObject);
4549
}
4650

@@ -97,6 +101,16 @@ public String noPathGetter() {
97101
};
98102
}
99103

104+
@Path("/plainTextService")
105+
public interface PlainTextService {
106+
107+
@GET
108+
@Consumes(MediaType.TEXT_PLAIN)
109+
@Produces(MediaType.TEXT_PLAIN)
110+
@Path("/plainText")
111+
public String plainText(String dataBody);
112+
}
113+
100114
public enum MyEnum {
101115
VALUE1, VALUE2
102116
}

typescript-service-generator-core/src/test/resources/eteTestData/complexServiceTestOutput/httpApiBridge.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ module ModuleName {
77
endpointPath: string;
88
endpointName: string;
99
method: string;
10-
mediaType: string;
10+
requestMediaType: string;
11+
responseMediaType: string;
1112
requiredHeaders: string[];
1213
pathArguments: any[];
1314
queryArguments: any;

typescript-service-generator-core/src/test/resources/eteTestData/complexServiceTestOutput/testComplexServiceClass.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ module ModuleName.TestComplexServiceClass {
3737
endpointPath: "testComplexService/allOptionsPost/{a}",
3838
endpointName: "allOptionsPost",
3939
method: "POST",
40-
mediaType: "application/json",
40+
requestMediaType: "application/json",
41+
responseMediaType: "",
4142
requiredHeaders: [],
4243
pathArguments: [a],
4344
queryArguments: {
@@ -54,7 +55,8 @@ module ModuleName.TestComplexServiceClass {
5455
endpointPath: "testComplexService/queryGetter",
5556
endpointName: "queryGetter",
5657
method: "GET",
57-
mediaType: "application/json",
58+
requestMediaType: "application/json",
59+
responseMediaType: "",
5860
requiredHeaders: [],
5961
pathArguments: [],
6062
queryArguments: {
@@ -71,7 +73,8 @@ module ModuleName.TestComplexServiceClass {
7173
endpointPath: "testComplexService/simplePut",
7274
endpointName: "simplePut",
7375
method: "PUT",
74-
mediaType: "application/json",
76+
requestMediaType: "application/json",
77+
responseMediaType: "",
7578
requiredHeaders: [],
7679
pathArguments: [],
7780
queryArguments: {

typescript-service-generator-core/src/test/resources/eteTestData/simpleServiceTestOutput/httpApiBridge.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ export interface HttpEndpointOptions {
66
endpointPath: string;
77
endpointName: string;
88
method: string;
9-
mediaType: string;
9+
requestMediaType: string;
10+
responseMediaType: string;
1011
requiredHeaders: string[];
1112
pathArguments: any[];
1213
queryArguments: any;

0 commit comments

Comments
 (0)