tuscany-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From antel...@apache.org
Subject svn commit: r748042 - in /tuscany/java/sca/modules/stripes: pom.xml src/main/java/org/apache/tuscany/sca/stripes/TuscanyHelper.java
Date Thu, 26 Feb 2009 06:55:30 GMT
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);
+//        }
     }
 
     /**



Mime
View raw message