Return-Path: Delivered-To: apmail-felix-commits-archive@www.apache.org Received: (qmail 9889 invoked from network); 6 Oct 2009 14:14:00 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 6 Oct 2009 14:14:00 -0000 Received: (qmail 24509 invoked by uid 500); 6 Oct 2009 14:14:00 -0000 Delivered-To: apmail-felix-commits-archive@felix.apache.org Received: (qmail 24487 invoked by uid 500); 6 Oct 2009 14:13:59 -0000 Mailing-List: contact commits-help@felix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@felix.apache.org Delivered-To: mailing list commits@felix.apache.org Received: (qmail 24478 invoked by uid 99); 6 Oct 2009 14:13:59 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 06 Oct 2009 14:13:59 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 06 Oct 2009 14:13:46 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id B115C23888EA; Tue, 6 Oct 2009 14:13:24 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r822285 - in /felix/trunk/scr/src: main/java/org/apache/felix/scr/ 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/he... Date: Tue, 06 Oct 2009 14:13:21 -0000 To: commits@felix.apache.org From: fmeschbe@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091006141324.B115C23888EA@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: fmeschbe Date: Tue Oct 6 14:13:14 2009 New Revision: 822285 URL: http://svn.apache.org/viewvc?rev=822285&view=rev Log: FELIX-1686 Record in the component metadata whether the activate/deactivate method was declared or not to be able to decide whether the activate/deactivate method must be present (if declared) or may be present (if not declared). This allows failing the component activation if the declared method is missing. Added: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java (with props) felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java (with props) felix/trunk/scr/src/test/resources/integration_test_activation_components.xml (with props) Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/Component.java felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/DeactivateMethod.java felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ModifiedMethod.java felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/UnbindMethod.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/metadata/ComponentMetadata.java felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/helper/ActivateMethodTest.java felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/metadata/ComponentMetadataTest.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/Component.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/Component.java?rev=822285&r1=822284&r2=822285&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/Component.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/Component.java Tue Oct 6 14:13:14 2009 @@ -22,6 +22,7 @@ import java.util.Dictionary; import org.osgi.framework.Bundle; +import org.osgi.service.component.ComponentInstance; /** @@ -191,6 +192,69 @@ /** + * Returns the org.osgi.service.component.ComponentInstance + * representing this component or null if this component + * is not been activated yet. + */ + ComponentInstance getComponentInstance(); + + + /** + * Returns the name of the method to be called when the component is being + * activated. + *

