You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by fm...@apache.org on 2009/08/03 09:46:48 UTC
svn commit: r800242 - in /felix/trunk/scr/src:
main/java/org/apache/felix/scr/impl/helper/
main/java/org/apache/felix/scr/impl/manager/
main/java/org/apache/felix/scr/impl/metadata/
test/java/org/apache/felix/scr/impl/metadata/
Author: fmeschbe
Date: Mon Aug 3 07:46:48 2009
New Revision: 800242
URL: http://svn.apache.org/viewvc?rev=800242&view=rev
Log:
FELIX-1437 Include declaration namespace in the decision of which
method signature to accept.
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ReflectionHelper.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/UnbindMethod.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ComponentMetadata.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ReferenceMetadata.java
felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/metadata/XmlHandlerTest.java
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ReflectionHelper.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ReflectionHelper.java?rev=800242&r1=800241&r2=800242&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ReflectionHelper.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ReflectionHelper.java Mon Aug 3 07:46:48 2009
@@ -50,14 +50,17 @@
public static final Class MAP_CLASS = Map.class;
public static final Class INTEGER_CLASS = Integer.class;
- // Helper used to find the best matching activate and modified methods
- public static final ActivatorMethodTester ACTIVATE_ACCEPTED_PARAMETERS = new ActivatorMethodTester( new Class[]
+ // Helper used to find the best matching activate and modified methods (DS 1.1 and newer)
+ public static final MethodTester ACTIVATE_ACCEPTED_PARAMETERS = new ActivatorMethodTester( new Class[]
{ COMPONENT_CONTEXT_CLASS, BUNDLE_CONTEXT_CLASS, MAP_CLASS } );
- // Helper used to find the best matching deactivate method
- public static final ActivatorMethodTester DEACTIVATE_ACCEPTED_PARAMETERS = new ActivatorMethodTester( new Class[]
+ // Helper used to find the best matching deactivate method (DS 1.1 and newer)
+ public static final MethodTester DEACTIVATE_ACCEPTED_PARAMETERS = new ActivatorMethodTester( new Class[]
{ COMPONENT_CONTEXT_CLASS, BUNDLE_CONTEXT_CLASS, MAP_CLASS, Integer.TYPE, INTEGER_CLASS } );
+ // Helper used to find the best matching activate/deactivate method (DS 1.0)
+ public static final MethodTester ACTIVATOR_10_ACCEPTED_PARAMETERS = new ActivatorMethodTester10();
+
static
{
Method tmpSentinel = null;
@@ -107,15 +110,16 @@
throws NoSuchMethodException, InvocationTargetException
{
// whether we accept package private methods
- boolean acceptPackage = true;
+ boolean acceptPackage = tester.acceptPackage();
final String packageName = getPackageName( objectClass );
final Class[] parameterTypesList = tester.getParameterLists();
for ( Class clazz = objectClass; clazz != null; clazz = clazz.getSuperclass() )
{
- // turns false on first package not equal to the package of objectClass
- acceptPackage &= packageName.equals( getPackageName( clazz ) );
- final boolean acceptPrivate = clazz == objectClass;
+ // turns false on first package not equal to the package of objectClass (or different class loader)
+ acceptPackage &= packageName.equals( getPackageName( clazz ) )
+ && clazz.getClassLoader() == objectClass.getClassLoader();
+ final boolean acceptPrivate = tester.acceptPrivate() && clazz == objectClass;
// check parameter types first
for ( int i = 0; i < parameterTypesList.length; i++ )
@@ -158,7 +162,7 @@
try
{
// find the declared method in this class
- return getMethod( clazz, name, null, clazz == objectClass, acceptPackage );
+ return getMethod( clazz, name, null, acceptPrivate, acceptPackage );
}
catch ( NoSuchMethodException nsme )
{
@@ -321,6 +325,15 @@
*/
boolean acceptEmpty();
+ /**
+ * Returns <code>true</code> if private methods are allowed at all.
+ */
+ boolean acceptPrivate();
+
+ /**
+ * Returns <code>true</code> if package private methods are allowed at all.
+ */
+ boolean acceptPackage();
/**
* Returns <code>true</code> if the method <code>m</code> is suitable for
@@ -336,6 +349,11 @@
Class[] getParameterLists();
}
+ /**
+ * The <code>ActivatorMethodTester</code> class implements the {@link MethodTester}
+ * interface to test methods applicable for Components declared with the
+ * SCR 1.1 (or newer) specification namespace.
+ */
public static final class ActivatorMethodTester implements ReflectionHelper.MethodTester
{
private final Class[] parameterLists;
@@ -356,6 +374,18 @@
}
+ public boolean acceptPrivate()
+ {
+ return true;
+ }
+
+
+ public boolean acceptPackage()
+ {
+ return true;
+ }
+
+
public boolean isSuitable( Method m )
{
Class[] types = m.getParameterTypes();
@@ -386,4 +416,52 @@
}
+
+ /**
+ * The <code>ActivatorMethodTester10</code> class implements the
+ * {@link MethodTester} interface to test methods applicable for Components
+ * declared with the original SCR 1.0 specification namespace.
+ */
+ public static final class ActivatorMethodTester10 implements ReflectionHelper.MethodTester
+ {
+
+ private static final Class[] PARAMETER_LIST =
+ { COMPONENT_CONTEXT_CLASS };
+
+
+ public boolean acceptEmpty()
+ {
+ // DS 1.0 activator methods only accept ComponentContext
+ return false;
+ }
+
+
+ public boolean acceptPrivate()
+ {
+ // DS 1.0 activator methods may only be public or protected
+ return true;
+ }
+
+
+ public boolean acceptPackage()
+ {
+ // DS 1.0 activator methods may only be public or protected
+ return true;
+ }
+
+
+ public boolean isSuitable( Method m )
+ {
+ // DS 1.0 activator methods only accept ComponentContext
+ Class[] types = m.getParameterTypes();
+ return types.length == 1 && types[0] == COMPONENT_CONTEXT_CLASS;
+ }
+
+
+ public Class[] getParameterLists()
+ {
+ return PARAMETER_LIST;
+ }
+ }
+
}
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java?rev=800242&r1=800241&r2=800242&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java Mon Aug 3 07:46:48 2009
@@ -128,13 +128,15 @@
m_componentManager.log( level, message, m_componentManager.getComponentMetadata(), ex );
}
};
- m_bind = new BindMethod( m_dependencyMetadata.getBind(),
+ m_bind = new BindMethod( m_componentManager.getComponentMetadata().isDS11(),
+ m_dependencyMetadata.getBind(),
m_componentInstance.getClass(),
m_dependencyMetadata.getName(),
m_dependencyMetadata.getInterface(),
logger
);
- m_unbind = new UnbindMethod( m_dependencyMetadata.getUnbind(),
+ m_unbind = new UnbindMethod( m_componentManager.getComponentMetadata().isDS11(),
+ m_dependencyMetadata.getUnbind(),
m_componentInstance.getClass(),
m_dependencyMetadata.getName(),
m_dependencyMetadata.getInterface(),
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java?rev=800242&r1=800241&r2=800242&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java Mon Aug 3 07:46:48 2009
@@ -190,8 +190,17 @@
// get the method
if ( activateMethod == ReflectionHelper.SENTINEL )
{
- activateMethod = getMethod( implementationObject, getComponentMetadata().getActivate(),
- ReflectionHelper.ACTIVATE_ACCEPTED_PARAMETERS );
+ // FELIX-1437: New signatures only with DS 1.1 namespace declaration
+ if ( getComponentMetadata().isDS11() )
+ {
+ activateMethod = getMethod( implementationObject, getComponentMetadata().getActivate(),
+ ReflectionHelper.ACTIVATE_ACCEPTED_PARAMETERS );
+ }
+ else
+ {
+ activateMethod = getMethod( implementationObject, getComponentMetadata().getActivate(),
+ ReflectionHelper.ACTIVATOR_10_ACCEPTED_PARAMETERS );
+ }
}
// 4. Call the activate method, if present
@@ -220,8 +229,17 @@
// get the method
if ( deactivateMethod == ReflectionHelper.SENTINEL )
{
- deactivateMethod = getMethod( implementationObject, getComponentMetadata().getDeactivate(),
- ReflectionHelper.DEACTIVATE_ACCEPTED_PARAMETERS );
+ // FELIX-1437: New signatures only with DS 1.1 namespace declaration
+ if ( getComponentMetadata().isDS11() )
+ {
+ deactivateMethod = getMethod( implementationObject, getComponentMetadata().getDeactivate(),
+ ReflectionHelper.DEACTIVATE_ACCEPTED_PARAMETERS );
+ }
+ else
+ {
+ deactivateMethod = getMethod( implementationObject, getComponentMetadata().getDeactivate(),
+ ReflectionHelper.ACTIVATOR_10_ACCEPTED_PARAMETERS );
+ }
}
// 1. Call the deactivate method, if present
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/UnbindMethod.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/UnbindMethod.java?rev=800242&r1=800241&r2=800242&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/UnbindMethod.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/UnbindMethod.java Mon Aug 3 07:46:48 2009
@@ -25,10 +25,10 @@
class UnbindMethod extends BindMethod
{
- UnbindMethod( final String methodName, final Class componentClass, final String referenceName,
- final String referenceClassName, final Logger logger )
+ UnbindMethod( final boolean isDS11, final String methodName, final Class componentClass,
+ final String referenceName, final String referenceClassName, final Logger logger )
{
- super( methodName, componentClass, referenceName, referenceClassName, logger );
+ super( isDS11, methodName, componentClass, referenceName, referenceClassName, logger );
}
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ComponentMetadata.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ComponentMetadata.java?rev=800242&r1=800241&r2=800242&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ComponentMetadata.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ComponentMetadata.java Mon Aug 3 07:46:48 2009
@@ -345,6 +345,16 @@
/**
+ * Returns <code>true</code> if the metadata declaration has used the
+ * Declarative Services version 1.1 namespace or a later namespace.
+ */
+ public boolean isDS11()
+ {
+ return getNamespaceCode() >= XmlHandler.DS_VERSION_1_1;
+ }
+
+
+ /**
* Returns the name of the component
*
* @return A string containing the name of the component
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ReferenceMetadata.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ReferenceMetadata.java?rev=800242&r1=800241&r2=800242&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ReferenceMetadata.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ReferenceMetadata.java Mon Aug 3 07:46:48 2009
@@ -162,7 +162,7 @@
}
m_policy = policy;
-
+
// secondary property
m_isStatic = POLICY_STATIC.equals( policy );
}
@@ -354,7 +354,7 @@
if ( m_name == null )
{
// 112.10 name attribute is optional, defaults to interface since DS 1.1
- if ( componentMetadata.getNamespaceCode() < XmlHandler.DS_VERSION_1_1 )
+ if ( !componentMetadata.isDS11() )
{
throw componentMetadata.validationFailure( "A name must be declared for the reference" );
}
@@ -365,7 +365,7 @@
{
throw componentMetadata.validationFailure( "An interface must be declared for the reference" );
}
-
+
if ( m_cardinality == null )
{
Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/metadata/XmlHandlerTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/metadata/XmlHandlerTest.java?rev=800242&r1=800241&r2=800242&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/metadata/XmlHandlerTest.java (original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/metadata/XmlHandlerTest.java Mon Aug 3 07:46:48 2009
@@ -60,6 +60,7 @@
final ComponentMetadata cm10 = ( ComponentMetadata ) metadataList10.get( 0 );
cm10.validate( logger );
assertEquals( "DS Version 1.0", XmlHandler.DS_VERSION_1_0, cm10.getNamespaceCode() );
+ assertFalse( "DS Version 1.0", cm10.isDS11() );
assertEquals( "Expected Activate Method not set", "activate", cm10.getActivate() );
assertEquals( "Expected Deactivate Method not set", "deactivate", cm10.getDeactivate() );
assertNull( "Expected Modified Method not set", cm10.getModified() );
@@ -134,7 +135,8 @@
// dont validate this, we test the raw reading
// ds namespace
- assertEquals( "ds name space", XmlHandler.DS_VERSION_1_0, cm10.getNamespaceCode() );
+ assertEquals( "DS Version 1.0", XmlHandler.DS_VERSION_1_0, cm10.getNamespaceCode() );
+ assertFalse( "DS Version 1.0", cm10.isDS11() );
// base component attributes
assertEquals( "component name", true, cm10.isEnabled() );