diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/RESTExceptionWrapper.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/RESTExceptionWrapper.java
index 7f52d95b9..758e40e3a 100644
--- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/RESTExceptionWrapper.java
+++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/RESTExceptionWrapper.java
@@ -22,8 +22,8 @@
package org.glyptodon.guacamole.net.basic.rest;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
-import java.lang.reflect.Parameter;
import javax.ws.rs.FormParam;
import javax.ws.rs.QueryParam;
import org.aopalliance.intercept.MethodInterceptor;
@@ -56,32 +56,39 @@ public class RESTExceptionWrapper implements MethodInterceptor {
private final Logger logger = LoggerFactory.getLogger(RESTExceptionWrapper.class);
/**
- * Determines whether the given parameter is associated with the HTTP
+ * Determines whether the given set of annotations describes an HTTP
* request parameter of the given name. For a parameter to be associated
* with an HTTP request parameter, it must be annotated with either the
* @QueryParam
or @FormParam
annotations.
*
- * @param parameter
- * The Java parameter to check.
+ * @param annotations
+ * The annotations associated with the Java parameter being checked.
*
* @param name
* The name of the HTTP request parameter.
*
* @return
- * true if the given parameter is associated with the HTTP request
+ * true if the given set of annotations describes an HTTP request
* parameter having the given name, false otherwise.
*/
- private boolean isRequestParameter(Parameter parameter, String name) {
+ private boolean isRequestParameter(Annotation[] annotations, String name) {
- // Check if parameter is associated with the HTTP query string
- QueryParam queryParam = parameter.getAnnotation(QueryParam.class);
- if (queryParam != null && name.equals(queryParam.value()))
- return true;
+ // Search annotations for associated HTTP parameters
+ for (Annotation annotation : annotations) {
- // Failing that, check whether the parameter is associated with the
- // HTTP request body
- FormParam formParam = parameter.getAnnotation(FormParam.class);
- return formParam != null && name.equals(formParam.value());
+ // Check if parameter is associated with the HTTP query string
+ if (annotation instanceof QueryParam && name.equals(((QueryParam) annotation).value()))
+ return true;
+
+ // Failing that, check whether the parameter is associated with the
+ // HTTP request body
+ if (annotation instanceof FormParam && name.equals(((FormParam) annotation).value()))
+ return true;
+
+ }
+
+ // No parameter annotations are present
+ return false;
}
@@ -103,19 +110,24 @@ public class RESTExceptionWrapper implements MethodInterceptor {
Method method = invocation.getMethod();
- // Iterate through all parameters, looking for the authentication token
- Parameter[] parameters = method.getParameters();
- for (int i = 0; i < parameters.length; i++) {
+ // Get the types and annotations associated with each parameter
+ Annotation[][] parameterAnnotations = method.getParameterAnnotations();
+ Class>[] parameterTypes = method.getParameterTypes();
- // Get current parameter
- Parameter parameter = parameters[i];
+ // The Java standards require these to be parallel arrays
+ assert(parameterAnnotations.length == parameterTypes.length);
+
+ // Iterate through all parameters, looking for the authentication token
+ for (int i = 0; i < parameterTypes.length; i++) {
// Only inspect String parameters
- if (parameter.getType() != String.class)
+ Class> parameterType = parameterTypes[i];
+ if (parameterType != String.class)
continue;
// Parameter must be declared as a REST service parameter
- if (!isRequestParameter(parameter, "token"))
+ Annotation[] annotations = parameterAnnotations[i];
+ if (!isRequestParameter(annotations, "token"))
continue;
// The token parameter has been found - return its value