View Javadoc

1   package com.atlassian.plugins.rest.module.json;
2   
3   import com.sun.jersey.spi.container.ContainerRequest;
4   import com.sun.jersey.spi.container.ContainerResponse;
5   import com.sun.jersey.spi.container.ContainerResponseFilter;
6   import org.apache.commons.lang.StringUtils;
7   import org.apache.commons.lang.Validate;
8   
9   import static javax.ws.rs.core.HttpHeaders.*;
10  
11  import javax.ws.rs.core.MediaType;
12  import javax.ws.rs.core.MultivaluedMap;
13  import javax.ws.rs.ext.Provider;
14  
15  @Provider
16  public class JsonWithPaddingResponseFilter implements ContainerResponseFilter {
17      public static final String ATLASSIAN_ALLOW_JSONP = "atlassian.allow.jsonp";
18  
19      private final String callbackFunctionParameterName;
20  
21      public JsonWithPaddingResponseFilter() {
22          this("jsonp-callback");
23      }
24  
25      public JsonWithPaddingResponseFilter(String callbackFunctionParameterName) {
26          Validate.notEmpty(callbackFunctionParameterName);
27          this.callbackFunctionParameterName = callbackFunctionParameterName;
28      }
29  
30      public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
31          if (isJsonWithPadding(request, response)) {
32              response.setContainerResponseWriter(new JsonWithPaddingResponseAdapter(getCallbackFunction(request), response.getContainerResponseWriter()));
33          }
34          return response;
35      }
36  
37      private boolean isJsonWithPadding(ContainerRequest request, ContainerResponse response) {
38          return isJsonResponse(response) && isCallbackRequest(request);
39      }
40  
41      private boolean isCallbackRequest(ContainerRequest request) {
42          return StringUtils.isNotBlank(getCallbackFunction(request));
43      }
44  
45      private String getCallbackFunction(ContainerRequest request) {
46          return request.getQueryParameters().getFirst(callbackFunctionParameterName);
47      }
48  
49      private boolean isJsonResponse(ContainerResponse response) {
50          final MultivaluedMap<String, Object> httpHeaders = response.getHttpHeaders();
51          return httpHeaders.containsKey(CONTENT_TYPE) && httpHeaders.getFirst(CONTENT_TYPE).equals(MediaType.APPLICATION_JSON_TYPE);
52      }
53  }