3232package io .grpc ;
3333
3434import com .google .common .base .Preconditions ;
35- import com .google .common .collect .ImmutableList ;
3635
3736import io .grpc .ForwardingServerCall .SimpleForwardingServerCall ;
3837import io .grpc .ForwardingServerCallListener .SimpleForwardingServerCallListener ;
3938
4039import java .util .Arrays ;
41- import java .util .Iterator ;
4240import java .util .List ;
4341
4442/**
@@ -50,7 +48,8 @@ private ServerInterceptors() {}
5048
5149 /**
5250 * Create a new {@code ServerServiceDefinition} whose {@link ServerCallHandler}s will call
53- * {@code interceptors} before calling the pre-existing {@code ServerCallHandler}.
51+ * {@code interceptors} before calling the pre-existing {@code ServerCallHandler}. The last
52+ * interceptor will have its {@link ServerInterceptor#interceptCall} called first.
5453 *
5554 * @param serviceDef the service definition for which to intercept all its methods.
5655 * @param interceptors array of interceptors to apply to the service.
@@ -63,7 +62,8 @@ public static ServerServiceDefinition intercept(ServerServiceDefinition serviceD
6362
6463 /**
6564 * Create a new {@code ServerServiceDefinition} whose {@link ServerCallHandler}s will call
66- * {@code interceptors} before calling the pre-existing {@code ServerCallHandler}.
65+ * {@code interceptors} before calling the pre-existing {@code ServerCallHandler}. The last
66+ * interceptor will have its {@link ServerInterceptor#interceptCall} called first.
6767 *
6868 * @param serviceDef the service definition for which to intercept all its methods.
6969 * @param interceptors list of interceptors to apply to the service.
@@ -72,77 +72,46 @@ public static ServerServiceDefinition intercept(ServerServiceDefinition serviceD
7272 public static ServerServiceDefinition intercept (ServerServiceDefinition serviceDef ,
7373 List <ServerInterceptor > interceptors ) {
7474 Preconditions .checkNotNull (serviceDef );
75- List <ServerInterceptor > immutableInterceptors = ImmutableList .copyOf (interceptors );
76- if (immutableInterceptors .isEmpty ()) {
75+ if (interceptors .isEmpty ()) {
7776 return serviceDef ;
7877 }
7978 ServerServiceDefinition .Builder serviceDefBuilder
8079 = ServerServiceDefinition .builder (serviceDef .getName ());
8180 for (ServerMethodDefinition <?, ?> method : serviceDef .getMethods ()) {
82- wrapAndAddMethod (serviceDefBuilder , method , immutableInterceptors );
81+ wrapAndAddMethod (serviceDefBuilder , method , interceptors );
8382 }
8483 return serviceDefBuilder .build ();
8584 }
8685
8786 private static <ReqT , RespT > void wrapAndAddMethod (
8887 ServerServiceDefinition .Builder serviceDefBuilder , ServerMethodDefinition <ReqT , RespT > method ,
8988 List <ServerInterceptor > interceptors ) {
90- ServerCallHandler <ReqT , RespT > callHandler
91- = InterceptCallHandler .create (interceptors , method .getServerCallHandler ());
89+ ServerCallHandler <ReqT , RespT > callHandler = method .getServerCallHandler ();
90+ for (ServerInterceptor interceptor : interceptors ) {
91+ callHandler = InterceptCallHandler .create (interceptor , callHandler );
92+ }
9293 serviceDefBuilder .addMethod (method .withServerCallHandler (callHandler ));
9394 }
9495
9596 private static class InterceptCallHandler <ReqT , RespT > implements ServerCallHandler <ReqT , RespT > {
9697 public static <ReqT , RespT > InterceptCallHandler <ReqT , RespT > create (
97- List <ServerInterceptor > interceptors , ServerCallHandler <ReqT , RespT > callHandler ) {
98- return new InterceptCallHandler <ReqT , RespT >(interceptors , callHandler );
99- }
100-
101- private final List <ServerInterceptor > interceptors ;
102- private final ServerCallHandler <ReqT , RespT > callHandler ;
103-
104- private InterceptCallHandler (List <ServerInterceptor > interceptors ,
105- ServerCallHandler <ReqT , RespT > callHandler ) {
106- this .interceptors = interceptors ;
107- this .callHandler = callHandler ;
108- }
109-
110- @ Override
111- public ServerCall .Listener <ReqT > startCall (String method , ServerCall <RespT > call ,
112- Metadata .Headers headers ) {
113- return ProcessInterceptorsCallHandler .create (interceptors .iterator (), callHandler )
114- .startCall (method , call , headers );
115- }
116- }
117-
118- private static class ProcessInterceptorsCallHandler <ReqT , RespT >
119- implements ServerCallHandler <ReqT , RespT > {
120- public static <ReqT , RespT > ProcessInterceptorsCallHandler <ReqT , RespT > create (
121- Iterator <ServerInterceptor > interceptors , ServerCallHandler <ReqT , RespT > callHandler ) {
122- return new ProcessInterceptorsCallHandler <ReqT , RespT >(interceptors , callHandler );
98+ ServerInterceptor interceptor , ServerCallHandler <ReqT , RespT > callHandler ) {
99+ return new InterceptCallHandler <ReqT , RespT >(interceptor , callHandler );
123100 }
124101
125- private Iterator < ServerInterceptor > interceptors ;
102+ private final ServerInterceptor interceptor ;
126103 private final ServerCallHandler <ReqT , RespT > callHandler ;
127104
128- private ProcessInterceptorsCallHandler ( Iterator < ServerInterceptor > interceptors ,
105+ private InterceptCallHandler ( ServerInterceptor interceptor ,
129106 ServerCallHandler <ReqT , RespT > callHandler ) {
130- this .interceptors = interceptors ;
107+ this .interceptor = Preconditions . checkNotNull ( interceptor , "interceptor" ) ;
131108 this .callHandler = callHandler ;
132109 }
133110
134111 @ Override
135112 public ServerCall .Listener <ReqT > startCall (String method , ServerCall <RespT > call ,
136113 Metadata .Headers headers ) {
137- if (interceptors != null && interceptors .hasNext ()) {
138- return interceptors .next ().interceptCall (method , call , headers , this );
139- } else {
140- Preconditions .checkState (interceptors != null ,
141- "The call handler has already been called. "
142- + "Some interceptor must have called on \" next\" twice." );
143- interceptors = null ;
144- return callHandler .startCall (method , call , headers );
145- }
114+ return interceptor .interceptCall (method , call , headers , callHandler );
146115 }
147116 }
148117
0 commit comments