Return-Path: Delivered-To: apmail-felix-commits-archive@www.apache.org Received: (qmail 47423 invoked from network); 16 May 2009 12:30:40 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 16 May 2009 12:30:40 -0000 Received: (qmail 38602 invoked by uid 500); 16 May 2009 12:30:40 -0000 Delivered-To: apmail-felix-commits-archive@felix.apache.org Received: (qmail 38537 invoked by uid 500); 16 May 2009 12:30:40 -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 38528 invoked by uid 99); 16 May 2009 12:30:40 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 16 May 2009 12:30:40 +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; Sat, 16 May 2009 12:30:27 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id C0CE823888DC; Sat, 16 May 2009 12:30:07 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r775456 [2/2] - in /felix/trunk/ipojo: api/src/main/java/org/apache/felix/ipojo/api/ api/src/main/java/org/apache/felix/ipojo/api/composite/ composite/src/main/java/org/apache/felix/ipojo/composite/ core/src/main/java/org/apache/felix/ipojo... Date: Sat, 16 May 2009 12:30:06 -0000 To: commits@felix.apache.org From: clement@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090516123007.C0CE823888DC@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Added: felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/FactoryVersionTest.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/FactoryVersionTest.java?rev=775456&view=auto ============================================================================== --- felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/FactoryVersionTest.java (added) +++ felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/FactoryVersionTest.java Sat May 16 12:30:05 2009 @@ -0,0 +1,179 @@ +package org.apache.felix.ipojo.tests.core; + +import static org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO.asiPOJOBundle; +import static org.ops4j.pax.exam.CoreOptions.mavenBundle; +import static org.ops4j.pax.exam.CoreOptions.options; +import static org.ops4j.pax.exam.CoreOptions.provision; +import static org.ops4j.pax.exam.MavenUtils.asInProject; +import static org.ops4j.pax.tinybundles.core.TinyBundles.asURL; +import static org.ops4j.pax.tinybundles.core.TinyBundles.newBundle; +import static org.ops4j.pax.tinybundles.core.TinyBundles.with; + +import java.io.File; + +import org.apache.felix.ipojo.architecture.Architecture; +import org.apache.felix.ipojo.tests.core.component.MyComponent; +import org.apache.felix.ipojo.tests.core.service.MyService; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.ops4j.pax.exam.Inject; +import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.junit.Configuration; +import org.ops4j.pax.exam.junit.JUnit4TestRunner; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceReference; + +@RunWith( JUnit4TestRunner.class ) +public class FactoryVersionTest { + + @Inject + private BundleContext context; + + private OSGiHelper osgi; + + private IPOJOHelper ipojo; + + @Before + public void init() { + osgi = new OSGiHelper(context); + ipojo = new IPOJOHelper(context); + } + + @After + public void stop() { + ipojo.dispose(); + osgi.dispose(); + } + + @Configuration + public static Option[] configure() { + + File tmp = new File("target/tmp"); + tmp.mkdirs(); + + Option[] opt = options( + provision( + // Runtime. + mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo").version(asInProject()), + mavenBundle().groupId( "org.ops4j.pax.tinybundles" ).artifactId( "pax-tinybundles-core" ).version(asInProject()) + ), + provision( + newBundle() + .addClass( MyService.class ) + .prepare() + .set(Constants.BUNDLE_SYMBOLICNAME,"ServiceInterface") + .set(Constants.EXPORT_PACKAGE, "org.apache.felix.ipojo.tests.core.service") + .build( asURL() ).toExternalForm() + ), + provision( + // Component V1 + newBundle() + .addClass(MyComponent.class) + .prepare( + with() + .set(Constants.BUNDLE_SYMBOLICNAME,"ProviderV1") + .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.tests.core.service") + ) + .build( asiPOJOBundle(new File(tmp, "provider-v1.jar"), new File("provider-v1.xml"))).toExternalForm(), + // Component V1.1 (Bundle Version) + newBundle() + .addClass(MyComponent.class) + .prepare( + with() + .set(Constants.BUNDLE_SYMBOLICNAME,"ProviderV1.1") + .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.tests.core.service") + .set(Constants.BUNDLE_VERSION, "1.1") + ) + .build( asiPOJOBundle(new File(tmp, "provider-v1.1.jar"), new File("provider-v1.1.xml"))).toExternalForm(), + // Instance declaration + newBundle() + .prepare( + with() + .set(Constants.BUNDLE_SYMBOLICNAME,"Instances") + ) + .build( asiPOJOBundle(new File(tmp, "instances.jar"), new File("instances.xml"))).toExternalForm() + + ) + ); + return opt; + } + + @Test + public void testDeploy() { + Bundle[] bundles = context.getBundles(); + for (int i = 0; i < bundles.length; i++) { + Assert.assertEquals(bundles[i].getSymbolicName() + " is not active", Bundle.ACTIVE, bundles[i].getState()); + } + } + + @Test + public void testInstanceArchitecture() { + // Version 1.0 + ServiceReference refv1 = ipojo.getServiceReferenceByName(Architecture.class.getName(), "instance-v1"); + Assert.assertNotNull(refv1); + Architecture archv1 = (Architecture) osgi.getServiceObject(refv1); + + String version = archv1.getInstanceDescription().getComponentDescription().getVersion(); + Assert.assertEquals("1.0", version); + + // Version 1.1 + ServiceReference refv11 = ipojo.getServiceReferenceByName(Architecture.class.getName(), "instance-v1.1"); + Assert.assertNotNull(refv11); + Architecture archv11 = (Architecture) osgi.getServiceObject(refv11); + + String version11 = archv11.getInstanceDescription().getComponentDescription().getVersion(); + Assert.assertEquals("1.1", version11); + + // No Version + ServiceReference refany = ipojo.getServiceReferenceByName(Architecture.class.getName(), "instance-any"); + Assert.assertNotNull(refany); + Architecture archany = (Architecture) osgi.getServiceObject(refany); + + String any = archany.getInstanceDescription().getComponentDescription().getVersion(); + Assert.assertNotNull(any); + + // No version set in the factory, so no version. + ServiceReference refmci = ipojo.getServiceReferenceByName(Architecture.class.getName(), "MyComponentInstance"); + Assert.assertNotNull(refmci); + Architecture archmcy = (Architecture) osgi.getServiceObject(refmci); + + String mci = archmcy.getInstanceDescription().getComponentDescription().getVersion(); + Assert.assertNull(mci); + + } + + @Test + public void testServiceProperty() { + // Version 1.0 + ServiceReference refv1 = ipojo.getServiceReferenceByName(MyService.class.getName(), "instance-v1"); + Assert.assertNotNull(refv1); + String version = (String) refv1.getProperty("factory.version"); + Assert.assertEquals("1.0", version); + + // Version 1.1 + ServiceReference refv11 = ipojo.getServiceReferenceByName(MyService.class.getName(), "instance-v1.1"); + Assert.assertNotNull(refv11); + String version11 = (String) refv11.getProperty("factory.version"); + + Assert.assertEquals("1.1", version11); + + // No Version + ServiceReference refany = ipojo.getServiceReferenceByName(MyService.class.getName(), "instance-any"); + Assert.assertNotNull(refany); + String any = (String) refany.getProperty("factory.version"); + Assert.assertNotNull(any); + + // No version set in the factory, so no version. + ServiceReference refmci = ipojo.getServiceReferenceByName(MyService.class.getName(), "MyComponentInstance"); + Assert.assertNotNull(refmci); + String mci = (String) refmci.getProperty("factory.version"); + Assert.assertNull(mci); + } + + +} Propchange: felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/FactoryVersionTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/IPOJOHelper.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/IPOJOHelper.java?rev=775456&view=auto ============================================================================== --- felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/IPOJOHelper.java (added) +++ felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/IPOJOHelper.java Sat May 16 12:30:05 2009 @@ -0,0 +1,730 @@ +/* + * 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.tests.core; + +import java.util.ArrayList; +import java.util.Dictionary; +import java.util.List; +import java.util.Properties; + +import org.apache.felix.ipojo.ComponentInstance; +import org.apache.felix.ipojo.Factory; +import org.apache.felix.ipojo.Handler; +import org.apache.felix.ipojo.HandlerFactory; +import org.apache.felix.ipojo.ServiceContext; +import org.apache.felix.ipojo.architecture.Architecture; +import org.apache.felix.ipojo.metadata.Element; +import org.apache.felix.ipojo.parser.ManifestMetadataParser; +import org.apache.felix.ipojo.parser.ParseException; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.service.cm.ManagedServiceFactory; + +/** + * iPOJO Helper. + * This helper helps getting {@link Factory}, and managing + * {@link ComponentInstance}. + * @author Felix Project Team + */ +public class IPOJOHelper { + + /** + * The bundle context. + */ + private BundleContext m_context; + + + /** + * List of instances. + */ + private List m_instances; + + /** + * Creates a IPOJOHelper. + * @param tc the OSGi Test Case + */ + public IPOJOHelper(BundleContext context) { + m_context = context; + m_instances = new ArrayList(); + } + + /** + * Disposes created instances. + * @see org.apache.felix.ipojo.junit4osgi.Helper#dispose() + */ + public void dispose() { + for (int i = 0; i < m_instances.size(); i++) { + ((ComponentInstance) m_instances.get(i)).dispose(); + } + m_instances.clear(); + } + + /** + * Gets a created instance from the instance name. + * @param name the instance name. + * @return the created {@link ComponentInstance} or null + * if the instance was not created during the session. + */ + public ComponentInstance getInstanceByName(String name) { + for (int i = 0; i < m_instances.size(); i++) { + if (((ComponentInstance) m_instances.get(i)).getInstanceName() + .equals(name)) { + return (ComponentInstance) m_instances.get(i); + } + } + return null; + } + + /** + * Creates a new component instance with the given name (and empty + * configuration), from the factory specified in the given bundle. + * + * @param bundle the bundle from which the component factory is defined. + * @param factoryName the name of the component factory, defined in the + * specified bundle. + * @param instanceName the name of the component instance to create. + * @return the newly created component instance. + */ + public static ComponentInstance createComponentInstance(Bundle bundle, + String factoryName, String instanceName) { + + // Create the instance configuration + Properties configuration = new Properties(); + configuration.put("instance.name", instanceName); + + return createComponentInstance(bundle, factoryName, configuration); + } + + /** + * Creates a new component instance with the given configuration, from the + * factory specified in the given bundle. + * + * @param bundle the bundle from which the component factory is defined. + * @param factoryName the name of the component factory, defined in the + * specified bundle. + * @param configuration the configuration of the component instance to + * create. + * @return the newly created component instance. + */ + public static ComponentInstance createComponentInstance(Bundle bundle, + String factoryName, Dictionary configuration) { + + // Retrieve the component factory. + Factory fact = getFactory(bundle, factoryName); + + if (fact == null) { + // Factory not found... + throw new IllegalArgumentException( + "Cannot find the component factory (" + factoryName + + ") in the specified bundle (" + + bundle.getSymbolicName() + ")."); + } + + try { + return fact.createComponentInstance(configuration); + } catch (Exception e) { + throw new IllegalArgumentException( + "Cannot create the component instance with the given configuration:" + + e.getMessage()); + } + } + + /** + * Creates a new component instance with the given name and configuration, + * from the factory specified in the given bundle. + * + * @param bundle the bundle from which the component factory is defined. + * @param factoryName the name of the component factory, defined in the + * specified bundle. + * @param instanceName the name of the component instance to create. + * @param configuration the configuration of the instance to create. + * @return the newly created component instance. + */ + public static ComponentInstance createComponentInstance(Bundle bundle, + String factoryName, String instanceName, Dictionary configuration) { + + // Add the instance name to the configuration + configuration.put("instance.name", instanceName); + + return createComponentInstance(bundle, factoryName, configuration); + } + + /** + * Creates a new component instance with the given name (and an empty + * configuration), from the factory specified in the given service context. + * + * @param serviceContext the service context in which the component factory + * service is registered. + * @param factoryName the name of the component factory, defined in the + * specified service context. + * @param instanceName the name of the component instance to create. + * @return the newly created component instance. + */ + public static ComponentInstance createComponentInstance( + ServiceContext serviceContext, String factoryName, + String instanceName) { + + // Create the instance configuration + Properties configuration = new Properties(); + configuration.put("instance.name", instanceName); + + return createComponentInstance(serviceContext, factoryName, + configuration); + } + + /** + * Creates a new component instance with the given name and configuration, + * from the factory specified in the given service context. + * + * @param serviceContext the service context in which the component factory + * service is registered. + * @param factoryName the name of the component factory, defined in the + * specified service context. + * @param configuration the configuration of the instance to create. + * @return the newly created component instance. + */ + public static ComponentInstance createComponentInstance( + ServiceContext serviceContext, String factoryName, + Dictionary configuration) { + + // Retrieve the component factory. + Factory fact = getFactory(serviceContext, factoryName); + + if (fact == null) { + // Factory not found... + throw new IllegalArgumentException( + "Cannot find the component factory (" + factoryName + + ") in the specified service context."); + } + + try { + return fact.createComponentInstance(configuration); + } catch (Exception e) { + throw new IllegalArgumentException( + "Cannot create the component instance with the given configuration: " + + e.getMessage()); + } + } + + /** + * Creates a new component instance with the given name and configuration, + * from the factory specified in the given service context. + * + * @param serviceContext the service context in which the component factory + * service is registered. + * @param factoryName the name of the component factory, defined in the + * specified service context. + * @param instanceName the name of the component instance to create. + * @param configuration the configuration of the instance to create. + * @return the newly created component instance. + */ + public static ComponentInstance createComponentInstance( + ServiceContext serviceContext, String factoryName, + String instanceName, Dictionary configuration) { + + // Add the instance name to the configuration + configuration.put("instance.name", instanceName); + + return createComponentInstance(serviceContext, factoryName, + configuration); + } + + /** + * Creates a new component instance with the given name (and empty + * configuration), from the factory specified in the local bundle. + * + * @param factoryName the name of the component factory, defined in the + * local bundle. + * @param instanceName the name of the component instance to create. + * @return the newly created component instance. + */ + public ComponentInstance createComponentInstance(String factoryName, + String instanceName) { + ComponentInstance ci = createComponentInstance(m_context.getBundle(), + factoryName, instanceName); + m_instances.add(ci); + return ci; + } + + /** + * Creates a new component instance with the given configuration, from the + * factory specified in the local bundle. + * + * @param factoryName the name of the component factory, in the local + * bundle. + * @param configuration the configuration of the component instance to + * create. + * @return the newly created component instance. + */ + public ComponentInstance createComponentInstance(String factoryName, + Dictionary configuration) { + ComponentInstance ci = createComponentInstance(m_context.getBundle(), + factoryName, configuration); + m_instances.add(ci); + return ci; + } + + /** + * Creates a new component instance with no configuration, from the factory + * specified in the local bundle. + * + * @param factoryName the name of the component factory, in the local + * bundle. + * @return the newly created component instance. + */ + public ComponentInstance createComponentInstance(String factoryName) { + ComponentInstance ci = createComponentInstance(m_context.getBundle(), + factoryName, (Dictionary) null); + m_instances.add(ci); + return ci; + } + + /** + * Creates a new component instance with the given name and configuration, + * from the factory specified in the given bundle. + * + * @param factoryName the name of the component factory, defined in the + * specified bundle. + * @param instanceName the name of the component instance to create. + * @param configuration the configuration of the instance to create. + * @return the newly created component instance. + */ + public ComponentInstance createComponentInstance(String factoryName, + String instanceName, Dictionary configuration) { + ComponentInstance ci = createComponentInstance(m_context.getBundle(), + factoryName, instanceName, configuration); + m_instances.add(ci); + return ci; + } + + /** + * Returns the component factory with the given name in the local bundle. + * + * @param factoryName the name of the factory to retrieve. + * @return the component factory with the given name in the local bundle, or + * {@code null} if not found. + */ + public Factory getFactory(String factoryName) { + return getFactory(m_context.getBundle(), factoryName); + } + + /** + * Returns the handler factory with the given name in the local bundle. + * + * @param factoryName the name of the handler factory to retrieve. + * @return the handler factory with the given name in the local bundle, or + * {@code null} if not found. + */ + public HandlerFactory getHandlerFactory(String factoryName) { + return getHandlerFactory(m_context.getBundle(), factoryName); + } + + /** + * Returns the metadata description of the component defined in this bundle. + * + * @param component the name of the locally defined component. + * @return the metadata description of the component with the given name, + * defined in this given bundle, or {@code null} if not found. + */ + public Element getMetadata(String component) { + return getMetadata(m_context.getBundle(), component); + } + + /** + * Returns the component factory with the given name in the given bundle. + * + * @param bundle the bundle from which the component factory is defined. + * @param factoryName the name of the defined factory. + * @return the component factory with the given name in the given bundle, or + * {@code null} if not found. + */ + public static Factory getFactory(Bundle bundle, String factoryName) { + ServiceReference[] refs; + try { + // Retrieves the component factories services in the bundle. + refs = bundle.getBundleContext().getServiceReferences( + Factory.class.getName(), + "(factory.name=" + factoryName + ")"); + if (refs != null) { + return (Factory) bundle.getBundleContext().getService(refs[0]); + } + + // Factory not found... + return null; + + } catch (InvalidSyntaxException e) { + throw new IllegalArgumentException( + "Cannot get the component factory services: " + + e.getMessage()); + } + } + + /** + * Returns the component factory with the given name, registered in the + * given service context. + * + * @param serviceContext the service context in which the factory service is + * defined. + * @param factoryName the name of the factory. + * @return the component factory with the given name, registered in the + * given service context. + */ + public static Factory getFactory(ServiceContext serviceContext, + String factoryName) { + ServiceReference[] refs; + try { + // Retrieves the component factories services in the service + // context. + refs = serviceContext.getServiceReferences(Factory.class.getName(), + "(factory.name=" + factoryName + ")"); + if (refs != null) { + return (Factory) serviceContext.getService(refs[0]); + } + return null; + + } catch (InvalidSyntaxException e) { + System.err.println("Cannot get the factory " + factoryName + " : " + + e.getMessage()); + return null; + } + } + + /** + * Returns the handler factory with the given name in the given bundle. + * + * @param bundle the bundle from which the handler factory is defined. + * @param factoryName the name of the handler factory to retrieve. + * @return the handler factory with the given name in the given bundle, or + * {@code null} if not found. + */ + public static HandlerFactory getHandlerFactory(Bundle bundle, + String factoryName) { + ServiceReference[] refs; + try { + // Retrieves the handler factories services in the bundle. + refs = bundle.getBundleContext().getServiceReferences( + HandlerFactory.class.getName(), + "(" + Handler.HANDLER_NAME_PROPERTY + "=" + factoryName + + ")"); + if (refs != null) { + return (HandlerFactory) bundle.getBundleContext().getService( + refs[0]); + } + + // Factory not found... + return null; + } catch (InvalidSyntaxException e) { + throw new IllegalArgumentException( + "Cannot get the handler factory services: " + + e.getMessage()); + } + } + + /** + * Returns the metadata description of the component with the given name, + * defined in the given bundle. + * + * @param bundle the bundle from which the component is defined. + * @param component the name of the defined component. + * @return the metadata description of the component with the given name, + * defined in the given bundle, or {@code null} if not found. + */ + public static Element getMetadata(Bundle bundle, String component) { + + // Retrieves the component description from the bundle's manifest. + String elem = (String) bundle.getHeaders().get("iPOJO-Components"); + if (elem == null) { + throw new IllegalArgumentException( + "Cannot find iPOJO-Components descriptor in the specified bundle (" + + bundle.getSymbolicName() + + "). Not an iPOJO bundle."); + } + + // Parses the retrieved description and find the component with the + // given name. + try { + Element element = ManifestMetadataParser.parseHeaderMetadata(elem); + Element[] childs = element.getElements("component"); + for (int i = 0; i < childs.length; i++) { + String name = childs[i].getAttribute("name"); + String clazz = childs[i].getAttribute("classname"); + if (name != null && name.equalsIgnoreCase(component)) { + return childs[i]; + } + if (clazz.equalsIgnoreCase(component)) { + return childs[i]; + } + } + + // Component not found... + return null; + + } catch (ParseException e) { + throw new IllegalStateException( + "Cannot parse the components from specified bundle (" + + bundle.getSymbolicName() + "): " + e.getMessage()); + } + } + + /** + * Returns the service object of a service registered in the specified + * service context, offering the specified interface and matching the given + * filter. + * + * @param serviceContext the service context in which the service is + * searched. + * @param itf the interface provided by the searched service. + * @param filter an additional filter (can be {@code null}). + * @return the service object provided by the specified bundle, offering the + * specified interface and matching the given filter. + */ + public static Object getServiceObject(ServiceContext serviceContext, + String itf, String filter) { + ServiceReference ref = getServiceReference(serviceContext, itf, filter); + if (ref != null) { + return serviceContext.getService(ref); + } else { + return null; + } + } + + /** + * Returns the service objects of the services registered in the specified + * service context, offering the specified interface and matching the given + * filter. + * + * @param serviceContext the service context in which services are searched. + * @param itf the interface provided by the searched services. + * @param filter an additional filter (can be {@code null}). + * @return the service objects provided by the specified bundle, offering + * the specified interface and matching the given filter. + */ + public static Object[] getServiceObjects(ServiceContext serviceContext, + String itf, String filter) { + ServiceReference[] refs = getServiceReferences(serviceContext, itf, + filter); + if (refs != null) { + Object[] list = new Object[refs.length]; + for (int i = 0; i < refs.length; i++) { + list[i] = serviceContext.getService(refs[i]); + } + return list; + } else { + return new Object[0]; + } + } + + /** + * Returns the service reference of a service registered in the specified + * service context, offering the specified interface and matching the given + * filter. + * + * @param serviceContext the service context in which services are searched. + * @param itf the interface provided by the searched service. + * @param filter an additional filter (can be {@code null}). + * @return a service reference registered in the specified service context, + * offering the specified interface and matching the given filter. + * If no service is found, {@code null} is returned. + */ + public static ServiceReference getServiceReference( + ServiceContext serviceContext, String itf, String filter) { + ServiceReference[] refs = getServiceReferences(serviceContext, itf, + filter); + if (refs.length != 0) { + return refs[0]; + } else { + // No service found + return null; + } + } + + /** + * Returns the service reference of the service registered in the specified + * service context, offering the specified interface and having the given + * persistent ID. + * + * @param serviceContext the service context in which services are searched. + * @param itf the interface provided by the searched service. + * @param pid the persistent ID of the searched service. + * @return a service registered in the specified service context, offering + * the specified interface and having the given persistent ID. + */ + public static ServiceReference getServiceReferenceByPID( + ServiceContext serviceContext, String itf, String pid) { + String filter = "(" + "service.pid" + "=" + pid + ")"; + ServiceReference[] refs = getServiceReferences(serviceContext, itf, + filter); + if (refs == null) { + return null; + } else if (refs.length == 1) { + return refs[0]; + } else { + throw new IllegalStateException( + "A service lookup by PID returned several providers (" + + refs.length + ")" + " for " + itf + " with pid=" + + pid); + } + } + + /** + * Returns the service reference of all the services registered in the + * specified service context, offering the specified interface and matching + * the given filter. + * + * @param serviceContext the service context in which services are searched. + * @param itf the interface provided by the searched services. + * @param filter an additional filter (can be {@code null}). + * @return all the service references registered in the specified service + * context, offering the specified interface and matching the given + * filter. If no service matches, an empty array is returned. + */ + public static ServiceReference[] getServiceReferences( + ServiceContext serviceContext, String itf, String filter) { + ServiceReference[] refs = null; + try { + // Get all the service references + refs = serviceContext.getServiceReferences(itf, filter); + } catch (InvalidSyntaxException e) { + throw new IllegalArgumentException( + "Cannot get service references: " + e.getMessage()); + } + if (refs == null) { + return new ServiceReference[0]; + } else { + return refs; + } + } + + /** + * Returns the service reference of a service registered in the specified + * service context, offering the specified interface and having the given + * name. + * + * @param serviceContext the service context in which services are searched. + * @param itf the interface provided by the searched service. + * @param name the name of the searched service. + * @return a service registered in the specified service context, offering + * the specified interface and having the given name. + */ + public static ServiceReference getServiceReferenceByName( + ServiceContext serviceContext, String itf, String name) { + String filter = null; + if (itf.equals(Factory.class.getName()) + || itf.equals(ManagedServiceFactory.class.getName())) { + filter = "(" + "factory.name" + "=" + name + ")"; + } else if (itf.equals(Architecture.class.getName())) { + filter = "(" + "architecture.instance" + "=" + name + ")"; + } else { + filter = "(" + "instance.name" + "=" + name + ")"; + } + return getServiceReference(serviceContext, itf, filter); + } + + /** + * Checks the availability of a service inside the given service context. + * @param sc the service context + * @param itf the service interface to found + * @return true if the service is available in the service + * context, false otherwise. + */ + public static boolean isServiceAvailable(ServiceContext sc, String itf) { + ServiceReference ref = getServiceReference(sc, itf, null); + return ref != null; + } + + /** + * Checks the availability of a service inside the given service context. + * @param sc the service context + * @param itf the service interface to found + * @param name the service provider name + * @return true if the service is available in the service + * context, false otherwise. + */ + public static boolean isServiceAvailableByName(ServiceContext sc, + String itf, String name) { + ServiceReference ref = getServiceReferenceByName(sc, itf, name); + return ref != null; + } + + /** + * Checks the availability of a service inside the given service context. + * @param sc the service context + * @param itf the service interface to found + * @param pid the pid of the service + * @return true if the service is available in the service + * context, false otherwise. + */ + public static boolean isServiceAvailableByPID(ServiceContext sc, + String itf, String pid) { + ServiceReference ref = getServiceReferenceByPID(sc, itf, pid); + return ref != null; + } + + /** + * Returns the service reference of a service provided by the specified + * bundle, offering the specified interface and having the given name. + * + * @param bundle the bundle from which the service is searched. + * @param itf the interface provided by the searched service. + * @param name the name of the searched service. + * @return a service provided by the specified bundle, offering the + * specified interface and having the given name. + */ + public static ServiceReference getServiceReferenceByName(Bundle bundle, + String itf, String name) { + String filter = null; + if (itf.equals(Factory.class.getName()) + || itf.equals(ManagedServiceFactory.class.getName())) { + filter = "(" + "factory.name" + "=" + name + ")"; + } else if (itf.equals(Architecture.class.getName())) { + filter = "(" + "architecture.instance" + "=" + name + ")"; + } else { + filter = "(" + "instance.name" + "=" + name + ")"; + } + return OSGiHelper.getServiceReference(bundle, itf, filter); + } + + /** + * Returns the service reference of a service provided by the local bundle, + * offering the specified interface and having the given name. + * + * @param itf the interface provided by the searched service. + * @param name the name of the searched service. + * @return a service provided by the specified bundle, offering the + * specified interface and having the given name. + */ + public ServiceReference getServiceReferenceByName(String itf, String name) { + return getServiceReferenceByName(m_context.getBundle(), itf, name); + } + + /** + * Checks if the service is available. + * @param itf the service interface + * @param name the service provider name + * @return true if the service is available, false + * otherwise. + */ + public boolean isServiceAvailableByName(String itf, String name) { + ServiceReference ref = getServiceReferenceByName(itf, name); + return ref != null; + } + +} Propchange: felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/IPOJOHelper.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/OSGiHelper.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/OSGiHelper.java?rev=775456&view=auto ============================================================================== --- felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/OSGiHelper.java (added) +++ felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/OSGiHelper.java Sat May 16 12:30:05 2009 @@ -0,0 +1,456 @@ +package org.apache.felix.ipojo.tests.core; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleException; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.service.packageadmin.PackageAdmin; + +import static org.junit.Assert.fail; + + +public class OSGiHelper { + + /** + * The bundle context. + */ + private BundleContext context; + + /** + * List of get references. + */ + private List m_references = new ArrayList(); + + public OSGiHelper(BundleContext context) { + this.context = context; + } + + public void dispose() { + // Unget services + for (int i = 0; i < m_references.size(); i++) { + context.ungetService((ServiceReference) m_references.get(i)); + } + m_references.clear(); + } + + /** + * Gets the Bundle Context. + * @return the bundle context. + */ + public BundleContext getContext() { + return context; + } + + /** + * Returns the service object of a service provided by the specified bundle, + * offering the specified interface and matching the given filter. + * + * @param bundle the bundle from which the service is searched. + * @param itf the interface provided by the searched service. + * @param filter an additional filter (can be {@code null}). + * @return the service object provided by the specified bundle, offering the + * specified interface and matching the given filter. + */ + public static Object getServiceObject(Bundle bundle, String itf, + String filter) { + ServiceReference ref = getServiceReference(bundle, itf, filter); + if (ref != null) { + return bundle.getBundleContext().getService(ref); + } else { + return null; + } + } + + /** + * Returns the service objects of the services provided by the specified + * bundle, offering the specified interface and matching the given filter. + * + * @param bundle the bundle from which services are searched. + * @param itf the interface provided by the searched services. + * @param filter an additional filter (can be {@code null}). + * @return the service objects provided by the specified bundle, offering + * the specified interface and matching the given filter. + */ + public static Object[] getServiceObjects(Bundle bundle, String itf, + String filter) { + ServiceReference[] refs = getServiceReferences(bundle, itf, filter); + if (refs != null) { + Object[] list = new Object[refs.length]; + for (int i = 0; i < refs.length; i++) { + list[i] = bundle.getBundleContext().getService(refs[i]); + } + return list; + } else { + return new Object[0]; + } + } + + /** + * Returns the service reference of a service provided by the specified + * bundle, offering the specified interface and matching the given filter. + * + * @param bundle the bundle from which the service is searched. + * @param itf the interface provided by the searched service. + * @param filter an additional filter (can be {@code null}). + * @return a service reference provided by the specified bundle, offering + * the specified interface and matching the given filter. If no + * service is found, {@code null} is returned. + */ + public static ServiceReference getServiceReference(Bundle bundle, + String itf, String filter) { + ServiceReference[] refs = getServiceReferences(bundle, itf, filter); + if (refs.length != 0) { + return refs[0]; + } else { + // No service found + return null; + } + } + + /** + * Checks if the service is available. + * @param itf the service interface + * @return true if the service is available, false + * otherwise. + */ + public boolean isServiceAvailable(String itf) { + ServiceReference ref = getServiceReference(itf, null); + return ref != null; + } + + /** + * Checks if the service is available. + * @param itf the service interface + * @param pid the service pid + * @return true if the service is available, false + * otherwise. + */ + public boolean isServiceAvailableByPID(String itf, String pid) { + ServiceReference ref = getServiceReferenceByPID(itf, pid); + return ref != null; + } + + /** + * Returns the service reference of the service provided by the specified + * bundle, offering the specified interface and having the given persistent + * ID. + * + * @param bundle the bundle from which the service is searched. + * @param itf the interface provided by the searched service. + * @param pid the persistent ID of the searched service. + * @return a service provided by the specified bundle, offering the + * specified interface and having the given persistent ID. + */ + public static ServiceReference getServiceReferenceByPID(Bundle bundle, + String itf, String pid) { + String filter = "(" + "service.pid" + "=" + pid + ")"; + ServiceReference[] refs = getServiceReferences(bundle, itf, filter); + if (refs == null) { + return null; + } else if (refs.length == 1) { + return refs[0]; + } else { + throw new IllegalStateException( + "A service lookup by PID returned several providers (" + + refs.length + ")" + " for " + itf + " with pid=" + + pid); + } + } + + /** + * Returns the service reference of all the services provided in the + * specified bundle, offering the specified interface and matching the given + * filter. + * + * @param bundle the bundle from which services are searched. + * @param itf the interface provided by the searched services. + * @param filter an additional filter (can be {@code null}). + * @return all the service references provided in the specified bundle, + * offering the specified interface and matching the given filter. + * If no service matches, an empty array is returned. + */ + public static ServiceReference[] getServiceReferences(Bundle bundle, + String itf, String filter) { + ServiceReference[] refs = null; + try { + // Get all the service references + refs = bundle.getBundleContext().getServiceReferences(itf, filter); + } catch (InvalidSyntaxException e) { + throw new IllegalArgumentException( + "Cannot get service references: " + e.getMessage()); + } + if (refs == null) { + return new ServiceReference[0]; + } else { + return refs; + } + } + + /** + * Returns the service object of a service provided by the local bundle, + * offering the specified interface and matching the given filter. + * + * @param itf the interface provided by the searched service. + * @param filter an additional filter (can be {@code null}). + * @return the service object provided by the local bundle, offering the + * specified interface and matching the given filter. + */ + public Object getServiceObject(String itf, String filter) { + ServiceReference ref = getServiceReference(itf, filter); + if (ref != null) { + m_references.add(ref); + return context.getService(ref); + } else { + return null; + } + } + + /** + * Returns the service object associated with this service reference. + * + * @param ref service reference + * @return the service object. + */ + public Object getServiceObject(ServiceReference ref) { + if (ref != null) { + m_references.add(ref); + return context.getService(ref); + } else { + return null; + } + } + + /** + * Returns the service objects of the services provided by the local bundle, + * offering the specified interface and matching the given filter. + * + * @param itf the interface provided by the searched services. + * @param filter an additional filter (can be {@code null}). + * @return the service objects provided by the local bundle, offering the + * specified interface and matching the given filter. + */ + public Object[] getServiceObjects(String itf, String filter) { + ServiceReference[] refs = getServiceReferences(itf, filter); + if (refs != null) { + Object[] list = new Object[refs.length]; + for (int i = 0; i < refs.length; i++) { + m_references.add(refs[i]); + list[i] = context.getService(refs[i]); + } + return list; + } else { + return new Object[0]; + } + } + + /** + * Returns the service reference of a service provided by the local bundle, + * offering the specified interface and matching the given filter. + * + * @param itf the interface provided by the searched service. + * @param filter an additional filter (can be {@code null}). + * @return a service reference provided by the local bundle, offering the + * specified interface and matching the given filter. If no service + * is found, {@code null} is returned. + */ + public ServiceReference getServiceReference(String itf, String filter) { + return getServiceReference(context.getBundle(), itf, filter); + } + + /** + * Returns the service reference of a service provided offering the + * specified interface. + * + * @param itf the interface provided by the searched service. + * @return a service reference provided by the local bundle, offering the + * specified interface and matching the given filter. If no service + * is found, {@code null} is returned. + */ + public ServiceReference getServiceReference(String itf) { + return getServiceReference(context.getBundle(), itf, null); + } + + /** + * Returns the service reference of the service provided by the local + * bundle, offering the specified interface and having the given persistent + * ID. + * + * @param itf the interface provided by the searched service. + * @param pid the persistent ID of the searched service. + * @return a service provided by the local bundle, offering the specified + * interface and having the given persistent ID. + */ + public ServiceReference getServiceReferenceByPID(String itf, String pid) { + return getServiceReferenceByPID(context.getBundle(), itf, pid); + } + + /** + * Returns the service reference of all the services provided in the local + * bundle, offering the specified interface and matching the given filter. + * + * @param itf the interface provided by the searched services. + * @param filter an additional filter (can be {@code null}). + * @return all the service references provided in the local bundle, offering + * the specified interface and matching the given filter. If no + * service matches, an empty array is returned. + */ + public ServiceReference[] getServiceReferences(String itf, String filter) { + return getServiceReferences(context.getBundle(), itf, filter); + } + + /** + * Gets the package admin exposed by the framework. + * Fails if the package admin is not available. + * @return the package admin service. + */ + public PackageAdmin getPackageAdmin() { + PackageAdmin pa = (PackageAdmin) getServiceObject(PackageAdmin.class.getName(), null); + if (pa == null) { + fail("No package admin available"); + } + return pa; + } + + /** + * Refresh the packages. + * Fails if the package admin service is not available. + */ + public void refresh() { + getPackageAdmin().refreshPackages(null); + } + + /** + * Waits for a service. Fails on timeout. + * If timeout is set to 0, it sets the timeout to 10s. + * @param itf the service interface + * @param filter the filter + * @param timeout the timeout + */ + public void waitForService(String itf, String filter, long timeout) { + if (timeout == 0) { + timeout = 10000; // Default 10 secondes. + } + ServiceReference[] refs = getServiceReferences(itf, filter); + long begin = System.currentTimeMillis(); + if (refs.length != 0) { + return; + } else { + while(refs.length == 0) { + try { + Thread.sleep(5); + } catch (InterruptedException e) { + // Interrupted + } + long now = System.currentTimeMillis(); + + if ((now - begin) > timeout) { + fail("Timeout ... no services matching with the request after " + timeout + "ms"); + } + refs = getServiceReferences(itf, filter); + } + } + } + + + /** + * Installs a bundle. + * Fails if the bundle cannot be installed. + * Be aware that you have to uninstall the bundle yourself. + * @param url bundle url + * @return the installed bundle + */ + public Bundle installBundle(String url) { + try { + return context.installBundle(url); + } catch (BundleException e) { + fail("Cannot install the bundle " + url + " : " + e.getMessage()); + } + return null; // Can not happen + } + + /** + * Installs a bundle. + * Fails if the bundle cannot be installed. + * Be aware that you have to uninstall the bundle yourself. + * @param url bundle url + * @param stream input stream containing the bundle + * @return the installed bundle + */ + public Bundle installBundle(String url, InputStream stream) { + try { + return context.installBundle(url, stream); + } catch (BundleException e) { + fail("Cannot install the bundle " + url + " : " + e.getMessage()); + } + return null; // Can not happen + } + + /** + * Installs and starts a bundle. + * Fails if the bundle cannot be installed or an error occurs + * during startup. Be aware that you have to uninstall the bundle + * yourself. + * @param url the bundle url + * @return the Bundle object. + */ + public Bundle installAndStart(String url) { + Bundle bundle = installBundle(url); + try { + bundle.start(); + } catch (BundleException e) { + fail("Cannot start the bundle " + url + " : " + e.getMessage()); + } + return bundle; + } + + /** + * Installs and starts a bundle. + * Fails if the bundle cannot be installed or an error occurs + * during startup. Be aware that you have to uninstall the bundle + * yourself. + * @param url the bundle url + * @param stream input stream containing the bundle + * @return the Bundle object. + */ + public Bundle installAndStart(String url, InputStream stream) { + Bundle bundle = installBundle(url, stream); + try { + bundle.start(); + } catch (BundleException e) { + fail("Cannot start the bundle " + url + " : " + e.getMessage()); + } + return bundle; + } + + /** + * Get the bundle by its id. + * @param bundleId the bundle id. + * @return the bundle with the given id. + */ + public Bundle getBundle(long bundleId) { + return context.getBundle(bundleId); + } + + /** + * Gets a bundle by its symbolic name. + * Fails if no bundle matches. + * @param name the symbolic name of the bundle + * @return the bundle object. + */ + public Bundle getBundle(String name) { + Bundle[] bundles = context.getBundles(); + for (int i = 0; i < bundles.length; i++) { + if (name.equals(bundles[i].getSymbolicName())) { + return bundles[i]; + } + } + fail("No bundles with the given symbolic name " + name); + return null; // should not happen + } + +} Propchange: felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/OSGiHelper.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/component/MyComponent.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/component/MyComponent.java?rev=775456&view=auto ============================================================================== --- felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/component/MyComponent.java (added) +++ felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/component/MyComponent.java Sat May 16 12:30:05 2009 @@ -0,0 +1,11 @@ +package org.apache.felix.ipojo.tests.core.component; + +import org.apache.felix.ipojo.tests.core.service.MyService; + +public class MyComponent implements MyService { + + public void foo() { + // Nothing to do. + } + +} Propchange: felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/component/MyComponent.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/service/MyService.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/service/MyService.java?rev=775456&view=auto ============================================================================== --- felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/service/MyService.java (added) +++ felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/service/MyService.java Sat May 16 12:30:05 2009 @@ -0,0 +1,7 @@ +package org.apache.felix.ipojo.tests.core.service; + +public interface MyService { + + public void foo(); + +} Propchange: felix/trunk/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/service/MyService.java ------------------------------------------------------------------------------ svn:mime-type = text/plain