Hi Jarek Well spotted. After thinking it over, I think bundle tracker will track existing bundles before bundle tracker is opened, by calling addingBundle() and passing event = null. I ''ll remove the checkAllBundles() to simplify things.
Thanks! Lin On Wed, Dec 2, 2009 at 4:56 PM, Jarek Gawor <[email protected]> wrote: > Lin, > > It is my understanding that the checkAllBundles() stuff shouldn't be > necessary anymore since the code was switched to use BundleTracker. > The BundleTracker should initially get the list of existing bundles > and call addingBundle() on each matching bundle. So right now I think > we are duplicating the work (and code) for existing bundles when the > extender starts. Or am I missing something? > > Jarek > > On Wed, Dec 2, 2009 at 4:35 PM, <[email protected]> wrote: >> 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); >> + } >> + >> } >> >> >> >
