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
4242
4343import java .lang .annotation .Annotation ;
4444import java .lang .reflect .Field ;
45+ import java .lang .reflect .Method ;
4546import java .net .URI ;
4647import java .util .HashMap ;
4748import java .util .Iterator ;
5253import javax .ws .rs .HttpMethod ;
5354import javax .ws .rs .Path ;
5455import javax .ws .rs .QueryParam ;
56+ import javax .ws .rs .BeanParam ;
5557import javax .ws .rs .core .Link ;
5658
5759import 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 */
0 commit comments