crafterm 2002/10/08 08:04:40
Modified: xfc/src/java/org/apache/excalibur/xfc/modules ECM.java
Log:
Fixed component handler analysis defect uncovered by latest testcase:
Since ECM marker interfaces can be extended from, all interfaces and
subinterfaces of components need to be examined when performing
handler analysis to correctly determine which component handler should
be used for that particular component.
Revision Changes Path
1.7 +43 -13
jakarta-avalon-excalibur/xfc/src/java/org/apache/excalibur/xfc/modules/ECM.java
Index: ECM.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/xfc/src/java/org/apache/excalibur/xfc/modules/ECM.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ECM.java 8 Oct 2002 12:49:22 -0000 1.6
+++ ECM.java 8 Oct 2002 15:04:40 -0000 1.7
@@ -330,23 +330,18 @@
try
{
Class clazz = Class.forName( classname );
- Class[] interfaces = clazz.getInterfaces();
+ String handler = getNormalizedHandlerName( clazz );
- for ( int i = 0; i < interfaces.length; ++i )
+ if ( handler != null )
{
- String interfaze = interfaces[i].getName();
-
- if ( m_handlers.containsKey( interfaze ) )
- {
- return (String) m_handlers.get( interfaze );
- }
+ return handler;
}
- if ( getLogger().isWarnEnabled() )
+ if ( getLogger().isInfoEnabled() )
{
- getLogger().warn(
- "Defaulting to 'transient' lifestyle for component " +
- clazz.getName()
+ getLogger().info(
+ "No known component handler discovered on " + clazz.getName() +
+ ", defaulting to 'transient'"
);
}
@@ -371,6 +366,41 @@
return TRANSIENT;
}
+ }
+
+ /**
+ * Method to find out the normalized handler name for a given Class
+ * object. It checks all interfaces implemented by the given Class,
+ * and all subinterfaces of those interfaces, recursively, until
+ * either a known component marker is found, or all interfaces
+ * are exhausted.
+ *
+ * @param interfaze a <code>Class</code> instance
+ * @return normalized handler name
+ */
+ private String getNormalizedHandlerName( final Class interfaze )
+ {
+ // get all interfaces implemented by this Class
+ Class[] interfaces = interfaze.getInterfaces();
+
+ for ( int i = 0; i < interfaces.length; ++i )
+ {
+ // check if this interface is a known component marker
+ if ( m_handlers.containsKey( interfaces[i].getName() ) )
+ {
+ return (String) m_handlers.get( interfaces[i].getName() );
+ }
+
+ // if it's unknown, check for any subinterfaces and recurse
+ String handler = getNormalizedHandlerName( interfaces[i] );
+
+ // if a subinterface is known, return
+ if ( handler != null )
+ return handler;
+ }
+
+ // all interfaces unknown
+ return null;
}
/**
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>