Skip to content

Commit 6dd4a96

Browse files
authored
Merge pull request #282 from oak/master
added support for fixed parameters via annotation
2 parents b421eab + b3e84e0 commit 6dd4a96

File tree

5 files changed

+252
-8
lines changed

5 files changed

+252
-8
lines changed

README.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,54 @@ public interface LibraryService {
459459
```json
460460
{"jsonrpc":"2.0", "method": "VideoLibrary.GetTVShows", "params": { "properties": ["title"] }, "id":1}
461461
```
462+
#### Fixed parameters
463+
464+
You may need to pass some fixed parameters to a JsonRpc method. In this case, use the annotation @JsonRpcFixedParam on the service method. You may also use @JsonRpcFixedParams to pass a collection of fixed parameters.
465+
466+
```java
467+
@JsonRpcService("/jsonrpc")
468+
public interface LibraryService {
469+
@JsonRpcMethod("VideoLibrary.GetTVShows")
470+
@JsonRpcFixedParam(name = "status", value = "published")
471+
List<TVShow> fetchTVShows(@JsonRpcParam(value="properties") final List<String> properties);
472+
}
473+
```
474+
475+
```json
476+
{
477+
"jsonrpc":"2.0",
478+
"method": "VideoLibrary.GetTVShows",
479+
"params": {
480+
"status": "published",
481+
"properties": ["title"]
482+
},
483+
"id":1
484+
}
485+
```
486+
487+
```java
488+
@JsonRpcService("/jsonrpc")
489+
public interface LibraryService {
490+
@JsonRpcMethod("VideoLibrary.GetTVShows")
491+
@JsonRpcFixedParams(fixedParams = {
492+
@JsonRpcFixedParam(name = "status", value = "published"),
493+
@JsonRpcFixedParam(name = "order_by", value = "recent") })
494+
List<TVShow> fetchTVShows(@JsonRpcParam(value="properties") final List<String> properties);
495+
}
496+
```
497+
498+
```json
499+
{
500+
"jsonrpc":"2.0",
501+
"method": "VideoLibrary.GetTVShows",
502+
"params": {
503+
"status": "published",
504+
"order_by": "recent",
505+
"properties": ["title"]
506+
},
507+
"id":1
508+
}
509+
```
462510

463511
[Google Group]: http://groups.google.com/group/json-rpc
464512
[Jackson page]: https://github.com/FasterXML/jackson
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.googlecode.jsonrpc4j;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Target(ElementType.METHOD)
9+
@Retention(RetentionPolicy.RUNTIME)
10+
public @interface JsonRpcFixedParam {
11+
12+
/**
13+
* @return the parameter's name.
14+
*/
15+
String name();
16+
17+
/**
18+
* @return the parameter's value.
19+
*/
20+
String value();
21+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.googlecode.jsonrpc4j;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Target(ElementType.METHOD)
9+
@Retention(RetentionPolicy.RUNTIME)
10+
public @interface JsonRpcFixedParams {
11+
12+
/**
13+
* @return a fixed parameter's collection.
14+
*/
15+
JsonRpcFixedParam[] fixedParams();
16+
}

src/main/java/com/googlecode/jsonrpc4j/ReflectionUtil.java

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -194,23 +194,27 @@ public static Object parseArguments(Method method, Object[] arguments) {
194194
if (jsonRpcMethod != null)
195195
paramsPassMode = jsonRpcMethod.paramsPassMode();
196196

197-
Map<String, Object> namedParams = getNamedParameters(method, arguments);
197+
Map<String, Object> params = new LinkedHashMap<>();
198+
199+
params.putAll(getFixedParametersCollection(method));
200+
params.putAll(getFixedParameters(method));
201+
params.putAll(getNamedParameters(method, arguments));
198202

199203
switch (paramsPassMode) {
200204
case ARRAY:
201-
if (namedParams.size() > 0) {
202-
Object[] parsed = new Object[namedParams.size()];
205+
if (params.size() > 0) {
206+
Object[] parsed = new Object[params.size()];
203207
int i = 0;
204-
for (Object value : namedParams.values()) {
208+
for (Object value : params.values()) {
205209
parsed[i++] = value;
206210
}
207211
return parsed;
208212
} else {
209213
return arguments != null ? arguments : new Object[]{};
210214
}
211215
case OBJECT:
212-
if (namedParams.size() > 0) {
213-
return namedParams;
216+
if (params.size() > 0) {
217+
return params;
214218
} else {
215219
if (arguments == null) {
216220
return new Object[]{};
@@ -221,8 +225,8 @@ public static Object parseArguments(Method method, Object[] arguments) {
221225
}
222226
case AUTO:
223227
default:
224-
if (namedParams.size() > 0) {
225-
return namedParams;
228+
if (params.size() > 0) {
229+
return params;
226230
} else {
227231
return arguments != null ? arguments : new Object[]{};
228232
}
@@ -260,6 +264,49 @@ private static Map<String, Object> getNamedParameters(Method method, Object[] ar
260264
return namedParams;
261265
}
262266

267+
/**
268+
* Checks method for @JsonRpcFixedParam annotations and returns fixed
269+
* parameters.
270+
*
271+
* @param method the method
272+
* @return fixed parameters or empty if no annotations found
273+
*/
274+
public static Map<String, Object> getFixedParameters(Method method) {
275+
276+
Map<String, Object> fixedParams = new LinkedHashMap<>();
277+
278+
for (Annotation an : getAnnotations(method)) {
279+
if (an instanceof JsonRpcFixedParam) {
280+
JsonRpcFixedParam jAnn = (JsonRpcFixedParam) an;
281+
fixedParams.put(jAnn.name(), jAnn.value());
282+
}
283+
}
284+
285+
return fixedParams;
286+
}
287+
288+
/**
289+
* Checks method for @JsonRpcFixedParams annotation and returns fixed
290+
* parameters.
291+
*
292+
* @param method the method
293+
* @return fixed parameters or empty if no annotations found
294+
*/
295+
public static Map<String, Object> getFixedParametersCollection(Method method) {
296+
297+
Map<String, Object> fixedParams = new LinkedHashMap<>();
298+
299+
JsonRpcFixedParams jsonRpcFixedParams = getAnnotation(method, JsonRpcFixedParams.class);
300+
301+
if (jsonRpcFixedParams != null) {
302+
for (JsonRpcFixedParam fixedParam : jsonRpcFixedParams.fixedParams()) {
303+
fixedParams.put(fixedParam.name(), fixedParam.value());
304+
}
305+
}
306+
307+
return fixedParams;
308+
}
309+
263310
public static void clearCache() {
264311
methodCache.clear();
265312
parameterTypeCache.clear();

src/test/java/com/googlecode/jsonrpc4j/ReflectionUtilTest.java

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,35 @@ public void someNamedParamsPassParamsAuto() throws Exception {
5757

5858
ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("someNamedParamsPassParamsAuto", String.class, int.class), null);
5959
}
60+
61+
@Test
62+
public void fixedParamPassParamsAuto() throws Exception {
63+
Object[] arguments = { "1", 2 };
64+
65+
@SuppressWarnings("unchecked")
66+
Map<String, Object> params = (Map<String, Object>) ReflectionUtil.parseArguments(
67+
JsonRpcTestService.class.getMethod("fixedParamPassParamsAuto", String.class, int.class), arguments);
68+
69+
assertEquals(3, params.size());
70+
assertEquals("1", params.get("one"));
71+
assertEquals(2, params.get("two"));
72+
assertEquals("value1", params.get("param1"));
73+
}
74+
75+
@Test
76+
public void fixedParamsPassParamsAuto() throws Exception {
77+
Object[] arguments = { "1", 2 };
78+
79+
@SuppressWarnings("unchecked")
80+
Map<String, Object> params = (Map<String, Object>) ReflectionUtil.parseArguments(
81+
JsonRpcTestService.class.getMethod("fixedParamsPassParamsAuto", String.class, int.class), arguments);
82+
83+
assertEquals(4, params.size());
84+
assertEquals("1", params.get("one"));
85+
assertEquals(2, params.get("two"));
86+
assertEquals("value1", params.get("param1"));
87+
assertEquals("value2", params.get("param2"));
88+
}
6089

6190
@Test
6291
public void allNamedParamsPassParamsAuto() throws Exception {
@@ -82,6 +111,33 @@ public void someNamedParamsPassParamsArray() throws Exception {
82111

83112
ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("someNamedParamsPassParamsArray", String.class, int.class), null);
84113
}
114+
115+
@Test
116+
public void fixedParamPassParamsArray() throws Exception {
117+
Object[] arguments = { "1", 2 };
118+
119+
Object[] params = (Object[]) ReflectionUtil.parseArguments(
120+
JsonRpcTestService.class.getMethod("fixedParamPassParamsArray", String.class, int.class), arguments);
121+
122+
assertEquals(3, params.length);
123+
assertEquals("value1", params[0]);
124+
assertEquals("1", params[1]);
125+
assertEquals(2, params[2]);
126+
}
127+
128+
@Test
129+
public void fixedParamsPassParamsArray() throws Exception {
130+
Object[] arguments = { "1", 2 };
131+
132+
Object[] params = (Object[]) ReflectionUtil.parseArguments(
133+
JsonRpcTestService.class.getMethod("fixedParamsPassParamsArray", String.class, int.class), arguments);
134+
135+
assertEquals(4, params.length);
136+
assertEquals("value1", params[0]);
137+
assertEquals("value2", params[1]);
138+
assertEquals("1", params[2]);
139+
assertEquals(2, params[3]);
140+
}
85141

86142
@Test
87143
public void allNamedParamsPassParamsArray() throws Exception {
@@ -106,6 +162,35 @@ public void someNamedParamsPassParamsObject() throws Exception {
106162

107163
ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("someNamedParamsPassParamsObject", String.class, int.class), null);
108164
}
165+
166+
@Test
167+
public void fixedParamPassParamsObject() throws Exception {
168+
Object[] arguments = { "1", 2 };
169+
170+
@SuppressWarnings("unchecked")
171+
Map<String, Object> params = (Map<String, Object>) ReflectionUtil.parseArguments(
172+
JsonRpcTestService.class.getMethod("fixedParamPassParamsObject", String.class, int.class), arguments);
173+
174+
assertEquals(3, params.size());
175+
assertEquals("1", params.get("one"));
176+
assertEquals(2, params.get("two"));
177+
assertEquals("value1", params.get("param1"));
178+
}
179+
180+
@Test
181+
public void fixedParamsPassParamsObject() throws Exception {
182+
Object[] arguments = { "1", 2 };
183+
184+
@SuppressWarnings("unchecked")
185+
Map<String, Object> params = (Map<String, Object>) ReflectionUtil.parseArguments(
186+
JsonRpcTestService.class.getMethod("fixedParamsPassParamsObject", String.class, int.class), arguments);
187+
188+
assertEquals(4, params.size());
189+
assertEquals("1", params.get("one"));
190+
assertEquals(2, params.get("two"));
191+
assertEquals("value1", params.get("param1"));
192+
assertEquals("value2", params.get("param2"));
193+
}
109194

110195
@Test
111196
public void allNamedParamsPassParamsObject() throws Exception {
@@ -143,6 +228,15 @@ private interface JsonRpcTestService {
143228
@JsonRpcMethod(value = "someNamedParamsPassParamsAuto", paramsPassMode = JsonRpcParamsPassMode.AUTO)
144229
void someNamedParamsPassParamsAuto(@JsonRpcParam("one") String one, int two);
145230

231+
@JsonRpcMethod(value = "fixedParamPassParamsAuto", paramsPassMode = JsonRpcParamsPassMode.AUTO)
232+
@JsonRpcFixedParam(name = "param1", value = "value1")
233+
void fixedParamPassParamsAuto(@JsonRpcParam("one") String one, @JsonRpcParam("two") int two);
234+
235+
@JsonRpcMethod(value = "fixedParamsPassParamsAuto", paramsPassMode = JsonRpcParamsPassMode.AUTO)
236+
@JsonRpcFixedParams(fixedParams = { @JsonRpcFixedParam(name = "param1", value = "value1"),
237+
@JsonRpcFixedParam(name = "param2", value = "value2") })
238+
void fixedParamsPassParamsAuto(@JsonRpcParam("one") String one, @JsonRpcParam("two") int two);
239+
146240
@JsonRpcMethod(value = "allNamedParamsPassParamsAuto", paramsPassMode = JsonRpcParamsPassMode.AUTO)
147241
void allNamedParamsPassParamsAuto(@JsonRpcParam("one") String one, @JsonRpcParam("two") int two);
148242

@@ -152,6 +246,15 @@ private interface JsonRpcTestService {
152246
@JsonRpcMethod(value = "someNamedParamsPassParamsArray", paramsPassMode = JsonRpcParamsPassMode.ARRAY)
153247
void someNamedParamsPassParamsArray(@JsonRpcParam("one") String one, int two);
154248

249+
@JsonRpcMethod(value = "fixedParamPassParamsArray", paramsPassMode = JsonRpcParamsPassMode.ARRAY)
250+
@JsonRpcFixedParam(name = "param1", value = "value1")
251+
void fixedParamPassParamsArray(@JsonRpcParam("one") String one, @JsonRpcParam("two") int two);
252+
253+
@JsonRpcMethod(value = "fixedParamsPassParamsArray", paramsPassMode = JsonRpcParamsPassMode.ARRAY)
254+
@JsonRpcFixedParams(fixedParams = { @JsonRpcFixedParam(name = "param1", value = "value1"),
255+
@JsonRpcFixedParam(name = "param2", value = "value2") })
256+
void fixedParamsPassParamsArray(@JsonRpcParam("one") String one, @JsonRpcParam("two") int two);
257+
155258
@JsonRpcMethod(value = "allNamedParamsPassParamsArray", paramsPassMode = JsonRpcParamsPassMode.ARRAY)
156259
void allNamedParamsPassParamsArray(@JsonRpcParam("one") String one, @JsonRpcParam("two") int two);
157260

@@ -161,6 +264,15 @@ private interface JsonRpcTestService {
161264
@JsonRpcMethod(value = "someNamedParamsPassParamsObject", paramsPassMode = JsonRpcParamsPassMode.OBJECT)
162265
void someNamedParamsPassParamsObject(@JsonRpcParam("one") String one, int two);
163266

267+
@JsonRpcMethod(value = "fixedParamPassParamsObject", paramsPassMode = JsonRpcParamsPassMode.OBJECT)
268+
@JsonRpcFixedParam(name = "param1", value = "value1")
269+
void fixedParamPassParamsObject(@JsonRpcParam("one") String one, @JsonRpcParam("two") int two);
270+
271+
@JsonRpcMethod(value = "fixedParamsPassParamsObject", paramsPassMode = JsonRpcParamsPassMode.OBJECT)
272+
@JsonRpcFixedParams(fixedParams = { @JsonRpcFixedParam(name = "param1", value = "value1"),
273+
@JsonRpcFixedParam(name = "param2", value = "value2") })
274+
void fixedParamsPassParamsObject(@JsonRpcParam("one") String one, @JsonRpcParam("two") int two);
275+
164276
@JsonRpcMethod(value = "allNamedParamsPassParamsObject", paramsPassMode = JsonRpcParamsPassMode.OBJECT)
165277
void allNamedParamsPassParamsObject(@JsonRpcParam("one") String one, @JsonRpcParam("two") int two);
166278

0 commit comments

Comments
 (0)