/**
* Copyright (C) 2012 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.portal.gadget.server;
import java.io.IOException;
import java.net.URL;
import java.util.Map;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.shindig.common.PropertiesModule;
import org.apache.shindig.common.cache.ehcache.EhCacheModule;
import org.apache.shindig.gadgets.DefaultGuiceModule;
import org.apache.shindig.gadgets.servlet.AuthenticationModule;
import org.apache.shindig.gadgets.servlet.ConcatProxyServlet;
import org.apache.shindig.gadgets.servlet.GadgetRenderingServlet;
import org.apache.shindig.gadgets.servlet.JsServlet;
import org.apache.shindig.gadgets.servlet.MakeRequestServlet;
import org.exoplatform.portal.gadget.core.ExoModule;
import org.exoplatform.portal.gadget.core.ExoOAuthModule;
import org.exoplatform.portal.gadget.core.GateInGuiceServletContextListener;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.ResourceHandler;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
import org.mortbay.resource.Resource;
import com.google.common.base.Joiner;
import com.google.common.collect.Maps;
/**
* Suite for running the end-to-end tests. The suite is responsible for starting up and shutting down the server.
*
* @author <a href="kienna@exoplatform.com">Kien Nguyen</a>
* @version $Revision$
*/
public class EndToEndServer {
private static final int JETTY_PORT = 9003;
private static final String GADGET_BASE = "/eXoGadgetServer/gadgets/ifr";
private static final String CONCAT_BASE = "/eXoGadgetServer/gadgets/concat";
private static final String JS_BASE = "/eXoGadgetServer/gadgets/js/*";
private static final String MAKE_REQUEST_BASE = "/eXoGadgetServer/gadgets/makeRequest";
public static final String SERVER_URL = "http://localhost:" + JETTY_PORT;
public static final String GADGET_BASEURL = SERVER_URL + GADGET_BASE;
private final Server server;
/** Fake error code for data service servlet request */
protected int errorCode;
/** Fake error message for data service servlet request */
protected String errorMessage;
public EndToEndServer() throws Exception {
server = createServer(JETTY_PORT);
}
public void start() throws Exception {
server.start();
}
public void stop() throws Exception {
server.stop();
}
public void clearDataServiceError() {
errorCode = 0;
}
public void setDataServiceError(int errorCode, String errorMessage) {
this.errorCode = errorCode;
this.errorMessage = errorMessage;
}
/**
* Create the server for end-to-end tests.
*/
private Server createServer(int port) throws Exception {
System.setProperty("shindig.port", String.valueOf(port));
System.setProperty("jetty.port", String.valueOf(port));
System.setProperty("gatein.gadgets.securitytokenkeyfile", "src/test/resources/conf/gadgets/key.txt");
Server newServer = new Server(port);
// Attach the test resources in /endtoend as static content for the test
ResourceHandler resources = new ResourceHandler();
URL resource = EndToEndTest.class.getResource("/endtoend");
resources.setBaseResource(Resource.newResource(resource));
newServer.addHandler(resources);
Context context = new Context(newServer, "/", Context.SESSIONS);
context.addEventListener(new GateInGuiceServletContextListener());
Map<String, String> initParams = Maps.newHashMap();
String modules = Joiner.on(":").join(ExoModule.class.getName(), ExoOAuthModule.class.getName(),
DefaultGuiceModule.class.getName(), AuthenticationModule.class.getName(), PropertiesModule.class.getName(),
EhCacheModule.class.getName());
initParams.put(GateInGuiceServletContextListener.MODULES_ATTRIBUTE, modules);
context.setInitParams(initParams);
// Attach the gadget rendering servlet
ServletHolder gadgetServletHolder = new ServletHolder(new GadgetRenderingServlet());
context.addServlet(gadgetServletHolder, GADGET_BASE);
// Attach the ConcatProxyServlet - needed for rewritten JS
ServletHolder concatHolder = new ServletHolder(new ConcatProxyServlet());
context.addServlet(concatHolder, CONCAT_BASE);
// Attach the JsServlet - needed for rewritten JS
ServletHolder jsHolder = new ServletHolder(new JsServlet());
context.addServlet(jsHolder, JS_BASE);
// Attach MakeRequestServlet
ServletHolder makeRequestHolder = new ServletHolder(new MakeRequestServlet());
context.addServlet(makeRequestHolder, MAKE_REQUEST_BASE);
// Attach an EchoServlet, used to test proxied rendering
ServletHolder echoHolder = new ServletHolder(new EchoServlet());
context.addServlet(echoHolder, "/echo");
return newServer;
}
static private class EchoServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType(req.getContentType());
IOUtils.copy(req.getReader(), resp.getWriter());
}
}
}