aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/trygvis/esper/testing/web/JerseyApplication.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io/trygvis/esper/testing/web/JerseyApplication.java')
-rw-r--r--src/main/java/io/trygvis/esper/testing/web/JerseyApplication.java78
1 files changed, 76 insertions, 2 deletions
diff --git a/src/main/java/io/trygvis/esper/testing/web/JerseyApplication.java b/src/main/java/io/trygvis/esper/testing/web/JerseyApplication.java
index eded64c..46964a0 100644
--- a/src/main/java/io/trygvis/esper/testing/web/JerseyApplication.java
+++ b/src/main/java/io/trygvis/esper/testing/web/JerseyApplication.java
@@ -1,11 +1,23 @@
package io.trygvis.esper.testing.web;
+import com.sun.jersey.api.core.*;
+import com.sun.jersey.core.spi.component.*;
+import com.sun.jersey.server.impl.inject.*;
+import com.sun.jersey.spi.inject.*;
import io.trygvis.esper.testing.*;
import io.trygvis.esper.testing.core.badge.*;
+import io.trygvis.esper.testing.util.sql.*;
+import io.trygvis.esper.testing.web.resource.*;
+import javax.ws.rs.*;
import javax.ws.rs.core.*;
+import javax.ws.rs.ext.*;
+import java.lang.reflect.*;
import java.util.*;
+import static fj.data.Option.*;
+import static io.trygvis.esper.testing.Util.parseInt;
+
public class JerseyApplication extends Application {
private final HashSet<Object> singletons;
@@ -16,12 +28,74 @@ public class JerseyApplication extends Application {
BadgeService badgeService = new BadgeService();
singletons = new HashSet<Object>(Arrays.asList(
- new CoreResource(da, badgeService),
- new JenkinsResource(da)
+ new CoreResource(da, badgeService),
+ new JenkinsResource(da)
));
}
+ public Set<Class<?>> getClasses() {
+ return new HashSet<>(Arrays.<Class<?>>asList(ResourceParamInjector.class));
+ }
+
public Set<Object> getSingletons() {
return singletons;
}
+
+ @Provider
+ public static class ResourceParamInjector implements InjectableProvider<MagicParam, Type> {
+
+ private final ResourceContext rc;
+
+ public ResourceParamInjector(@Context ResourceContext rc) {
+ this.rc = rc;
+ }
+
+ public ComponentScope getScope() {
+ return ComponentScope.PerRequest;
+ }
+
+ public Injectable getInjectable(final ComponentContext ic, final MagicParam a, Type type) {
+ if (PageRequest.class.equals(type)) {
+ return new AbstractHttpContextInjectable() {
+ public Object getValue(HttpContext hc) {
+ MultivaluedMap<String, String> queryParameters = hc.getRequest().getQueryParameters();
+
+ return new PageRequest(
+ fromNull(queryParameters.getFirst("startIndex")).bind(parseInt),
+ fromNull(queryParameters.getFirst("count")).bind(parseInt));
+ }
+ };
+ } else if (UUID.class.equals(type)) {
+
+ return new AbstractHttpContextInjectable() {
+ public Object getValue(HttpContext hc) {
+
+ if (a.query().length() > 0) {
+ return parse(hc.getRequest().getQueryParameters().getFirst(a.query()));
+ } else {
+ MultivaluedMap<String, String> pathParameters = hc.getUriInfo().getPathParameters();
+
+ for (Map.Entry<String, List<String>> entry : pathParameters.entrySet()) {
+ if ("uuid".equals(entry.getKey())) {
+ return parse(entry.getValue().get(0));
+ }
+ }
+ }
+
+ throw new RuntimeException("@MagicParam used with UUID argument with no {uuid} path variable.");
+ }
+
+ private UUID parse(String s) {
+ try {
+ return UUID.fromString(s);
+ } catch (IllegalArgumentException e) {
+ throw new WebApplicationException(400);
+ }
+ }
+ };
+ }
+
+ return null;
+ }
+ }
}