| /* | |
| * 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.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 IOException { | |
| res.setContentType("application/javascript"); | |
| switch (Action.valueOf(req.getParameter("action"))) { | |
| case SUCCESS: { | |
| handleDelay(req); | |
| 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: { | |
| handleDelay(req); | |
| 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. | |
| } | |
| } | |
| /** | |
| * Handle a delay query parameter if present. | |
| * | |
| * @param req | |
| */ | |
| private void handleDelay(HttpServletRequest req) { | |
| String delayVal = req.getParameter("delay"); | |
| if (delayVal != null) { | |
| int delayMs = Integer.parseInt(delayVal); | |
| try { | |
| Thread.sleep(delayMs); | |
| } catch (InterruptedException e) { | |
| log("Interrupted sleep, continuing"); | |
| } | |
| } | |
| } | |
| } |