Author: linsun
Date: Wed Dec 2 21:35:07 2009
New Revision: 886314
URL: http://svn.apache.org/viewvc?rev=886314&view=rev
Log:
ARIES-64 Have blueprint extender process bundles associated with composite
bundle when detecting the CompositeBundleFactory service + itest for this
Added:
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainer2BTCustomizerTest.java
(with props)
Modified:
incubator/aries/trunk/blueprint/blueprint-core/pom.xml
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainerBTCustomizerTest.java
incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AriesBundleTrackerCustomizer.java
Modified: incubator/aries/trunk/blueprint/blueprint-core/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/pom.xml?rev=886314&r1=886313&r2=886314&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/pom.xml (original)
+++ incubator/aries/trunk/blueprint/blueprint-core/pom.xml Wed Dec 2 21:35:07
2009
@@ -52,6 +52,11 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>org.eclipse</groupId>
+ <artifactId>osgi</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.cglib</artifactId>
<optional>true</optional>
@@ -92,7 +97,7 @@
<Export-Package>
org.apache.aries.blueprint*;version="${pom.version}"
</Export-Package>
-
<Import-Package>!org.apache.aries.blueprint*,org.apache.aries.util.tracker;resolution:=optional,*</Import-Package>
+
<Import-Package>!org.apache.aries.blueprint*,org.apache.aries.util.tracker;resolution:=optional,org.osgi.service.framework;resolution:=optional,*</Import-Package>
<_versionpolicy>[$(version;==;$(@)),$(version;+;$(@)))</_versionpolicy>
<_removeheaders>Ignore-Package,Include-Resource,Private-Package,Bundle-DocURL</_removeheaders>
</instructions>
Modified:
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java
URL:
http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java?rev=886314&r1=886313&r2=886314&view=diff
==============================================================================
---
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java
(original)
+++
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java
Wed Dec 2 21:35:07 2009
@@ -45,6 +45,7 @@
import org.osgi.framework.SynchronousBundleListener;
import org.osgi.service.blueprint.container.BlueprintContainer;
import org.osgi.service.blueprint.container.BlueprintEvent;
+import org.osgi.service.framework.CompositeBundle;
import org.osgi.util.tracker.BundleTracker;
import org.osgi.util.tracker.BundleTrackerCustomizer;
import org.slf4j.Logger;
@@ -86,22 +87,42 @@
bt.open();
Bundle[] bundles = context.getBundles();
+ checkAllBundles(bundles, sr);
+
+ LOGGER.debug("Blueprint extender started");
+ }
+
+
+ /**
+ * this method check all bundles. if the sr is null, then we only check
+ * bundles within the current bundle context where this bundle resides.
+ * if sr is not null, then we also check the bundles inside the child
frameworks
+ * that are associated with composite bundles
+ * @param bundles bundles to be checked
+ * @param sr Service reference for the composite bundle factory
service
+ */
+ private void checkAllBundles(Bundle[] bundles, ServiceReference sr) {
for (Bundle b : bundles) {
- // If the bundle is active, check it
- if (b.getState() == Bundle.ACTIVE) {
- checkBundle(b);
- // Also check bundles in the starting state with a lazy activation
policy
- } else if (b.getState() == Bundle.STARTING) {
- String activationPolicyHeader = (String)
b.getHeaders().get(Constants.BUNDLE_ACTIVATIONPOLICY);
- if (activationPolicyHeader != null &&
activationPolicyHeader.startsWith(Constants.ACTIVATION_LAZY)) {
+ if (sr != null && (b instanceof CompositeBundle)) {
+ // let's check bundles associated with the composite bundle
+ CompositeBundle cb = (CompositeBundle)b;
+ Bundle[] buns =
cb.getCompositeFramework().getBundleContext().getBundles();
+ checkAllBundles(buns, sr);
+ } else {
+ // If the bundle is active, check it
+ if (b.getState() == Bundle.ACTIVE) {
checkBundle(b);
+ // Also check bundles in the starting state with a lazy
activation policy
+ } else if (b.getState() == Bundle.STARTING) {
+ String activationPolicyHeader = (String)
b.getHeaders().get(Constants.BUNDLE_ACTIVATIONPOLICY);
+ if (activationPolicyHeader != null &&
activationPolicyHeader.startsWith(Constants.ACTIVATION_LAZY)) {
+ checkBundle(b);
+ }
}
}
}
- LOGGER.debug("Blueprint extender started");
}
-
-
+
public void stop(BundleContext context) {
LOGGER.debug("Stopping blueprint extender...");
if (bt != null) {
@@ -362,12 +383,13 @@
}
public Object addingBundle(Bundle b, BundleEvent event) {
+
+ super.addingBundle(b, event);
if (event == null) {
return null;
}
-
- super.addingBundle(b, event);
+
bundleChanged(event);
return b;
Added:
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainer2BTCustomizerTest.java
URL:
http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainer2BTCustomizerTest.java?rev=886314&view=auto
==============================================================================
---
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainer2BTCustomizerTest.java
(added)
+++
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainer2BTCustomizerTest.java
Wed Dec 2 21:35:07 2009
@@ -0,0 +1,139 @@
+/*
+ * 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.aries.blueprint.itests;
+
+import static org.junit.Assert.assertNotNull;
+import static org.ops4j.pax.exam.CoreOptions.equinox;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.CoreOptions;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.ops4j.pax.exam.options.MavenArtifactProvisionOption;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.framework.CompositeBundle;
+import org.osgi.service.framework.CompositeBundleFactory;
+
+/**
+ * This test is based on the BlueprintContainerBTCustomizerTest. but this
test starts the
+ * blueprint sample before the blueprint bundle is started so going a slightly
+ * different code path
+ *
+ */
+...@runwith(JUnit4TestRunner.class)
+public class BlueprintContainer2BTCustomizerTest extends
AbstractIntegrationTest {
+
+ @Test
+ public void test() throws Exception {
+ // Create a config to check the property placeholder
+ ConfigurationAdmin ca = getOsgiService(ConfigurationAdmin.class);
+ Configuration cf = ca.getConfiguration("blueprint-sample-placeholder",
null);
+ Hashtable props = new Hashtable();
+ props.put("key.b", "10");
+ cf.update(props);
+
+
+ ServiceReference sr =
bundleContext.getServiceReference("org.osgi.service.framework.CompositeBundleFactory");
+ if (sr != null) {
+ // install blueprint.sample into the composite context
+ CompositeBundleFactory cbf =
(CompositeBundleFactory)bundleContext.getService(sr);
+
+ Map<String, String> frameworkConfig = new HashMap<String,
String>();
+ // turn on the line below to enable telnet localhost 10000 to the
child framework osgi console
+ // frameworkConfig.put("osgi.console", "10000");
+
+ // construct composite bundle information
+ Map<String, String> compositeManifest = new HashMap<String,
String>();
+ compositeManifest.put(Constants.BUNDLE_SYMBOLICNAME,
"test-composite");
+ compositeManifest.put(Constants.BUNDLE_VERSION, "1.0.0");
+ // this import-package is used by the blueprint.sample
+ compositeManifest.put(Constants.IMPORT_PACKAGE,
"org.osgi.service.blueprint.container");
+ // this export-package is used by pax junit runner as it needs to
see the blueprint sample package
+ // for the test after the blueprint sample is started.
+ compositeManifest.put(Constants.EXPORT_PACKAGE,
"org.apache.aries.blueprint.sample");
+
+ CompositeBundle cb = cbf.installCompositeBundle(frameworkConfig,
"test-composite", compositeManifest);
+
+ BundleContext compositeBundleContext =
cb.getCompositeFramework().getBundleContext();
+ // install the blueprint sample onto the framework associated with
the composite bundle
+ MavenArtifactProvisionOption mapo =
CoreOptions.mavenBundle().groupId("org.apache.aries.blueprint").artifactId("org.apache.aries.blueprint.sample").version(
"1.0.0-incubating-SNAPSHOT");
+ // let's use input stream to avoid invoking mvn url handler which
isn't avail in the child framework.
+ InputStream is = new URL(mapo.getURL()).openStream();
+ Bundle bundle =
compositeBundleContext.installBundle(mapo.getURL(), is);
+ assertNotNull(bundle);
+
+ // start the composite bundle then the blueprint sample
+ cb.start();
+ bundle.start();
+
+ // start the blueprint bundle and it should detect the previously
started blueprint sample
+ Bundle blueprintBundle =
getInstalledBundle("org.apache.aries.blueprint");
+ blueprintBundle.start();
+ //Thread.sleep(5000);
+
+ // do the test
+ testBlueprintContainer(compositeBundleContext, bundle);
+
+ }
+ }
+
+ @org.ops4j.pax.exam.junit.Configuration
+ public static Option[] configuration() {
+ Option[] options = options(
+ // Log
+ mavenBundle("org.ops4j.pax.logging", "pax-logging-api"),
+ mavenBundle("org.ops4j.pax.logging", "pax-logging-service"),
+ // Felix Config Admin
+ mavenBundle("org.apache.felix", "org.apache.felix.configadmin"),
+ // Felix mvn url handler
+ mavenBundle("org.ops4j.pax.url", "pax-url-mvn"),
+
+
+ // this is how you set the default log level when using pax
logging (logProfile)
+
systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("DEBUG"),
+
+ // Bundles
+ mavenBundle("org.apache.aries", "org.apache.aries.util"),
+ mavenBundle("org.apache.aries.blueprint",
"org.apache.aries.blueprint").noStart(),
+ // don't install the blueprint sample here as it will be installed
onto the same framework as the blueprint core bundle
+ // mavenBundle("org.apache.aries.blueprint",
"org.apache.aries.blueprint.sample").noStart(),
+ mavenBundle("org.osgi", "org.osgi.compendium"),
+ //
org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption("-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"),
+
+ equinox().version("3.5.0")
+ );
+ options = updateOptions(options);
+ return options;
+ }
+
+}
Propchange:
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainer2BTCustomizerTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainer2BTCustomizerTest.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange:
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainer2BTCustomizerTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainerBTCustomizerTest.java
URL:
http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainerBTCustomizerTest.java?rev=886314&r1=886313&r2=886314&view=diff
==============================================================================
---
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainerBTCustomizerTest.java
(original)
+++
incubator/aries/trunk/blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/BlueprintContainerBTCustomizerTest.java
Wed Dec 2 21:35:07 2009
@@ -95,7 +95,6 @@
// start the composite bundle then the blueprint sample
cb.start();
- Thread.sleep(5000);
bundle.start();
// do the test
Modified:
incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AriesBundleTrackerCustomizer.java
URL:
http://svn.apache.org/viewvc/incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AriesBundleTrackerCustomizer.java?rev=886314&r1=886313&r2=886314&view=diff
==============================================================================
---
incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AriesBundleTrackerCustomizer.java
(original)
+++
incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AriesBundleTrackerCustomizer.java
Wed Dec 2 21:35:07 2009
@@ -55,27 +55,40 @@
List<BundleTracker> btList = BundleTrackerFactory
.getBundleTrackerList(bundleScope);
- if (event.getType() == BundleEvent.STOPPING) {
- // if CompositeBundle is being stopped, let's remove the bundle
- // tracker(s) associated with the composite bundle
- if (btList != null) {
- // unregister the bundlescope off the factory and close
- // bundle trackers
- BundleTrackerFactory
- .unregisterAndCloseBundleTracker(bundleScope);
+ // bundle is already active and there is no event associated
+ // this can happen when bundle is first time added to the tracker
+ if (event == null) {
+ if (b.getState() == Bundle.ACTIVE) {
+ openTracker(b, bundleScope, stateMask);
+ }
+ } else {
+ if (event.getType() == BundleEvent.STOPPING) {
+ // if CompositeBundle is being stopped, let's remove the
bundle
+ // tracker(s) associated with the composite bundle
+ if (btList != null) {
+ // unregister the bundlescope off the factory and close
+ // bundle trackers
+ BundleTrackerFactory
+ .unregisterAndCloseBundleTracker(bundleScope);
+ }
+ } else if (event.getType() == BundleEvent.STARTING) {
+ openTracker(b, bundleScope, stateMask);
}
- } else if (event.getType() == BundleEvent.STARTING) {
- // let's process each of the bundle in the CompositeBundle
- CompositeBundle cb = (CompositeBundle) b;
- BundleContext compositeBundleContext = cb
- .getCompositeFramework().getBundleContext();
-
- // let's track each of the bundle in the CompositeBundle
- BundleTracker bt = new BundleTracker(compositeBundleContext,
- stateMask, this);
- bt.open();
- BundleTrackerFactory.registerBundleTracker(bundleScope, bt);
}
}
}
+
+ private void openTracker(Bundle b, String bundleScope, int stateMask) {
+ // let's process each of the bundle in the CompositeBundle
+ CompositeBundle cb = (CompositeBundle) b;
+ BundleContext compositeBundleContext = cb
+ .getCompositeFramework().getBundleContext();
+
+ // let's track each of the bundle in the CompositeBundle
+ BundleTracker bt = new BundleTracker(compositeBundleContext,
+ stateMask, this);
+ bt.open();
+ BundleTrackerFactory.registerBundleTracker(bundleScope, bt);
+ }
+
}