Skip to content

Commit addf07b

Browse files
committed
Added typed properties, + renamigns
1 parent 686a7d0 commit addf07b

File tree

10 files changed

+92
-71
lines changed

10 files changed

+92
-71
lines changed

services-api/src/main/java/io/scalecube/services/RequestContext.java

Lines changed: 3 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
import io.scalecube.services.auth.Principal;
1010
import io.scalecube.services.exceptions.ForbiddenException;
1111
import io.scalecube.services.methods.MethodInfo;
12-
import java.math.BigDecimal;
13-
import java.math.BigInteger;
1412
import java.util.Collections;
1513
import java.util.Map;
1614
import java.util.Map.Entry;
@@ -228,8 +226,8 @@ public RequestContext methodInfo(MethodInfo methodInfo) {
228226
*
229227
* @return path parameters, or {@code null} if not set
230228
*/
231-
public Map<String, String> pathParams() {
232-
return source.getOrDefault(PATH_PARAMS_KEY, Collections.emptyMap());
229+
public TypedParameters pathParams() {
230+
return new TypedParameters(source.getOrDefault(PATH_PARAMS_KEY, Collections.emptyMap()));
233231
}
234232

235233
/**
@@ -241,54 +239,6 @@ public RequestContext pathParams(Map<String, String> pathParams) {
241239
return put(PATH_PARAMS_KEY, pathParams);
242240
}
243241

244-
/**
245-
* Returns specific path parameter by name.
246-
*
247-
* @param name name of the path parameter
248-
* @return path parameter value, or {@code null} if not found
249-
*/
250-
public String pathParam(String name) {
251-
return pathParams().get(name);
252-
}
253-
254-
/**
255-
* Returns specific path parameter by name, and converts it to the specified type.
256-
*
257-
* @param name name of the path parameter
258-
* @param type expected type of the path parameter
259-
* @param <T> type parameter
260-
* @return converted path parameter, or {@code null} if not found
261-
*/
262-
public <T> T pathParam(String name, Class<T> type) {
263-
final var s = pathParam(name);
264-
if (s == null) {
265-
return null;
266-
}
267-
268-
if (type == String.class) {
269-
//noinspection unchecked
270-
return (T) s;
271-
}
272-
if (type == Integer.class) {
273-
//noinspection unchecked
274-
return (T) Integer.valueOf(s);
275-
}
276-
if (type == Long.class) {
277-
//noinspection unchecked
278-
return (T) Long.valueOf(s);
279-
}
280-
if (type == BigDecimal.class) {
281-
//noinspection unchecked
282-
return (T) new BigDecimal(s);
283-
}
284-
if (type == BigInteger.class) {
285-
//noinspection unchecked
286-
return (T) new BigInteger(s);
287-
}
288-
289-
throw new IllegalArgumentException("Unsupported pathParam type: " + type);
290-
}
291-
292242
/**
293243
* Retrieves {@link RequestContext} from the reactor context, wrapping the existing context if
294244
* necessary.
@@ -366,7 +316,7 @@ public String toString() {
366316
.add("principal=" + principal())
367317
.add("methodInfo=" + methodInfo())
368318
.add("headers=" + mask(headers()))
369-
.add("pathParams=" + mask(pathParams()))
319+
.add("pathParams=" + source.getOrDefault(PATH_PARAMS_KEY, Collections.emptyMap()))
370320
.add("sourceKeys=" + source.stream().map(Entry::getKey).toList())
371321
.toString();
372322
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.scalecube.services;
2+
3+
import java.math.BigDecimal;
4+
import java.math.BigInteger;
5+
import java.util.LinkedHashMap;
6+
import java.util.Map;
7+
import java.util.function.Function;
8+
9+
public class TypedParameters {
10+
11+
private final Map<String, String> params;
12+
13+
public TypedParameters(Map<String, String> params) {
14+
this.params = new LinkedHashMap<>(params != null ? params : Map.of());
15+
}
16+
17+
public Integer intValue(String name) {
18+
return get(name, Integer::parseInt);
19+
}
20+
21+
public Long longValue(String name) {
22+
return get(name, Long::parseLong);
23+
}
24+
25+
public BigInteger bigInteger(String name) {
26+
return get(name, BigInteger::new);
27+
}
28+
29+
public Double doubleValue(String name) {
30+
return get(name, Double::parseDouble);
31+
}
32+
33+
public BigDecimal bigDecimal(String name) {
34+
return get(name, BigDecimal::new);
35+
}
36+
37+
public <T extends Enum<T>> T enumValue(String name, Function<String, T> enumFunc) {
38+
return get(name, enumFunc);
39+
}
40+
41+
public Boolean booleanValue(String name) {
42+
return get(name, Boolean::parseBoolean);
43+
}
44+
45+
public String stringValue(String name) {
46+
return get(name, s -> s);
47+
}
48+
49+
public <T> T get(String name, Function<String, T> converter) {
50+
final var s = params.get(name);
51+
return s != null ? converter.apply(s) : null;
52+
}
53+
}

services-api/src/test/java/io/scalecube/services/methods/StubServiceImpl.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ public Mono<Void> invokeDynamicQualifier() {
5151
context -> {
5252
assertNotNull(context.headers(), "headers");
5353
assertNotNull(context.principal(), "principal");
54-
assertNotNull(context.pathParams(), "pathParams");
55-
assertNotNull(context.pathParam("foo"), "pathParam[foo]");
56-
assertNotNull(context.pathParam("bar"), "pathParam[bar]");
54+
final var pathParams = context.pathParams();
55+
assertNotNull(pathParams, "pathParams");
56+
assertNotNull(pathParams.stringValue("foo"), "pathParam[foo]");
57+
assertNotNull(pathParams.stringValue("bar"), "pathParam[bar]");
5758
})
5859
.then();
5960
}

services-examples/src/main/java/io/scalecube/services/examples/GreetingServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,6 @@ public Mono<ServiceMessage> emptyGreetingMessage(ServiceMessage request) {
107107
@Override
108108
public Mono<String> helloDynamicQualifier(Long value) {
109109
return RequestContext.deferContextual()
110-
.map(context -> context.pathParam("someVar") + "@" + value);
110+
.map(context -> context.pathParams().stringValue("someVar") + "@" + value);
111111
}
112112
}

services-gateway/src/test/java/io/scalecube/services/gateway/files/ReportServiceImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ public Flux<ServiceMessage> successfulDownload() {
122122
return RequestContext.deferContextual()
123123
.flatMapMany(
124124
context -> {
125-
final var fileSize = context.pathParam("fileSize", Long.class);
125+
final var pathParams = context.pathParams();
126+
final var fileSize = pathParams.longValue("fileSize");
126127
final var headers = context.headers();
127128
final File file;
128129
try {

services-gateway/src/test/java/io/scalecube/services/gateway/rest/RestServiceImpl.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public Mono<SomeResponse> options() {
1717
return RequestContext.deferContextual()
1818
.map(
1919
context -> {
20-
final var foo = context.pathParam("foo");
20+
final var pathParams = context.pathParams();
21+
final var foo = pathParams.stringValue("foo");
2122
assertNotNull(foo);
2223
assertNotNull(context.headers());
2324
assertThat(context.headers().size(), greaterThan(0));
@@ -31,7 +32,8 @@ public Mono<SomeResponse> get() {
3132
return RequestContext.deferContextual()
3233
.map(
3334
context -> {
34-
final var foo = context.pathParam("foo");
35+
final var pathParams = context.pathParams();
36+
final var foo = pathParams.stringValue("foo");
3537
assertNotNull(foo);
3638
assertNotNull(context.headers());
3739
assertThat(context.headers().size(), greaterThan(0));
@@ -45,7 +47,8 @@ public Mono<SomeResponse> head() {
4547
return RequestContext.deferContextual()
4648
.map(
4749
context -> {
48-
final var foo = context.pathParam("foo");
50+
final var pathParams = context.pathParams();
51+
final var foo = pathParams.stringValue("foo");
4952
assertEquals("head123456", foo, "pathParam");
5053
final var headers = context.headers();
5154
assertNotNull(headers);
@@ -70,7 +73,9 @@ public Mono<SomeResponse> post(SomeRequest request) {
7073
return RequestContext.deferContextual()
7174
.map(
7275
context -> {
73-
assertNotNull(context.pathParam("foo"));
76+
final var pathParams = context.pathParams();
77+
final var foo = pathParams.stringValue("foo");
78+
assertNotNull(foo);
7479
assertNotNull(context.headers());
7580
assertThat(context.headers().size(), greaterThan(0));
7681
assertEquals("POST", context.requestMethod());
@@ -83,7 +88,9 @@ public Mono<SomeResponse> put(SomeRequest request) {
8388
return RequestContext.deferContextual()
8489
.map(
8590
context -> {
86-
assertNotNull(context.pathParam("foo"));
91+
final var pathParams = context.pathParams();
92+
final var foo = pathParams.stringValue("foo");
93+
assertNotNull(foo);
8794
assertNotNull(context.headers());
8895
assertThat(context.headers().size(), greaterThan(0));
8996
assertEquals("PUT", context.requestMethod());
@@ -96,7 +103,9 @@ public Mono<SomeResponse> patch(SomeRequest request) {
96103
return RequestContext.deferContextual()
97104
.map(
98105
context -> {
99-
assertNotNull(context.pathParam("foo"));
106+
final var pathParams = context.pathParams();
107+
final var foo = pathParams.stringValue("foo");
108+
assertNotNull(foo);
100109
assertNotNull(context.headers());
101110
assertThat(context.headers().size(), greaterThan(0));
102111
assertEquals("PATCH", context.requestMethod());
@@ -109,7 +118,8 @@ public Mono<SomeResponse> delete() {
109118
return RequestContext.deferContextual()
110119
.map(
111120
context -> {
112-
final var foo = context.pathParam("foo");
121+
final var pathParams = context.pathParams();
122+
final var foo = pathParams.stringValue("foo");
113123
assertNotNull(foo);
114124
assertNotNull(context.headers());
115125
assertThat(context.headers().size(), greaterThan(0));
@@ -123,7 +133,8 @@ public Mono<SomeResponse> trace() {
123133
return RequestContext.deferContextual()
124134
.map(
125135
context -> {
126-
final var foo = context.pathParam("foo");
136+
final var pathParams = context.pathParams();
137+
final var foo = pathParams.stringValue("foo");
127138
assertNotNull(foo);
128139
assertNotNull(context.headers());
129140
assertThat(context.headers().size(), greaterThan(0));

services-gateway/src/test/java/io/scalecube/services/gateway/rest/RoutingServiceImpl.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ public Mono<SomeResponse> find() {
1414
return RequestContext.deferContextual()
1515
.map(
1616
context -> {
17-
final var foo = context.pathParam("foo");
17+
final var pathParams = context.pathParams();
18+
final var foo = pathParams.stringValue("foo");
1819
assertNotNull(foo);
1920
assertNotNull(context.headers());
2021
assertTrue(context.headers().size() > 0);
@@ -28,7 +29,9 @@ public Mono<SomeResponse> update(SomeRequest request) {
2829
return RequestContext.deferContextual()
2930
.map(
3031
context -> {
31-
assertNotNull(context.pathParam("foo"));
32+
final var pathParams = context.pathParams();
33+
final var foo = pathParams.stringValue("foo");
34+
assertNotNull(foo);
3235
assertNotNull(context.headers());
3336
assertTrue(context.headers().size() > 0);
3437
assertEquals("POST", context.requestMethod());

services/src/main/java/io/scalecube/services/files/FileServiceImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ public Flux<ServiceMessage> streamFile() {
9696
.flatMapMany(
9797
context -> {
9898
final var headers = context.headers();
99-
final var filename = context.pathParam("filename");
99+
final var pathParams = context.pathParams();
100+
final var filename = pathParams.stringValue("filename");
100101
final var path = baseDir.resolve(filename);
101102

102103
if (!isPathValid(path)) {

services/src/test/java/io/scalecube/services/PlaceholderQualifierTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ public Mono<String> hello() {
169169

170170
@Override
171171
public Mono<String> helloWithPathParam() {
172-
return RequestContext.deferContextual().map(context -> id + "|" + context.pathParam("name"));
172+
return RequestContext.deferContextual()
173+
.map(context -> id + "|" + context.pathParams().stringValue("name"));
173174
}
174175
}
175176
}

services/src/test/java/io/scalecube/services/sut/GreetingServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,6 @@ public Flux<Long> manyStream(Long cnt) {
205205
@Override
206206
public Mono<String> helloDynamicQualifier(Long value) {
207207
return RequestContext.deferContextual()
208-
.map(context -> context.pathParam("someVar") + "@" + value);
208+
.map(context -> context.pathParams().stringValue("someVar") + "@" + value);
209209
}
210210
}

0 commit comments

Comments
 (0)