1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.cubby.internal.controller;
17
18 import java.util.Map;
19 import java.util.ResourceBundle;
20
21 import javax.servlet.http.HttpServletRequest;
22 import javax.servlet.http.HttpServletResponse;
23
24 import org.seasar.cubby.controller.MessagesBehaviour;
25 import org.seasar.cubby.spi.ContainerProvider;
26 import org.seasar.cubby.spi.ProviderFactory;
27 import org.seasar.cubby.spi.container.Container;
28
29
30
31
32
33
34
35 public class ThreadContext {
36
37
38 private static final ThreadLocal<ThreadContext> THREAD_LOCAL = new ThreadLocal<ThreadContext>();
39
40
41 private final HttpServletRequest request;
42
43
44 private final HttpServletResponse response;
45
46
47 private ResourceBundle messagesResourceBundle = null;
48
49
50 private Map<String, Object> messages = null;
51
52
53 private MessagesBehaviour messagesBehaviour;
54
55
56
57
58
59
60
61
62
63 private ThreadContext(final HttpServletRequest request,
64 final HttpServletResponse response) {
65 this.request = request;
66 this.response = response;
67 }
68
69
70
71
72
73
74 private static ThreadContext getContext() {
75 final ThreadContext context = THREAD_LOCAL.get();
76 if (context == null) {
77 throw new IllegalStateException(
78 "Could not get context from ThreadLocal. run in context scope.");
79 }
80 return context;
81 }
82
83
84
85
86
87
88 public static HttpServletRequest getRequest() {
89 return getContext().request;
90 }
91
92
93
94
95
96
97 public static HttpServletResponse getResponse() {
98 return getContext().response;
99 }
100
101
102
103
104
105
106 public static ResourceBundle getMessagesResourceBundle() {
107 final ThreadContext context = getContext();
108 if (context.messagesResourceBundle == null) {
109 final MessagesBehaviour messagesBehaviour = getMessagesBehaviour(context);
110 context.messagesResourceBundle = messagesBehaviour
111 .getBundle(context.request.getLocale());
112 }
113 return context.messagesResourceBundle;
114 }
115
116
117
118
119
120
121
122 public static Map<String, Object> getMessagesMap() {
123 final ThreadContext context = getContext();
124 if (context.messages == null) {
125 final ResourceBundle bundle = getMessagesResourceBundle();
126 final MessagesBehaviour messagesBehaviour = getMessagesBehaviour(context);
127 context.messages = messagesBehaviour.toMap(bundle);
128 }
129 return context.messages;
130 }
131
132
133
134
135
136
137
138
139 private static MessagesBehaviour getMessagesBehaviour(
140 final ThreadContext context) {
141 if (context.messagesBehaviour == null) {
142 final Container container = ProviderFactory.get(
143 ContainerProvider.class).getContainer();
144 context.messagesBehaviour = container
145 .lookup(MessagesBehaviour.class);
146 }
147 return context.messagesBehaviour;
148 }
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164 public static void runInContext(final HttpServletRequest request,
165 final HttpServletResponse response, final Command command)
166 throws Exception {
167 if (request == null) {
168 throw new NullPointerException("request");
169 }
170 if (response == null) {
171 throw new NullPointerException("response");
172 }
173 if (command == null) {
174 throw new NullPointerException("command");
175 }
176
177 final ThreadContext previous = THREAD_LOCAL.get();
178 final ThreadContext context = new ThreadContext(request, response);
179 THREAD_LOCAL.set(context);
180 try {
181 command.execute(request, response);
182 } finally {
183 if (previous == null) {
184 THREAD_LOCAL.remove();
185 } else {
186 THREAD_LOCAL.set(previous);
187 }
188 }
189 }
190
191
192
193
194
195
196
197
198 public interface Command {
199
200
201
202
203
204
205
206
207
208
209
210 void execute(HttpServletRequest request, HttpServletResponse response)
211 throws Exception;
212
213 }
214
215 }