1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.seasar.cubby.internal.controller;
18
19 import javax.servlet.http.HttpServletRequest;
20 import javax.servlet.http.HttpServletResponse;
21
22
23
24
25
26
27 public class ThreadContext {
28
29
30 private static final ThreadLocal<ThreadContext> THREAD_LOCAL = new ThreadLocal<ThreadContext>();
31
32 private static final ThreadLocal<ThreadContext> PREVIOUS = new ThreadLocal<ThreadContext>();
33
34
35 private final HttpServletRequest request;
36
37
38 private final HttpServletResponse response;
39
40
41
42
43
44
45
46
47
48 private ThreadContext(final HttpServletRequest request,
49 final HttpServletResponse response) {
50 this.request = request;
51 this.response = response;
52 }
53
54
55
56
57
58
59 public static ThreadContext getCurrentContext() {
60 final ThreadContext context = THREAD_LOCAL.get();
61 if (context == null) {
62 throw new IllegalStateException(
63 "Could not get context from ThreadLocal. run in context scope.");
64 }
65 return context;
66 }
67
68
69
70
71
72
73 public HttpServletRequest getRequest() {
74 return request;
75 }
76
77
78
79
80
81
82 public HttpServletResponse getResponse() {
83 return response;
84 }
85
86
87
88
89
90
91
92
93
94 public static void enter(final HttpServletRequest request,
95 final HttpServletResponse response) {
96 if (request == null) {
97 throw new NullPointerException("request");
98 }
99 if (response == null) {
100 throw new NullPointerException("response");
101 }
102
103 final ThreadContext previous = THREAD_LOCAL.get();
104 if (previous != null) {
105 PREVIOUS.set(previous);
106 }
107 final ThreadContext context = new ThreadContext(request, response);
108 THREAD_LOCAL.set(context);
109 }
110
111
112
113
114 public static void exit() {
115 final ThreadContext previous = PREVIOUS.get();
116 if (previous != null) {
117 THREAD_LOCAL.set(previous);
118 }
119 }
120
121
122
123
124 public static void remove() {
125 THREAD_LOCAL.remove();
126 }
127
128 }