View Javadoc
1   package com.atlassian.plugin.refimpl.filter;
2   
3   import com.atlassian.plugin.refimpl.ContainerManager;
4   import com.atlassian.plugin.refimpl.tenant.RefappTenancyCondition;
5   import com.atlassian.plugin.refimpl.tenant.RefappTenantRegistry;
6   
7   import javax.servlet.Filter;
8   import javax.servlet.FilterChain;
9   import javax.servlet.FilterConfig;
10  import javax.servlet.ServletContext;
11  import javax.servlet.ServletException;
12  import javax.servlet.ServletRequest;
13  import javax.servlet.ServletResponse;
14  import javax.servlet.http.HttpServletRequest;
15  import javax.servlet.http.HttpServletResponse;
16  import java.io.IOException;
17  
18  /**
19   * This filter will prevent access to the full application while it is still in a 'warm' untenanted state.
20   */
21  
22  public class RefAppTenantFilter implements Filter {
23      private ServletContext context;
24      private RefappTenantRegistry tenantRegistry;
25  
26      @Override
27      public void init(FilterConfig filterConfig) throws ServletException {
28          this.context = filterConfig.getServletContext();
29          this.tenantRegistry = (RefappTenantRegistry) context.getAttribute(ContainerManager.TENANTACCESSOR);
30      }
31  
32      /**
33       * Captures the current {@link javax.servlet.ServletRequest} using the {@link com.atlassian.plugin.refimpl.CurrentHttpRequest}
34       * class
35       */
36      @Override
37      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
38              throws IOException, ServletException {
39          if (RefappTenancyCondition.isEnabled()) {
40              HttpServletRequest req = (HttpServletRequest) servletRequest;
41              String path = req.getRequestURI();
42              if (isBaseRest(path) || tenantRegistry.hasTenant()) {
43                  filterChain.doFilter(servletRequest, servletResponse);
44              } else {
45                  ((HttpServletResponse) servletResponse).sendError(202, "Server unavailable. Waiting for tenant.");
46              }
47          } else {
48              filterChain.doFilter(servletRequest, servletResponse);
49          }
50      }
51  
52      @Override
53      public void destroy() {
54      }
55  
56      public boolean isBaseRest(String path) {
57          String contextpath = context.getContextPath();
58          return path.startsWith("/refapp/rest/landlord") ||
59                  path.startsWith("/refapp/plugins/servlet/landlord");
60      }
61  
62  }