public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
      throws IOException, ServletException {

    HttpServletRequest httpRequest;
    HttpServletResponse httpResponse;

    try {
      httpRequest = (HttpServletRequest) request;
      httpResponse = (HttpServletResponse) response;

      IAmFilter filter = getAmFilterInstance(httpRequest);

      AmFilterResult result = filter.isAccessAllowed(httpRequest, httpResponse);

      switch (result.getStatus().getIntValue()) {
        case AmFilterResultStatus.INT_STATUS_CONTINUE:
          allowRequestToContinue(
              httpRequest, httpResponse,
              filterChain, result);
          break;

        case AmFilterResultStatus.INT_STATUS_FORBIDDEN:
          httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN);
          break;

        case AmFilterResultStatus.INT_STATUS_REDIRECT:
          httpResponse.sendRedirect(result.getRedirectURL());
          break;

        case AmFilterResultStatus.INT_STATUS_SERVE_DATA:
          sendData(httpResponse, result);
          break;

        case AmFilterResultStatus.INT_STATUS_SERVER_ERROR:
          httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
          break;

        case AmFilterResultStatus.INT_STATUS_UNAUTHORIZED:
          httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
          break;

        default:
          throw new AgentException(
              "Unknown filter result status: "
                  + result.getStatus()
                  + ":"
                  + result.getStatus().getIntValue());
      }
    } catch (Exception ex) {
      throw new ServletException("AmAgentFilter: An exception has occured", ex);
    }
  }
 public void allowRequestToContinue(
     HttpServletRequest request,
     HttpServletResponse response,
     FilterChain filterChain,
     AmFilterResult result)
     throws IOException, ServletException {
   IHttpServletRequestHelper helper = result.getRequestHelper();
   HttpServletRequest outgoingRequest = null;
   if (helper != null) {
     outgoingRequest = new AmAgentServletRequest(request, helper);
   } else {
     outgoingRequest = request;
   }
   boolean needProcessResponse = result.getProcessResponseFlag();
   if (needProcessResponse) {
     OpenSSOHttpServletResponse outgoingResponse =
         new OpenSSOHttpServletResponse((HttpServletResponse) response);
     filterChain.doFilter(outgoingRequest, outgoingResponse);
     processResponse(outgoingRequest, outgoingResponse);
   } else {
     filterChain.doFilter(outgoingRequest, response);
   }
 }
 protected void sendData(HttpServletResponse response, AmFilterResult result) throws IOException {
   PrintWriter out = null;
   try {
     response.setContentType("text/html");
     out = response.getWriter();
     String respContent = result.getDataToServe();
     boolean needProcessResponse = result.getProcessResponseFlag();
     if (needProcessResponse) {
       String processedRespContent =
           getWsResponseProcessor().process(result.getRequestURL(), respContent);
       out.print(processedRespContent);
     } else {
       out.print(respContent);
     }
     out.flush();
     out.close();
   } catch (IOException ex) {
     throw ex;
   } finally {
     if (out != null) {
       out.close();
     }
   }
 }