1   package com.atlassian.plugins.rest.common.expand.jersey;
2   
3   import com.atlassian.plugins.rest.common.expand.EntityCrawler;
4   import com.atlassian.plugins.rest.common.expand.parameter.DefaultExpandParameter;
5   import com.atlassian.plugins.rest.common.expand.parameter.ExpandParameter;
6   import com.atlassian.plugins.rest.common.expand.resolver.EntityExpanderResolver;
7   import com.google.common.base.Preconditions;
8   import com.sun.jersey.spi.container.ContainerRequest;
9   import com.sun.jersey.spi.container.ContainerResponse;
10  import com.sun.jersey.spi.container.ContainerResponseFilter;
11  
12  import javax.ws.rs.ext.Provider;
13  
14  /**
15   * <p>The response filter that handled entity expansion.</p>
16   * <p>By default it looks up the {@code expand} query parameter. If the parameter exists (and contains relevant information) the filter
17   * triggers the expansion of the current entity in the {@link ContainerResponse response}.</p>
18   */
19  @Provider
20  public class ExpandResponseFilter implements ContainerResponseFilter
21  {
22      private final String expandParameterName;
23      private final EntityExpanderResolver expanderResolver;
24  
25      public ExpandResponseFilter(EntityExpanderResolver expanderResolver)
26      {
27          this("expand", expanderResolver);
28      }
29  
30      public ExpandResponseFilter(String expandParameterName, EntityExpanderResolver expanderResolver)
31      {
32          this.expanderResolver = expanderResolver;
33          this.expandParameterName = Preconditions.checkNotNull(expandParameterName);
34      }
35  
36      public ContainerResponse filter(ContainerRequest request, ContainerResponse response)
37      {
38          final ExpandParameter expandParameter = new DefaultExpandParameter(request.getQueryParameters().get(expandParameterName));
39          new EntityCrawler().crawl(response.getEntity(), expandParameter, expanderResolver);
40          return response;
41      }
42  }