Skip to content
This repository was archived by the owner on May 28, 2018. It is now read-only.

Commit e570863

Browse files
sfuhrmstepanv
authored andcommitted
JERSEY-2928: Added support for @BeanParam beans.
Handling includes bean setter methods with @QueryParam annotations and fields with @QueryParam annotations. Fixed one Checkstyle violation Satisfy the copyright.year.wrong check Change-Id: I82d5e76495d86e98506f0825c3cfcab496d18d3b
1 parent 7d50c86 commit e570863

File tree

2 files changed

+100
-12
lines changed

2 files changed

+100
-12
lines changed

incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/InjectLinkFieldDescriptor.java

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
33
*
4-
* Copyright (c) 2010-2014 Oracle and/or its affiliates. All rights reserved.
4+
* Copyright (c) 2010-2015 Oracle and/or its affiliates. All rights reserved.
55
*
66
* The contents of this file are subject to the terms of either the GNU
77
* General Public License Version 2 only ("GPL") or the Common Development
@@ -42,6 +42,7 @@
4242

4343
import java.lang.annotation.Annotation;
4444
import java.lang.reflect.Field;
45+
import java.lang.reflect.Method;
4546
import java.net.URI;
4647
import java.util.HashMap;
4748
import java.util.Iterator;
@@ -52,6 +53,7 @@
5253
import javax.ws.rs.HttpMethod;
5354
import javax.ws.rs.Path;
5455
import javax.ws.rs.QueryParam;
56+
import javax.ws.rs.BeanParam;
5557
import javax.ws.rs.core.Link;
5658

5759
import org.glassfish.jersey.linking.mapping.ResourceMappingContext;
@@ -165,20 +167,11 @@ public static String getLinkTemplate(ResourceMappingContext rmc, InjectLink link
165167
builder.append(methodTemplate);
166168
}
167169

168-
// append query parameters
169-
StringBuilder querySubString = new StringBuilder();
170-
for (Annotation paramAnns[] : method.getParameterAnnotations()) {
171-
for (Annotation ann : paramAnns) {
172-
if (ann.annotationType() == QueryParam.class) {
173-
querySubString.append(((QueryParam) ann).value());
174-
querySubString.append(',');
175-
}
176-
}
177-
}
170+
CharSequence querySubString = extractQueryParams(method);
178171

179172
if (querySubString.length() > 0) {
180173
builder.append("{?");
181-
builder.append(querySubString.subSequence(0, querySubString.length() - 1));
174+
builder.append(querySubString);
182175
builder.append("}");
183176
}
184177

@@ -193,6 +186,47 @@ public static String getLinkTemplate(ResourceMappingContext rmc, InjectLink link
193186
return template;
194187
}
195188

189+
private static CharSequence extractQueryParams(AnnotatedMethod method) throws SecurityException {
190+
// append query parameters
191+
StringBuilder querySubString = new StringBuilder();
192+
int parameterIndex = 0;
193+
for (Annotation paramAnns[] : method.getParameterAnnotations()) {
194+
for (Annotation ann : paramAnns) {
195+
if (ann.annotationType() == QueryParam.class) {
196+
querySubString.append(((QueryParam) ann).value());
197+
querySubString.append(',');
198+
}
199+
if (ann.annotationType() == BeanParam.class) {
200+
Class<?> beanParamType = method.getParameterTypes()[parameterIndex];
201+
Field fields[] = beanParamType.getFields();
202+
for (Field field : fields) {
203+
QueryParam queryParam = field.getAnnotation(QueryParam.class);
204+
if (queryParam != null) {
205+
querySubString.append(queryParam.value());
206+
querySubString.append(',');
207+
}
208+
}
209+
Method beanMethods[] = beanParamType.getMethods();
210+
for (Method beanMethod : beanMethods) {
211+
QueryParam queryParam = beanMethod.getAnnotation(QueryParam.class);
212+
if (queryParam != null) {
213+
querySubString.append(queryParam.value());
214+
querySubString.append(',');
215+
}
216+
}
217+
}
218+
}
219+
parameterIndex++;
220+
}
221+
222+
CharSequence result = "";
223+
224+
if (querySubString.length() > 0) {
225+
result = querySubString.subSequence(0, querySubString.length() - 1);
226+
}
227+
return result;
228+
}
229+
196230
/**
197231
* TODO javadoc.
198232
*/

incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/FieldProcessorTest.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import java.util.logging.Logger;
5151
import java.util.regex.MatchResult;
5252
import java.util.zip.ZipEntry;
53+
import javax.ws.rs.BeanParam;
5354

5455
import javax.ws.rs.GET;
5556
import javax.ws.rs.Path;
@@ -688,6 +689,59 @@ public void testQueryResourceWithoutBindings() {
688689
mockUriInfo.getQueryParameters().clear();
689690
}
690691

692+
/** Bean param with method setter QueryParam. */
693+
public static class BeanParamBeanA {
694+
private String qparam;
695+
@QueryParam("qparam")
696+
public void setQParam(String qparam) {
697+
this.qparam = qparam;
698+
}
699+
}
700+
701+
/** Bean param with field QueryParam. */
702+
public static class BeanParamBeanB {
703+
@QueryParam("query") public String query;
704+
}
705+
706+
@Path("a")
707+
public static class BeanParamQueryResource {
708+
709+
@Path("b")
710+
@GET
711+
public String getB(@BeanParam BeanParamBeanA beanParamBeanA, @BeanParam BeanParamBeanB beanParamBeanB) {
712+
return "hello world";
713+
}
714+
}
715+
716+
public static class BeanParamResourceBean {
717+
718+
public String getQueryParam() {
719+
return queryExample;
720+
}
721+
722+
private String queryExample;
723+
724+
public BeanParamResourceBean(String queryExample) {
725+
this.queryExample = queryExample;
726+
}
727+
728+
@InjectLink(resource = BeanParamQueryResource.class, method = "getB",
729+
bindings = {
730+
@Binding(name = "query", value = "${instance.queryParam}"),
731+
@Binding(name = "qparam", value = "foo")
732+
})
733+
public String uri;
734+
}
735+
736+
@Test
737+
public void testBeanParamResource() {
738+
LOG.info("BeanParamResource");
739+
FieldProcessor<BeanParamResourceBean> instance = new FieldProcessor(BeanParamResourceBean.class);
740+
BeanParamResourceBean testClass = new BeanParamResourceBean("queryExample");
741+
instance.processLinks(testClass, mockUriInfo, mockRmc);
742+
assertEquals("/application/resources/a/b?qparam=foo&query=queryExample", testClass.uri);
743+
}
744+
691745
public static class TestClassK {
692746

693747
public static final ZipEntry zipEntry = new ZipEntry("entry");

0 commit comments

Comments
 (0)