The import order here is still all wrong. On Wed, Oct 8, 2008 at 4:36 PM, <[EMAIL PROTECTED]> wrote:
> Author: johnh > Date: Wed Oct 8 16:36:02 2008 > New Revision: 703022 > > URL: http://svn.apache.org/viewvc?rev=703022&view=rev > Log: > Adding support for JSONP calling of /gadgets/metadata. This closes issue > SHINDIG-624. > > Many thanks to Michael Hermanto for the patch! > > > Added: > > > incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/RpcServletTest.java > Modified: > > > incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/RpcServlet.java > > Modified: > incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/RpcServlet.java > URL: > http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/RpcServlet.java?rev=703022&r1=703021&r2=703022&view=diff > > ============================================================================== > --- > incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/RpcServlet.java > (original) > +++ > incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/RpcServlet.java > Wed Oct 8 16:36:02 2008 > @@ -18,48 +18,77 @@ > */ > package org.apache.shindig.gadgets.servlet; > > -import org.apache.shindig.common.servlet.InjectedServlet; > - > import com.google.inject.Inject; > - > import org.apache.commons.io.IOUtils; > +import org.apache.shindig.common.servlet.InjectedServlet; > import org.json.JSONException; > import org.json.JSONObject; > > +import javax.servlet.ServletInputStream; > +import javax.servlet.http.HttpServletRequest; > +import javax.servlet.http.HttpServletResponse; > import java.io.IOException; > import java.io.UnsupportedEncodingException; > import java.util.logging.Level; > import java.util.logging.Logger; > - > -import javax.servlet.ServletInputStream; > -import javax.servlet.http.HttpServletRequest; > -import javax.servlet.http.HttpServletResponse; > +import java.util.regex.Pattern; > > /** > * Handles RPC metadata requests. > */ > public class RpcServlet extends InjectedServlet { > - private static final int MAX_REQUEST_SIZE = 1024 * 128; > - private static final Logger logger > - = Logger.getLogger("org.apache.shindig.gadgets"); > + static final String GET_REQUEST_REQ_PARAM = "req"; > + static final String GET_REQUEST_CALLBACK_PARAM = "callback"; > + static final Pattern GET_REQUEST_CALLBACK_PATTERN = > Pattern.compile("[A-Za-z_\\.]+"); > + > + private static final int POST_REQUEST_MAX_SIZE = 1024 * 128; > + private static final Logger logger = > Logger.getLogger("org.apache.shindig.gadgets"); > > private JsonRpcHandler jsonHandler; > + > @Inject > public void setJsonRpcHandler(JsonRpcHandler jsonHandler) { > this.jsonHandler = jsonHandler; > } > > + @Override > + protected void doGet(HttpServletRequest request, HttpServletResponse > response) > + throws IOException { > + String reqValue; > + String callbackValue; > + > + try { > + reqValue = validateParameterValue(request, GET_REQUEST_REQ_PARAM); > + callbackValue = validateParameterValue(request, > GET_REQUEST_CALLBACK_PARAM); > + if (!GET_REQUEST_CALLBACK_PATTERN.matcher(callbackValue).matches()) > { > + throw new IllegalArgumentException("Wrong format for parameter '" > + > + GET_REQUEST_CALLBACK_PARAM + "' specified. Expected: " + > + GET_REQUEST_CALLBACK_PATTERN.toString()); > + } > + > + } catch (IllegalArgumentException e) { > + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); > + logger.log(Level.INFO, e.getMessage(), e); > + return; > + } > + > + Result result = process(request, response, reqValue.getBytes()); > + response.getWriter().write(result.isSuccess() > + ? callbackValue + "(" + result.getOutput() + ")" > + : result.getOutput()); > + } > > @Override > - protected void doPost(HttpServletRequest request, > - HttpServletResponse response) throws IOException { > + protected void doPost(HttpServletRequest request, HttpServletResponse > response) > + throws IOException { > + > int length = request.getContentLength(); > if (length <= 0) { > logger.info("No Content-Length specified."); > response.setStatus(HttpServletResponse.SC_LENGTH_REQUIRED); > return; > } > - if (length > MAX_REQUEST_SIZE) { > + if (length > POST_REQUEST_MAX_SIZE) { > logger.info("Request size too large: " + length); > response.setStatus(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE); > return; > @@ -73,29 +102,66 @@ > return; > } > > + Result result = process(request, response, body); > + response.getWriter().write(result.getOutput()); > + } > + > + private String validateParameterValue(HttpServletRequest request, String > parameter) > + throws IllegalArgumentException { > + String result = request.getParameter(parameter); > + if (result == null) { > + throw new IllegalArgumentException("No parameter '" + parameter + "' > specified."); > + } > + return result; > + } > + > + private Result process(HttpServletRequest request, HttpServletResponse > response, byte[] body) { > try { > - String encoding = request.getCharacterEncoding(); > - if (encoding == null) { > - encoding = "UTF-8"; > - } > + String encoding = getRequestCharacterEncoding(request); > JSONObject req = new JSONObject(new String(body, encoding)); > - > JSONObject resp = jsonHandler.process(req); > response.setStatus(HttpServletResponse.SC_OK); > response.setContentType("application/json; charset=utf-8"); > response.setHeader("Content-Disposition", > "attachment;filename=rpc.txt"); > - response.getWriter().write(resp.toString()); > + return new Result(resp.toString(), true); > } catch (UnsupportedEncodingException e) { > response.setStatus(HttpServletResponse.SC_BAD_REQUEST); > - response.getWriter().write("Unsupported input character set"); > logger.log(Level.INFO, e.getMessage(), e); > + return new Result("Unsupported input character set", false); > } catch (JSONException e) { > response.setStatus(HttpServletResponse.SC_BAD_REQUEST); > - response.getWriter().write("Malformed JSON request."); > + return new Result("Malformed JSON request.", false); > } catch (RpcException e) { > response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); > - response.getWriter().write(e.getMessage()); > logger.log(Level.INFO, e.getMessage(), e); > + return new Result(e.getMessage(), false); > } > } > + > + private String getRequestCharacterEncoding(HttpServletRequest request) { > + String encoding = request.getCharacterEncoding(); > + if (encoding == null) { > + encoding = "UTF-8"; > + } > + return encoding; > + } > + > + private static class Result { > + private final String output; > + private final boolean success; > + > + public Result(String output, boolean success) { > + this.output = output; > + this.success = success; > + } > + > + public String getOutput() { > + return output; > + } > + > + public boolean isSuccess() { > + return success; > + } > + } > + > } > > Added: > incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/RpcServletTest.java > URL: > http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/RpcServletTest.java?rev=703022&view=auto > > ============================================================================== > --- > incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/RpcServletTest.java > (added) > +++ > incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/RpcServletTest.java > Wed Oct 8 16:36:02 2008 > @@ -0,0 +1,138 @@ > +/* > + * 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.shindig.gadgets.servlet; > + > +import junit.framework.TestCase; > +import static org.easymock.classextension.EasyMock.*; > +import org.json.JSONException; > +import org.json.JSONObject; > + > +import javax.servlet.http.HttpServletRequest; > +import javax.servlet.http.HttpServletResponse; > +import java.io.IOException; > +import java.io.PrintWriter; > + > +/** > + * Tests for RpcServlet. > + */ > +public class RpcServletTest extends TestCase { > + private RpcServlet servlet; > + private JsonRpcHandler handler; > + > + @Override > + public void setUp() throws Exception { > + super.setUp(); > + servlet = new RpcServlet(); > + handler = createMock(JsonRpcHandler.class); > + servlet.setJsonRpcHandler(handler); > + } > + > + public void testDoGetNormal() throws Exception { > + HttpServletRequest request = createGetRequest("{\"gadgets\":[]}", > + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._"); > + HttpServletResponse response = > createHttpResponse("Content-Disposition", > + "attachment;filename=rpc.txt", "application/json; charset=utf-8", > + > "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._({\"GADGETS\":[]})", > + HttpServletResponse.SC_OK); > + JSONObject handlerResponse = new JSONObject("{\"GADGETS\":[]}"); > + > expect(handler.process(isA(JSONObject.class))).andReturn(handlerResponse); > + replay(handler); > + servlet.doGet(request, response); > + verify(response); > + } > + > + public void testDoGetWithHandlerRpcException() throws Exception { > + HttpServletRequest request = createGetRequest("{\"gadgets\":[]}", > "function"); > + HttpServletResponse response = > createHttpResponse("rpcExceptionMessage", > + HttpServletResponse.SC_INTERNAL_SERVER_ERROR); > + expect(handler.process(isA(JSONObject.class))).andThrow( > + new RpcException("rpcExceptionMessage")); > + replay(handler); > + servlet.doGet(request, response); > + verify(response); > + } > + > + public void testDoGetWithHandlerJsonException() throws Exception { > + HttpServletRequest request = createGetRequest("{\"gadgets\":[]}", > "function"); > + HttpServletResponse response = createHttpResponse("Malformed JSON > request.", > + HttpServletResponse.SC_BAD_REQUEST); > + expect(handler.process(isA(JSONObject.class))).andThrow(new > JSONException("json")); > + replay(handler); > + servlet.doGet(request, response); > + verify(response); > + } > + > + public void testDoGetWithMissingReqParam() throws Exception { > + HttpServletRequest request = createGetRequest(null, "function"); > + HttpServletResponse response = createHttpResponse(null, > HttpServletResponse.SC_BAD_REQUEST); > + servlet.doGet(request, response); > + verify(response); > + } > + > + public void testDoGetWithMissingCallbackParam() throws Exception { > + HttpServletRequest request = createGetRequest("{\"gadgets\":[]}", > null); > + HttpServletResponse response = createHttpResponse(null, > HttpServletResponse.SC_BAD_REQUEST); > + servlet.doGet(request, response); > + verify(response); > + } > + > + public void testDoGetWithBadCallbackParamValue() throws Exception { > + HttpServletRequest request = createGetRequest("{\"gadgets\":[]}", > "/'!="); > + HttpServletResponse response = createHttpResponse(null, > HttpServletResponse.SC_BAD_REQUEST); > + servlet.doGet(request, response); > + verify(response); > + } > + > + private HttpServletRequest createGetRequest(String reqParamValue, String > callbackParamValue) { > + HttpServletRequest result = createMock(HttpServletRequest.class); > + expect(result.getMethod()).andReturn("GET").anyTimes(); > + expect(result.getCharacterEncoding()).andReturn("UTF-8").anyTimes(); > + expect(result.getParameter(RpcServlet.GET_REQUEST_REQ_PARAM)) > + .andReturn(reqParamValue).anyTimes(); > + expect(result.getParameter(RpcServlet.GET_REQUEST_CALLBACK_PARAM)) > + .andReturn(callbackParamValue).anyTimes(); > + replay(result); > + return result; > + } > + > + private HttpServletResponse createHttpResponse(String response, int > httpStatusCode) > + throws IOException { > + return createHttpResponse(null, null, null, response, httpStatusCode); > + } > + > + private HttpServletResponse createHttpResponse(String header1, String > header2, > + String contentType, String response, int httpStatusCode) throws > IOException { > + HttpServletResponse result = createMock(HttpServletResponse.class); > + PrintWriter writer = createMock(PrintWriter.class); > + if (response != null) { > + expect(result.getWriter()).andReturn(writer); > + writer.write(response); > + } > + if (header1 != null && header2 != null) { > + result.setHeader(header1, header2); > + } > + if (contentType != null) { > + result.setContentType(contentType); > + } > + result.setStatus(httpStatusCode); > + replay(result, writer); > + return result; > + } > + > +} > > >

