1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.springframework.web.context.request.async;
17
18 import java.util.List;
19
20 import org.apache.commons.logging.Log;
21 import org.apache.commons.logging.LogFactory;
22
23 import org.springframework.web.context.request.NativeWebRequest;
24
25
26
27
28
29
30
31 class DeferredResultInterceptorChain {
32
33 private static final Log logger = LogFactory.getLog(DeferredResultInterceptorChain.class);
34
35 private final List<DeferredResultProcessingInterceptor> interceptors;
36
37 private int preProcessingIndex = -1;
38
39
40 public DeferredResultInterceptorChain(List<DeferredResultProcessingInterceptor> interceptors) {
41 this.interceptors = interceptors;
42 }
43
44 public void applyBeforeConcurrentHandling(NativeWebRequest request, DeferredResult<?> deferredResult) throws Exception {
45 for (DeferredResultProcessingInterceptor interceptor : this.interceptors) {
46 interceptor.beforeConcurrentHandling(request, deferredResult);
47 }
48 }
49
50 public void applyPreProcess(NativeWebRequest request, DeferredResult<?> deferredResult) throws Exception {
51 for (DeferredResultProcessingInterceptor interceptor : this.interceptors) {
52 interceptor.preProcess(request, deferredResult);
53 this.preProcessingIndex++;
54 }
55 }
56
57 public Object applyPostProcess(NativeWebRequest request, DeferredResult<?> deferredResult, Object concurrentResult) {
58 try {
59 for (int i = this.preProcessingIndex; i >= 0; i--) {
60 this.interceptors.get(i).postProcess(request, deferredResult, concurrentResult);
61 }
62 }
63 catch (Throwable t) {
64 return t;
65 }
66 return concurrentResult;
67 }
68
69 public void triggerAfterTimeout(NativeWebRequest request, DeferredResult<?> deferredResult) throws Exception {
70 for (DeferredResultProcessingInterceptor interceptor : this.interceptors) {
71 if (deferredResult.isSetOrExpired()) {
72 return;
73 }
74 if (!interceptor.handleTimeout(request, deferredResult)){
75 break;
76 }
77 }
78 }
79
80 public void triggerAfterCompletion(NativeWebRequest request, DeferredResult<?> deferredResult) {
81 for (int i = this.preProcessingIndex; i >= 0; i--) {
82 try {
83 this.interceptors.get(i).afterCompletion(request, deferredResult);
84 }
85 catch (Throwable t) {
86 logger.error("afterCompletion error", t);
87 }
88 }
89 }
90
91 }