+ * This method never returns null, that is, if this method is + * not declared in the component descriptor this method returns the + * default value activate. + */ + String getActivate(); + + + /** + * Returns true if the name of the method to be called on + * component activation (see {@link #getActivate()} is declared in the + * component descriptor or not. + *

+ * For a component declared in a Declarative Services 1.0 descriptor, this + * method always returns false. + */ + boolean isActivateDeclared(); + + + /** + * Returns the name of the method to be called when the component is being + * deactivated. + *

+ * This method never returns null, that is, if this method is + * not declared in the component descriptor this method returns the + * default value deactivate. + */ + String getDeactivate(); + + + /** + * Returns true if the name of the method to be called on + * component deactivation (see {@link #getDeactivate()} is declared in the + * component descriptor or not. + *

+ * For a component declared in a Declarative Services 1.0 descriptor, this + * method always returns false. + */ + boolean isDeactivateDeclared(); + + + /** + * Returns the name of the method to be called when the component + * configuration has been updated or null if such a method is + * not declared in the component descriptor. + *

+ * For a component declared in a Declarative Services 1.0 descriptor, this + * method always returns null. + */ + String getModified(); + + + /** * Enables this Component if it is disabled. If the Component is not * currently {@link #STATE_DISABLED disabled} this method has no effect. If * the Component is {@link #STATE_DESTROYED destroyed}, this method throws Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java?rev=822285&r1=822284&r2=822285&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java Tue Oct 6 14:13:14 2009 @@ -28,10 +28,10 @@ public class ActivateMethod extends BaseMethod { - - public ActivateMethod( final AbstractComponentManager componentManager, String methodName, Class componentClass ) + public ActivateMethod( final AbstractComponentManager componentManager, final String methodName, + final boolean methodRequired, final Class componentClass ) { - super( componentManager, methodName, componentClass ); + super( componentManager, methodName, methodRequired, componentClass ); } @@ -131,6 +131,18 @@ } + protected String getMethodNamePrefix() + { + return "activate"; + } + + + public boolean invoke( Object componentInstance, Object rawParameter ) + { + return methodExists() && super.invoke( componentInstance, rawParameter ); + } + + private Method getSingleParameterMethod( final Class targetClass, final boolean acceptPrivate, final boolean acceptPackage ) throws SuitableMethodNotAccessibleException, InvocationTargetException, NoSuchMethodException Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java?rev=822285&r1=822284&r2=822285&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java Tue Oct 6 14:13:14 2009 @@ -52,22 +52,32 @@ private Method m_method = null; + private final boolean m_methodRequired; + private State m_state; protected BaseMethod( final AbstractComponentManager componentManager, final String methodName, final Class componentClass ) { + this( componentManager, methodName, methodName != null, componentClass ); + } + + + protected BaseMethod( final AbstractComponentManager componentManager, final String methodName, + final boolean methodRequired, final Class componentClass ) + { m_componentManager = componentManager; m_methodName = methodName; + m_methodRequired = methodRequired; m_componentClass = componentClass; if ( m_methodName == null ) { - m_state = new NotApplicable(); + m_state = NotApplicable.INSTANCE; } else { - m_state = new NotResolved(); + m_state = NotResolved.INSTANCE; } } @@ -96,6 +106,34 @@ } + synchronized void setMethod( Method method ) + { + this.m_method = method; + + if ( method != null ) + { + m_state = Resolved.INSTANCE; + } + else if ( m_methodRequired ) + { + m_state = NotFound.INSTANCE; + } + else + { + // optional method not found, log as DEBUG and ignore + getComponentManager().log( LogService.LOG_DEBUG, + getMethodNamePrefix() + " method [" + getMethodName() + "] not found, ignoring", null ); + m_state = NotApplicable.INSTANCE; + } + } + + + State getState() + { + return m_state; + } + + /** * Finds the method named in the {@link #m_methodName} field in the given * targetClass. If the target class has no acceptable method @@ -184,7 +222,7 @@ // 112.3.1 If the method is not is not declared protected or // public, SCR must log an error message with the log service, // if present, and ignore the method - getComponentManager().log( LogService.LOG_DEBUG, "Method " + m_methodName + " cannot be called", ex ); + getComponentManager().log( LogService.LOG_DEBUG, "Method " + getMethodName() + " cannot be called", ex ); } catch ( InvocationTargetException ex ) { @@ -369,70 +407,121 @@ public boolean invoke( final Object componentInstance, final Object rawParameter ) { - return m_state.invoke( componentInstance, rawParameter ); + return m_state.invoke( this, componentInstance, rawParameter ); + } + + + public boolean methodExists() + { + return m_state.methodExists( this ); } private static interface State { - boolean invoke( final Object componentInstance, final Object rawParameter ); + boolean invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter ); + + + boolean methodExists( final BaseMethod baseMethod ); } private static class NotApplicable implements State { - public boolean invoke( final Object componentInstance, final Object rawParameter ) + private static final State INSTANCE = new NotApplicable(); + + + public boolean invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter ) + { + return true; + } + + + public boolean methodExists( final BaseMethod baseMethod ) { return true; } } - private class NotResolved implements State + private static class NotResolved implements State { + private static final State INSTANCE = new NotResolved(); - public boolean invoke( final Object componentInstance, final Object rawParameter ) + + private void resolve( final BaseMethod baseMethod ) { - getComponentManager().log( LogService.LOG_DEBUG, - "getting " + getMethodNamePrefix() + "bind: " + m_methodName, null ); + baseMethod.getComponentManager().log( LogService.LOG_DEBUG, + "getting " + baseMethod.getMethodNamePrefix() + ": " + baseMethod.getMethodName(), null ); + + // resolve the method + Method method; try { - m_method = findMethod(); - m_state = ( m_method == null ) ? ( State ) new NotFound() : new Resolved(); - return m_state.invoke( componentInstance, rawParameter ); + method = baseMethod.findMethod(); } catch ( InvocationTargetException ex ) { - m_state = new NotFound(); - // We can safely ignore this one - getComponentManager().log( LogService.LOG_WARNING, getMethodName() + " cannot be found", ex.getTargetException() ); + method = null; + baseMethod.getComponentManager().log( LogService.LOG_WARNING, + baseMethod.getMethodName() + " cannot be found", ex.getTargetException() ); } - return true; + + baseMethod.setMethod( method ); + } + + + public boolean invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter ) + { + resolve( baseMethod ); + return baseMethod.getState().invoke( baseMethod, componentInstance, rawParameter ); + } + + + public boolean methodExists( final BaseMethod baseMethod ) + { + resolve( baseMethod ); + return baseMethod.getState().methodExists( baseMethod ); } } - private class NotFound implements State + private static class NotFound implements State { + private static final State INSTANCE = new NotFound(); + - public boolean invoke( final Object componentInstance, final Object rawParameter ) + public boolean invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter ) { // 112.3.1 If the method is not found , SCR must log an error // message with the log service, if present, and ignore the // method - getComponentManager().log( LogService.LOG_ERROR, - getMethodNamePrefix() + "bind method [" + m_methodName + "] not found", null ); - return true; + baseMethod.getComponentManager().log( LogService.LOG_ERROR, + baseMethod.getMethodNamePrefix() + " method [" + baseMethod.getMethodName() + "] not found", null ); + return false; + } + + + public boolean methodExists( final BaseMethod baseMethod ) + { + return false; } } - private class Resolved implements State + private static class Resolved implements State { + private static final State INSTANCE = new Resolved(); - public boolean invoke( final Object componentInstance, final Object rawParameter ) + + public boolean invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter ) { - getComponentManager().log( LogService.LOG_DEBUG, - "invoking " + getMethodNamePrefix() + "bind: " + m_methodName, null ); - return invokeMethod( componentInstance, rawParameter ); + baseMethod.getComponentManager().log( LogService.LOG_DEBUG, + "invoking " + baseMethod.getMethodNamePrefix() + ": " + baseMethod.getMethodName(), null ); + return baseMethod.invokeMethod( componentInstance, rawParameter ); } - } + + public boolean methodExists( final BaseMethod baseMethod ) + { + return true; + } + } } Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java?rev=822285&r1=822284&r2=822285&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java Tue Oct 6 14:13:14 2009 @@ -466,7 +466,7 @@ if ( params[i] == null ) { throw new IllegalStateException( "Dependency Manager: Service " + service.getReference() - + " has already gone, not " + getMethodNamePrefix() + "binding" ); + + " has already gone, will not " + getMethodNamePrefix() ); } } } @@ -477,7 +477,7 @@ protected String getMethodNamePrefix() { - return ""; + return "bind"; } //---------- Service abstraction ------------------------------------ Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/DeactivateMethod.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/DeactivateMethod.java?rev=822285&r1=822284&r2=822285&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/DeactivateMethod.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/DeactivateMethod.java Tue Oct 6 14:13:14 2009 @@ -25,9 +25,10 @@ public class DeactivateMethod extends ActivateMethod { - public DeactivateMethod( final AbstractComponentManager componentManager, String methodName, Class componentClass ) + public DeactivateMethod( final AbstractComponentManager componentManager, final String methodName, + final boolean methodRequired, final Class componentClass ) { - super( componentManager, methodName, componentClass ); + super( componentManager, methodName, methodRequired, componentClass ); } @@ -42,4 +43,10 @@ return new Class[] { COMPONENT_CONTEXT_CLASS }; } + + + protected String getMethodNamePrefix() + { + return "deactivate"; + } } Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ModifiedMethod.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ModifiedMethod.java?rev=822285&r1=822284&r2=822285&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ModifiedMethod.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ModifiedMethod.java Tue Oct 6 14:13:14 2009 @@ -25,9 +25,10 @@ public class ModifiedMethod extends ActivateMethod { - public ModifiedMethod( final AbstractComponentManager componentManager, String methodName, Class componentClass ) + public ModifiedMethod( final AbstractComponentManager componentManager, final String methodName, + final Class componentClass ) { - super( componentManager, methodName, componentClass ); + super( componentManager, methodName, methodName != null, componentClass ); } @@ -35,4 +36,10 @@ { return false; } + + + protected String getMethodNamePrefix() + { + return "modified"; + } } Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/UnbindMethod.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/UnbindMethod.java?rev=822285&r1=822284&r2=822285&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/UnbindMethod.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/UnbindMethod.java Tue Oct 6 14:13:14 2009 @@ -37,7 +37,7 @@ protected String getMethodNamePrefix() { - return "un"; + return "unbind"; } } \ No newline at end of file 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=822285&r1=822284&r2=822285&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 Tue Oct 6 14:13:14 2009 @@ -155,7 +155,7 @@ } - ComponentInstance getComponentInstance() + public ComponentInstance getComponentInstance() { return m_componentContext; } @@ -228,7 +228,8 @@ // get the method if ( m_activateMethod == null) { - m_activateMethod = new ActivateMethod( this, getComponentMetadata().getActivate(), implementationObjectClass ); + m_activateMethod = new ActivateMethod( this, getComponentMetadata().getActivate(), getComponentMetadata() + .isActivateDeclared(), implementationObjectClass ); } // 4. Call the activate method, if present @@ -258,8 +259,8 @@ // get the method if ( m_deactivateMethod == null ) { - m_deactivateMethod = new DeactivateMethod( this, getComponentMetadata().getDeactivate(), implementationObject - .getClass() ); + m_deactivateMethod = new DeactivateMethod( this, getComponentMetadata().getDeactivate(), + getComponentMetadata().isDeactivateDeclared(), implementationObject.getClass() ); } // 1. Call the deactivate method, if present 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=822285&r1=822284&r2=822285&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 Tue Oct 6 14:13:14 2009 @@ -79,9 +79,15 @@ // 112.5.8 activate can be specified (since DS 1.1) private String m_activate = null; + // 112.5.8 whether activate has been specified + private boolean m_activateDeclared = false; + // 112.5.12 deactivate can be specified (since DS 1.1) private String m_deactivate = null; + // 112.5.12 whether deactivate has been specified + private boolean m_deactivateDeclared = false; + // 112.??.?? modified method (configuration update, since DS 1.1) private String m_modified = null; @@ -234,6 +240,7 @@ return; } m_activate = activate; + m_activateDeclared = true; } @@ -250,6 +257,7 @@ return; } m_deactivate = deactivate; + m_deactivateDeclared = true; } @@ -448,6 +456,20 @@ /** + * Returns whether the activate method has been declared in the descriptor + * or not. + * + * @return whether the activate method has been declared in the descriptor + * or not. + * @since 1.2.0 (DS 1.1) + */ + public boolean isActivateDeclared() + { + return m_activateDeclared; + } + + + /** * Returns the name of the deactivate method * * @return the name of the deactivate method @@ -460,6 +482,20 @@ /** + * Returns whether the deactivate method has been declared in the descriptor + * or not. + * + * @return whether the deactivate method has been declared in the descriptor + * or not. + * @since 1.2.0 (DS 1.1) + */ + public boolean isDeactivateDeclared() + { + return m_deactivateDeclared; + } + + + /** * Returns the name of the modified method * * @return the name of the modified method @@ -614,9 +650,11 @@ } else if ( m_namespaceCode < XmlHandler.DS_VERSION_1_1 ) { + // DS 1.0 cannot declare the activate method, assume default and undeclared logger.log( LogService.LOG_WARNING, "Ignoring activate method declaration, DS 1.1 or later namespace required", this, null ); m_activate = "activate"; + m_activateDeclared = false; } // 112.5.12 deactivate can be specified (since DS 1.1) @@ -627,9 +665,11 @@ } else if ( m_namespaceCode < XmlHandler.DS_VERSION_1_1 ) { + // DS 1.0 cannot declare the deactivate method, assume default and undeclared logger.log( LogService.LOG_WARNING, "Ignoring deactivate method declaration, DS 1.1 or later namespace required", this, null ); m_deactivate = "deactivate"; + m_deactivateDeclared = false; } // 112.??.?? modified can be specified (since DS 1.1) Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/helper/ActivateMethodTest.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/helper/ActivateMethodTest.java?rev=822285&r1=822284&r2=822285&view=diff ============================================================================== --- felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/helper/ActivateMethodTest.java (original) +++ felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/helper/ActivateMethodTest.java Tue Oct 6 14:13:14 2009 @@ -229,7 +229,7 @@ } }; ImmediateComponentManager icm = new ImmediateComponentManager( null, null, metadata ); - ActivateMethod am = new ActivateMethod( icm, methodName, obj.getClass() ); + ActivateMethod am = new ActivateMethod( icm, methodName, methodName != null, obj.getClass() ); am.invoke( obj, new ActivateMethod.ActivatorParameter( m_ctx, -1 ) ); Method m = get(am, "m_method"); assertNotNull( m ); @@ -257,7 +257,7 @@ } }; ImmediateComponentManager icm = new ImmediateComponentManager( null, null, metadata ); - ActivateMethod am = new ActivateMethod( icm, methodName, obj.getClass() ); + ActivateMethod am = new ActivateMethod( icm, methodName, methodName != null, obj.getClass() ); am.invoke( obj, new ActivateMethod.ActivatorParameter( m_ctx, -1 ) ); assertNull( get( am, "m_method" ) ); assertNull( obj.getCalledMethod() ); Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/metadata/ComponentMetadataTest.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/metadata/ComponentMetadataTest.java?rev=822285&r1=822284&r2=822285&view=diff ============================================================================== --- felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/metadata/ComponentMetadataTest.java (original) +++ felix/trunk/scr/src/test/java/org/apache/felix/scr/impl/metadata/ComponentMetadataTest.java Tue Oct 6 14:13:14 2009 @@ -279,11 +279,13 @@ final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null ); cm1.validate( logger ); assertEquals( "Activate method name", "activate", cm1.getActivate() ); + assertFalse( "Activate method expected to not be declared", cm1.isActivateDeclared() ); final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null ); cm2.setActivate( "someMethod" ); cm2.validate( logger ); assertEquals( "Activate method name", "activate", cm2.getActivate() ); + assertFalse( "Activate method expected to not be declared", cm2.isActivateDeclared() ); } @@ -292,11 +294,13 @@ final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null ); cm1.validate( logger ); assertEquals( "Activate method name", "activate", cm1.getActivate() ); + assertFalse( "Activate method expected to not be declared", cm1.isActivateDeclared() ); final ComponentMetadata cm2 = createComponentMetadata11( Boolean.TRUE, null ); cm2.setActivate( "someMethod" ); cm2.validate( logger ); assertEquals( "Activate method name", "someMethod", cm2.getActivate() ); + assertTrue( "Activate method expected to be declared", cm2.isActivateDeclared() ); } @@ -305,11 +309,13 @@ final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null ); cm1.validate( logger ); assertEquals( "Deactivate method name", "deactivate", cm1.getDeactivate() ); + assertFalse( "Deactivate method expected to not be declared", cm1.isDeactivateDeclared() ); final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null ); cm2.setDeactivate( "someMethod" ); cm2.validate( logger ); assertEquals( "Deactivate method name", "deactivate", cm2.getDeactivate() ); + assertFalse( "Deactivate method expected to not be declared", cm2.isDeactivateDeclared() ); } @@ -318,11 +324,13 @@ final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null ); cm1.validate( logger ); assertEquals( "Deactivate method name", "deactivate", cm1.getDeactivate() ); + assertFalse( "Deactivate method expected to not be declared", cm1.isDeactivateDeclared() ); final ComponentMetadata cm2 = createComponentMetadata11( Boolean.TRUE, null ); cm2.setDeactivate( "someMethod" ); cm2.validate( logger ); assertEquals( "Deactivate method name", "someMethod", cm2.getDeactivate() ); + assertTrue( "Deactivate method expected to be declared", cm2.isDeactivateDeclared() ); } 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=822285&r1=822284&r2=822285&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 Tue Oct 6 14:13:14 2009 @@ -72,7 +72,9 @@ 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() ); + assertFalse( "Activate method expected to not be declared", cm10.isActivateDeclared() ); assertEquals( "Expected Deactivate Method not set", "deactivate", cm10.getDeactivate() ); + assertFalse( "Deactivate method expected to not be declared", cm10.isDeactivateDeclared() ); assertNull( "Expected Modified Method not set", cm10.getModified() ); assertEquals( "Expected Configuration Policy not set", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL, cm10 .getConfigurationPolicy() ); @@ -83,7 +85,9 @@ cm11.validate( logger ); assertEquals( "DS Version 1.1", XmlHandler.DS_VERSION_1_1, cm11.getNamespaceCode() ); assertEquals( "Expected Activate Method set", "myactivate", cm11.getActivate() ); + assertTrue( "Activate method expected to be declared", cm11.isActivateDeclared() ); assertEquals( "Expected Deactivate Method set", "mydeactivate", cm11.getDeactivate() ); + assertTrue( "Activate method expected to be declared", cm11.isDeactivateDeclared() ); assertEquals( "Expected Modified Method set", "mymodified", cm11.getModified() ); assertEquals( "Expected Configuration Policy set", ComponentMetadata.CONFIGURATION_POLICY_IGNORE, cm11 .getConfigurationPolicy() ); @@ -158,7 +162,9 @@ // ds 1.1 elements assertEquals( "activate method", "myactivate", cm10.getActivate() ); assertEquals( "deactivate method", "mydeactivate", cm10.getDeactivate() ); + assertTrue( "Activate method expected to be declared", cm10.isActivateDeclared() ); assertEquals( "modified method", "mymodified", cm10.getModified() ); + assertTrue( "Deactivate method expected to be declared", cm10.isDeactivateDeclared() ); assertEquals( "configuration policy", "ignore", cm10.getConfigurationPolicy() ); // from the implementation element Added: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java?rev=822285&view=auto ============================================================================== --- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java (added) +++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java Tue Oct 6 14:13:14 2009 @@ -0,0 +1,188 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.felix.scr.integration; + + +import junit.framework.TestCase; + +import org.apache.felix.scr.Component; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.ops4j.pax.exam.junit.JUnit4TestRunner; + + +@RunWith(JUnit4TestRunner.class) +public class ComponentActivationTest extends ComponentTestBase +{ + + static + { + // use different components + descriptorFile = "/integration_test_activation_components.xml"; + + // uncomment to enable debugging of this test class + // paxRunnerVmOption = DEBUG_VM_OPTION; + } + + + @Test + public void test_activator_not_declared() + { + final String componentname = "ActivatorComponent.no.decl"; + + final Component component = findComponentByName( componentname ); + + TestCase.assertNotNull( component ); + TestCase.assertFalse( component.isDefaultEnabled() ); + + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + + component.enable(); + delay(); + + TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() ); + + component.disable(); + + delay(); + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + } + + + @Test + public void test_activate_missing() + { + final String componentname = "ActivatorComponent.activate.missing"; + + final Component component = findComponentByName( componentname ); + + TestCase.assertNotNull( component ); + TestCase.assertFalse( component.isDefaultEnabled() ); + + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + + component.enable(); + delay(); + + // activate must fail + TestCase.assertEquals( Component.STATE_UNSATISFIED, component.getState() ); + + component.disable(); + + delay(); + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + } + + + @Test + public void test_deactivate_missing() + { + final String componentname = "ActivatorComponent.deactivate.missing"; + + final Component component = findComponentByName( componentname ); + + TestCase.assertNotNull( component ); + TestCase.assertFalse( component.isDefaultEnabled() ); + + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + + component.enable(); + delay(); + + TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() ); + + component.disable(); + + delay(); + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + } + + + @Test + public void test_activator_declared() + { + final String componentname = "ActivatorComponent.decl"; + + final Component component = findComponentByName( componentname ); + + TestCase.assertNotNull( component ); + TestCase.assertFalse( component.isDefaultEnabled() ); + + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + + component.enable(); + delay(); + + TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() ); + + component.disable(); + + delay(); + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + } + + + @Test + public void test_activate_fail() + { + final String componentname = "ActivatorComponent.activate.fail"; + + final Component component = findComponentByName( componentname ); + + TestCase.assertNotNull( component ); + TestCase.assertFalse( component.isDefaultEnabled() ); + + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + + component.enable(); + delay(); + + // activate has failed + TestCase.assertEquals( Component.STATE_UNSATISFIED, component.getState() ); + + component.disable(); + + delay(); + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + } + + + @Test + public void test_deactivate_fail() + { + final String componentname = "ActivatorComponent.deactivate.fail"; + + final Component component = findComponentByName( componentname ); + + TestCase.assertNotNull( component ); + TestCase.assertFalse( component.isDefaultEnabled() ); + + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + + component.enable(); + delay(); + + TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() ); + + component.disable(); + + delay(); + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + } +} Propchange: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev Url Added: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java?rev=822285&view=auto ============================================================================== --- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java (added) +++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java Tue Oct 6 14:13:14 2009 @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.felix.scr.integration.components; + + +import java.util.Map; + + +public class ActivatorComponent +{ + + public static final String FLAG_FAIL_ACTIVATE = "failActivate"; + + public static final String FLAG_FAIL_DEACTIVATE = "failDeactivate"; + + + @SuppressWarnings("unused") + private void myActivate( Map configuration ) + { + if ( configuration.containsKey( FLAG_FAIL_ACTIVATE ) ) + { + throw new IllegalStateException( "myActivate fails" ); + } + } + + + @SuppressWarnings("unused") + private void myDeactivate( Map configuration ) + { + if ( configuration.containsKey( FLAG_FAIL_DEACTIVATE ) ) + { + throw new IllegalStateException( "myDeactivate fails" ); + } + } +} Propchange: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev Url Added: felix/trunk/scr/src/test/resources/integration_test_activation_components.xml URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/resources/integration_test_activation_components.xml?rev=822285&view=auto ============================================================================== --- felix/trunk/scr/src/test/resources/integration_test_activation_components.xml (added) +++ felix/trunk/scr/src/test/resources/integration_test_activation_components.xml Tue Oct 6 14:13:14 2009 @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Propchange: felix/trunk/scr/src/test/resources/integration_test_activation_components.xml ------------------------------------------------------------------------------ svn:eol-style = native