[jboss-cvs] jboss-seam/src/main/org/jboss/seam ...

Gavin King gavin.king at jboss.com
Mon Jun 18 17:32:03 EDT 2007


  User: gavin   
  Date: 07/06/18 17:32:03

  Modified:    src/main/org/jboss/seam  Component.java
  Log:
  make @Destroy optional on default @Remove method
  
  Revision  Changes    Path
  1.256     +283 -229  jboss-seam/src/main/org/jboss/seam/Component.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: Component.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/Component.java,v
  retrieving revision 1.255
  retrieving revision 1.256
  diff -u -b -r1.255 -r1.256
  --- Component.java	18 Jun 2007 04:54:10 -0000	1.255
  +++ Component.java	18 Jun 2007 21:32:03 -0000	1.256
  @@ -154,6 +154,7 @@
      private Method destroyMethod;
      private Method createMethod;
      private Method unwrapMethod;
  +   private Method defaultRemoveMethod;
      
      //TODO: check the EJB3 spec, I think you
      //      are allowed to have multiple
  @@ -247,7 +248,7 @@
            );
   
         initMembers( getBeanClass(), applicationContext );
  -      checkDestroyMethod();
  +      checkDefaultRemoveMethod();
   
         businessInterfaces = getBusinessInterfaces( getBeanClass() );
   
  @@ -376,11 +377,11 @@
         }
      }
   
  -   private void checkDestroyMethod()
  +   private void checkDefaultRemoveMethod()
      {
  -      if ( type==STATEFUL_SESSION_BEAN && ( destroyMethod==null || !removeMethods.values().contains(destroyMethod) ) )
  +      if ( type==STATEFUL_SESSION_BEAN && getDefaultRemoveMethod()==null )
         {
  -         throw new IllegalArgumentException("Stateful session bean component should have a method marked @Remove @Destroy: " + name);
  +         throw new IllegalArgumentException("Stateful session bean component must have a method with no parameters marked @Remove: " + name);
         }
      }
   
  @@ -491,9 +492,55 @@
   
         for ( ; clazz!=Object.class; clazz = clazz.getSuperclass() )
         {
  -
            for ( Method method: clazz.getDeclaredMethods() )
            {
  +            scanMethod(applicationContext, selectionSetters, dataModelNames, method);
  +         }
  +
  +         for ( Field field: clazz.getDeclaredFields() )
  +         {
  +            scanField(selectionFields, dataModelNames, field);
  +         }
  +      }
  +
  +      final boolean hasMultipleDataModels = dataModelGetters.size() > 1;
  +      String defaultDataModelName = null;
  +      if ( !hasMultipleDataModels )
  +      {
  +         if ( !dataModelGetters.isEmpty() )
  +         {
  +            defaultDataModelName = dataModelGetters.get(0).getName();
  +         }
  +      }
  +
  +      for (Map.Entry<Method, Annotation> annotatedMethod: selectionSetters.entrySet())
  +      {
  +         Method method = annotatedMethod.getKey();
  +         Annotation ann = annotatedMethod.getValue();
  +         String name = getDataModelSelectionName(dataModelNames, hasMultipleDataModels, defaultDataModelName, ann);
  +         Object existing = dataModelSelectionSetters.put( name, new BijectedMethod(name, method, ann) );
  +         if (existing!=null)
  +         {
  +            throw new IllegalStateException("Multiple @DataModelSelection setters for: " + name);
  +         }
  +      }
  +
  +      for (Map.Entry<Field, Annotation> annotatedField: selectionFields.entrySet())
  +      {
  +         Field field = annotatedField.getKey();
  +         Annotation ann = annotatedField.getValue();
  +         String name = getDataModelSelectionName(dataModelNames, hasMultipleDataModels, defaultDataModelName, ann);
  +         Object existing = dataModelSelectionSetters.put( name, new BijectedField(name, field, ann) );
  +         if (existing!=null)
  +         {
  +            throw new IllegalStateException("Multiple @DataModelSelection fields for: " + name);
  +         }
  +      }
  +
  +   }
  +
  +   private void scanMethod(Context applicationContext, Map<Method, Annotation> selectionSetters, Set<String> dataModelNames, Method method)
  +   {
               if ( method.isAnnotationPresent(IfInvalid.class) )
               {
                  validateMethods.add(method);
  @@ -501,8 +548,12 @@
               if ( method.isAnnotationPresent(REMOVE) )
               {
                  removeMethods.put( method.getName(), method );
  +         if ( method.getParameterTypes().length==0 )
  +         {
  +            defaultRemoveMethod = method;
               }
  -            if ( method.isAnnotationPresent(Destroy.class) )
  +      }
  +      if ( method.isAnnotationPresent(Destroy.class) && method!=getDefaultRemoveMethod() )
               {
                  /*if ( method.getParameterTypes().length>0 ) and it doesnt take a Component paramater
                  {
  @@ -647,12 +698,10 @@
               {
                  method.setAccessible(true);
               }
  -
            }
   
  -         for ( Field field: clazz.getDeclaredFields() )
  +   private void scanField(Map<Field, Annotation> selectionFields, Set<String> dataModelNames, Field field)
            {
  -
               if ( !field.isAccessible() )
               {
                  field.setAccessible(true);
  @@ -720,45 +769,6 @@
                     selectionFields.put(field, ann);
                  }
               }
  -
  -         }
  -
  -      }
  -
  -      final boolean hasMultipleDataModels = dataModelGetters.size() > 1;
  -      String defaultDataModelName = null;
  -      if ( !hasMultipleDataModels )
  -      {
  -         if ( !dataModelGetters.isEmpty() )
  -         {
  -            defaultDataModelName = dataModelGetters.get(0).getName();
  -         }
  -      }
  -
  -      for (Map.Entry<Method, Annotation> annotatedMethod: selectionSetters.entrySet())
  -      {
  -         Method method = annotatedMethod.getKey();
  -         Annotation ann = annotatedMethod.getValue();
  -         String name = getDataModelSelectionName(dataModelNames, hasMultipleDataModels, defaultDataModelName, ann);
  -         Object existing = dataModelSelectionSetters.put( name, new BijectedMethod(name, method, ann) );
  -         if (existing!=null)
  -         {
  -            throw new IllegalStateException("Multiple @DataModelSelection setters for: " + name);
  -         }
  -      }
  -
  -      for (Map.Entry<Field, Annotation> annotatedField: selectionFields.entrySet())
  -      {
  -         Field field = annotatedField.getKey();
  -         Annotation ann = annotatedField.getValue();
  -         String name = getDataModelSelectionName(dataModelNames, hasMultipleDataModels, defaultDataModelName, ann);
  -         Object existing = dataModelSelectionSetters.put( name, new BijectedField(name, field, ann) );
  -         if (existing!=null)
  -         {
  -            throw new IllegalStateException("Multiple @DataModelSelection fields for: " + name);
  -         }
  -      }
  -
      }
   
      protected void checkPersistenceContextForComponentType()
  @@ -1219,6 +1229,40 @@
         return bean;
      }
   
  +   public void destroy(Object bean)
  +   {
  +      try
  +      {
  +         callDestroyMethod(bean);
  +      }
  +      catch (Exception e)
  +      {
  +         log.warn("Exception calling component @Destroy method: " + name, e);
  +      }
  +      if ( getType()==STATEFUL_SESSION_BEAN )
  +      {
  +         try
  +         {
  +            callDefaultRemoveMethod(bean);
  +         }
  +         catch (Exception e)
  +         {
  +            log.warn("Exception calling stateful session bean default @Remove method: " + name, e);
  +         }
  +      }
  +      else if ( getType()==JAVA_BEAN )
  +      {
  +         try
  +         {
  +            callPreDestroyMethod(bean);
  +         }
  +         catch (Exception e)
  +         {
  +            log.warn("Exception calling JavaBean @PreDestroy method: " + name, e);
  +         }
  +      }
  +   }
  +
      /**
       * Wrap a CGLIB interceptor around an instance of the component
       */
  @@ -1835,6 +1879,16 @@
         return instance;
      }
   
  +   private void callDefaultRemoveMethod(Object instance)
  +   {
  +      callComponentMethod( instance, getDefaultRemoveMethod() );
  +   }
  +
  +   public Method getDefaultRemoveMethod()
  +   {
  +      return defaultRemoveMethod;
  +   }
  +
      public void callCreateMethod(Object instance)
      {
         if ( hasCreateMethod() )
  
  
  



More information about the jboss-cvs-commits mailing list