package org.swellrt.server.box.servlet; import java.io.IOException; import javax.inject.Inject; import javax.inject.Singleton; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.waveprotocol.box.server.authentication.SessionManager; import org.waveprotocol.box.server.persistence.mongodb.MongoDbProvider; import org.waveprotocol.box.server.waveserver.WaveletProvider; import org.waveprotocol.wave.util.logging.Log; import com.google.inject.Injector; /** * A Servlet providing SwellRT REST operations on /swell context * * * TODO: to use a "cool" REST framework * * * @author pablojan@gmail.com * */ @Singleton @SuppressWarnings("serial") public class SwellRtServlet extends HttpServlet { private static final Log LOG = Log.get(SwellRtServlet.class); public final static String SERVLET_CONTEXT = "/swell"; private final SessionManager sessionManager; // TODO pass dependencies to each Service by injection private MongoDbProvider mongoDbProvider; private WaveletProvider waveletProvider; private Injector injector; @Inject public SwellRtServlet(SessionManager sessionManager, MongoDbProvider mongoDbProvider, WaveletProvider waveletProvider, Injector injector) { this.sessionManager = sessionManager; this.mongoDbProvider = mongoDbProvider; this.waveletProvider = waveletProvider; this.injector = injector; } /** * Do some clean up in query string to remove URL session param. This is a * workaround for for the jetty's session URL rewriting. * * @param req HttpServletRequest the servlet request * @return the Path info without jetty's extra session parameter */ public static String getCleanPathInfo(HttpServletRequest req) { String path = req.getPathInfo(); if (path == null) return ""; int separatorIndex = path.indexOf(";"); if (separatorIndex >= 0) { return path.substring(0, separatorIndex); } return path; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws IOException { String[] pathTokens = getCleanPathInfo(req).split("/"); String entity = pathTokens[1]; if (entity.equals("model")) { injector.getInstance(QueryModelService.class).execute(req, response); } else if (entity.equals("account")) { injector.getInstance(AccountService.class).execute(req, response); } else if (entity.equals("auth")) { injector.getInstance(AuthenticationService.class).execute(req, response); } else if (entity.equals("object")) { injector.getInstance(ObjectApiService.class).execute(req, response); } else if (entity.equals("echo")) { injector.getInstance(EchoService.class).execute(req, response); } else { response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse response) throws IOException { String[] pathTokens = getCleanPathInfo(req).split("/"); String entity = pathTokens[1]; if (entity.equals("notification")) { injector.getInstance(NotificationService.class).execute(req, response); } else if (entity.equals("email")) { injector.getInstance(EmailService.class).execute(req, response); } else if (entity.equals("password")) { injector.getInstance(PasswordService.class).execute(req, response); } else if (entity.equals("account")) { injector.getInstance(AccountService.class).execute(req, response); } else if (entity.equals("auth")) { injector.getInstance(AuthenticationService.class).execute(req, response); } else if (entity.equals("invite")) { injector.getInstance(InviteService.class).execute(req, response); } else if (entity.equals("join")) { injector.getInstance(JoinMessageService.class).execute(req, response); } else if (entity.equals("object")) { injector.getInstance(ObjectApiService.class).execute(req, response); } else { response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } } @Override protected void doDelete(HttpServletRequest req, HttpServletResponse response) throws IOException { String[] pathTokens = getCleanPathInfo(req).split("/"); String entity = pathTokens[1]; if (entity.equals("auth")) { injector.getInstance(AuthenticationService.class).execute(req, response); } else { response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } } }