/*
 * Copyright 2009 Google Inc.
 * 
 * Licensed 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 com.google.gwt.jsonp.server;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * A servlet that returns a given value, following the JSONP protocol.
 * Expected url parameters:
 *
 * <ul>
 *   <li>action: one of the following values:
 *     <ul>
 *       <li>TIMEOUT: don't respond anything to simulate a timeout
 *       <li>SUCCESS: return a JSON value
 *       <li>FAILURE: return an error
 *     </ul>
 *   <li>value: the JSON value to return if action == "SUCCESS"
 *   <li>error: the error message to return if action == "FAILURE"
 * </ul>
 */
public class EchoServlet extends HttpServlet {

  private enum Action {
    SUCCESS,
    FAILURE,
    TIMEOUT
  }

  @Override
  protected void service(HttpServletRequest req, HttpServletResponse res)
      throws ServletException, IOException {
    switch (Action.valueOf(req.getParameter("action"))) {
      case SUCCESS: {
        String callback = req.getParameter("callback");
        String value = req.getParameter("value");
        if (value == null) {
          value = "";
        }
        res.getWriter().println(callback + "(" + value + ");");
        res.getWriter().flush();
        break;
      }

      case FAILURE: {
        String failureCallback = req.getParameter("failureCallback");
        String error = req.getParameter("error");
        if (failureCallback != null) {
          res.getWriter().println(failureCallback + "('" + error + "');");
          res.getWriter().flush();
        } else {
          // If no failure callback is defined, send the error through the
          // success callback.
          String callback = req.getParameter("callback");
          res.getWriter().println(callback + "('" + error + "');");
          res.getWriter().flush();
        }
        break;
      }

      case TIMEOUT:
        // Don't respond anything so that a timeout happens.
    }
  }
}
