1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.rest.cxf.batch;
20
21 import java.io.ByteArrayOutputStream;
22 import java.io.IOException;
23 import java.io.PrintWriter;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.HashMap;
27 import java.util.HashSet;
28 import java.util.List;
29 import java.util.Locale;
30 import java.util.Map;
31 import java.util.Set;
32 import java.util.stream.Collectors;
33 import javax.servlet.ServletOutputStream;
34 import javax.servlet.WriteListener;
35 import javax.servlet.http.Cookie;
36 import javax.servlet.http.HttpServletResponse;
37 import javax.ws.rs.core.HttpHeaders;
38
39 public class BatchItemResponse implements HttpServletResponse {
40
41 private final Set<Cookie> cookies = new HashSet<>();
42
43 private final Map<String, List<Object>> headers = new HashMap<>();
44
45 private final ByteArrayOutputStream baos = new ByteArrayOutputStream();
46
47 private final ServletOutputStream servletOuputStream = new ServletOutputStream() {
48
49 @Override
50 public boolean isReady() {
51 return true;
52 }
53
54 @Override
55 public void setWriteListener(final WriteListener writeListener) {
56
57 }
58
59 @Override
60 public void write(final int b) throws IOException {
61 baos.write(b);
62 }
63 };
64
65 private final PrintWriter writer = new PrintWriter(baos);
66
67 private int status;
68
69 private Locale locale;
70
71 public Set<Cookie> getCookies() {
72 return cookies;
73 }
74
75 public Map<String, List<Object>> getHeaders() {
76 return headers;
77 }
78
79 @Override
80 public void addCookie(final Cookie cookie) {
81 this.cookies.add(cookie);
82 }
83
84 @Override
85 public boolean containsHeader(final String name) {
86 return headers.containsKey(name);
87 }
88
89 @Override
90 public void setDateHeader(final String name, final long date) {
91 List<Object> values = headers.get(name);
92 if (values == null) {
93 values = new ArrayList<>();
94 headers.put(name, values);
95 } else {
96 values.clear();
97 }
98 values.add(date);
99 }
100
101 @Override
102 public void addDateHeader(final String name, final long date) {
103 List<Object> values = headers.get(name);
104 if (values == null) {
105 values = new ArrayList<>();
106 headers.put(name, values);
107 }
108 values.add(date);
109 }
110
111 @Override
112 public void setHeader(final String name, final String value) {
113 List<Object> values = headers.get(name);
114 if (values == null) {
115 values = new ArrayList<>();
116 headers.put(name, values);
117 } else {
118 values.clear();
119 }
120 values.add(value);
121 }
122
123 @Override
124 public void addHeader(final String name, final String value) {
125 List<Object> values = headers.get(name);
126 if (values == null) {
127 values = new ArrayList<>();
128 headers.put(name, values);
129 }
130 values.add(value);
131 }
132
133 @Override
134 public void setIntHeader(final String name, final int value) {
135 List<Object> values = headers.get(name);
136 if (values == null) {
137 values = new ArrayList<>();
138 headers.put(name, values);
139 } else {
140 values.clear();
141 }
142 values.add(value);
143 }
144
145 @Override
146 public void addIntHeader(final String name, final int value) {
147 List<Object> values = headers.get(name);
148 if (values == null) {
149 values = new ArrayList<>();
150 headers.put(name, values);
151 }
152 values.add(value);
153 }
154
155 @Override
156 public String getHeader(final String name) {
157 return headers.containsKey(name) ? headers.get(name).get(0).toString() : null;
158 }
159
160 @Override
161 public Collection<String> getHeaders(final String name) {
162 return headers.containsKey(name)
163 ? headers.get(name).stream().map(Object::toString).collect(Collectors.toList())
164 : List.of();
165 }
166
167 @Override
168 public Collection<String> getHeaderNames() {
169 return headers.keySet();
170 }
171
172 @Override
173 public String encodeURL(final String url) {
174 return url;
175 }
176
177 @Override
178 public String encodeRedirectURL(final String url) {
179 return url;
180 }
181
182 @Override
183 @SuppressWarnings("deprecation")
184 public String encodeUrl(final String url) {
185 return encodeURL(url);
186 }
187
188 @Override
189 @SuppressWarnings("deprecation")
190 public String encodeRedirectUrl(final String url) {
191 return encodeRedirectURL(url);
192 }
193
194 @Override
195 public void sendError(final int sc, final String msg) throws IOException {
196 setStatus(sc);
197 }
198
199 @Override
200 public void sendError(final int sc) throws IOException {
201 setStatus(sc);
202 }
203
204 @Override
205 public void sendRedirect(final String location) throws IOException {
206 setStatus(SC_MOVED_TEMPORARILY);
207 setHeader(HttpHeaders.LOCATION, location);
208 }
209
210 @Override
211 public void setStatus(final int sc) {
212 this.status = sc;
213 }
214
215 @Override
216 @SuppressWarnings("deprecation")
217 public void setStatus(final int sc, final String sm) {
218 setStatus(sc);
219 }
220
221 @Override
222 public int getStatus() {
223 return status;
224 }
225
226 @Override
227 public String getCharacterEncoding() {
228 throw new UnsupportedOperationException();
229 }
230
231 @Override
232 public String getContentType() {
233 throw new UnsupportedOperationException();
234 }
235
236 public ByteArrayOutputStream getUnderlyingOutputStream() {
237 return baos;
238 }
239
240 @Override
241 public ServletOutputStream getOutputStream() throws IOException {
242 return servletOuputStream;
243 }
244
245 @Override
246 public PrintWriter getWriter() throws IOException {
247 return writer;
248 }
249
250 @Override
251 public void setCharacterEncoding(final String charset) {
252 throw new UnsupportedOperationException();
253 }
254
255 @Override
256 public void setContentLength(final int len) {
257 setIntHeader(HttpHeaders.CONTENT_LENGTH, len);
258 }
259
260 @Override
261 public void setContentLengthLong(final long len) {
262 setContentLength((int) len);
263 }
264
265 @Override
266 public void setContentType(final String type) {
267 setHeader(HttpHeaders.CONTENT_TYPE, type);
268 }
269
270 @Override
271 public void setBufferSize(final int size) {
272 throw new UnsupportedOperationException();
273 }
274
275 @Override
276 public int getBufferSize() {
277 throw new UnsupportedOperationException();
278 }
279
280 @Override
281 public void flushBuffer() throws IOException {
282 throw new UnsupportedOperationException();
283 }
284
285 @Override
286 public void resetBuffer() {
287 throw new UnsupportedOperationException();
288 }
289
290 @Override
291 public boolean isCommitted() {
292 throw new UnsupportedOperationException();
293 }
294
295 @Override
296 public void reset() {
297 throw new UnsupportedOperationException();
298 }
299
300 @Override
301 public void setLocale(final Locale loc) {
302 this.locale = loc;
303 }
304
305 @Override
306 public Locale getLocale() {
307 return locale;
308 }
309 }