[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