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);
>> +     }
>> +
>>  }
>>
>>
>>
>

Reply via email to