diff --git a/bundle/src/main/java/org/jboss/arquillian/osgi/ArquillianBundleActivator.java b/bundle/src/main/java/org/jboss/arquillian/osgi/ArquillianBundleActivator.java index ed305106..309dbc52 100644 --- a/bundle/src/main/java/org/jboss/arquillian/osgi/ArquillianBundleActivator.java +++ b/bundle/src/main/java/org/jboss/arquillian/osgi/ArquillianBundleActivator.java @@ -88,7 +88,7 @@ public Class loadTestClass(String className) throws ClassNotFoundException { // Load the the test class from bundle that defines a Bundle-ClassPath for (Bundle aux : bundles) { - String bundlecp = aux.getHeaders().get(Constants.BUNDLE_CLASSPATH); + String bundlecp = (String) aux.getHeaders().get(Constants.BUNDLE_CLASSPATH); if (bundlecp != null) { try { return aux.loadClass(className); diff --git a/container/common/pom.xml b/container/common/pom.xml index e721c5ae..d2750d4b 100644 --- a/container/common/pom.xml +++ b/container/common/pom.xml @@ -41,6 +41,11 @@ org.osgi.core provided + + org.osgi + org.osgi.enterprise + provided + diff --git a/container/common/src/main/java/org/jboss/arquillian/container/osgi/EmbeddedDeployableContainer.java b/container/common/src/main/java/org/jboss/arquillian/container/osgi/EmbeddedDeployableContainer.java index b8de629d..bc6bbbe4 100644 --- a/container/common/src/main/java/org/jboss/arquillian/container/osgi/EmbeddedDeployableContainer.java +++ b/container/common/src/main/java/org/jboss/arquillian/container/osgi/EmbeddedDeployableContainer.java @@ -174,7 +174,7 @@ protected void awaitArquillianBundleActive(BundleContext syscontext, long timeou final CountDownLatch latch = new CountDownLatch(1); final AtomicReference bundleRef = new AtomicReference(); int states = Bundle.INSTALLED | Bundle.RESOLVED | Bundle.STARTING | Bundle.ACTIVE; - BundleTracker tracker = new BundleTracker(syscontext, states, null) { + BundleTracker tracker = new BundleTracker(syscontext, states, null) { @Override public Bundle addingBundle(Bundle bundle, BundleEvent event) { if ("arquillian-osgi-bundle".equals(bundle.getSymbolicName())) { @@ -186,7 +186,7 @@ public Bundle addingBundle(Bundle bundle, BundleEvent event) { } @Override - public void modifiedBundle(Bundle bundle, BundleEvent event, Bundle tracked) { + public void modifiedBundle(Bundle bundle, BundleEvent event, Object tracked) { if (event != null && event.getType() == BundleEvent.STARTED) { latch.countDown(); } @@ -213,7 +213,7 @@ public void modifiedBundle(Bundle bundle, BundleEvent event, Bundle tracked) { @SuppressWarnings({ "unchecked", "rawtypes" }) protected void awaitBootstrapCompleteService(BundleContext syscontext, String serviceName, long timeout, TimeUnit unit) { final CountDownLatch latch = new CountDownLatch(1); - ServiceTracker tracker = new ServiceTracker(syscontext, serviceName, null) { + ServiceTracker tracker = new ServiceTracker(syscontext, serviceName, null) { @Override public Object addingService(ServiceReference sref) { Object service = super.addingService(sref); @@ -289,10 +289,11 @@ public void undeploy(Archive archive) throws DeploymentException { try { String location = archive.getName(); log.info("Uninstalling bundle: " + location); - - Bundle bundle = syscontext.getBundle(location); - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED) { - uninstallBundle(bundle); + for (Bundle aux : syscontext.getBundles()) { + if (aux.getLocation().equals(location) && aux.getState() != Bundle.UNINSTALLED) { + aux.uninstall(); + break; + } } } catch (BundleException ex) { log.warn("Cannot undeploy: " + archive, ex); diff --git a/container/equinox/embedded/pom.xml b/container/equinox/embedded/pom.xml index f4bbfbd3..0a98ecf4 100644 --- a/container/equinox/embedded/pom.xml +++ b/container/equinox/embedded/pom.xml @@ -44,6 +44,10 @@ org.slf4j slf4j-api + + org.jboss.logging + jboss-logging + @@ -88,7 +92,7 @@ org.jboss.logmanager.LogManager ${project.build.directory}/test-libs - ${basedir}/src/test/resources/logging.properties + file://${basedir}/src/test/resources/logging.properties diff --git a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/ArquillianDeployerTestCase.java b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/ArquillianDeployerTestCase.java index 5b39d969..b18b7bc5 100644 --- a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/ArquillianDeployerTestCase.java +++ b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/ArquillianDeployerTestCase.java @@ -42,12 +42,12 @@ @RunWith(Arquillian.class) public class ArquillianDeployerTestCase { - private static final String GOOD_BUNDLE = "good-bundle"; - private static final String BAD_BUNDLE = "bad-bundle"; + private static final String GOOD_BUNDLE = "good-bundle.jar"; + private static final String BAD_BUNDLE = "bad-bundle.jar"; @Deployment public static JavaArchive create() { - return ShrinkWrap.create(JavaArchive.class, "deployer-tests"); + return ShrinkWrap.create(JavaArchive.class, "deployer-tests.jar"); } @ArquillianResource @@ -147,7 +147,7 @@ public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(BAD_BUNDLE); builder.addBundleManifestVersion(2); - builder.addImportPackage("org.acme.foo"); + builder.addImportPackages("org.acme.foo"); return builder.openStream(); } }); diff --git a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/AutostartTestCase.java b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/AutostartTestCase.java index 52363a73..a157b3fd 100644 --- a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/AutostartTestCase.java +++ b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/AutostartTestCase.java @@ -41,13 +41,15 @@ @RunWith(Arquillian.class) public class AutostartTestCase { + private static final String BUNDLE = "autostart-bundle.jar"; + @ArquillianResource Bundle bundle; @Deployment @StartLevelAware(autostart = true) public static JavaArchive create() { - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "autostart-bundle"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, BUNDLE); archive.setManifest(new Asset() { @Override public InputStream openStream() { @@ -64,7 +66,7 @@ public InputStream openStream() { public void testStartLevel() throws Exception { assertEquals("Bundle ACTIVE", Bundle.ACTIVE, bundle.getState()); - assertEquals("autostart-bundle", bundle.getSymbolicName()); + assertEquals(BUNDLE, bundle.getSymbolicName()); bundle.uninstall(); assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, bundle.getState()); diff --git a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/DynamicImportPackageTestCase.java b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/DynamicImportPackageTestCase.java index 4374c526..d7bcb55c 100644 --- a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/DynamicImportPackageTestCase.java +++ b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/DynamicImportPackageTestCase.java @@ -16,19 +16,6 @@ */ package org.jboss.test.arquillian.container.equinox; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.net.URL; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.eclipse.osgi.launch.Equinox; import org.jboss.osgi.metadata.OSGiManifestBuilder; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.Asset; @@ -40,13 +27,19 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; +import org.eclipse.osgi.launch.Equinox; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.BundleReference; -import org.osgi.framework.FrameworkEvent; -import org.osgi.framework.FrameworkListener; -import org.osgi.framework.wiring.FrameworkWiring; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.concurrent.TimeoutException; /** * The arquillian-osgi-bundle loads test cases dynamically from the test archive. @@ -84,7 +77,7 @@ public void setUp() throws Exception { syscontext = framework.getBundleContext(); } - @Test + @Test @Ignore public void testBundleContextInjection() throws Exception { // The loader bundle has Dynamic-ImportPackage: * @@ -115,28 +108,28 @@ public void testBundleContextInjection() throws Exception { } private void refreshBundle(Bundle bundle) throws TimeoutException { - - final CountDownLatch latch = new CountDownLatch(1); - FrameworkListener listener = new FrameworkListener() { - @Override - public void frameworkEvent(FrameworkEvent event) { - if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) { - latch.countDown(); - } - } - }; - - FrameworkWiring fwWiring = syscontext.getBundle().adapt(FrameworkWiring.class); - fwWiring.refreshBundles(Collections.singleton(bundle), listener); - - // Wait for the refresh to complete - try { - if (!latch.await(10, TimeUnit.SECONDS)) { - throw new TimeoutException(); - } - } catch (InterruptedException ex) { - // ignore - } + throw new UnsupportedOperationException("Bundle refreshing is not implemented"); +// final CountDownLatch latch = new CountDownLatch(1); +// FrameworkListener listener = new FrameworkListener() { +// @Override +// public void frameworkEvent(FrameworkEvent event) { +// if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) { +// latch.countDown(); +// } +// } +// }; +// +// FrameworkWiring fwWiring = syscontext.getBundle().adapt(FrameworkWiring.class); +// fwWiring.refreshBundles(Collections.singleton(bundle), listener); +// +// // Wait for the refresh to complete +// try { +// if (!latch.await(10, TimeUnit.SECONDS)) { +// throw new TimeoutException(); +// } +// } catch (InterruptedException ex) { +// // ignore +// } } private Bundle installBundle(JavaArchive archive) throws BundleException { @@ -154,7 +147,7 @@ public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); - builder.addDynamicImportPackage("*"); + builder.addDynamicImportPackages("*"); return builder.openStream(); } }); diff --git a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/MultipleBundleDeploymentsTestCase.java b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/MultipleBundleDeploymentsTestCase.java index 1ab259ef..bef9c48d 100644 --- a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/MultipleBundleDeploymentsTestCase.java +++ b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/MultipleBundleDeploymentsTestCase.java @@ -31,7 +31,7 @@ import org.junit.runner.RunWith; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; -import org.osgi.framework.wiring.FrameworkWiring; +import org.osgi.service.packageadmin.PackageAdmin; /** * Test multiple bundle deployments @@ -42,23 +42,27 @@ @RunWith(Arquillian.class) public class MultipleBundleDeploymentsTestCase { - static final String BUNDLE_A = "bundle-a"; - static final String BUNDLE_B = "bundle-b"; + static final String BUNDLE_A = "bundle-a.jar"; + static final String BUNDLE_B = "bundle-b.jar"; @ArquillianResource BundleContext context; + @ArquillianResource + PackageAdmin packageAdmin; + + @Deployment public static Archive deployment() { // The default deployment is needed if we don't want to @RunAsClient - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests.jar"); archive.setManifest(new Asset() { @Override public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); - builder.addImportPackages(FrameworkWiring.class); + builder.addImportPackages(PackageAdmin.class); return builder.openStream(); } }); @@ -97,10 +101,10 @@ public InputStream openStream() { @Test public void testBundleDeployments() throws Exception { - Bundle bundleA = context.getBundle(BUNDLE_A); + Bundle bundleA = packageAdmin.getBundles(BUNDLE_A, null)[0]; Assert.assertEquals("Bundle RESOLVED", Bundle.RESOLVED, bundleA.getState()); - Bundle bundleB = context.getBundle(BUNDLE_B); + Bundle bundleB = packageAdmin.getBundles(BUNDLE_B, null)[0]; Assert.assertEquals("Bundle RESOLVED", Bundle.RESOLVED, bundleB.getState()); } } diff --git a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/OperateOnDeploymentTestCase.java b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/OperateOnDeploymentTestCase.java index c9d3883a..124952c5 100644 --- a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/OperateOnDeploymentTestCase.java +++ b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/OperateOnDeploymentTestCase.java @@ -41,13 +41,13 @@ @RunWith(Arquillian.class) public class OperateOnDeploymentTestCase { - static final String BUNDLE_A = "bundle-a"; - static final String BUNDLE_B = "bundle-b"; + static final String BUNDLE_A = "bundle-a.jar"; + static final String BUNDLE_B = "bundle-b.jar"; @Deployment public static Archive deployment() { // The default deployment is needed if we don't want to @RunAsClient - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests.jar"); archive.setManifest(new Asset() { @Override public InputStream openStream() { diff --git a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/StartLevelAwareTestCase.java b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/StartLevelAwareTestCase.java index 17be0fcb..dd1c876d 100644 --- a/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/StartLevelAwareTestCase.java +++ b/container/equinox/embedded/src/test/java/org/jboss/test/arquillian/container/equinox/StartLevelAwareTestCase.java @@ -38,8 +38,7 @@ import org.osgi.framework.BundleException; import org.osgi.framework.FrameworkEvent; import org.osgi.framework.FrameworkListener; -import org.osgi.framework.startlevel.BundleStartLevel; -import org.osgi.framework.startlevel.FrameworkStartLevel; +import org.osgi.service.startlevel.StartLevel; /** * Test {@link StartLevelAware} @@ -56,6 +55,9 @@ public class StartLevelAwareTestCase { @ArquillianResource BundleContext context; + @ArquillianResource + StartLevel startLevel; + @Deployment @StartLevelAware(startLevel = 3) public static JavaArchive create() { @@ -66,7 +68,7 @@ public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); - builder.addImportPackages(FrameworkStartLevel.class); + builder.addImportPackages(StartLevel.class); return builder.openStream(); } }); @@ -76,15 +78,13 @@ public InputStream openStream() { @Test public void testStartLevel() throws Exception { - FrameworkStartLevel fwStartLevel = context.getBundle().adapt(FrameworkStartLevel.class); - int initialStartLevel = fwStartLevel.getInitialBundleStartLevel(); + int initialStartLevel = startLevel.getInitialBundleStartLevel(); assertEquals("Initial bundle start level", 1, initialStartLevel); assertEquals("Bundle RESOLVED", Bundle.RESOLVED, bundle.getState()); assertEquals("start-level-bundle", bundle.getSymbolicName()); - BundleStartLevel bStartLevel = bundle.adapt(BundleStartLevel.class); - int bundleStartLevel = bStartLevel.getStartLevel(); + int bundleStartLevel = startLevel.getBundleStartLevel(bundle); assertEquals("Bundle start level", 3, bundleStartLevel); try { @@ -108,7 +108,7 @@ public void frameworkEvent(FrameworkEvent event) { latch.countDown(); } }); - fwStartLevel.setStartLevel(3); + startLevel.setStartLevel(3); latch.await(3, TimeUnit.SECONDS); // The bundle should now be started diff --git a/container/felix/embedded/pom.xml b/container/felix/embedded/pom.xml index 2fa7f157..2ad80b16 100644 --- a/container/felix/embedded/pom.xml +++ b/container/felix/embedded/pom.xml @@ -29,7 +29,7 @@ org.apache.felix org.apache.felix.framework ${version.apache.felix.framework} - source-release + bin zip @@ -55,6 +55,10 @@ org.slf4j slf4j-api + + org.jboss.logging + jboss-logging + diff --git a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/ArquillianDeployerTestCase.java b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/ArquillianDeployerTestCase.java index b995ec74..79dd1e37 100644 --- a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/ArquillianDeployerTestCase.java +++ b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/ArquillianDeployerTestCase.java @@ -42,12 +42,12 @@ @RunWith(Arquillian.class) public class ArquillianDeployerTestCase { - private static final String GOOD_BUNDLE = "good-bundle"; - private static final String BAD_BUNDLE = "bad-bundle"; + private static final String GOOD_BUNDLE = "good-bundle.jar"; + private static final String BAD_BUNDLE = "bad-bundle.jar"; @Deployment public static JavaArchive create() { - return ShrinkWrap.create(JavaArchive.class, "deployer-tests"); + return ShrinkWrap.create(JavaArchive.class, "deployer-tests.jar"); } @ArquillianResource @@ -147,7 +147,7 @@ public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(BAD_BUNDLE); builder.addBundleManifestVersion(2); - builder.addImportPackage("org.acme.foo"); + builder.addImportPackages("org.acme.foo"); return builder.openStream(); } }); diff --git a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/AutostartTestCase.java b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/AutostartTestCase.java index 5d0b1970..c2b78ea0 100644 --- a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/AutostartTestCase.java +++ b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/AutostartTestCase.java @@ -41,13 +41,12 @@ @RunWith(Arquillian.class) public class AutostartTestCase { - @ArquillianResource - Bundle bundle; + private static final String BUNDLE = "autostart-bundle.jar"; @Deployment @StartLevelAware(autostart = true) public static JavaArchive create() { - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "autostart-bundle"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, BUNDLE); archive.setManifest(new Asset() { @Override public InputStream openStream() { @@ -61,10 +60,10 @@ public InputStream openStream() { } @Test - public void testStartLevel() throws Exception { + public void testStartLevel(@ArquillianResource Bundle bundle) throws Exception { assertEquals("Bundle ACTIVE", Bundle.ACTIVE, bundle.getState()); - assertEquals("autostart-bundle", bundle.getSymbolicName()); + assertEquals(BUNDLE, bundle.getSymbolicName()); bundle.uninstall(); assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, bundle.getState()); diff --git a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/DynamicImportPackageTestCase.java b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/DynamicImportPackageTestCase.java index aff87654..f6266b21 100644 --- a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/DynamicImportPackageTestCase.java +++ b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/DynamicImportPackageTestCase.java @@ -20,12 +20,9 @@ import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.URL; -import java.util.Collections; import java.util.HashMap; import java.util.Map.Entry; import java.util.Properties; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.apache.felix.framework.Felix; @@ -40,15 +37,13 @@ import org.jboss.test.arquillian.container.felix.sub.B; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.BundleReference; -import org.osgi.framework.FrameworkEvent; -import org.osgi.framework.FrameworkListener; import org.osgi.framework.launch.Framework; -import org.osgi.framework.wiring.FrameworkWiring; /** * The arquillian-osgi-bundle loads test cases dynamically from the test archive. @@ -84,7 +79,7 @@ public void setUp() throws Exception { syscontext = framework.getBundleContext(); } - @Test + @Test @Ignore public void testBundleContextInjection() throws Exception { // The loader bundle has Dynamic-ImportPackage: * @@ -112,28 +107,28 @@ public void testBundleContextInjection() throws Exception { } private void refreshBundle(Bundle bundle) throws TimeoutException { - - final CountDownLatch latch = new CountDownLatch(1); - FrameworkListener listener = new FrameworkListener() { - @Override - public void frameworkEvent(FrameworkEvent event) { - if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) { - latch.countDown(); - } - } - }; - - FrameworkWiring fwWiring = syscontext.getBundle().adapt(FrameworkWiring.class); - fwWiring.refreshBundles(Collections.singleton(bundle), listener); - - // Wait for the refresh to complete - try { - if (!latch.await(10, TimeUnit.SECONDS)) { - throw new TimeoutException(); - } - } catch (InterruptedException ex) { - // ignore - } + throw new UnsupportedOperationException("Bundle refreshing is not implemented"); +// final CountDownLatch latch = new CountDownLatch(1); +// FrameworkListener listener = new FrameworkListener() { +// @Override +// public void frameworkEvent(FrameworkEvent event) { +// if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) { +// latch.countDown(); +// } +// } +// }; +// +// FrameworkWiring fwWiring = syscontext.getBundle().adapt(FrameworkWiring.class); +// fwWiring.refreshBundles(Collections.singleton(bundle), listener); +// +// // Wait for the refresh to complete +// try { +// if (!latch.await(10, TimeUnit.SECONDS)) { +// throw new TimeoutException(); +// } +// } catch (InterruptedException ex) { +// // ignore +// } } private Bundle installBundle(JavaArchive archive) throws BundleException { @@ -145,13 +140,13 @@ private Bundle installBundle(JavaArchive archive) throws BundleException { } private JavaArchive getLoaderBundle() { - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "loader-bundle"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "loader-bundle.jar"); archive.setManifest(new Asset() { public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); - builder.addDynamicImportPackage("*"); + builder.addDynamicImportPackages("*"); return builder.openStream(); } }); @@ -159,7 +154,7 @@ public InputStream openStream() { } private JavaArchive getBundleA() { - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "bundleA"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "bundleA.jar"); archive.addClasses(A.class); archive.setManifest(new Asset() { public InputStream openStream() { @@ -174,7 +169,7 @@ public InputStream openStream() { } private JavaArchive getBundleB() { - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "bundleB"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "bundleB.jar"); archive.addClasses(B.class); archive.setManifest(new Asset() { public InputStream openStream() { diff --git a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/MultipleBundleDeploymentsTestCase.java b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/MultipleBundleDeploymentsTestCase.java index 27855a72..a081914b 100644 --- a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/MultipleBundleDeploymentsTestCase.java +++ b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/MultipleBundleDeploymentsTestCase.java @@ -31,7 +31,7 @@ import org.junit.runner.RunWith; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; -import org.osgi.framework.wiring.FrameworkWiring; +import org.osgi.service.packageadmin.PackageAdmin; /** * Test multiple bundle deployments @@ -42,23 +42,26 @@ @RunWith(Arquillian.class) public class MultipleBundleDeploymentsTestCase { - static final String BUNDLE_A = "bundle-a"; - static final String BUNDLE_B = "bundle-b"; + static final String BUNDLE_A = "bundle-a.jar"; + static final String BUNDLE_B = "bundle-b.jar"; @ArquillianResource BundleContext context; + @ArquillianResource + PackageAdmin packageAdmin; + @Deployment public static Archive deployment() { // The default deployment is needed if we don't want to @RunAsClient - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests.jar"); archive.setManifest(new Asset() { @Override public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); - builder.addImportPackages(FrameworkWiring.class); + builder.addImportPackages(PackageAdmin.class); return builder.openStream(); } }); @@ -97,10 +100,10 @@ public InputStream openStream() { @Test public void testBundleDeployments() throws Exception { - Bundle bundleA = context.getBundle(BUNDLE_A); + Bundle bundleA = packageAdmin.getBundles(BUNDLE_A, null)[0]; Assert.assertEquals("Bundle INSTALLED", Bundle.INSTALLED, bundleA.getState()); - Bundle bundleB = context.getBundle(BUNDLE_B); + Bundle bundleB = packageAdmin.getBundles(BUNDLE_B, null)[0]; Assert.assertEquals("Bundle INSTALLED", Bundle.INSTALLED, bundleB.getState()); } } diff --git a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/OperateOnDeploymentTestCase.java b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/OperateOnDeploymentTestCase.java index 0acf7601..b453e6be 100644 --- a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/OperateOnDeploymentTestCase.java +++ b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/OperateOnDeploymentTestCase.java @@ -41,13 +41,13 @@ @RunWith(Arquillian.class) public class OperateOnDeploymentTestCase { - static final String BUNDLE_A = "bundle-a"; - static final String BUNDLE_B = "bundle-b"; + static final String BUNDLE_A = "bundle-a.jar"; + static final String BUNDLE_B = "bundle-b.jar"; @Deployment public static Archive deployment() { // The default deployment is needed if we don't want to @RunAsClient - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests.jar"); archive.setManifest(new Asset() { @Override public InputStream openStream() { diff --git a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/StartLevelAwareTestCase.java b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/StartLevelAwareTestCase.java index c44b4c15..7e13da89 100644 --- a/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/StartLevelAwareTestCase.java +++ b/container/felix/embedded/src/test/java/org/jboss/test/arquillian/container/felix/StartLevelAwareTestCase.java @@ -38,8 +38,8 @@ import org.osgi.framework.BundleException; import org.osgi.framework.FrameworkEvent; import org.osgi.framework.FrameworkListener; -import org.osgi.framework.startlevel.BundleStartLevel; -import org.osgi.framework.startlevel.FrameworkStartLevel; +import org.osgi.service.startlevel.StartLevel; + /** * Test {@link StartLevelAware} @@ -56,6 +56,9 @@ public class StartLevelAwareTestCase { @ArquillianResource BundleContext context; + @ArquillianResource + StartLevel startLevel; + @Deployment @StartLevelAware(startLevel = 3) public static JavaArchive create() { @@ -66,7 +69,7 @@ public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); - builder.addImportPackages(FrameworkStartLevel.class); + builder.addImportPackages(StartLevel.class); return builder.openStream(); } }); @@ -76,15 +79,13 @@ public InputStream openStream() { @Test public void testStartLevel() throws Exception { - FrameworkStartLevel fwStartLevel = context.getBundle().adapt(FrameworkStartLevel.class); - int initialStartLevel = fwStartLevel.getInitialBundleStartLevel(); + int initialStartLevel = startLevel.getInitialBundleStartLevel(); assertEquals("Initial bundle start level", 1, initialStartLevel); assertEquals("Bundle RESOLVED", Bundle.RESOLVED, bundle.getState()); assertEquals("start-level-bundle", bundle.getSymbolicName()); - BundleStartLevel bStartLevel = bundle.adapt(BundleStartLevel.class); - int bundleStartLevel = bStartLevel.getStartLevel(); + int bundleStartLevel = startLevel.getBundleStartLevel(bundle); assertEquals("Bundle start level", 3, bundleStartLevel); try { @@ -108,7 +109,7 @@ public void frameworkEvent(FrameworkEvent event) { latch.countDown(); } }); - fwStartLevel.setStartLevel(3); + startLevel.setStartLevel(3); latch.await(3, TimeUnit.SECONDS); // The bundle should now be started diff --git a/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/ArquillianDeployerTestCase.java b/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/ArquillianDeployerTestCase.java index 37655e90..679bd039 100644 --- a/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/ArquillianDeployerTestCase.java +++ b/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/ArquillianDeployerTestCase.java @@ -147,7 +147,7 @@ public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(BAD_BUNDLE); builder.addBundleManifestVersion(2); - builder.addImportPackage("org.acme.foo"); + builder.addImportPackages("org.acme.foo"); return builder.openStream(); } }); diff --git a/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/MultipleBundleDeploymentsTestCase.java b/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/MultipleBundleDeploymentsTestCase.java index 1f54b014..b493971f 100644 --- a/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/MultipleBundleDeploymentsTestCase.java +++ b/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/MultipleBundleDeploymentsTestCase.java @@ -31,7 +31,7 @@ import org.junit.runner.RunWith; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; -import org.osgi.framework.wiring.FrameworkWiring; +import org.osgi.service.packageadmin.PackageAdmin; /** * Test multiple bundle deployments @@ -42,23 +42,26 @@ @RunWith(Arquillian.class) public class MultipleBundleDeploymentsTestCase { - static final String BUNDLE_A = "bundle-a"; - static final String BUNDLE_B = "bundle-b"; + static final String BUNDLE_A = "bundle-a.jar"; + static final String BUNDLE_B = "bundle-b.jar"; @ArquillianResource BundleContext context; + @ArquillianResource + PackageAdmin packageAdmin; + @Deployment public static Archive deployment() { // The default deployment is needed if we don't want to @RunAsClient - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests.jar"); archive.setManifest(new Asset() { @Override public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); - builder.addImportPackages(FrameworkWiring.class); + builder.addImportPackages(PackageAdmin.class); return builder.openStream(); } }); @@ -97,10 +100,10 @@ public InputStream openStream() { @Test public void testBundleDeployments() throws Exception { - Bundle bundleA = context.getBundle(BUNDLE_A); + Bundle bundleA = packageAdmin.getBundles(BUNDLE_A, null)[0]; Assert.assertEquals("Bundle RESOLVED", Bundle.RESOLVED, bundleA.getState()); - Bundle bundleB = context.getBundle(BUNDLE_B); + Bundle bundleB = packageAdmin.getBundles(BUNDLE_B, null)[0]; Assert.assertEquals("Bundle RESOLVED", Bundle.RESOLVED, bundleB.getState()); } } diff --git a/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/SimpleBundleTestCase.java b/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/SimpleBundleTestCase.java index 08941099..9f495487 100644 --- a/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/SimpleBundleTestCase.java +++ b/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/SimpleBundleTestCase.java @@ -90,11 +90,11 @@ public void testBundleInjection(@ArquillianResource Bundle bundle) throws Except assertNotNull("BundleContext available", context); // Get the service reference - ServiceReference sref = context.getServiceReference(SimpleService.class); + ServiceReference sref = context.getServiceReference(SimpleService.class.getName()); assertNotNull("ServiceReference not null", sref); // Get the service for the reference - SimpleService service = context.getService(sref); + SimpleService service = (SimpleService) context.getService(sref); assertNotNull("Service not null", service); // Invoke the service diff --git a/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/StartLevelAwareTestCase.java b/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/StartLevelAwareTestCase.java index 3b276bf5..238185c0 100644 --- a/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/StartLevelAwareTestCase.java +++ b/container/jbosgi/embedded/src/test/java/org/jboss/test/arquillian/container/osgi/StartLevelAwareTestCase.java @@ -38,8 +38,7 @@ import org.osgi.framework.BundleException; import org.osgi.framework.FrameworkEvent; import org.osgi.framework.FrameworkListener; -import org.osgi.framework.startlevel.BundleStartLevel; -import org.osgi.framework.startlevel.FrameworkStartLevel; +import org.osgi.service.startlevel.StartLevel; /** * Test {@link StartLevelAware} @@ -56,6 +55,9 @@ public class StartLevelAwareTestCase { @ArquillianResource BundleContext context; + @ArquillianResource + StartLevel startLevel; + @Deployment @StartLevelAware(startLevel = 3) public static JavaArchive create() { @@ -66,7 +68,7 @@ public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); - builder.addImportPackages(FrameworkStartLevel.class); + builder.addImportPackages(StartLevel.class); return builder.openStream(); } }); @@ -75,16 +77,13 @@ public InputStream openStream() { @Test public void testStartLevel() throws Exception { - - FrameworkStartLevel fwStartLevel = context.getBundle().adapt(FrameworkStartLevel.class); - int initialStartLevel = fwStartLevel.getInitialBundleStartLevel(); + int initialStartLevel = startLevel.getInitialBundleStartLevel(); assertEquals("Initial bundle start level", 1, initialStartLevel); assertEquals("Bundle RESOLVED", Bundle.RESOLVED, bundle.getState()); assertEquals("start-level-bundle", bundle.getSymbolicName()); - BundleStartLevel bStartLevel = bundle.adapt(BundleStartLevel.class); - int bundleStartLevel = bStartLevel.getStartLevel(); + int bundleStartLevel = startLevel.getBundleStartLevel(bundle); assertEquals("Bundle start level", 3, bundleStartLevel); try { @@ -108,7 +107,7 @@ public void frameworkEvent(FrameworkEvent event) { latch.countDown(); } }); - fwStartLevel.setStartLevel(3); + startLevel.setStartLevel(3); latch.await(3, TimeUnit.SECONDS); // The bundle should now be started diff --git a/container/karaf/embedded/pom.xml b/container/karaf/embedded/pom.xml index 57ba1b15..42e6c541 100644 --- a/container/karaf/embedded/pom.xml +++ b/container/karaf/embedded/pom.xml @@ -17,7 +17,6 @@ - 4.0.3 ${project.build.directory}/apache-karaf-${version.apache.karaf} @@ -42,6 +41,10 @@ org.slf4j slf4j-api + + org.jboss.logging + jboss-logging + @@ -66,7 +69,6 @@ org.apache.felix org.apache.felix.framework - ${karaf.felix.version} provided diff --git a/container/karaf/embedded/src/main/java/org/jboss/arquillian/container/osgi/karaf/embedded/KarafEmbeddedContainerConfiguration.java b/container/karaf/embedded/src/main/java/org/jboss/arquillian/container/osgi/karaf/embedded/KarafEmbeddedContainerConfiguration.java index b8c44673..85ebe314 100644 --- a/container/karaf/embedded/src/main/java/org/jboss/arquillian/container/osgi/karaf/embedded/KarafEmbeddedContainerConfiguration.java +++ b/container/karaf/embedded/src/main/java/org/jboss/arquillian/container/osgi/karaf/embedded/KarafEmbeddedContainerConfiguration.java @@ -20,7 +20,6 @@ import org.jboss.arquillian.container.osgi.OSGiContainerConfiguration; import org.jboss.arquillian.container.spi.ConfigurationException; -import org.jboss.osgi.metadata.spi.NotNullException; /** * KarafContainerConfiguration @@ -52,7 +51,9 @@ public void setKarafBeginningStartLevel(Integer startLevel) { public void validate() throws ConfigurationException { super.validate(); - NotNullException.assertValue(karafHome, "karafHome"); + if (karafHome == null) { + throw new IllegalArgumentException("Null " + "karafHome"); + } File karafHomeDir = new File(karafHome); if (!karafHomeDir.isDirectory()) throw new IllegalStateException("Not a valid Karaf home dir: " + karafHomeDir); diff --git a/container/karaf/embedded/src/main/java/org/jboss/arquillian/container/osgi/karaf/embedded/KarafEmbeddedDeployableContainer.java b/container/karaf/embedded/src/main/java/org/jboss/arquillian/container/osgi/karaf/embedded/KarafEmbeddedDeployableContainer.java index 98663ecf..686aa8a6 100644 --- a/container/karaf/embedded/src/main/java/org/jboss/arquillian/container/osgi/karaf/embedded/KarafEmbeddedDeployableContainer.java +++ b/container/karaf/embedded/src/main/java/org/jboss/arquillian/container/osgi/karaf/embedded/KarafEmbeddedDeployableContainer.java @@ -26,8 +26,9 @@ import org.osgi.framework.BundleException; import org.osgi.framework.FrameworkEvent; import org.osgi.framework.FrameworkListener; +import org.osgi.framework.ServiceReference; import org.osgi.framework.launch.Framework; -import org.osgi.framework.startlevel.FrameworkStartLevel; +import org.osgi.service.startlevel.StartLevel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -120,13 +121,14 @@ public void log(Level level, String message, Throwable th) { protected void awaitKarafBeginningStartLevel(final BundleContext syscontext, final Integer beginningStartLevel, long timeout, TimeUnit unit) { final CountDownLatch latch = new CountDownLatch(1); - final FrameworkStartLevel fwrkStartLevel = syscontext.getBundle().adapt(FrameworkStartLevel.class); + ServiceReference sref = syscontext.getServiceReference(StartLevel.class.getName()); + final StartLevel startLevel = (StartLevel) syscontext.getService(sref); FrameworkListener listener = new FrameworkListener() { @Override public void frameworkEvent(FrameworkEvent event) { if (event.getType() == FrameworkEvent.STARTLEVEL_CHANGED) { - int startLevel = fwrkStartLevel.getStartLevel(); - if (startLevel == beginningStartLevel) { + int startLevelVal = startLevel.getStartLevel(); + if (startLevelVal == beginningStartLevel) { latch.countDown(); } } @@ -134,8 +136,8 @@ public void frameworkEvent(FrameworkEvent event) { }; syscontext.addFrameworkListener(listener); try { - int startLevel = fwrkStartLevel.getStartLevel(); - if (startLevel < beginningStartLevel) { + int startLevelVal = startLevel.getStartLevel(); + if (startLevelVal < beginningStartLevel) { try { if (!latch.await(timeout, unit)) throw new IllegalStateException("Giving up waiting to reach start level: " + beginningStartLevel); diff --git a/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/ArquillianDeployerTestCase.java b/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/ArquillianDeployerTestCase.java index dfe808f2..0262a88f 100644 --- a/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/ArquillianDeployerTestCase.java +++ b/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/ArquillianDeployerTestCase.java @@ -42,12 +42,12 @@ @RunWith(Arquillian.class) public class ArquillianDeployerTestCase { - private static final String GOOD_BUNDLE = "good-bundle"; - private static final String BAD_BUNDLE = "bad-bundle"; + private static final String GOOD_BUNDLE = "good-bundle.jar"; + private static final String BAD_BUNDLE = "bad-bundle.jar"; @Deployment public static JavaArchive create() { - return ShrinkWrap.create(JavaArchive.class, "deployer-tests"); + return ShrinkWrap.create(JavaArchive.class, "deployer-tests.jar"); } @ArquillianResource @@ -147,7 +147,7 @@ public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(BAD_BUNDLE); builder.addBundleManifestVersion(2); - builder.addImportPackage("org.acme.foo"); + builder.addImportPackages("org.acme.foo"); return builder.openStream(); } }); diff --git a/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/MultipleBundleDeploymentsTestCase.java b/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/MultipleBundleDeploymentsTestCase.java index 6928d0a9..4f54b931 100644 --- a/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/MultipleBundleDeploymentsTestCase.java +++ b/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/MultipleBundleDeploymentsTestCase.java @@ -31,7 +31,7 @@ import org.junit.runner.RunWith; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; -import org.osgi.framework.wiring.FrameworkWiring; +import org.osgi.service.packageadmin.PackageAdmin; /** * Test multiple bundle deployments @@ -42,23 +42,26 @@ @RunWith(Arquillian.class) public class MultipleBundleDeploymentsTestCase { - static final String BUNDLE_A = "bundle-a"; - static final String BUNDLE_B = "bundle-b"; + static final String BUNDLE_A = "bundle-a.jar"; + static final String BUNDLE_B = "bundle-b.jar"; @ArquillianResource BundleContext context; + @ArquillianResource + PackageAdmin packageAdmin; + @Deployment public static Archive deployment() { // The default deployment is needed if we don't want to @RunAsClient - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests.jar"); archive.setManifest(new Asset() { @Override public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); - builder.addImportPackages(FrameworkWiring.class); + builder.addImportPackages(PackageAdmin.class); return builder.openStream(); } }); @@ -97,10 +100,10 @@ public InputStream openStream() { @Test public void testBundleDeployments() throws Exception { - Bundle bundleA = context.getBundle(BUNDLE_A); + Bundle bundleA = packageAdmin.getBundles(BUNDLE_A, null)[0]; Assert.assertEquals("Bundle INSTALLED", Bundle.INSTALLED, bundleA.getState()); - Bundle bundleB = context.getBundle(BUNDLE_B); + Bundle bundleB = packageAdmin.getBundles(BUNDLE_B, null)[0]; Assert.assertEquals("Bundle INSTALLED", Bundle.INSTALLED, bundleB.getState()); } } diff --git a/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/OperateOnDeploymentTestCase.java b/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/OperateOnDeploymentTestCase.java index 22292ed7..f970a65e 100644 --- a/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/OperateOnDeploymentTestCase.java +++ b/container/karaf/embedded/src/test/java/org/jboss/test/arquillian/container/karaf/embedded/OperateOnDeploymentTestCase.java @@ -41,13 +41,13 @@ @RunWith(Arquillian.class) public class OperateOnDeploymentTestCase { - static final String BUNDLE_A = "bundle-a"; - static final String BUNDLE_B = "bundle-b"; + static final String BUNDLE_A = "bundle-a.jar"; + static final String BUNDLE_B = "bundle-b.jar"; @Deployment public static Archive deployment() { // The default deployment is needed if we don't want to @RunAsClient - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests.jar"); archive.setManifest(new Asset() { @Override public InputStream openStream() { diff --git a/container/karaf/managed/src/main/java/org/jboss/arquillian/container/osgi/karaf/managed/KarafManagedDeployableContainer.java b/container/karaf/managed/src/main/java/org/jboss/arquillian/container/osgi/karaf/managed/KarafManagedDeployableContainer.java index 4630866d..51aa1d78 100644 --- a/container/karaf/managed/src/main/java/org/jboss/arquillian/container/osgi/karaf/managed/KarafManagedDeployableContainer.java +++ b/container/karaf/managed/src/main/java/org/jboss/arquillian/container/osgi/karaf/managed/KarafManagedDeployableContainer.java @@ -228,9 +228,13 @@ public boolean accept(File dir, String name) { awaitKarafBeginningStartLevel(beginningStartLevel, 30, TimeUnit.SECONDS); // Await the bootstrap complete marker service to become available - String completeService = config.getBootstrapCompleteService(); - if (completeService != null) - awaitBootstrapCompleteService(completeService, 30, TimeUnit.SECONDS); + String completeServices = config.getBootstrapCompleteService(); + if (completeServices != null) { + List completeServicesList = Arrays.asList(completeServices.split(",")); + for (String completeService : completeServicesList) { + awaitBootstrapCompleteService(completeService, 30, TimeUnit.SECONDS); + } + } } catch (RuntimeException rte) { destroyKarafProcess(); @@ -273,11 +277,14 @@ public void undeploy(Archive archive) throws DeploymentException { String bundleState = null; try { long bundleId = handle.getBundleId(); - CompositeData bundleType = bundleStateMBean.getBundle(bundleId); + CompositeData bundleType = getBundle(bundleId); if (bundleType != null) { bundleState = (String) bundleType.get(BundleStateMBean.STATE); } } catch (IOException e) { + // ignore if the operation fails + return; + } catch (IllegalArgumentException e) { // ignore non-existent bundle return; } @@ -426,7 +433,7 @@ private void awaitKarafBeginningStartLevel(final Integer beginningStartLevel, lo private void awaitBootstrapCompleteService(String serviceName, long timeout, TimeUnit unit) throws TimeoutException, InterruptedException, IOException { long timeoutMillis = System.currentTimeMillis() + unit.toMillis(timeout); while (System.currentTimeMillis() < timeoutMillis) { - TabularData list = serviceStateMBean.listServices(serviceName, null); + TabularData list = listServices(serviceName); if (list.size() > 0) { return; } else { @@ -493,6 +500,33 @@ private List listBundles(String symbolicName) throws IOException { return bundleList; } + private CompositeData getBundle(long bundleIdentifier) throws IOException { + TabularData listBundles = bundleStateMBean.listBundles(); + Iterator iterator = listBundles.values().iterator(); + while (iterator.hasNext()) { + CompositeData bundleType = (CompositeData) iterator.next(); + Long bundleId = (Long) bundleType.get(BundleStateMBean.IDENTIFIER); + if (bundleId.longValue() == bundleIdentifier) { + return bundleType; + } + } + throw new IllegalArgumentException("Indicated bundle (id=" + bundleIdentifier + ") does not exist"); + } + + private TabularData listServices(String clazz) throws IOException { + TabularData list = serviceStateMBean.listServices(); + Iterator iterator = list.values().iterator(); + while (iterator.hasNext()) { + CompositeData serviceType = (CompositeData) iterator.next(); + String [] serviceIntfsArray = (String []) serviceType.get(ServiceStateMBean.OBJECT_CLASS); + List serviceIntfsList = Arrays.asList(serviceIntfsArray); + if (!serviceIntfsList.contains(clazz)) { + iterator.remove(); + } + } + return list; + } + static class BundleHandle { private long bundleId; private String symbolicName; diff --git a/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/ArquillianDeployerTestCase.java b/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/ArquillianDeployerTestCase.java index d2b03324..ab9a221b 100644 --- a/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/ArquillianDeployerTestCase.java +++ b/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/ArquillianDeployerTestCase.java @@ -42,12 +42,12 @@ @RunWith(Arquillian.class) public class ArquillianDeployerTestCase { - private static final String GOOD_BUNDLE = "good-bundle"; - private static final String BAD_BUNDLE = "bad-bundle"; + private static final String GOOD_BUNDLE = "good-bundle.jar"; + private static final String BAD_BUNDLE = "bad-bundle.jar"; @Deployment public static JavaArchive create() { - return ShrinkWrap.create(JavaArchive.class, "deployer-tests"); + return ShrinkWrap.create(JavaArchive.class, "deployer-tests.jar"); } @ArquillianResource @@ -147,7 +147,7 @@ public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(BAD_BUNDLE); builder.addBundleManifestVersion(2); - builder.addImportPackage("org.acme.foo"); + builder.addImportPackages("org.acme.foo"); return builder.openStream(); } }); diff --git a/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/MultipleBundleDeploymentsTestCase.java b/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/MultipleBundleDeploymentsTestCase.java index c6a1ed16..b448a40f 100644 --- a/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/MultipleBundleDeploymentsTestCase.java +++ b/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/MultipleBundleDeploymentsTestCase.java @@ -31,7 +31,8 @@ import org.junit.runner.RunWith; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; -import org.osgi.framework.wiring.FrameworkWiring; +import org.osgi.service.packageadmin.PackageAdmin; + /** * Test multiple bundle deployments @@ -42,23 +43,26 @@ @RunWith(Arquillian.class) public class MultipleBundleDeploymentsTestCase { - static final String BUNDLE_A = "bundle-a"; - static final String BUNDLE_B = "bundle-b"; + static final String BUNDLE_A = "bundle-a.jar"; + static final String BUNDLE_B = "bundle-b.jar"; @ArquillianResource BundleContext context; + @ArquillianResource + PackageAdmin packageAdmin; + @Deployment public static Archive deployment() { // The default deployment is needed if we don't want to @RunAsClient - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests.jar"); archive.setManifest(new Asset() { @Override public InputStream openStream() { OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance(); builder.addBundleSymbolicName(archive.getName()); builder.addBundleManifestVersion(2); - builder.addImportPackages(FrameworkWiring.class); + builder.addImportPackages(PackageAdmin.class); return builder.openStream(); } }); @@ -97,10 +101,10 @@ public InputStream openStream() { @Test public void testBundleDeployments() throws Exception { - Bundle bundleA = context.getBundle(BUNDLE_A); + Bundle bundleA = packageAdmin.getBundles(BUNDLE_A, null)[0]; Assert.assertEquals("Bundle INSTALLED", Bundle.INSTALLED, bundleA.getState()); - Bundle bundleB = context.getBundle(BUNDLE_B); + Bundle bundleB = packageAdmin.getBundles(BUNDLE_B, null)[0]; Assert.assertEquals("Bundle INSTALLED", Bundle.INSTALLED, bundleB.getState()); } } diff --git a/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/OperateOnDeploymentTestCase.java b/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/OperateOnDeploymentTestCase.java index 83638a74..996244a9 100644 --- a/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/OperateOnDeploymentTestCase.java +++ b/container/karaf/managed/src/test/java/org/jboss/test/arquillian/container/karaf/managed/OperateOnDeploymentTestCase.java @@ -41,13 +41,13 @@ @RunWith(Arquillian.class) public class OperateOnDeploymentTestCase { - static final String BUNDLE_A = "bundle-a"; - static final String BUNDLE_B = "bundle-b"; + static final String BUNDLE_A = "bundle-a.jar"; + static final String BUNDLE_B = "bundle-b.jar"; @Deployment public static Archive deployment() { // The default deployment is needed if we don't want to @RunAsClient - final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests"); + final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "multiple-tests.jar"); archive.setManifest(new Asset() { @Override public InputStream openStream() { diff --git a/pom.xml b/pom.xml index 6bf1d541..15fd36ed 100644 --- a/pom.xml +++ b/pom.xml @@ -25,22 +25,22 @@ - 4.2.1 - 2.3.3 + 3.2.2 + 2.2.11 1.1.2.Final 3.1.3.GA 1.4.1.Final - 3.0.3.Final - 4.0.0.CR1 - 4.0.0.Final - 2.0.0.Final + 2.1.2.Final + 2.2.0.Final + 3.2.0.Final + 1.2.1.Final 1.1.2 2.0.0 4.11 1.8.4 - 5.0.0 + 4.2.0 1.5.11 - 3.7.1 + 3.6.0.v20100517 diff --git a/protocol/pom.xml b/protocol/pom.xml index 59e28856..4bc6c72f 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -66,6 +66,11 @@ slf4j-log4j12 test + + org.jboss.logging + jboss-logging + test + diff --git a/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiEnricherExtension.java b/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiEnricherExtension.java index 30c4b9d8..8052176b 100644 --- a/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiEnricherExtension.java +++ b/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiEnricherExtension.java @@ -34,6 +34,8 @@ public void register(ExtensionBuilder builder) { builder.service(TestEnricher.class, OSGiTestEnricher.class); builder.service(AuxiliaryArchiveAppender.class, OSGiAuxiliaryArchiveAppender.class); builder.service(ResourceProvider.class, BundleContextProvider.class); + builder.service(ResourceProvider.class, StartLevelProvider.class); + builder.service(ResourceProvider.class, PackageAdminProvider.class); builder.service(ResourceProvider.class, BundleProvider.class); } } diff --git a/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiEnricherRemoteExtension.java b/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiEnricherRemoteExtension.java index 1d9658e8..ee4dae03 100644 --- a/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiEnricherRemoteExtension.java +++ b/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiEnricherRemoteExtension.java @@ -35,6 +35,8 @@ public void register(ExtensionBuilder builder) { if(Validate.classExists("org.osgi.framework.Bundle")) { builder.service(TestEnricher.class, OSGiTestEnricher.class); builder.service(ResourceProvider.class, BundleContextProvider.class); + builder.service(ResourceProvider.class, StartLevelProvider.class); + builder.service(ResourceProvider.class, PackageAdminProvider.class); builder.service(ResourceProvider.class, BundleProvider.class); } } diff --git a/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiTestEnricher.java b/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiTestEnricher.java index d0080411..c45d18df 100644 --- a/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiTestEnricher.java +++ b/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/OSGiTestEnricher.java @@ -16,27 +16,44 @@ */ package org.jboss.arquillian.testenricher.osgi; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.logging.Level; import java.util.logging.Logger; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.core.api.annotation.Inject; import org.jboss.arquillian.osgi.StartLevelAware; import org.jboss.arquillian.test.spi.TestEnricher; import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.BundleReference; -import org.osgi.framework.startlevel.BundleStartLevel; +import org.osgi.framework.ServiceReference; +import org.osgi.service.packageadmin.PackageAdmin; +import org.osgi.service.startlevel.StartLevel; /** * The OSGi TestEnricher * - * The enricher supports start level aware bundle deployments. + * The enricher supports following injections and annotations: * *
  * 
+    @Inject
+    BundleContext context;
+
+    @Inject
+    Bundle bundle;
+
+    @Inject
+    StartLevel startLevel;
+
+    @Inject
+    PackageAdmin packageAdmin;
+
     @Deployment
-    @StartLevelAware(startLevel = 3)
+    @StartLevelAware(startLevel = 3, autostart = true)
     public static JavaArchive create() {
         final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "start-level-bundle");
         ...
@@ -54,8 +71,28 @@ public class OSGiTestEnricher implements TestEnricher {
     @Override
     public void enrich(Object testCase) {
 
-        // Process {@link StartLevelAware} on the {@link Deployment}
+        BundleContext bundleContext = BundleContextProvider.getBundleContext();
+        if (bundleContext == null) {
+            log.fine("System bundle context not available");
+            return;
+        }
+
         Class testClass = testCase.getClass();
+        for (Field field : testClass.getDeclaredFields()) {
+            if (field.isAnnotationPresent(Inject.class)) {
+                if (field.getType().isAssignableFrom(BundleContext.class)) {
+                    injectBundleContext(testCase, field);
+                } else if (field.getType().isAssignableFrom(Bundle.class)) {
+                    injectBundle(testCase, field);
+                } else if (field.getType().isAssignableFrom(PackageAdmin.class)) {
+                    injectPackageAdmin(testCase, field);
+                } else if (field.getType().isAssignableFrom(StartLevel.class)) {
+                    injectStartLevel(testCase, field);
+                }
+            }
+        }
+
+        // Process {@link StartLevelAware} on the {@link Deployment}
         for (Method method : testClass.getDeclaredMethods()) {
             if (method.isAnnotationPresent(Deployment.class)) {
                 Deployment andep = method.getAnnotation(Deployment.class);
@@ -65,8 +102,8 @@ public void enrich(Object testCase) {
                     if (bundle != null) {
                         int bundleStartLevel = startLevelAware.startLevel();
                         log.fine("Setting bundle start level of " + bundle + " to: " + bundleStartLevel);
-                        BundleStartLevel startLevel = bundle.adapt(BundleStartLevel.class);
-                        startLevel.setStartLevel(bundleStartLevel);
+                        StartLevel startLevel = getStartLevel();
+                        startLevel.setBundleStartLevel(bundle, bundleStartLevel);
                         if (startLevelAware.autostart()) {
                             try {
                                 bundle.start();
@@ -85,6 +122,60 @@ public Object[] resolve(Method method) {
         return null;
     }
 
+    private void injectBundleContext(Object testCase, Field field) {
+        try {
+            BundleContext context = BundleContextProvider.getBundleContext();
+            log.warning("Deprecated @Inject BundleContext, use @ArquillianResource BundleContext");
+            field.set(testCase, context);
+        } catch (IllegalAccessException ex) {
+            throw new IllegalStateException("Cannot inject BundleContext", ex);
+        }
+    }
+
+    private void injectBundle(Object testCase, Field field) {
+        try {
+            Bundle bundle = getBundle(testCase);
+            log.warning("Deprecated @Inject Bundle, use @ArquillianResource Bundle");
+            field.set(testCase, bundle);
+        } catch (IllegalAccessException ex) {
+            throw new IllegalStateException("Cannot inject Bundle", ex);
+        }
+    }
+
+    private void injectPackageAdmin(Object testCase, Field field) {
+        try {
+            PackageAdmin packageAdmin = getPackageAdmin();
+            log.warning("Deprecated @Inject PackageAdmin, use @ArquillianResource PackageAdmin");
+            field.set(testCase, packageAdmin);
+        } catch (IllegalAccessException ex) {
+            throw new IllegalStateException("Cannot inject PackageAdmin", ex);
+        }
+    }
+
+    private void injectStartLevel(Object testCase, Field field) {
+        try {
+            StartLevel startLevel = getStartLevel();
+            log.warning("Deprecated @Inject StartLevel, use @ArquillianResource StartLevel");
+            field.set(testCase, startLevel);
+        } catch (IllegalAccessException ex) {
+            throw new IllegalStateException("Cannot inject StartLevel", ex);
+        }
+    }
+
+    private PackageAdmin getPackageAdmin() {
+        BundleContext context = BundleContextProvider.getBundleContext();
+        ServiceReference sref = context.getServiceReference(PackageAdmin.class.getName());
+        PackageAdmin packageAdmin = (PackageAdmin) context.getService(sref);
+        return packageAdmin;
+    }
+
+    private StartLevel getStartLevel() {
+        BundleContext context = BundleContextProvider.getBundleContext();
+        ServiceReference sref = context.getServiceReference(StartLevel.class.getName());
+        StartLevel startLevel = (StartLevel) context.getService(sref);
+        return startLevel;
+    }
+
     private Bundle getBundle(Object testCase) {
         // [ARQ-459] Allow TestRunner to TestEnricher communication
         Bundle bundle = BundleAssociation.getBundle();
diff --git a/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/PackageAdminProvider.java b/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/PackageAdminProvider.java
new file mode 100644
index 00000000..bb3e8750
--- /dev/null
+++ b/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/PackageAdminProvider.java
@@ -0,0 +1,75 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2011, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed 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.jboss.arquillian.testenricher.osgi;
+
+import java.lang.annotation.Annotation;
+import org.jboss.arquillian.container.test.impl.enricher.resource.OperatesOnDeploymentAwareProvider;
+import org.jboss.arquillian.core.api.Instance;
+import org.jboss.arquillian.core.api.InstanceProducer;
+import org.jboss.arquillian.core.api.annotation.Inject;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.arquillian.test.spi.annotation.SuiteScoped;
+import org.jboss.arquillian.test.spi.enricher.resource.ResourceProvider;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+* {@link OperatesOnDeploymentAwareProvider} implementation to
+* provide {@link PackageAdmin} injection to {@link ArquillianResource}-
+* annotated fields.
+*
+* @author Thomas.Diesler@jboss.com
+* @since 15-Oct-2012
+*/
+public class PackageAdminProvider implements ResourceProvider {
+
+    @Inject
+    @SuiteScoped
+    private InstanceProducer packageAdminProducer;
+
+    @Inject
+    private Instance packageAdmin;
+
+    @Override
+    public boolean canProvide(final Class type) {
+        return type.isAssignableFrom(PackageAdmin.class);
+    }
+
+    @Override
+    public Object lookup(ArquillianResource resource, Annotation... qualifiers) {
+        initialize();
+        return packageAdmin.get();
+    }
+
+    private void initialize() {
+            BundleContext syscontext = BundleContextProvider.getBundleContext();
+            PackageAdmin service = getPackageAdmin(syscontext);
+            if (service != null) {
+                packageAdminProducer.set(service);
+            }
+    }
+
+    private PackageAdmin getPackageAdmin(BundleContext syscontext) {
+        PackageAdmin result = null;
+        if (syscontext != null) {
+            ServiceReference sref = syscontext.getServiceReference(PackageAdmin.class.getName());
+            result = (PackageAdmin) syscontext.getService(sref);
+        }
+        return result;
+    }
+}
\ No newline at end of file
diff --git a/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/StartLevelProvider.java b/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/StartLevelProvider.java
new file mode 100644
index 00000000..6a1d2207
--- /dev/null
+++ b/testenricher/src/main/java/org/jboss/arquillian/testenricher/osgi/StartLevelProvider.java
@@ -0,0 +1,74 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2011, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed 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.jboss.arquillian.testenricher.osgi;
+
+import java.lang.annotation.Annotation;
+import org.jboss.arquillian.container.test.impl.enricher.resource.OperatesOnDeploymentAwareProvider;
+import org.jboss.arquillian.core.api.Instance;
+import org.jboss.arquillian.core.api.InstanceProducer;
+import org.jboss.arquillian.core.api.annotation.Inject;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.arquillian.test.spi.annotation.SuiteScoped;
+import org.jboss.arquillian.test.spi.enricher.resource.ResourceProvider;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.startlevel.StartLevel;
+
+/**
+* {@link OperatesOnDeploymentAwareProvider} implementation to provide {@link ManagementClient} injection to
+* {@link ArquillianResource}- annotated fields.
+*
+* @author Thomas.Diesler@jboss.com
+* @since 15-Oct-2012
+*/
+public class StartLevelProvider implements ResourceProvider {
+
+    @Inject
+    @SuiteScoped
+    private InstanceProducer startLevelProducer;
+
+    @Inject
+    private Instance startLevel;
+
+    @Override
+    public boolean canProvide(final Class type) {
+        return type.isAssignableFrom(StartLevel.class);
+    }
+
+    @Override
+    public Object lookup(ArquillianResource resource, Annotation... qualifiers) {
+        initialize();
+        return startLevel.get();
+    }
+
+    private void initialize() {
+        BundleContext syscontext = BundleContextProvider.getBundleContext();
+        StartLevel service = getStartLevel(syscontext);
+        if (service != null) {
+            startLevelProducer.set(service);
+        }
+    }
+
+    private StartLevel getStartLevel(BundleContext syscontext) {
+        StartLevel result = null;
+        if (syscontext != null) {
+            ServiceReference sref = syscontext.getServiceReference(StartLevel.class.getName());
+            result = (StartLevel) syscontext.getService(sref);
+        }
+        return result;
+    }
+}
\ No newline at end of file