Return-Path: Delivered-To: apmail-felix-commits-archive@www.apache.org Received: (qmail 40114 invoked from network); 5 Jan 2010 10:15:45 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 5 Jan 2010 10:15:45 -0000 Received: (qmail 12392 invoked by uid 500); 5 Jan 2010 10:15:45 -0000 Delivered-To: apmail-felix-commits-archive@felix.apache.org Received: (qmail 12335 invoked by uid 500); 5 Jan 2010 10:15:44 -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 12326 invoked by uid 99); 5 Jan 2010 10:15:44 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 05 Jan 2010 10:15:44 +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, 05 Jan 2010 10:15:39 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 334C023888CE; Tue, 5 Jan 2010 10:15:19 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r895971 - in /felix/trunk/ipojo: core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/ core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/t... Date: Tue, 05 Jan 2010 10:14:58 -0000 To: commits@felix.apache.org From: clement@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100105101519.334C023888CE@eris.apache.org> Author: clement Date: Tue Jan 5 10:14:25 2010 New Revision: 895971 URL: http://svn.apache.org/viewvc?rev=895971&view=rev Log: Fix issue FELIX-1965 When a validate callback throws an exception, the service is still published (a small amount of time). This 'door' allows a consumer to use a non initialized service. The fix avoids that and test it. Added: felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CallbackWithErrorCheckService.java (with props) felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ErrorCallbackTestCase.java (with props) Modified: felix/trunk/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java felix/trunk/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/CallbackTestCase.java felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/LifeCycleCallbackTest.java felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/resources/metadata.xml Modified: felix/trunk/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java?rev=895971&r1=895970&r2=895971&view=diff ============================================================================== --- felix/trunk/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java (original) +++ felix/trunk/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java Tue Jan 5 10:14:25 2010 @@ -168,7 +168,7 @@ throw new IllegalStateException(e.getMessage()); } catch (InvocationTargetException e) { error("[" + getInstanceManager().getInstanceName() + "] The callback method " + m_callbacks[i].getMethod() + " has thrown an exception : " + e.getTargetException().getMessage(), e.getTargetException()); - getInstanceManager().setState(ComponentInstance.INVALID); + throw new IllegalStateException(e.getTargetException().getMessage()); } } } Modified: felix/trunk/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java?rev=895971&r1=895970&r2=895971&view=diff ============================================================================== --- felix/trunk/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java (original) +++ felix/trunk/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java Tue Jan 5 10:14:25 2010 @@ -276,14 +276,19 @@ } /** - * Return a service object for the dependency. + * Returns a service object for the dependency. * @see org.osgi.framework.ServiceFactory#getService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration) * @param bundle : the bundle - * @param registration : the service registration of the registred service - * @return : a new service object or a already created service object (in the case of singleton) + * @param registration : the service registration of the registered service + * @return a new service object or a already created service object (in the case of singleton) or null + * if the instance is no more valid. */ public Object getService(Bundle bundle, ServiceRegistration registration) { - return m_strategy.getService(bundle, registration); + if (getInstanceManager().getState() == InstanceManager.VALID) { + return m_strategy.getService(bundle, registration); + } else { + return null; + } } /** Added: felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CallbackWithErrorCheckService.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CallbackWithErrorCheckService.java?rev=895971&view=auto ============================================================================== --- felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CallbackWithErrorCheckService.java (added) +++ felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CallbackWithErrorCheckService.java Tue Jan 5 10:14:25 2010 @@ -0,0 +1,44 @@ +/* + * 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.ipojo.test.scenarios.component; + +import java.util.Properties; + +import org.apache.felix.ipojo.test.scenarios.lifecycle.callback.service.CheckService; + +public class CallbackWithErrorCheckService extends ParentClass implements CheckService { + + + public void start() { + throw new NullPointerException(); + } + + public void stop() { + } + + public boolean check() { + return true; + } + + public Properties getProps() { + Properties p = new Properties(); + return p; + } + +} Propchange: felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CallbackWithErrorCheckService.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/CallbackTestCase.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/CallbackTestCase.java?rev=895971&r1=895970&r2=895971&view=diff ============================================================================== --- felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/CallbackTestCase.java (original) +++ felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/CallbackTestCase.java Tue Jan 5 10:14:25 2010 @@ -29,87 +29,87 @@ import org.osgi.framework.ServiceReference; public class CallbackTestCase extends OSGiTestCase { - - ComponentInstance instance; // Instance under test - ComponentInstance fooProvider; + + ComponentInstance instance; // Instance under test + ComponentInstance fooProvider; - public void setUp() { - Properties p2 = new Properties(); - p2.put("instance.name","fooProvider"); - fooProvider = Utils.getComponentInstance(getContext(), "LFCB-FooProviderType-1", p2); - fooProvider.stop(); - - Properties p1 = new Properties(); - p1.put("instance.name","callback"); - instance = Utils.getComponentInstance(getContext(), "LFCB-CallbackCheckService", p1); - - } - - public void tearDown() { - instance.dispose(); - fooProvider.dispose(); - instance= null; - fooProvider = null; - } - - public void testCallback() { - // Check instance is invalid - ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance.getInstanceName()); - assertNotNull("Check architecture availability", arch_ref); - PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ref)).getInstanceDescription(); - assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID); - assertEquals("Check pojo count - 1", id_dep.getCreatedObjects().length, 0); - - // Start fooprovider - fooProvider.start(); - - // Check instance validity - //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription(); - assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID); - - // Check service providing - ServiceReference cs_ref = Utils.getServiceReferenceByName(getContext(), CheckService.class.getName(), instance.getInstanceName()); - assertNotNull("Check CheckService availability", cs_ref); - CheckService cs = (CheckService) getContext().getService(cs_ref); - assertTrue("check CheckService invocation", cs.check()); - - // Check int property - Integer index = (Integer) (cs.getProps().get("int")); - assertEquals("Check int property - 1", index.intValue(), 1); - - assertEquals("Check pojo count - 2", id_dep.getCreatedObjects().length, 1); - - fooProvider.stop(); - - //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription(); - assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID); - - assertEquals("Check pojo count - 3", id_dep.getCreatedObjects().length, 1); - - fooProvider.start(); - - // Check instance validity - //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription(); - assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID); - - // Check service providing - cs_ref = Utils.getServiceReferenceByName(getContext(), CheckService.class.getName(), instance.getInstanceName()); - assertNotNull("Check CheckService availability", cs_ref); - cs = (CheckService) getContext().getService(cs_ref); - assertTrue("check CheckService invocation", cs.check()); - - // Check int property - index = (Integer) (cs.getProps().get("int")); - assertEquals("Check int property - 2 ("+index.intValue()+")", index.intValue(), 3); - - assertEquals("Check pojo count - 4 ", id_dep.getCreatedObjects().length, 1); - - // Clean up - getContext().ungetService(arch_ref); - getContext().ungetService(cs_ref); - cs = null; - id_dep = null; - } - + public void setUp() { + Properties p2 = new Properties(); + p2.put("instance.name","fooProvider"); + fooProvider = Utils.getComponentInstance(getContext(), "LFCB-FooProviderType-1", p2); + fooProvider.stop(); + + Properties p1 = new Properties(); + p1.put("instance.name","callback"); + instance = Utils.getComponentInstance(getContext(), "LFCB-CallbackCheckService", p1); + + } + + public void tearDown() { + instance.dispose(); + fooProvider.dispose(); + instance= null; + fooProvider = null; + } + + public void testCallback() { + // Check instance is invalid + ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance.getInstanceName()); + assertNotNull("Check architecture availability", arch_ref); + PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ref)).getInstanceDescription(); + assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID); + assertEquals("Check pojo count - 1", id_dep.getCreatedObjects().length, 0); + + // Start fooprovider + fooProvider.start(); + + // Check instance validity + //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription(); + assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID); + + // Check service providing + ServiceReference cs_ref = Utils.getServiceReferenceByName(getContext(), CheckService.class.getName(), instance.getInstanceName()); + assertNotNull("Check CheckService availability", cs_ref); + CheckService cs = (CheckService) getContext().getService(cs_ref); + assertTrue("check CheckService invocation", cs.check()); + + // Check int property + Integer index = (Integer) (cs.getProps().get("int")); + assertEquals("Check int property - 1", index.intValue(), 1); + + assertEquals("Check pojo count - 2", id_dep.getCreatedObjects().length, 1); + + fooProvider.stop(); + + //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription(); + assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID); + + assertEquals("Check pojo count - 3", id_dep.getCreatedObjects().length, 1); + + fooProvider.start(); + + // Check instance validity + //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription(); + assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID); + + // Check service providing + cs_ref = Utils.getServiceReferenceByName(getContext(), CheckService.class.getName(), instance.getInstanceName()); + assertNotNull("Check CheckService availability", cs_ref); + cs = (CheckService) getContext().getService(cs_ref); + assertTrue("check CheckService invocation", cs.check()); + + // Check int property + index = (Integer) (cs.getProps().get("int")); + assertEquals("Check int property - 2 ("+index.intValue()+")", index.intValue(), 3); + + assertEquals("Check pojo count - 4 ", id_dep.getCreatedObjects().length, 1); + + // Clean up + getContext().ungetService(arch_ref); + getContext().ungetService(cs_ref); + cs = null; + id_dep = null; + } + } Added: felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ErrorCallbackTestCase.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ErrorCallbackTestCase.java?rev=895971&view=auto ============================================================================== --- felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ErrorCallbackTestCase.java (added) +++ felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ErrorCallbackTestCase.java Tue Jan 5 10:14:25 2010 @@ -0,0 +1,56 @@ +/* + * 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.ipojo.test.scenarios.lifecycle.callback; + +import java.util.Properties; + +import org.apache.felix.ipojo.ComponentInstance; +import org.apache.felix.ipojo.junit4osgi.OSGiTestCase; +import org.apache.felix.ipojo.test.scenarios.lifecycle.callback.service.CheckService; +import org.apache.felix.ipojo.test.scenarios.util.Utils; +import org.osgi.framework.ServiceReference; + +/** + * Test the fix for FELIX-1965. + * When a validate callback throws an exception, the service is still provided. + */ +public class ErrorCallbackTestCase extends OSGiTestCase { + + ComponentInstance instance; // Instance under test + + public void tearDown() { + if (instance != null) { + instance.dispose(); + instance= null; + } + } + + public void testErrorInValidateCallback() { + Properties p2 = new Properties(); + p2.put("instance.name","error"); + instance = Utils.getComponentInstance(getContext(), "LFCB-CallbackWithError", p2); + + // The service should not be provided as the start method has thrown an exception + ServiceReference ref = getServiceReference(CheckService.class.getName(), "(instance.name=" + instance.getInstanceName() +")"); + assertNull(ref); + + } + + +} Propchange: felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ErrorCallbackTestCase.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/LifeCycleCallbackTest.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/LifeCycleCallbackTest.java?rev=895971&r1=895970&r2=895971&view=diff ============================================================================== --- felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/LifeCycleCallbackTest.java (original) +++ felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/LifeCycleCallbackTest.java Tue Jan 5 10:14:25 2010 @@ -25,17 +25,18 @@ import org.osgi.framework.BundleContext; public class LifeCycleCallbackTest extends TestSuite { - + - public static Test suite(BundleContext bc) { - OSGiTestSuite ots = new OSGiTestSuite("Lifecycle callbacks Test Suite", bc); - ots.addTestSuite(CallbackTestCase.class); - ots.addTestSuite(ParentCallbackTestCase.class); + public static Test suite(BundleContext bc) { + OSGiTestSuite ots = new OSGiTestSuite("Lifecycle callbacks Test Suite", bc); + ots.addTestSuite(CallbackTestCase.class); + ots.addTestSuite(ParentCallbackTestCase.class); ots.addTestSuite(ImmediateCallbackTest.class); ots.addTestSuite(ImmediateCallbackSingletonFactoryTest.class); ots.addTestSuite(ImmediateCallbackSeveralFactoryTest.class); - return ots; - } + ots.addTestSuite(ErrorCallbackTestCase.class); + return ots; + } } Modified: felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/resources/metadata.xml URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/resources/metadata.xml?rev=895971&r1=895970&r2=895971&view=diff ============================================================================== --- felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/resources/metadata.xml (original) +++ felix/trunk/ipojo/tests/core/lifecycle-callback/src/main/resources/metadata.xml Tue Jan 5 10:14:25 2010 @@ -3,54 +3,63 @@ xsi:schemaLocation="org.apache.felix.ipojo http://felix.apache.org/ipojo/schemas/SNAPSHOT/core.xsd" xmlns="org.apache.felix.ipojo" > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +