killbill-memoizeit

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java
index 97d4c1e..e4f8827 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java
@@ -19,24 +19,20 @@ package org.killbill.billing.jaxrs.util;
 import java.net.URI;
 import java.util.Map;
 
+import javax.ws.rs.Path;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
 
-import org.killbill.billing.jaxrs.json.ProfilingDataJson;
 import org.killbill.billing.jaxrs.resources.JaxRsResourceBase;
 import org.killbill.billing.jaxrs.resources.JaxrsResource;
-import org.killbill.commons.profiling.Profiling;
-import org.killbill.commons.profiling.ProfilingData;
 
 public class JaxrsUriBuilder {
 
     public Response buildResponse(final UriInfo uriInfo, final Class<? extends JaxrsResource> theClass, final String getMethodName, final Object objectId) {
-        final UriBuilder uriBuilder = UriBuilder.fromResource(theClass)
-                                                .path(theClass, getMethodName)
-                                                .scheme(uriInfo.getAbsolutePath().getScheme())
-                                                .host(uriInfo.getAbsolutePath().getHost())
-                                                .port(uriInfo.getAbsolutePath().getPort());
+        final UriBuilder uriBuilder = getUriBuilder(theClass, getMethodName).scheme(uriInfo.getAbsolutePath().getScheme())
+                                                                            .host(uriInfo.getAbsolutePath().getHost())
+                                                                            .port(uriInfo.getAbsolutePath().getPort());
 
         final URI location = objectId != null ? uriBuilder.build(objectId) : uriBuilder.build();
         return Response.created(location).build();
@@ -48,10 +44,8 @@ public class JaxrsUriBuilder {
             return null;
         }
 
-        final UriBuilder uriBuilder = UriBuilder.fromResource(theClass)
-                                                .path(theClass, getMethodName)
-                                                .queryParam(JaxRsResourceBase.QUERY_SEARCH_OFFSET, nextOffset)
-                                                .queryParam(JaxRsResourceBase.QUERY_SEARCH_LIMIT, limit);
+        final UriBuilder uriBuilder = getUriBuilder(theClass, getMethodName).queryParam(JaxRsResourceBase.QUERY_SEARCH_OFFSET, nextOffset)
+                                                                            .queryParam(JaxRsResourceBase.QUERY_SEARCH_LIMIT, limit);
         for (final String key : params.keySet()) {
             uriBuilder.queryParam(key, params.get(key));
         }
@@ -63,7 +57,7 @@ public class JaxrsUriBuilder {
         // Let's build a n absolute location for cross resources
         // See Jersey ContainerResponse.setHeaders
         final StringBuilder tmp = new StringBuilder(baseUri.substring(0, baseUri.length() - 1));
-        tmp.append(UriBuilder.fromResource(theClass).path(theClass, getMethodName).build(objectId).toString());
+        tmp.append(getUriBuilder(theClass, getMethodName).build(objectId).toString());
         final URI newUriFromResource = UriBuilder.fromUri(tmp.toString()).build();
         final Response.ResponseBuilder ri = Response.created(newUriFromResource);
         final Object obj = new Object() {
@@ -74,4 +68,20 @@ public class JaxrsUriBuilder {
         };
         return ri.entity(obj).build();
     }
+
+    private UriBuilder getUriBuilder(final Class<? extends JaxrsResource> theClassMaybeEnhanced, final String getMethodName) {
+        final Class theClass = getNonEnhancedClass(theClassMaybeEnhanced);
+        return UriBuilder.fromResource(theClass).path(theClass, getMethodName);
+    }
+
+    private Class getNonEnhancedClass(final Class<? extends JaxrsResource> theClassMaybeEnhanced) {
+        // If Guice is proxying the class for example ($EnhancerByGuice$), we want the real class.
+        // See https://java.net/projects/jersey/lists/users/archive/2008-10/message/291
+        Class theClass = theClassMaybeEnhanced;
+        while (theClass.getAnnotation(Path.class) == null && JaxRsResourceBase.class.isAssignableFrom(theClass)) {
+            theClass = theClass.getSuperclass();
+        }
+
+        return theClass;
+    }
 }