/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.ambari.view.storm;

import org.apache.ambari.view.ViewContext;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLDecoder;
import java.util.*;
import java.io.*;

/**
 * Simple servlet for proxying requests with doAs impersonation.
 */
public class ProxyServlet extends HttpServlet {

  private ViewContext viewContext;
  private static final String STORM_HOST = "storm.host";
  private static final String STORM_PORT = "storm.port";
  private static final String STORM_SSL_ENABLED = "storm.sslEnabled";
  private String stormURL;

  @Override
  public void init(ServletConfig config) throws ServletException {
    super.init(config);

    ServletContext context = config.getServletContext();
    viewContext = (ViewContext) context.getAttribute(ViewContext.CONTEXT_ATTRIBUTE);
    String sslEnabled = viewContext.getProperties().get(STORM_SSL_ENABLED);
    String hostname = viewContext.getProperties().get(STORM_HOST);
    String port = viewContext.getProperties().get(STORM_PORT);
    stormURL = (sslEnabled.equals("true") ? "https" : "http") + "://" + hostname + ":" + port;
  }

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    InputStream body = null;
    String urlToRead = stormURL + URLDecoder.decode(request.getParameter("url"));
    HashMap<String,String> headersMap = this.getHeaders(request);
    InputStream resultStream = viewContext.getURLStreamProvider().readAsCurrent(urlToRead, "GET", body, headersMap);
    this.setResponse(request, response, resultStream);
  }

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    InputStream stream = request.getInputStream();
    String urlToRead = stormURL + URLDecoder.decode(request.getParameter("url"));
    HashMap<String,String> headersMap = this.getHeaders(request);
    InputStream resultStream = viewContext.getURLStreamProvider().readAsCurrent(urlToRead, "POST", stream, headersMap);
    this.setResponse(request, response, resultStream);
  }

  /**
   * Get headers from request
   * @param  request HTTPServletRequest
   * @return HashMap map containing headers
   */
  public HashMap<String,String> getHeaders(HttpServletRequest request){
    Enumeration headerNames = request.getHeaderNames();
    HashMap<String,String> map = new HashMap<String, String>();
    while (headerNames.hasMoreElements()) {
      String key = (String) headerNames.nextElement();
      String value = request.getHeader(key);
      map.put(key, value);
    }
    map.put("Content-Type",request.getContentType());
    return map;
  }

  /**
   * Set response to the get/post request
   * @param request      HttpServletRequest
   * @param response     HttpServletResponse
   * @param resultStream InputStream
   */
  public void setResponse(HttpServletRequest request, HttpServletResponse response, InputStream resultStream) throws IOException{
    Scanner scanner = new Scanner(resultStream).useDelimiter("\\A");
    String result = scanner.hasNext() ? scanner.next() : "";
    Boolean notFound = result == "" || result.indexOf("\"exception\":\"NotFoundException\"") != -1;
    response.setContentType(request.getContentType());
    response.setStatus(notFound ? HttpServletResponse.SC_NOT_FOUND : HttpServletResponse.SC_OK);
    PrintWriter writer = response.getWriter();
    writer.print(result);
  }
}
