Author: antelder
Date: Thu Feb 26 06:55:29 2009
New Revision: 748042

URL: http://svn.apache.org/viewvc?rev=748042&view=rev
Log:
Get the Stripes web framework integration working by finishing the Helper class

Modified:
    tuscany/java/sca/modules/stripes/pom.xml
    
tuscany/java/sca/modules/stripes/src/main/java/org/apache/tuscany/sca/stripes/TuscanyHelper.java

Modified: tuscany/java/sca/modules/stripes/pom.xml
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/stripes/pom.xml?rev=748042&r1=748041&r2=748042&view=diff
==============================================================================
--- tuscany/java/sca/modules/stripes/pom.xml (original)
+++ tuscany/java/sca/modules/stripes/pom.xml Thu Feb 26 06:55:29 2009
@@ -36,6 +36,11 @@
             <artifactId>tuscany-host-webapp</artifactId>
             <version>2.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-implementation-web-runtime</artifactId>
+            <version>2.0-SNAPSHOT</version>
+        </dependency>
         
         <dependency>
             <groupId>net.sourceforge.stripes</groupId>

Modified: 
tuscany/java/sca/modules/stripes/src/main/java/org/apache/tuscany/sca/stripes/TuscanyHelper.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/stripes/src/main/java/org/apache/tuscany/sca/stripes/TuscanyHelper.java?rev=748042&r1=748041&r2=748042&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/stripes/src/main/java/org/apache/tuscany/sca/stripes/TuscanyHelper.java
 (original)
+++ 
tuscany/java/sca/modules/stripes/src/main/java/org/apache/tuscany/sca/stripes/TuscanyHelper.java
 Thu Feb 26 06:55:29 2009
@@ -19,16 +19,6 @@
 
 package org.apache.tuscany.sca.stripes;
 
