Skip to content

Commit

Permalink
Extract JEE interop features to a helper class
Browse files Browse the repository at this point in the history
  • Loading branch information
shs96c committed Jul 4, 2019
1 parent 2505fb3 commit 84fcbf0
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@
import org.openqa.grid.common.exception.GridException;
import org.openqa.grid.internal.GridRegistry;
import org.openqa.grid.internal.RemoteProxy;
import org.openqa.selenium.grid.server.ServletRequestWrappingHttpRequest;
import org.openqa.selenium.grid.server.ServletResponseWrappingHttpResponse;
import org.openqa.selenium.grid.server.JeeInterop;
import org.openqa.selenium.json.Json;
import org.openqa.selenium.remote.http.HttpRequest;
import org.openqa.selenium.remote.http.HttpResponse;
Expand Down Expand Up @@ -57,18 +56,18 @@ public ProxyStatusServlet(GridRegistry registry) {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
process(
new ServletRequestWrappingHttpRequest(request),
new ServletResponseWrappingHttpResponse(response));
HttpResponse seRes = new HttpResponse();
process(JeeInterop.toHttpRequest(request), seRes);
JeeInterop.copyResponse(seRes, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
process(
new ServletRequestWrappingHttpRequest(request),
new ServletResponseWrappingHttpResponse(response));
HttpResponse seRes = new HttpResponse();
process(JeeInterop.toHttpRequest(request), seRes);
JeeInterop.copyResponse(seRes, response);
}

protected void process(HttpRequest request, HttpResponse response) {
response.setHeader("Content-Type", MediaType.JSON_UTF_8.toString());
response.setStatus(200);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ private JeeInterop() {
// Utility class
}

private static void copyResponse(HttpResponse from, HttpServletResponse to) {
public static void copyResponse(HttpResponse from, HttpServletResponse to) {
to.setStatus(from.getStatus());
from.getHeaderNames().forEach(name -> from.getHeaders(name).forEach(value -> to.addHeader(name, value)));

Expand All @@ -47,7 +47,7 @@ private static void copyResponse(HttpResponse from, HttpServletResponse to) {
}
}

private static HttpRequest toHttpRequest(HttpServletRequest source) {
public static HttpRequest toHttpRequest(HttpServletRequest source) {
return new ServletRequestWrappingHttpRequest(source);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@
* Read-only adapter of {@link HttpServletRequest} to a {@link HttpRequest}. This class is not
* thread-safe, and you can only expect to read the content once.
*/
public class ServletRequestWrappingHttpRequest extends HttpRequest {
class ServletRequestWrappingHttpRequest extends HttpRequest {

private final HttpServletRequest req;

public ServletRequestWrappingHttpRequest(HttpServletRequest req) {
ServletRequestWrappingHttpRequest(HttpServletRequest req) {
super(HttpMethod.valueOf(req.getMethod()), req.getPathInfo() == null ? "/" : req.getPathInfo());

this.req = req;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

public class ServletResponseWrappingHttpResponse extends HttpResponse {
class ServletResponseWrappingHttpResponse extends HttpResponse {

private final HttpServletResponse resp;

public ServletResponseWrappingHttpResponse(HttpServletResponse resp) {
ServletResponseWrappingHttpResponse(HttpServletResponse resp) {
this.resp = Preconditions.checkNotNull(resp, "Response to wrap must not be null");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,37 +21,35 @@
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;

import org.openqa.selenium.grid.session.ActiveSession;
import org.openqa.selenium.grid.web.CommandHandler;
import org.openqa.selenium.grid.web.NoHandler;
import org.openqa.selenium.json.Json;
import org.openqa.selenium.remote.SessionId;
import org.openqa.selenium.remote.http.HttpHandler;
import org.openqa.selenium.remote.http.HttpMethod;
import org.openqa.selenium.remote.http.UrlTemplate;
import org.openqa.selenium.remote.server.commandhandler.BeginSession;
import org.openqa.selenium.remote.server.commandhandler.GetAllSessions;
import org.openqa.selenium.remote.server.commandhandler.GetLogTypes;
import org.openqa.selenium.remote.server.commandhandler.GetLogsOfType;
import org.openqa.selenium.grid.web.NoHandler;
import org.openqa.selenium.remote.server.commandhandler.NoSessionHandler;
import org.openqa.selenium.remote.server.commandhandler.Status;
import org.openqa.selenium.remote.server.commandhandler.UploadFile;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;

import javax.servlet.http.HttpServletRequest;


class AllHandlers {

private final Json json;
private final ActiveSessions allSessions;

private final Map<HttpMethod, ImmutableList<Function<String, CommandHandler>>> additionalHandlers;
private final Map<HttpMethod, ImmutableList<Function<String, HttpHandler>>> additionalHandlers;

public AllHandlers(NewSessionPipeline pipeline, ActiveSessions allSessions) {
this.allSessions = Objects.requireNonNull(allSessions);
Expand All @@ -76,10 +74,10 @@ public AllHandlers(NewSessionPipeline pipeline, ActiveSessions allSessions) {
));
}

public CommandHandler match(HttpServletRequest req) {
public HttpHandler match(HttpServletRequest req) {
String path = Strings.isNullOrEmpty(req.getPathInfo()) ? "/" : req.getPathInfo();

Optional<? extends CommandHandler> additionalHandler = additionalHandlers.get(HttpMethod.valueOf(req.getMethod()))
Optional<? extends HttpHandler> additionalHandler = additionalHandlers.get(HttpMethod.valueOf(req.getMethod()))
.stream()
.map(bundle -> bundle.apply(req.getPathInfo()))
.filter(Objects::nonNull)
Expand Down Expand Up @@ -109,7 +107,7 @@ public CommandHandler match(HttpServletRequest req) {
return new NoHandler(json);
}

private <H extends CommandHandler> Function<String, CommandHandler> handler(
private <H extends HttpHandler> Function<String, HttpHandler> handler(
String template,
Function<Map<String, String>, H> handlerGenerator) {
UrlTemplate urlTemplate = new UrlTemplate(template);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,11 @@
import com.google.common.net.HttpHeaders;
import com.google.common.net.MediaType;

import org.openqa.selenium.grid.server.ServletRequestWrappingHttpRequest;
import org.openqa.selenium.grid.server.ServletResponseWrappingHttpResponse;
import org.openqa.selenium.grid.server.JeeInterop;
import org.openqa.selenium.grid.session.ActiveSession;
import org.openqa.selenium.grid.web.CommandHandler;
import org.openqa.selenium.logging.LoggingHandler;
import org.openqa.selenium.remote.SessionId;
import org.openqa.selenium.remote.http.HttpHandler;
import org.openqa.selenium.remote.server.commandhandler.ExceptionHandler;
import org.openqa.selenium.remote.server.log.LoggingManager;
import org.openqa.selenium.remote.server.log.PerSessionLogHandler;
Expand All @@ -38,6 +37,7 @@

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
Expand Down Expand Up @@ -188,7 +188,7 @@ public ServletInputStream getInputStream() {
}

private void handle(HttpServletRequest req, HttpServletResponse resp) {
CommandHandler handler = handlers.match(req);
HttpHandler handler = handlers.match(req);

LOG.fine("Found handler: " + handler);

Expand Down Expand Up @@ -228,10 +228,8 @@ private void handle(HttpServletRequest req, HttpServletResponse resp) {
req.getMethod(),
req.getPathInfo(),
handler.getClass().getSimpleName()));
handler.execute(
new ServletRequestWrappingHttpRequest(req),
new ServletResponseWrappingHttpResponse(resp));
} catch (IOException e) {
JeeInterop.execute(handler, req, resp);
} catch (UncheckedIOException e) {
resp.reset();
throw new RuntimeException(e);
} finally {
Expand All @@ -244,9 +242,7 @@ private void handle(HttpServletRequest req, HttpServletResponse resp) {
execution.get(10, MINUTES);
} catch (ExecutionException e) {
resp.reset();
new ExceptionHandler(e).execute(
new ServletRequestWrappingHttpRequest(req),
new ServletResponseWrappingHttpResponse(resp));
JeeInterop.execute(new ExceptionHandler(e), req, resp);
} catch (InterruptedException e) {
logger.log(Level.WARNING, "Unexpectedly interrupted: " + e.getMessage(), e);
invalidateSession = true;
Expand Down

0 comments on commit 84fcbf0

Please sign in to comment.