use a servlet instead of a restful resource

This commit is contained in:
Sebastian Sdorra
2011-08-07 16:35:51 +02:00
parent 8e4ff52207
commit b93230c8a1
3 changed files with 74 additions and 27 deletions

View File

@@ -109,7 +109,7 @@ public class HgHookManager
StringBuilder url = new StringBuilder(request.getScheme()); StringBuilder url = new StringBuilder(request.getScheme());
url.append("://localhost:").append(request.getServerPort()); url.append("://localhost:").append(request.getServerPort());
url.append(request.getContextPath()).append("/api/rest/hook/hg/"); url.append(request.getContextPath()).append("/hook/hg/");
if (hgHookScript == null) if (hgHookScript == null)
{ {

View File

@@ -31,11 +31,12 @@
package sonia.scm.api.rest.resources; package sonia.scm.web;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -45,26 +46,41 @@ import sonia.scm.repository.HgRepositoryHandler;
import sonia.scm.repository.HgRepositoryHookEvent; import sonia.scm.repository.HgRepositoryHookEvent;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
import sonia.scm.repository.RepositoryNotFoundException; import sonia.scm.repository.RepositoryNotFoundException;
import sonia.scm.util.HttpUtil;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import javax.ws.rs.FormParam; import java.io.IOException;
import javax.ws.rs.POST;
import javax.ws.rs.Path; import java.util.regex.Matcher;
import javax.ws.rs.PathParam; import java.util.regex.Pattern;
import javax.ws.rs.core.Response;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** /**
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
@Path("hook/hg/{repository}/{type}") @Singleton
public class HgHookCallback public class HgHookCallbackServlet extends HttpServlet
{ {
/** the logger for HgHookCallback */ /** Field description */
private static final String PARAM_CHALLENGE = "challenge";
/** Field description */
private static final String PARAM_NODE = "node";
/** Field description */
private static final Pattern REGEX_URL =
Pattern.compile("^/hook/hg/([^/]+)/([^/]+)$");
/** the logger for HgHookCallbackServlet */
private static final Logger logger = private static final Logger logger =
LoggerFactory.getLogger(HgHookCallback.class); LoggerFactory.getLogger(HgHookCallbackServlet.class);
//~--- constructors --------------------------------------------------------- //~--- constructors ---------------------------------------------------------
@@ -77,8 +93,9 @@ public class HgHookCallback
* @param hookManager * @param hookManager
*/ */
@Inject @Inject
public HgHookCallback(RepositoryManager repositoryManager, public HgHookCallbackServlet(RepositoryManager repositoryManager,
HgRepositoryHandler handler, HgHookManager hookManager) HgRepositoryHandler handler,
HgHookManager hookManager)
{ {
this.repositoryManager = repositoryManager; this.repositoryManager = repositoryManager;
this.handler = handler; this.handler = handler;
@@ -88,25 +105,21 @@ public class HgHookCallback
//~--- methods -------------------------------------------------------------- //~--- methods --------------------------------------------------------------
/** /**
* TODO: protect * Method description
*
* *
* *
* @param response
* @param repositoryName * @param repositoryName
* @param type * @param type
* @param challenge * @param challenge
* @param node * @param node
* *
* @return * @throws IOException
*/ */
@POST public void hookCallback(HttpServletResponse response, String repositoryName,
public Response hookCallback(@PathParam("repository") String repositoryName, String type, String challenge, String node)
@PathParam("type") String type, throws IOException
@FormParam("challenge") String challenge,
@FormParam("node") String node)
{ {
Response response = null;
if (hookManager.isAcceptAble(challenge)) if (hookManager.isAcceptAble(challenge))
{ {
try try
@@ -115,7 +128,6 @@ public class HgHookCallback
repositoryName, repositoryName,
new HgRepositoryHookEvent(handler, new HgRepositoryHookEvent(handler,
repositoryName, node)); repositoryName, node));
response = Response.ok().build();
} }
catch (RepositoryNotFoundException ex) catch (RepositoryNotFoundException ex)
{ {
@@ -129,7 +141,7 @@ public class HgHookCallback
} }
} }
response = Response.status(Response.Status.NOT_FOUND).build(); response.sendError(HttpServletResponse.SC_NOT_FOUND);
} }
} }
else else
@@ -139,10 +151,41 @@ public class HgHookCallback
logger.warn("hg hook challenge is not accept able"); logger.warn("hg hook challenge is not accept able");
} }
response = Response.status(Response.Status.BAD_REQUEST).build(); response.sendError(HttpServletResponse.SC_BAD_REQUEST);
} }
}
return response; /**
* Method description
*
*
* @param request
* @param response
*
* @throws IOException
* @throws ServletException
*/
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
String strippedURI = HttpUtil.getStrippedURI(request);
Matcher m = REGEX_URL.matcher(strippedURI);
if (m.matches())
{
String repositoryId = m.group(1);
String type = m.group(2);
String challenge = request.getParameter(PARAM_CHALLENGE);
String node = request.getParameter(PARAM_NODE);
hookCallback(response, repositoryId, type, challenge, node);
}
else
{
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
}
} }
//~--- fields --------------------------------------------------------------- //~--- fields ---------------------------------------------------------------

View File

@@ -52,6 +52,9 @@ public class HgServletModule extends ServletModule
/** Field description */ /** Field description */
public static final String MAPPING_HG = "/hg/*"; public static final String MAPPING_HG = "/hg/*";
/** Field description */
public static final String MAPPING_HOOK = "/hook/hg/*";
//~--- methods -------------------------------------------------------------- //~--- methods --------------------------------------------------------------
/** /**
@@ -62,6 +65,7 @@ public class HgServletModule extends ServletModule
protected void configureServlets() protected void configureServlets()
{ {
bind(HgHookManager.class); bind(HgHookManager.class);
serve(MAPPING_HOOK).with(HgHookCallbackServlet.class);
// register hg cgi servlet // register hg cgi servlet
filter(MAPPING_HG).through(BasicAuthenticationFilter.class); filter(MAPPING_HG).through(BasicAuthenticationFilter.class);