-import net.sourceforge.stripes.action.ActionBeanContext;
-import net.sourceforge.stripes.controller.StripesFilter;
-import net.sourceforge.stripes.exception.StripesRuntimeException;
-import net.sourceforge.stripes.util.Log;
-import net.sourceforge.stripes.util.ReflectUtil;
-import org.springframework.context.ApplicationContext;
-import org.springframework.core.NestedRuntimeException;
-import org.springframework.web.context.support.WebApplicationContextUtils;
-
-import javax.servlet.ServletContext;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.Collection;
@@ -36,50 +26,57 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import javax.servlet.ServletContext;
+
+import net.sourceforge.stripes.action.ActionBeanContext;
+import net.sourceforge.stripes.controller.StripesFilter;
+import net.sourceforge.stripes.exception.StripesRuntimeException;
+import net.sourceforge.stripes.util.Log;
+import net.sourceforge.stripes.util.ReflectUtil;
+
+import org.apache.tuscany.sca.implementation.web.runtime.WebApplicationUtils;
+import org.oasisopen.sca.annotation.Reference;
+
 /**
- * <p>Static helper class that is used to lookup Spring beans and inject them 
into objects
- * (often ActionBeans). Is capable of injecting beans through setter methods 
(property access)
+ * <p>Static helper class that is used to lookup SCA references and inject 
them into objects
+ * (often ActionBeans). Is capable of injecting references through setter 
methods (property access)
  * and also through direct field access if the security policy allows it. 
Methods and fields
- * must be annotated using the {...@code @SpringBean} annotation.</p>
+ * must be annotated using the SCA {...@code @Reference} annotation.</p>
  *
  * <p>Methods and fields may be public, protected, package-access or private. 
If they are not
  * public an attempt is made to call {...@link Method#setAccessible(boolean)} 
in order to make
  * them accessible from this class.  If the attempt fails, an exception will 
be thrown.</p>
  *
  * <p>Method names can take any form.  For example {...@code setSomeBean(Bean 
b)} or
- * {...@code someBean(bean b)}. In both cases, if a specific SpringBean name 
is not supplied,
+ * {...@code someBean(bean b)}. In both cases, if a specific Reference name is 
not supplied,
  * the default name of {...@code someBean} will be used.</p>
  *
- * <p>The value of the {...@code @SpringBean} annotation should be the bean 
name in the Spring
- * application context if it is different from the field/property name.  If 
the value
- * is left blank, an attempt is made to auto-wire the bean; first by 
field/property name and
- * then by type. If the value is left blank and more than one bean of the same 
type is found,
- * an exception will be raised.</p>
+ * <p>The value of the {...@code @Reference} annotation should be the 
reference on the 
+ * SCA component with an {...@code <implementation.web>} componentType. 
  *
  * <p>The first time that any of the injection methods in this class is called 
with a specific type
  * of object, the object's class is examined for annotated fields and methods. 
The discovered
  * fields and methods are then cached for future usage.</p>
  *
- * @see SpringBean
- * @author Dan Hayes, Tim Fennell
+ * Created for Tuscany from the Stripes SpringHelper written by Dan Hayes and 
Tim Fennell
  */
 public class TuscanyHelper {
     private static final Log log = Log.getInstance(TuscanyHelper.class);
 
-    /** Lazily filled in map of Class to methods annotated with SpringBean. */
+    /** Lazily filled in map of Class to methods annotated with Reference. */
     private static Map<Class<?>, Collection<Method>> methodMap =
             new ConcurrentHashMap<Class<?>, Collection<Method>>();
 
-    /** Lazily filled in map of Class to fields annotated with SpringBean. */
+    /** Lazily filled in map of Class to fields annotated with Reference. */
     private static Map<Class<?>, Collection<Field>> fieldMap =
             new ConcurrentHashMap<Class<?>, Collection<Field>>();
 
     /**
-     * Injects Spring managed beans into using a Web Application Context that 
is
+     * Injects SCA References using the ComponentContext that is
      * derived from the ServletContext, which is in turn looked up using the
      * ActionBeanContext.
      *
-     * @param bean    the object into which to inject spring managed bean
+     * @param bean    the object into which to inject SCA reference
      * @param context the ActionBeanContext represented by the current request
      */
     public static void injectBeans(Object bean, ActionBeanContext context) {
@@ -87,39 +84,27 @@
     }
 
     /**
-     * Injects Spring managed beans using a Web Application Context derived 
from
-     * the ServletContext.
-     *
-     * @param bean the object to have beans injected into
-     * @param ctx the ServletContext to use to find the Spring 
ApplicationContext
-     */
-    public static void injectBeans(Object bean, ServletContext ctx) {
-        ApplicationContext ac = 
WebApplicationContextUtils.getWebApplicationContext(ctx);
-        injectBeans(bean, ac);
-    }
-
-    /**
-     * Looks for all methods and fields annotated with {...@code @SpringBean} 
and attempts
+     * Looks for all methods and fields annotated with {...@code @Reference} 
and attempts
      * to lookup and inject a managed bean into the field/property. If any 
annotated
      * element cannot be injected an exception is thrown.
      *
-     * @param bean the bean into which to inject spring beans
-     * @param ctx the Spring application context
+     * @param bean the bean into which to inject SCA reference
+     * @param ctx the SCA ComponentContext
      */
-    public static void injectBeans(Object bean, ApplicationContext ctx) {
+    public static void injectBeans(Object bean, ServletContext ctx) {
         // First inject any values using annotated methods
         for (Method m : getMethods(bean.getClass())) {
             try {
-                SpringBean springBean = m.getAnnotation(SpringBean.class);
-                boolean nameSupplied = !"".equals(springBean.value());
-                String name = nameSupplied ? springBean.value() : 
methodToPropertyName(m);
+                Reference scaReference = m.getAnnotation(Reference.class);
+                boolean nameSupplied = !"".equals(scaReference.name());
+                String name = nameSupplied ? scaReference.name() : 
methodToPropertyName(m);
                 Class<?> beanType = m.getParameterTypes()[0];
-                Object managedBean = findSpringBean(ctx, name, beanType, 
!nameSupplied);
+                Object managedBean = findReference(ctx, name, beanType, 
!nameSupplied);
                 m.invoke(bean, managedBean);
             }
             catch (Exception e) {
                 throw new StripesRuntimeException("Exception while trying to 
lookup and inject " +
-                    "a Spring bean into a bean of type " + 
bean.getClass().getSimpleName() +
+                    "an SCA Reference into a bean of type " + 
bean.getClass().getSimpleName() +
                     " using method " + m.toString(), e);
             }
         }
@@ -127,28 +112,28 @@
         // And then inject any properties that are annotated
         for (Field f : getFields(bean.getClass())) {
             try {
-                SpringBean springBean = f.getAnnotation(SpringBean.class);
-                boolean nameSupplied = !"".equals(springBean.value());
-                String name = nameSupplied ? springBean.value() : f.getName();
-                Object managedBean = findSpringBean(ctx, name, f.getType(), 
!nameSupplied);
+                Reference scaReference = f.getAnnotation(Reference.class);
+                boolean nameSupplied = !"".equals(scaReference.name());
+                String name = nameSupplied ? scaReference.name() : f.getName();
+                Object managedBean = findReference(ctx, name, f.getType(), 
!nameSupplied);
                 f.set(bean, managedBean);
             }
             catch (Exception e) {
                 throw new StripesRuntimeException("Exception while trying to 
lookup and inject " +
-                    "a Spring bean into a bean of type " + 
bean.getClass().getSimpleName() +
+                    "an SCA Referenceinto a bean of type " + 
bean.getClass().getSimpleName() +
                     " using field access on field " + f.toString(), e);
             }
         }
     }
 
     /**
-     * Fetches the methods on a class that are annotated with SpringBean. The 
first time it
+     * Fetches the methods on a class that are annotated with Reference. The 
first time it
      * is called for a particular class it will introspect the class and cache 
the results.
      * All non-overridden methods are examined, including protected and 
private methods.
      * If a method is not public an attempt it made to make it accessible - if 
it fails
      * it is removed from the collection and an error is logged.
      *
-     * @param clazz the class on which to look for SpringBean annotated methods
+     * @param clazz the class on which to look for Reference annotated methods
      * @return the collection of methods with the annotation
      */
     protected static Collection<Method> getMethods(Class<?> clazz) {
@@ -159,7 +144,7 @@
 
             while (iterator.hasNext()) {
                 Method method = iterator.next();
-                if (!method.isAnnotationPresent(SpringBean.class)) {
+                if (!method.isAnnotationPresent(Reference.class)) {
                     iterator.remove();
                 }
                 else {
@@ -171,7 +156,7 @@
                         catch (SecurityException se) {
                             throw new StripesRuntimeException(
                                 "Method " + clazz.getName() + "." + 
method.getName() + "is marked " +
-                                "with @SpringBean and is not public. An 
attempt to call " +
+                                "with @Reference and is not public. An attempt 
to call " +
                                 "setAccessible(true) resulted in a 
SecurityException. Please " +
                                 "either make the method public or modify your 
JVM security " +
                                 "policy to allow Stripes to 
setAccessible(true).", se);
@@ -181,7 +166,7 @@
                     // Ensure the method has only the one parameter
                     if (method.getParameterTypes().length != 1) {
                         throw new StripesRuntimeException(
-                            "A method marked with @SpringBean must have 
exactly one parameter: " +
+                            "A method marked with @Reference must have exactly 
one parameter: " +
                             "the bean to be injected. Method [" + 
method.toGenericString() + "] has " +
                             method.getParameterTypes().length + " parameters."
                         );
@@ -196,13 +181,13 @@
     }
 
     /**
-     * Fetches the fields on a class that are annotated with SpringBean. The 
first time it
+     * Fetches the fields on a class that are annotated with Refernece. The 
first time it
      * is called for a particular class it will introspect the class and cache 
the results.
      * All non-overridden fields are examined, including protected and private 
fields.
      * If a field is not public an attempt it made to make it accessible - if 
it fails
      * it is removed from the collection and an error is logged.
      *
-     * @param clazz the class on which to look for SpringBean annotated fields
+     * @param clazz the class on which to look for Reference annotated fields
      * @return the collection of methods with the annotation
      */
     protected static Collection<Field> getFields(Class<?> clazz) {
@@ -213,7 +198,7 @@
 
             while (iterator.hasNext()) {
                 Field field = iterator.next();
-                if (!field.isAnnotationPresent(SpringBean.class)) {
+                if (!field.isAnnotationPresent(Reference.class)) {
                     iterator.remove();
                 }
                 else if (!field.isAccessible()) {
@@ -224,7 +209,7 @@
                     catch (SecurityException se) {
                         throw new StripesRuntimeException(
                             "Field " + clazz.getName() + "." + field.getName() 
+ "is marked " +
-                            "with @SpringBean and is not public. An attempt to 
call " +
+                            "with @Reference and is not public. An attempt to 
call " +
                             "setAccessible(true) resulted in a 
SecurityException. Please " +
                             "either make the field public, annotate a public 
setter instead " +
                             "or modify your JVM security policy to allow 
Stripes to " +
@@ -240,53 +225,54 @@
     }
 
     /**
-     * Looks up a Spring managed bean from an Application Context. First looks 
for a bean
+     * Looks up an SCA Reference from a ComponentContext. First looks for a 
bean
      * with name specified. If no such bean exists, looks for a bean by type. 
If there is
      * only one bean of the appropriate type, it is returned. If zero or more 
than one bean
      * of the correct type exists, an exception is thrown.
      *
-     * @param ctx the Spring Application Context
-     * @param name the name of the spring bean to look for
+     * @param ctx the SCA ComponentContext
+     * @param name the name of the reference to look for
      * @param type the type of bean to look for
      * @param allowFindByType true to indicate that finding a bean by type is 
acceptable
      *        if find by name fails.
      * @exception RuntimeException various subclasses of RuntimeException are 
thrown if it
-     *            is not possible to find a unique matching bean in the spring 
context given
+     *            is not possible to find a unique matching bean in the 
ComponentContext given
      *            the constraints supplied.
      */
-    protected static Object findSpringBean(ApplicationContext ctx,
+    protected static Object findReference(ServletContext ctx,
                                            String name,
                                            Class<?> type,
                                            boolean allowFindByType) {
         // First try to lookup using the name provided
-        try {
-            Object bean =  ctx.getBean(name, type);
-            log.debug("Found spring bean with name [", name, "] and type [",
+            Object bean =  WebApplicationUtils.getReference(name, type, ctx);
+            if (bean == null) {
+                throw new StripesRuntimeException("no reference defined:" + 
name);
+            }
+
+            log.debug("Found sca reference with name [", name, "] and type [",
                       bean.getClass().getName(), "]");
             return bean;
-        }
-        catch (NestedRuntimeException nre) {
-            if (!allowFindByType) throw nre;
-        }
 
-        // If we got here then we didn't find a bean yet, try by type
-        String[] beanNames = ctx.getBeanNamesForType(type);
-        if (beanNames.length == 0) {
-            throw new StripesRuntimeException(
-                "Unable to find SpringBean with name [" + name + "] or type [" 
+
-                type.getName() + "] in the Spring application context.");
-        }
-        else if (beanNames.length > 1) {
-            throw new StripesRuntimeException(
-                "Unable to find SpringBean with name [" + name + "] or unique 
bean with type [" +
-                type.getName() + "] in the Spring application context. Found " 
+ beanNames.length +
-                "beans of matching type.");
-        }
-        else {
-            log.warn("Found unique SpringBean with type [" + type.getName() + 
"]. Matching on ",
-                     "type is a little risky so watch out!");
-            return ctx.getBean(beanNames[0], type);
-        }
+// TODO: Support get by type (sca autowire?)            
+            
+//        // If we got here then we didn't find a bean yet, try by type
+//        String[] beanNames = ctx.getBeanNamesForType(type);
+//        if (beanNames.length == 0) {
+//            throw new StripesRuntimeException(
+//                "Unable to find SpringBean with name [" + name + "] or type 
[" +
+//                type.getName() + "] in the Spring application context.");
+//        }
+//        else if (beanNames.length > 1) {
+//            throw new StripesRuntimeException(
+//                "Unable to find SpringBean with name [" + name + "] or 
unique bean with type [" +
+//                type.getName() + "] in the Spring application context. Found 
" + beanNames.length +
+//                "beans of matching type.");
+//        }
+//        else {
+//            log.warn("Found unique SpringBean with type [" + type.getName() 
+ "]. Matching on ",
+//                     "type is a little risky so watch out!");
+//            return ctx.getBean(beanNames[0], type);
+//        }
     }
 
     /**


Reply via email to