Return-Path: Delivered-To: apmail-felix-commits-archive@www.apache.org Received: (qmail 5934 invoked from network); 29 Oct 2009 15:11:17 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 29 Oct 2009 15:11:17 -0000 Received: (qmail 99966 invoked by uid 500); 29 Oct 2009 15:11:17 -0000 Delivered-To: apmail-felix-commits-archive@felix.apache.org Received: (qmail 99907 invoked by uid 500); 29 Oct 2009 15:11:16 -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 99889 invoked by uid 99); 29 Oct 2009 15:11:15 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 29 Oct 2009 15:11:15 +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; Thu, 29 Oct 2009 15:11:12 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 2DE1F23888E7; Thu, 29 Oct 2009 15:10:51 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r830994 - in /felix/trunk/scr/src: main/java/org/apache/felix/scr/impl/manager/ test/java/org/apache/felix/scr/integration/ test/java/org/apache/felix/scr/integration/components/ Date: Thu, 29 Oct 2009 15:10:51 -0000 To: commits@felix.apache.org From: fmeschbe@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091029151051.2DE1F23888E7@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: fmeschbe Date: Thu Oct 29 15:10:50 2009 New Revision: 830994 URL: http://svn.apache.org/viewvc?rev=830994&view=rev Log: FELIX-1826 Throw ComponentException if newInstance fails to create a component instance (for any one reason, which is logged actually) Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/SimpleComponent.java Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java?rev=830994&r1=830993&r2=830994&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java Thu Oct 29 15:10:50 2009 @@ -30,6 +30,7 @@ import org.osgi.framework.Constants; import org.osgi.framework.ServiceRegistration; import org.osgi.service.component.ComponentConstants; +import org.osgi.service.component.ComponentException; import org.osgi.service.component.ComponentFactory; import org.osgi.service.component.ComponentInstance; import org.osgi.service.log.LogService; @@ -110,8 +111,14 @@ cm.activateInternal(); final ComponentInstance instance = cm.getComponentInstance(); - m_componentInstances.put( cm, instance ); + if ( instance == null ) + { + // activation failed, clean up component manager + cm.dispose(); + throw new ComponentException( "Failed activating component" ); + } + m_componentInstances.put( cm, instance ); return instance; } Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java?rev=830994&r1=830993&r2=830994&view=diff ============================================================================== --- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java (original) +++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java Thu Oct 29 15:10:50 2009 @@ -32,6 +32,7 @@ import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.osgi.service.component.ComponentConstants; +import org.osgi.service.component.ComponentException; import org.osgi.service.component.ComponentFactory; import org.osgi.service.component.ComponentInstance; @@ -94,4 +95,110 @@ TestCase.assertEquals( 0, instanceMap.size() ); TestCase.assertFalse( instanceMap.containsValue( instance ) ); } + + + @Test + public void test_component_factory_disable_factory() throws InvalidSyntaxException + { + // tests components remain alive after factory has been disabled + + final String componentname = "factory.component"; + final String componentfactory = "factory.component.factory"; + + final Component component = findComponentByName( componentname ); + + TestCase.assertNotNull( component ); + TestCase.assertFalse( component.isDefaultEnabled() ); + + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + TestCase.assertNull( SimpleComponent.INSTANCE ); + + component.enable(); + delay(); + + TestCase.assertEquals( Component.STATE_FACTORY, component.getState() ); + TestCase.assertNull( SimpleComponent.INSTANCE ); + + final ServiceReference[] refs = bundleContext.getServiceReferences( ComponentFactory.class.getName(), "(" + + ComponentConstants.COMPONENT_FACTORY + "=" + componentfactory + ")" ); + TestCase.assertNotNull( refs ); + TestCase.assertEquals( 1, refs.length ); + final ComponentFactory factory = ( ComponentFactory ) bundleContext.getService( refs[0] ); + TestCase.assertNotNull( factory ); + + Hashtable props = new Hashtable(); + props.put( PROP_NAME, PROP_NAME ); + final ComponentInstance instance = factory.newInstance( props ); + TestCase.assertNotNull( instance ); + + TestCase.assertNotNull( instance.getInstance() ); + TestCase.assertEquals( SimpleComponent.INSTANCE, instance.getInstance() ); + TestCase.assertEquals( PROP_NAME, SimpleComponent.INSTANCE.getProperty( PROP_NAME ) ); + + final Map instanceMap = ( Map ) getFieldValue( component, "m_componentInstances" ); + TestCase.assertNotNull( instanceMap ); + TestCase.assertEquals( 1, instanceMap.size() ); + TestCase.assertTrue( instanceMap.containsValue( instance ) ); + + // disable the factory + component.disable(); + delay(); + + // factory is disabled but the instance is still alive + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + TestCase.assertNotNull( SimpleComponent.INSTANCE ); + TestCase.assertEquals( 1, instanceMap.size() ); + TestCase.assertTrue( instanceMap.containsValue( instance ) ); + + instance.dispose(); + TestCase.assertNull( SimpleComponent.INSTANCE ); + + TestCase.assertEquals( 0, instanceMap.size() ); + TestCase.assertFalse( instanceMap.containsValue( instance ) ); + } + + + @Test + public void test_component_factory_newInstance_failure() throws InvalidSyntaxException + { + final String componentname = "factory.component"; + final String componentfactory = "factory.component.factory"; + + final Component component = findComponentByName( componentname ); + + TestCase.assertNotNull( component ); + TestCase.assertFalse( component.isDefaultEnabled() ); + + TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); + TestCase.assertNull( SimpleComponent.INSTANCE ); + + component.enable(); + delay(); + + TestCase.assertEquals( Component.STATE_FACTORY, component.getState() ); + TestCase.assertNull( SimpleComponent.INSTANCE ); + + final ServiceReference[] refs = bundleContext.getServiceReferences( ComponentFactory.class.getName(), "(" + + ComponentConstants.COMPONENT_FACTORY + "=" + componentfactory + ")" ); + TestCase.assertNotNull( refs ); + TestCase.assertEquals( 1, refs.length ); + final ComponentFactory factory = ( ComponentFactory ) bundleContext.getService( refs[0] ); + TestCase.assertNotNull( factory ); + + Hashtable props = new Hashtable(); + props.put( PROP_NAME, PROP_NAME ); + props.put( SimpleComponent.PROP_ACTIVATE_FAILURE, "Requested Failure" ); + try { + final ComponentInstance instance = factory.newInstance( props ); + TestCase.assertNotNull( instance ); + TestCase.fail("Expected newInstance method to fail with ComponentException"); + } catch (ComponentException ce) { + // this is expected ! + } + + final Map instanceMap = ( Map ) getFieldValue( component, "m_componentInstances" ); + TestCase.assertNotNull( instanceMap ); + TestCase.assertTrue( instanceMap.isEmpty() ); + TestCase.assertNull( SimpleComponent.INSTANCE ); + } } Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/SimpleComponent.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/SimpleComponent.java?rev=830994&r1=830993&r2=830994&view=diff ============================================================================== --- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/SimpleComponent.java (original) +++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/SimpleComponent.java Thu Oct 29 15:10:50 2009 @@ -33,12 +33,16 @@ public class SimpleComponent { - public static SimpleComponent INSTANCE; + // component configuration property whose existence causes the + // activate method to fail + public static final String PROP_ACTIVATE_FAILURE = "request.activation.failure"; public static final Map INSTANCES = new HashMap(); public static final Set PREVIOUS_INSTANCES = new HashSet(); + public static SimpleComponent INSTANCE; + private Map m_config; public long m_id; @@ -53,6 +57,12 @@ @SuppressWarnings("unused") private void activate( ComponentContext activateContext, Map config ) { + // fail activation if requested so + if ( config.containsKey( PROP_ACTIVATE_FAILURE ) ) + { + throw new RuntimeException( String.valueOf( config.get( PROP_ACTIVATE_FAILURE ) ) ); + } + m_id = ( Long ) config.get( ComponentConstants.COMPONENT_ID ); m_activateContext = activateContext;