1515 */
1616package feign ;
1717
18- import com .google .common .base .Joiner ;
19- import com .google .common .collect .ImmutableList ;
20- import com .google .common .collect .ImmutableSet ;
21- import com .google .common .reflect .TypeToken ;
22-
2318import java .lang .annotation .Annotation ;
2419import java .lang .reflect .Method ;
2520import java .net .URI ;
21+ import java .util .ArrayList ;
22+ import java .util .Collection ;
23+ import java .util .LinkedHashSet ;
24+ import java .util .Set ;
2625
2726import javax .ws .rs .Consumes ;
2827import javax .ws .rs .FormParam ;
3332import javax .ws .rs .Produces ;
3433import javax .ws .rs .QueryParam ;
3534
36- import static com .google .common .base .Preconditions .checkState ;
37- import static com .google .common .net .HttpHeaders .ACCEPT ;
38- import static com .google .common .net .HttpHeaders .CONTENT_TYPE ;
35+ import static feign .Util .ACCEPT ;
36+ import static feign .Util .CONTENT_TYPE ;
37+ import static feign .Util .checkState ;
38+ import static feign .Util .join ;
3939
4040/**
4141 * Defines what annotations and values are valid on interfaces.
4242 */
4343public final class Contract {
4444
45- public static ImmutableSet <MethodMetadata > parseAndValidatateMetadata (Class <?> declaring ) {
46- ImmutableSet . Builder <MethodMetadata > builder = ImmutableSet . builder ();
45+ public static Set <MethodMetadata > parseAndValidatateMetadata (Class <?> declaring ) {
46+ Set <MethodMetadata > metadata = new LinkedHashSet < MethodMetadata > ();
4747 for (Method method : declaring .getDeclaredMethods ()) {
4848 if (method .getDeclaringClass () == Object .class )
4949 continue ;
50- builder .add (parseAndValidatateMetadata (method ));
50+ metadata .add (parseAndValidatateMetadata (method ));
5151 }
52- return builder . build () ;
52+ return metadata ;
5353 }
5454
5555 public static MethodMetadata parseAndValidatateMetadata (Method method ) {
5656 MethodMetadata data = new MethodMetadata ();
57- data .returnType (TypeToken . of ( method .getGenericReturnType () ));
57+ data .returnType (method .getGenericReturnType ());
5858 data .configKey (Feign .configKey (method ));
5959
6060 for (Annotation methodAnnotation : method .getAnnotations ()) {
@@ -75,9 +75,9 @@ public static MethodMetadata parseAndValidatateMetadata(Method method) {
7575 } else if (annotationType == Path .class ) {
7676 data .template ().append (Path .class .cast (methodAnnotation ).value ());
7777 } else if (annotationType == Produces .class ) {
78- data .template ().header (CONTENT_TYPE , Joiner . on (',' ). join ( ((Produces ) methodAnnotation ).value ()));
78+ data .template ().header (CONTENT_TYPE , join (',' , ((Produces ) methodAnnotation ).value ()));
7979 } else if (annotationType == Consumes .class ) {
80- data .template ().header (ACCEPT , Joiner . on (',' ). join ( ((Consumes ) methodAnnotation ).value ()));
80+ data .template ().header (ACCEPT , join (',' , ((Consumes ) methodAnnotation ).value ()));
8181 }
8282 }
8383 checkState (data .template ().method () != null , "Method %s not annotated with HTTP method type (ex. GET, POST)" ,
@@ -95,28 +95,24 @@ public static MethodMetadata parseAndValidatateMetadata(Method method) {
9595 for (Annotation parameterAnnotation : parameterAnnotations ) {
9696 Class <? extends Annotation > annotationType = parameterAnnotation .annotationType ();
9797 if (annotationType == PathParam .class ) {
98- data . indexToName (). put ( i , PathParam .class .cast (parameterAnnotation ).value ());
98+ indexName ( data , i , PathParam .class .cast (parameterAnnotation ).value ());
9999 hasHttpAnnotation = true ;
100100 } else if (annotationType == QueryParam .class ) {
101101 String name = QueryParam .class .cast (parameterAnnotation ).value ();
102- data .template ().query (
103- name ,
104- ImmutableList .<String >builder ().addAll (data .template ().queries ().get (name ))
105- .add (String .format ("{%s}" , name )).build ());
106- data .indexToName ().put (i , name );
102+ Collection <String > query = addTemplatedParam (data .template ().queries ().get (name ), name );
103+ data .template ().query (name , query );
104+ indexName (data , i , name );
107105 hasHttpAnnotation = true ;
108106 } else if (annotationType == HeaderParam .class ) {
109107 String name = HeaderParam .class .cast (parameterAnnotation ).value ();
110- data .template ().header (
111- name ,
112- ImmutableList .<String >builder ().addAll (data .template ().headers ().get (name ))
113- .add (String .format ("{%s}" , name )).build ());
114- data .indexToName ().put (i , name );
108+ Collection <String > header = addTemplatedParam (data .template ().headers ().get (name ), name );
109+ data .template ().header (name , header );
110+ indexName (data , i , name );
115111 hasHttpAnnotation = true ;
116112 } else if (annotationType == FormParam .class ) {
117113 String form = FormParam .class .cast (parameterAnnotation ).value ();
118114 data .formParams ().add (form );
119- data . indexToName (). put ( i , form );
115+ indexName ( data , i , form );
120116 hasHttpAnnotation = true ;
121117 }
122118 }
@@ -132,4 +128,17 @@ public static MethodMetadata parseAndValidatateMetadata(Method method) {
132128 }
133129 return data ;
134130 }
131+
132+ private static Collection <String > addTemplatedParam (Collection <String > possiblyNull , String name ) {
133+ if (possiblyNull == null )
134+ possiblyNull = new ArrayList <String >();
135+ possiblyNull .add (String .format ("{%s}" , name ));
136+ return possiblyNull ;
137+ }
138+
139+ private static void indexName (MethodMetadata data , int i , String name ) {
140+ Collection <String > names = data .indexToName ().containsKey (i ) ? data .indexToName ().get (i ) : new ArrayList <String >();
141+ names .add (name );
142+ data .indexToName ().put (i , names );
143+ }
135144}
0 commit comments