You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@aries.apache.org by Jarek Gawor <jg...@gmail.com> on 2009/12/02 22:56:52 UTC

Re: svn commit: r886314 - in /incubator/aries/trunk: blueprint/blueprint-core/ blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/ blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/ util/src/main/java

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,  <li...@apache.org> 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);
> +     }
> +
>  }
>
>
>

Re: svn commit: r886314 - in /incubator/aries/trunk: blueprint/blueprint-core/ blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/ blueprint/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/ util/src/main/java

Posted by Lin Sun <li...@gmail.com>.
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 <jg...@gmail.com> 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,  <li...@apache.org> 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);
>> +     }
>> +
>>  }
>>
>>
>>
>