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);
> +
> +        }
> +    }
> +
> +   �[email protected]
> +    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);
> +     }
> +
>  }
>
>
>

Reply via email to