You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by st...@apache.org on 2011/08/10 22:38:57 UTC

svn commit: r1156358 - in /cocoon/cocoon3/trunk/cocoon-rest/src: main/java/org/apache/cocoon/rest/controller/ test/java/org/apache/cocoon/rest/controller/

Author: stevendolg
Date: Wed Aug 10 20:38:56 2011
New Revision: 1156358

URL: http://svn.apache.org/viewvc?rev=1156358&view=rev
Log:
Reworked class to fix warnings.
Introduced more meaningful exceptions.

Added:
    cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/IllegalFieldAnnotationException.java   (with props)
    cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/UnknownControllerException.java   (with props)
Modified:
    cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/NonPrototypeControllerException.java
    cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/SpringRESTController.java
    cocoon/cocoon3/trunk/cocoon-rest/src/test/java/org/apache/cocoon/rest/controller/SpringRESTControllerTest.java

Added: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/IllegalFieldAnnotationException.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/IllegalFieldAnnotationException.java?rev=1156358&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/IllegalFieldAnnotationException.java (added)
+++ cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/IllegalFieldAnnotationException.java Wed Aug 10 20:38:56 2011
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.rest.controller;
+
+import org.apache.cocoon.pipeline.SetupException;
+
+
+public class IllegalFieldAnnotationException extends SetupException {
+
+    private static final long serialVersionUID = 1L;
+
+    public IllegalFieldAnnotationException(String message) {
+        super(message);
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/IllegalFieldAnnotationException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/IllegalFieldAnnotationException.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/IllegalFieldAnnotationException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/NonPrototypeControllerException.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/NonPrototypeControllerException.java?rev=1156358&r1=1156357&r2=1156358&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/NonPrototypeControllerException.java (original)
+++ cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/NonPrototypeControllerException.java Wed Aug 10 20:38:56 2011
@@ -16,9 +16,9 @@
  */
 package org.apache.cocoon.rest.controller;
 
-import org.apache.cocoon.pipeline.ProcessingException;
+import org.apache.cocoon.pipeline.SetupException;
 
-public class NonPrototypeControllerException extends ProcessingException {
+public class NonPrototypeControllerException extends SetupException {
 
     private static final long serialVersionUID = 1L;
 

Modified: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/SpringRESTController.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/SpringRESTController.java?rev=1156358&r1=1156357&r2=1156358&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/SpringRESTController.java (original)
+++ cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/SpringRESTController.java Wed Aug 10 20:38:56 2011
@@ -21,6 +21,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.net.URL;
 import java.util.List;
 import java.util.Map;
@@ -37,7 +38,6 @@ import org.apache.cocoon.controller.Cont
 import org.apache.cocoon.pipeline.caching.CacheKey;
 import org.apache.cocoon.rest.controller.annotation.BaseURL;
 import org.apache.cocoon.rest.controller.annotation.Inject;
-import org.apache.cocoon.rest.controller.annotation.RESTController;
 import org.apache.cocoon.rest.controller.annotation.RequestHeader;
 import org.apache.cocoon.rest.controller.annotation.RequestParameter;
 import org.apache.cocoon.rest.controller.annotation.SitemapParameter;
@@ -49,10 +49,9 @@ import org.apache.cocoon.servlet.collect
 import org.apache.cocoon.servlet.util.HttpContextHelper;
 import org.apache.cocoon.servlet.util.SettingsHelper;
 import org.apache.cocoon.sitemap.util.ExceptionHandler;
+import org.apache.cocoon.sitemap.util.SpringProxyHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.aop.framework.Advised;
-import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 
@@ -60,7 +59,8 @@ import org.springframework.context.Appli
  * <p>
  * This controller is responsible for the execution of instances of REST controller beans. Note that
  * each controller implementation must be available as Spring bean. For that purpose you can use the
- * {@link RESTController} annotation and load all beans from a particular package automatically. See
+ * {@link org.apache.cocoon.rest.controller.annotation.RESTController RESTController} annotation and
+ * load all beans from a particular package automatically. See
  * http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-classpath-scanning
  * for details.
  * </p>
@@ -94,11 +94,21 @@ public class SpringRESTController implem
         return readCacheKey();
     }
 
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.apache.cocoon.controller.Controller#setup(java.lang.String, java.util.Map,
+     *      java.util.Map)
+     * 
+     * @throws UnknownControllerException if a controller is requested that is not registered as
+     *             Spring bean.
+     * @throws NonPrototypeControllerException if the requested controller is not configured to run
+     *             in the prototype scope.
+     * @throws IllegalFieldAnnotationException if the requested controller contains dependency
+     *             injection fields that cannot be satisfied.
+     */
     public void setup(String controllerName, Map<String, Object> inputParameters, Map<String, ? extends Object> configuration) {
-        if (!this.applicationContext.isPrototype(controllerName)) {
-            throw new NonPrototypeControllerException("Requested REST controller '" + controllerName
-                    + "' is defined within the 'prototype' scope.");
-        }
+        this.validateControllerBean(controllerName);
 
         try {
             // get the prepared controller
@@ -126,7 +136,18 @@ public class SpringRESTController implem
         } catch (Exception e) {
             throw ExceptionHandler.getInvocationException(e);
         }
+    }
+
+    private void validateControllerBean(String controllerName) {
+        if (!this.applicationContext.containsBean(controllerName)) {
+            throw new UnknownControllerException("Requested REST controller '" + controllerName
+                    + "' is not defined within the Spring application context.");
+        }
 
+        if (!this.applicationContext.isPrototype(controllerName)) {
+            throw new NonPrototypeControllerException("Requested REST controller '" + controllerName
+                    + "' is not defined within the 'prototype' scope.");
+        }
     }
 
     public void execute(OutputStream outputStream) {
@@ -146,7 +167,7 @@ public class SpringRESTController implem
      *
      * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
      */
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+    public void setApplicationContext(ApplicationContext applicationContext) {
         this.applicationContext = applicationContext;
     }
 
@@ -155,9 +176,9 @@ public class SpringRESTController implem
     }
 
     private Object getController(String controllerName, Map<String, Object> inputParameters,
-            Map<String, ? extends Object> configuration) throws Exception {
+            Map<String, ? extends Object> configuration) throws IllegalAccessException, IOException {
         Object controller = this.applicationContext.getBean(controllerName);
-        Object unpackedController = unpackProxy(controller);
+        Object unpackedController = SpringProxyHelper.unpackProxy(controller);
         Map<Class<? extends Annotation>, List<Field>> annotatedFields = this.annotationCollector
                 .getAnnotatedFields(unpackedController.getClass());
 
@@ -165,195 +186,232 @@ public class SpringRESTController implem
         populateInjectFields(inputParameters, unpackedController, annotatedFields);
         populateRequestFields(inputParameters, unpackedController, annotatedFields);
         populateRequestHeaderFields(inputParameters, unpackedController, annotatedFields);
-        populateSitemapParameters(configuration, unpackedController, annotatedFields);
-        populateBaseURL(configuration, unpackedController, annotatedFields);
+        populateSitemapParameterFields(configuration, unpackedController, annotatedFields);
+        populateBaseURLFields(configuration, unpackedController, annotatedFields);
 
         return controller;
     }
 
-    private static void populateBaseURL(Map<String, ? extends Object> configuration, Object controller,
-            Map<Class<? extends Annotation>, List<Field>> annotatedFields) throws IllegalAccessException, Exception {
-        List<Field> baseURLFields = annotatedFields.get(BaseURL.class);
-        if (baseURLFields == null || baseURLFields.isEmpty()) {
-            return;
+    private static boolean isBlank(String string) {
+        if (string == null) {
+            return true;
         }
 
-        for (Field field : baseURLFields) {
-            field.setAccessible(true);
-
-            Class<?> fieldType = field.getType();
-            if (fieldType == URL.class) {
-                field.set(controller, configuration.get("baseUrl"));
-            } else {
-                throw new Exception("The annotation " + BaseURL.class.getName() + " can only be set on fields of type "
-                        + URL.class.getName() + "." + " " + "(field=" + field.getName() + ", type="
-                        + fieldType.getName() + ")");
+        for (int i = 0; i < string.length(); i++) {
+            if (!Character.isWhitespace(string.charAt(i))) {
+                return false;
             }
         }
+
+        return true;
     }
 
-    public static <T> T unpackProxy(T proxy) throws Exception {
-        if (proxy instanceof Advised) {
-            Advised advised = (Advised) proxy;
-            @SuppressWarnings("unchecked")
-            T target = (T) advised.getTargetSource().getTarget();
-            return target;
+    private static void populateBaseURLFields(Map<String, ? extends Object> configuration, Object controller,
+            Map<Class<? extends Annotation>, List<Field>> annotatedFields) throws IllegalAccessException {
+        List<Field> baseURLFields = annotatedFields.get(BaseURL.class);
+        if (baseURLFields == null || baseURLFields.isEmpty()) {
+            return;
         }
 
-        return proxy;
+        for (Field field : baseURLFields) {
+            populateBaseURLField(configuration, controller, field);
+        }
     }
 
-    private static boolean isBlank(String str) {
-        int strLen;
-        if (str == null || (strLen = str.length()) == 0) {
-            return true;
-        }
-        for (int i = 0; i < strLen; i++) {
-            if (Character.isWhitespace(str.charAt(i)) == false) {
-                return false;
-            }
+    private static void populateBaseURLField(Map<String, ? extends Object> configuration, Object controller, Field field)
+            throws IllegalAccessException {
+        field.setAccessible(true);
+
+        Class<?> fieldType = field.getType();
+        if (fieldType == URL.class) {
+            field.set(controller, configuration.get("baseUrl"));
+        } else {
+            throwIllegalFieldAnnotationException(BaseURL.class, field, URL.class);
         }
-        return true;
     }
 
     private static void populateInjectFields(Map<String, ? extends Object> parameters, Object controller,
-            Map<Class<? extends Annotation>, List<Field>> annotatedFields) throws IllegalAccessException, IOException,
-            Exception {
+            Map<Class<? extends Annotation>, List<Field>> annotatedFields) throws IllegalAccessException, IOException {
         List<Field> injectFields = annotatedFields.get(Inject.class);
         if (injectFields == null || injectFields.isEmpty()) {
             return;
         }
 
-        HttpServletRequest request = HttpContextHelper.getRequest(parameters);
-        HttpServletResponse response = HttpContextHelper.getResponse(parameters);
-
         for (Field field : injectFields) {
-            field.setAccessible(true);
+            populateInjectField(parameters, controller, field);
+        }
+    }
 
-            Class<?> fieldType = field.getType();
-            if (fieldType == HttpServletRequest.class) {
-                field.set(controller, request);
-            } else if (fieldType == HttpServletResponse.class) {
-                field.set(controller, response);
-            } else if (fieldType == Logger.class) {
-                field.set(controller, LoggerFactory.getLogger(controller.getClass()));
-            } else if (fieldType == ServletInputStream.class || fieldType == InputStream.class) {
-                field.set(controller, request.getInputStream());
-            } else if (fieldType == ServletOutputStream.class || fieldType == OutputStream.class) {
-                field.set(controller, response.getOutputStream());
-            } else if (fieldType == ServletContext.class) {
-                ServletContext servletContext = HttpContextHelper.getServletContext(parameters);
-                field.set(controller, servletContext);
-            } else if (fieldType == Settings.class) {
-                Settings settings = SettingsHelper.getSettings(parameters);
-                field.set(controller, settings);
-            } else {
-                throw new Exception("The annotation " + Inject.class.getName()
-                        + " doesn't support the injection of type " + fieldType.getName() + "." + " " + "(field="
-                        + field.getName() + ", type=" + fieldType.getName() + ")");
-            }
+    private static void populateInjectField(Map<String, ? extends Object> parameters, Object controller, Field field)
+            throws IllegalAccessException, IOException {
+        field.setAccessible(true);
+
+        Class<?> fieldType = field.getType();
+        if (fieldType == HttpServletRequest.class) {
+            HttpServletRequest request = HttpContextHelper.getRequest(parameters);
+            field.set(controller, request);
+        } else if (fieldType == HttpServletResponse.class) {
+            HttpServletResponse response = HttpContextHelper.getResponse(parameters);
+            field.set(controller, response);
+        } else if (fieldType == Logger.class) {
+            field.set(controller, LoggerFactory.getLogger(controller.getClass()));
+        } else if (fieldType == ServletInputStream.class || fieldType == InputStream.class) {
+            HttpServletRequest request = HttpContextHelper.getRequest(parameters);
+            field.set(controller, request.getInputStream());
+        } else if (fieldType == ServletOutputStream.class || fieldType == OutputStream.class) {
+            HttpServletResponse response = HttpContextHelper.getResponse(parameters);
+            field.set(controller, response.getOutputStream());
+        } else if (fieldType == ServletContext.class) {
+            ServletContext servletContext = HttpContextHelper.getServletContext(parameters);
+            field.set(controller, servletContext);
+        } else if (fieldType == Settings.class) {
+            Settings settings = SettingsHelper.getSettings(parameters);
+            field.set(controller, settings);
+        } else {
+            throwIllegalFieldAnnotationException(Inject.class, field, HttpServletRequest.class,
+                    HttpServletResponse.class, Logger.class, ServletInputStream.class, InputStream.class,
+                    ServletOutputStream.class, OutputStream.class, ServletContext.class, Settings.class);
         }
     }
 
     private static void populateRequestFields(Map<String, ? extends Object> parameters, Object controller,
-            Map<Class<? extends Annotation>, List<Field>> annotatedFields) throws IllegalAccessException, Exception {
+            Map<Class<? extends Annotation>, List<Field>> annotatedFields) throws IllegalAccessException {
         List<Field> requestFields = annotatedFields.get(RequestParameter.class);
         if (requestFields == null || requestFields.isEmpty()) {
             return;
         }
 
-        HttpServletRequest request = HttpContextHelper.getRequest(parameters);
         for (Field field : requestFields) {
-            field.setAccessible(true);
+            populateRequestField(parameters, controller, field);
+        }
+    }
 
-            String requestParameterName = field.getAnnotation(RequestParameter.class).value();
-            if (isBlank(requestParameterName)) {
-                requestParameterName = field.getName();
-            }
+    private static void populateRequestField(Map<String, ? extends Object> parameters, Object controller, Field field)
+            throws IllegalAccessException {
+        field.setAccessible(true);
+
+        HttpServletRequest request = HttpContextHelper.getRequest(parameters);
 
-            Class<?> fieldType = field.getType();
-            if (fieldType == String.class) {
-                String parameter = request.getParameter(requestParameterName);
-                if (parameter != null) {
-                    field.set(controller, parameter);
-                }
-            } else if (fieldType == int.class) {
-                String parameter = request.getParameter(requestParameterName);
-                if (parameter != null) {
-                    field.set(controller, Integer.parseInt(parameter));
-                }
-            } else if (fieldType == boolean.class) {
-                String parameter = request.getParameter(requestParameterName);
-                if (parameter != null) {
-                    field.set(controller, Boolean.parseBoolean(parameter));
-                }
-            } else if (fieldType == String[].class) {
-                String[] parameterValues = request.getParameterValues(requestParameterName);
-                if (parameterValues != null) {
-                    field.set(controller, parameterValues);
-                }
-            } else {
-                throw new Exception("The annotation " + RequestParameter.class.getName()
-                        + " can only be set on fields of type " + String.class.getName() + ", "
-                        + String[].class.getName() + ", " + int.class.getName() + " or " + boolean.class.getName()
-                        + ". (field=" + field.getName() + ", type=" + fieldType.getName() + ")");
+        String requestParameterName = field.getAnnotation(RequestParameter.class).value();
+        if (isBlank(requestParameterName)) {
+            requestParameterName = field.getName();
+        }
+
+        Class<?> fieldType = field.getType();
+        if (fieldType == String.class) {
+            String parameter = request.getParameter(requestParameterName);
+            if (parameter != null) {
+                field.set(controller, parameter);
+            }
+        } else if (fieldType == int.class) {
+            String parameter = request.getParameter(requestParameterName);
+            if (parameter != null) {
+                field.set(controller, Integer.parseInt(parameter));
+            }
+        } else if (fieldType == boolean.class) {
+            String parameter = request.getParameter(requestParameterName);
+            if (parameter != null) {
+                field.set(controller, Boolean.parseBoolean(parameter));
             }
+        } else if (fieldType == String[].class) {
+            String[] parameterValues = request.getParameterValues(requestParameterName);
+            if (parameterValues != null) {
+                field.set(controller, parameterValues);
+            }
+        } else {
+            throwIllegalFieldAnnotationException(RequestParameter.class, field, String.class, int.class,
+                    boolean.class, String[].class);
         }
     }
 
     private static void populateRequestHeaderFields(Map<String, ? extends Object> parameters, Object controller,
-            Map<Class<? extends Annotation>, List<Field>> annotatedFields) throws IllegalAccessException, Exception {
+            Map<Class<? extends Annotation>, List<Field>> annotatedFields) throws IllegalAccessException {
         List<Field> requestHeaderFields = annotatedFields.get(RequestHeader.class);
         if (requestHeaderFields == null || requestHeaderFields.isEmpty()) {
             return;
         }
 
-        HttpServletRequest request = HttpContextHelper.getRequest(parameters);
         for (Field field : requestHeaderFields) {
-            field.setAccessible(true);
+            populateRequestHeaderField(parameters, controller, field);
+        }
+    }
 
-            String name = field.getAnnotation(RequestHeader.class).value();
-            if (isBlank(name)) {
-                name = field.getName();
-            }
+    private static void populateRequestHeaderField(Map<String, ? extends Object> parameters, Object controller,
+            Field field) throws IllegalAccessException {
+        field.setAccessible(true);
+
+        HttpServletRequest request = HttpContextHelper.getRequest(parameters);
+
+        String name = field.getAnnotation(RequestHeader.class).value();
+        if (isBlank(name)) {
+            name = field.getName();
+        }
 
-            Class<?> fieldType = field.getType();
-            if (fieldType == String.class) {
-                String header = request.getHeader(name);
-                if (header != null) {
-                    field.set(controller, header);
-                }
-            } else {
-                throw new Exception("The annotation " + RequestHeader.class.getName()
-                        + " can only be set on fields of type " + String.class.getName() + "." + " " + "(field="
-                        + field.getName() + ", type=" + fieldType.getName() + ")");
+        Class<?> fieldType = field.getType();
+        if (fieldType == String.class) {
+            String header = request.getHeader(name);
+            if (header != null) {
+                field.set(controller, header);
             }
+        } else {
+            throwIllegalFieldAnnotationException(RequestHeader.class, field, String.class);
         }
     }
 
-    private static void populateSitemapParameters(Map<String, ? extends Object> configuration, Object controller,
-            Map<Class<? extends Annotation>, List<Field>> annotatedFields) throws IllegalAccessException, Exception {
+    private static void populateSitemapParameterFields(Map<String, ? extends Object> configuration, Object controller,
+            Map<Class<? extends Annotation>, List<Field>> annotatedFields) throws IllegalAccessException {
         List<Field> sitemapParameterFields = annotatedFields.get(SitemapParameter.class);
         if (sitemapParameterFields == null || sitemapParameterFields.isEmpty()) {
             return;
         }
 
         for (Field field : sitemapParameterFields) {
-            field.setAccessible(true);
+            populateSitemapParameterField(configuration, controller, field);
+        }
+    }
 
-            String name = field.getAnnotation(SitemapParameter.class).value();
-            if (isBlank(name)) {
-                name = field.getName();
-            }
+    private static void populateSitemapParameterField(Map<String, ? extends Object> configuration, Object controller,
+            Field field) throws IllegalAccessException {
+        field.setAccessible(true);
 
-            Class<?> fieldType = field.getType();
-            if (fieldType == String.class) {
-                field.set(controller, configuration.get(name));
-            } else {
-                throw new Exception("The annotation " + SitemapParameter.class.getName()
-                        + " can only be set on fields of type " + String.class.getName() + "." + " " + "(field="
-                        + field.getName() + ", type=" + fieldType.getName() + ")");
+        String name = field.getAnnotation(SitemapParameter.class).value();
+        if (isBlank(name)) {
+            name = field.getName();
+        }
+
+        Class<?> fieldType = field.getType();
+        if (fieldType == String.class) {
+            field.set(controller, configuration.get(name));
+        } else {
+            throwIllegalFieldAnnotationException(SitemapParameter.class, field, String.class);
+        }
+    }
+
+    private static void throwIllegalFieldAnnotationException(Class<? extends Annotation> annotationClass,
+            Field field, Class<?>... supportedTypes) {
+        StringBuilder stringBuilder = new StringBuilder();
+
+        stringBuilder.append("The annotation @");
+        stringBuilder.append(annotationClass.getSimpleName());
+        stringBuilder.append(" can only be set on fields of type ");
+
+        for (int i = 0; i < supportedTypes.length; i++) {
+            stringBuilder.append(supportedTypes[i].getSimpleName());
+
+            if (i < supportedTypes.length - 2) {
+                stringBuilder.append(", ");
+            } else if (i == supportedTypes.length - 2) {
+                stringBuilder.append(" or ");
             }
         }
+        stringBuilder.append(". (The field was '");
+        stringBuilder.append(Modifier.toString(field.getModifiers()));
+        stringBuilder.append(" ");
+        stringBuilder.append(field.getType().getName());
+        stringBuilder.append(" ");
+        stringBuilder.append(field.getName());
+        stringBuilder.append("')");
+
+        throw new IllegalFieldAnnotationException(stringBuilder.toString());
     }
 }

Added: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/UnknownControllerException.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/UnknownControllerException.java?rev=1156358&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/UnknownControllerException.java (added)
+++ cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/UnknownControllerException.java Wed Aug 10 20:38:56 2011
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.rest.controller;
+
+import org.apache.cocoon.pipeline.SetupException;
+
+public class UnknownControllerException extends SetupException {
+
+    private static final long serialVersionUID = 1L;
+
+    public UnknownControllerException(String message) {
+        super(message);
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/UnknownControllerException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/UnknownControllerException.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/UnknownControllerException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: cocoon/cocoon3/trunk/cocoon-rest/src/test/java/org/apache/cocoon/rest/controller/SpringRESTControllerTest.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/test/java/org/apache/cocoon/rest/controller/SpringRESTControllerTest.java?rev=1156358&r1=1156357&r2=1156358&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-rest/src/test/java/org/apache/cocoon/rest/controller/SpringRESTControllerTest.java (original)
+++ cocoon/cocoon3/trunk/cocoon-rest/src/test/java/org/apache/cocoon/rest/controller/SpringRESTControllerTest.java Wed Aug 10 20:38:56 2011
@@ -34,10 +34,11 @@ import org.apache.cocoon.configuration.M
 import org.apache.cocoon.rest.controller.response.Status;
 import org.apache.cocoon.servlet.util.HttpContextHelper;
 import org.apache.cocoon.servlet.util.SettingsHelper;
+import org.apache.cocoon.sitemap.InvocationException;
+import org.apache.cocoon.sitemap.util.ExceptionHandler;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.mock.web.MockHttpServletResponse;
@@ -46,13 +47,13 @@ import org.springframework.test.context.
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 @RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(locations = { "/META-INF/cocoon/spring/cocoon-rest.xml", "/cocoon-rest-test-controller.xml" })
+@ContextConfiguration(locations = {"/META-INF/cocoon/spring/cocoon-rest.xml", "/cocoon-rest-test-controller.xml"})
 public class SpringRESTControllerTest {
 
     @Autowired
     private SpringRESTController springRESTController;
 
-    @Test(expected = NoSuchBeanDefinitionException.class)
+    @Test(expected = UnknownControllerException.class)
     public void requestNonExistingController() {
         Map<String, Object> inputParameters = Collections.emptyMap();
         Map<String, ? extends Object> configuration = Collections.emptyMap();
@@ -89,54 +90,85 @@ public class SpringRESTControllerTest {
         }
     }
 
-    @Test(expected = Exception.class)
+    @Test
     public void requestControllerWithIllegalInjectField() {
         Map<String, Object> inputParameters = new HashMap<String, Object>();
         HttpContextHelper.storeRequest(new MockHttpServletRequest(), inputParameters);
         HttpContextHelper.storeResponse(new MockHttpServletResponse(), inputParameters);
 
         Map<String, ? extends Object> configuration = Collections.emptyMap();
-        this.springRESTController.setup("illegal-inject-field-controller", inputParameters, configuration);
+
+        try {
+            this.springRESTController.setup("illegal-inject-field-controller", inputParameters, configuration);
+        } catch (InvocationException e) {
+            assertCauseIsIllegalFieldAnnotation(e);
+        }
+    }
+
+    private static void assertCauseIsIllegalFieldAnnotation(InvocationException e) {
+        Throwable cause = ExceptionHandler.getCause(e);
+        assertTrue(cause instanceof IllegalFieldAnnotationException);
     }
 
-    @Test(expected = Exception.class)
+    @Test
     public void requestControllerWithIllegalRequestField() {
         Map<String, Object> inputParameters = new HashMap<String, Object>();
         HttpContextHelper.storeRequest(new MockHttpServletRequest(), inputParameters);
         HttpContextHelper.storeResponse(new MockHttpServletResponse(), inputParameters);
 
         Map<String, ? extends Object> configuration = Collections.emptyMap();
-        this.springRESTController.setup("illegal-request-field-controller", inputParameters, configuration);
+
+        try {
+            this.springRESTController.setup("illegal-request-field-controller", inputParameters, configuration);
+        } catch (InvocationException e) {
+            assertCauseIsIllegalFieldAnnotation(e);
+        }
     }
 
-    @Test(expected = Exception.class)
+    @Test
     public void requestControllerWithIllegalRequestHeaderField() {
         Map<String, Object> inputParameters = new HashMap<String, Object>();
         HttpContextHelper.storeRequest(new MockHttpServletRequest(), inputParameters);
         HttpContextHelper.storeResponse(new MockHttpServletResponse(), inputParameters);
 
         Map<String, ? extends Object> configuration = Collections.emptyMap();
-        this.springRESTController.setup("illegal-request-header-field-controller", inputParameters, configuration);
+
+        try {
+            this.springRESTController.setup("illegal-request-header-field-controller", inputParameters, configuration);
+        } catch (InvocationException e) {
+            assertCauseIsIllegalFieldAnnotation(e);
+        }
     }
 
-    @Test(expected = Exception.class)
+    @Test
     public void requestControllerWithIllegalSitemapParameterField() {
         Map<String, Object> inputParameters = new HashMap<String, Object>();
         HttpContextHelper.storeRequest(new MockHttpServletRequest(), inputParameters);
         HttpContextHelper.storeResponse(new MockHttpServletResponse(), inputParameters);
 
         Map<String, ? extends Object> configuration = Collections.emptyMap();
-        this.springRESTController.setup("illegal-sitemap-parameter-field-controller", inputParameters, configuration);
+
+        try {
+            this.springRESTController.setup("illegal-sitemap-parameter-field-controller", inputParameters,
+                    configuration);
+        } catch (InvocationException e) {
+            assertCauseIsIllegalFieldAnnotation(e);
+        }
     }
 
-    @Test(expected = Exception.class)
+    @Test
     public void requestControllerWithIllegalBaseURLField() {
         Map<String, Object> inputParameters = new HashMap<String, Object>();
         HttpContextHelper.storeRequest(new MockHttpServletRequest(), inputParameters);
         HttpContextHelper.storeResponse(new MockHttpServletResponse(), inputParameters);
 
         Map<String, ? extends Object> configuration = Collections.emptyMap();
-        this.springRESTController.setup("illegal-base-url-field-controller", inputParameters, configuration);
+
+        try {
+            this.springRESTController.setup("illegal-base-url-field-controller", inputParameters, configuration);
+        } catch (InvocationException e) {
+            assertCauseIsIllegalFieldAnnotation(e);
+        }
     }
 
     @Test
@@ -158,8 +190,8 @@ public class SpringRESTControllerTest {
         httpServletRequest.setParameter("alias-request-parameter", String.valueOf(Math.random()));
         httpServletRequest.setParameter("intRequestParameter", String.valueOf((int) Math.random() * 100));
         httpServletRequest.setParameter("booleanRequestParameter", String.valueOf(Math.random() < 0.5));
-        httpServletRequest.setParameter("stringArrayRequestParameter", new String[] { String.valueOf(Math.random()),
-                String.valueOf(Math.random()) });
+        httpServletRequest.setParameter("stringArrayRequestParameter", new String[] {String.valueOf(Math.random()),
+                String.valueOf(Math.random())});
 
         httpServletRequest.addHeader("stringRequestHeader", String.valueOf(Math.random()));
         httpServletRequest.addHeader("alias-request-header", String.valueOf(Math.random()));