View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements. See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership. The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License. You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied. See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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              // nope
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 }