Skip to content

Commit

Permalink
Remove mime-type specific result rendering. This feature isn't
Browse files Browse the repository at this point in the history
used and adds a lot of complexity.
  • Loading branch information
jleyba committed May 6, 2014
1 parent 1c0f6c8 commit 96673df
Show file tree
Hide file tree
Showing 6 changed files with 208 additions and 497 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,14 @@

package org.openqa.selenium.remote.server.renderer;

import static com.google.common.base.Strings.nullToEmpty;
import static org.openqa.selenium.remote.HttpSessionId.getSessionId;

import com.google.common.base.Charsets;

import org.openqa.selenium.remote.BeanToJsonConverter;
import org.openqa.selenium.remote.ErrorCodes;
import org.openqa.selenium.remote.Response;
import org.openqa.selenium.remote.server.HttpRequest;
import org.openqa.selenium.remote.server.HttpResponse;
import org.openqa.selenium.remote.server.rest.Renderer;
Expand All @@ -41,6 +46,9 @@ public JsonResult(String propertyName) {
public void render(HttpRequest request, HttpResponse response, RestishHandler handler)
throws Exception {
Object result = request.getAttribute(propertyName);
if (result == null) {
result = prepareDefaultResponse(request);
}

String json = new BeanToJsonConverter().convert(result);
ByteBuffer bb = Charsets.UTF_8.encode(json);
Expand All @@ -52,4 +60,13 @@ public void render(HttpRequest request, HttpResponse response, RestishHandler ha
response.setContent(data);
response.end();
}

private Response prepareDefaultResponse(HttpRequest request) {
Response response = new Response();
response.setStatus(ErrorCodes.SUCCESS);
response.setState(ErrorCodes.SUCCESS_STRING);
response.setSessionId(nullToEmpty(getSessionId(request.getUri())));
response.setValue(null);
return response;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,7 @@

package org.openqa.selenium.remote.server.rest;

import static com.google.common.base.Preconditions.checkNotNull;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;

import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.remote.ErrorCodes;
Expand All @@ -46,7 +41,6 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
Expand All @@ -56,24 +50,30 @@

public class ResultConfig {

private final Renderer successRenderer;
private final Renderer errorRenderer;

private final String[] sections;
private final HandlerFactory handlerFactory;
private final DriverSessions sessions;
private final Multimap<ResultType, Result> resultToRender = LinkedHashMultimap.create();
private final String url;
private final Logger log;

public ResultConfig(String url, Class<? extends RestishHandler> handlerClazz, DriverSessions sessions,
Logger log) {
this.url = url;
this.log = log;
public ResultConfig(
String url, Class<? extends RestishHandler> handlerClazz,
DriverSessions sessions, Logger log,
Renderer successRenderer, Renderer errorRenderer) {
if (url == null || handlerClazz == null) {
throw new IllegalArgumentException("You must specify the handler and the url");
}

sections = url.split("/");
this.url = url;
this.log = log;
this.sections = url.split("/");
this.sessions = sessions;
this.handlerFactory = getHandlerFactory(handlerClazz);
this.successRenderer = successRenderer;
this.errorRenderer = errorRenderer;
}


Expand Down Expand Up @@ -130,50 +130,6 @@ protected RestishHandler populate(RestishHandler handler, String pathString) {
return handler;
}

/**
* Configures this instance to handle a particular type of result with the given renderer. This
* result handler will be registered with an empty mime-type. Accordingly, it will only be used
* if there are no other handlers registered with an exact mime-type match.
*
* @param resultType The type of result to configure.
* @param renderer The renderer to use.
* @return A self reference for fluency.
* @see #on(ResultType, Result)
*/
public ResultConfig on(ResultType resultType, Renderer renderer) {
return on(resultType, renderer, "");
}

/*
* Configure this ResultConfig to handle results of type ResultType with a specific renderer. The
* mimeType is used to distinguish between JSON calls and "ordinary" browser pointed at the remote
* WD Server, which is not implemented at all yet.
* @see #on(ResultType, Result)
*/
public ResultConfig on(ResultType success, Renderer renderer, String mimeType) {
return on(success, new Result(mimeType, renderer));
}

/**
* Configures how this instance will handle specific types of results. Each ResultType may be
* handled by multiple Results. Upon rendering a response, this instance will select the first
* Result that is an exact mime-type match for the original HTTP request (results are checked in
* the order registered). There may only be one Result registered for each mime-type.
*
* @param type The type of result to configure for.
* @param result The handler for the given result type.
* @return A self reference for fluency.
*/
public ResultConfig on(ResultType type, Result result) {
// There should not be more than one renderer for each result and
// mime type.
for (Result existingResult : resultToRender.get(type)) {
assert(!existingResult.isExactMimeTypeMatch(result.getMimeType()));
}
resultToRender.put(type, result);
return this;
}

public void handle(String pathInfo, final HttpRequest request,
final HttpResponse response) throws Exception {
String sessionId = HttpSessionId.getSessionId(request.getUri());
Expand All @@ -185,7 +141,6 @@ public void handle(String pathInfo, final HttpRequest request,
final RestishHandler handler = getHandler(pathInfo, sessId);

try {

if (handler instanceof JsonParametersAware) {
setJsonParameters(request, handler);
}
Expand All @@ -208,7 +163,8 @@ public void handle(String pathInfo, final HttpRequest request,
}
} catch (UnreachableBrowserException e){
throwUpIfSessionTerminated(sessId);
replyError(request, response, e);
request.setAttribute("exception", e);
errorRenderer.render(request, response, null);
return;
} catch (SessionNotFoundException e){
throw e;
Expand All @@ -229,7 +185,7 @@ public void handle(String pathInfo, final HttpRequest request,
request.setAttribute("exception", e);
}

final Renderer renderer = getRenderer(result, request);
final Renderer renderer = result == ResultType.SUCCESS ? successRenderer : errorRenderer;

renderer.render(request, response, handler);
response.end();
Expand All @@ -243,13 +199,6 @@ public void handle(String pathInfo, final HttpRequest request,
}
}

private void replyError(HttpRequest request, final HttpResponse response, Exception e)
throws Exception {
Renderer renderer2 = getRenderer(ResultType.ERROR, request);
request.setAttribute("exception", e);
renderer2.render(request, response, null);
}

private void throwUpIfSessionTerminated(SessionId sessId) throws Exception {
if (sessId == null) return;
Session session = sessions.get(sessId);
Expand All @@ -259,19 +208,6 @@ private void throwUpIfSessionTerminated(SessionId sessId) throws Exception {
}
}

@VisibleForTesting
Renderer getRenderer(ResultType resultType, HttpRequest request) {
Collection<Result> results = checkNotNull(resultToRender.get(resultType));
Result tempToUse = null;
for (Result res : results) {
if (tempToUse == null && !res.isOnlyForExactMatch()
|| res.isExactMimeTypeMatch(request.getHeader("Accept"))) {
tempToUse = res;
}
}
return checkNotNull(tempToUse).getRenderer();
}

@SuppressWarnings("unchecked")
private void setJsonParameters(HttpRequest request, RestishHandler handler) throws Exception {
BufferedReader reader = new BufferedReader(request.getReader());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,44 +16,37 @@

package org.openqa.selenium.remote.server.rest;

import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;

import org.openqa.selenium.remote.server.DriverSessions;

import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;

public class UrlMapper {

private final Multimap<ResultType, Result> globals = LinkedHashMultimap.create();
private final Set<ResultConfig> configs = new LinkedHashSet<ResultConfig>();
private final DriverSessions sessions;
private final Logger log;
private final Renderer successRenderer;
private final Renderer errorRenderer;

public UrlMapper(DriverSessions sessions, Logger log) {
public UrlMapper(DriverSessions sessions, Logger log,
Renderer successRenderer, Renderer errorRenderer) {
this.sessions = sessions;
this.log = log;
this.successRenderer = successRenderer;
this.errorRenderer = errorRenderer;
}

public ResultConfig bind(String url, Class<? extends RestishHandler> handlerClazz) {
public void bind(String url, Class<? extends RestishHandler> handlerClazz) {
ResultConfig existingConfig = getConfig(url);
if (existingConfig != null) {
configs.remove(existingConfig);
}

ResultConfig config = new ResultConfig(url, handlerClazz, sessions, log);
ResultConfig config = new ResultConfig(
url, handlerClazz, sessions, log, successRenderer, errorRenderer);
configs.add(config);
Map<ResultType, Collection<Result>> map = globals.asMap();
for (Map.Entry<ResultType, Collection<Result>> entry : map.entrySet()) {
for (Result result : entry.getValue()) {
config.on(entry.getKey(), result);
}
}
return config;
}

public ResultConfig getConfig(String url) {
Expand All @@ -65,12 +58,4 @@ public ResultConfig getConfig(String url) {

return null;
}

public void addGlobalHandler(ResultType type, Result result) {
globals.put(type, result);

for (ResultConfig config : configs) {
config.on(type, result);
}
}
}
Loading

0 comments on commit 96673df

Please sign in to comment.