Hi Lin, did you mean to delete the files: incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AbstractBundleTrackerCustomizer.java incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AriesBundleTrackerCustomizer.java incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/MultiBundleTracker.java
at the moment they are 0 length files. Cheers, Jeremy On 6 May 2010 16:22, <[email protected]> wrote: > Author: linsun > Date: Thu May 6 15:22:31 2010 > New Revision: 941776 > > URL: http://svn.apache.org/viewvc?rev=941776&view=rev > Log: > ARIES-272 BundleTrackerCustomizers will not recurse on bundles added to a > CompositeBundle before the composite bundle is started - patch from Holly > Cummins > > Added: > > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java > (with props) > > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java > (with props) > Modified: > > incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java > > incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java > > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AbstractBundleTrackerCustomizer.java > > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AriesBundleTrackerCustomizer.java > > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/MultiBundleTracker.java > > 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=941776&r1=941775&r2=941776&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 > Thu May 6 15:22:31 2010 > @@ -37,7 +37,7 @@ import org.apache.aries.blueprint.Parser > import org.apache.aries.blueprint.namespace.NamespaceHandlerRegistryImpl; > import org.apache.aries.blueprint.utils.HeaderParser; > import org.apache.aries.blueprint.utils.HeaderParser.PathElement; > -import org.apache.aries.util.tracker.AriesBundleTrackerCustomizer; > +import org.apache.aries.util.tracker.RecursiveBundleTracker; > import org.osgi.framework.Bundle; > import org.osgi.framework.BundleActivator; > import org.osgi.framework.BundleContext; > @@ -54,8 +54,7 @@ import org.slf4j.Logger; > import org.slf4j.LoggerFactory; > > /** > - * This is the blueprint extender that listens to blueprint bundles. it > implements the sync > - * bundle listener but it doesn't register the listener and uses the bundle > tracker instead. > + * This is the blueprint extender that listens to blueprint bundles. > * > * @version $Rev$, $Date$ > */ > @@ -68,7 +67,7 @@ public class BlueprintExtender implement > private Map<Bundle, BlueprintContainerImpl> containers; > private BlueprintEventDispatcher eventDispatcher; > private NamespaceHandlerRegistry handlers; > - private BundleTracker bt; > + private RecursiveBundleTracker bt; > private ServiceRegistration parserServiceReg; > > public void start(BundleContext context) { > @@ -80,13 +79,9 @@ public class BlueprintExtender implement > eventDispatcher = new BlueprintEventDispatcher(context, executors); > containers = new HashMap<Bundle, BlueprintContainerImpl>(); > > - ServiceReference sr = > this.context.getServiceReference("org.osgi.service.framework.CompositeBundleFactory"); > - if (sr == null) { > - bt = new BundleTracker(context, Bundle.STARTING | Bundle.ACTIVE > | Bundle.STOPPING, new BlueprintBundleTrackerCustomizer()); > - } else { > - // composite bundle factory service is active, let's track > blueprint bundles installed in the child frameworks too. > - bt = new BundleTracker(context, Bundle.STARTING | Bundle.ACTIVE > | Bundle.STOPPING, new BlueprintMutilBundleTrackerCustomizer()); > - } > + int stateMask = Bundle.INSTALLED | Bundle.RESOLVED | Bundle.STARTING > | Bundle.ACTIVE > + | Bundle.STOPPING; > + bt = new RecursiveBundleTracker(context, stateMask, new > BlueprintBundleTrackerCustomizer()); > bt.open(); > > // Create and publish a ParserService > @@ -374,44 +369,4 @@ public class BlueprintExtender implement > } > } > > - // blueprint bundle tracker calls bundleChanged to minimize changes. > - // this bundle tracker customizer handles bundles installed in the child > framework as well > - private class BlueprintMutilBundleTrackerCustomizer extends > - AriesBundleTrackerCustomizer { > - > - public BlueprintMutilBundleTrackerCustomizer() { > - } > - > - public Object addingBundle(Bundle b, BundleEvent event) { > - > - super.addingBundle(b, event); > - > - if (event == null) { > - // existing bundles first added to the tracker with no event > change > - checkInitialBundle(b); > - } else { > - bundleChanged(event); > - } > - > - return b; > - } > - > - public void modifiedBundle(Bundle b, BundleEvent event, Object arg2) > { > - > - super.modifiedBundle(b, event, arg2); > - > - if (event == null) { > - // cannot think of why we would be interested in a modified > bundle with no bundle event > - return; > - } else { > - bundleChanged(event); > - } > - > - } > - > - // don't think we would be interested in removedBundle, as that is > - // called when bundle is removed from the tracker > - public void removedBundle(Bundle b, BundleEvent event, Object arg2) { > - } > - } > } > > Modified: > incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java > URL: > http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java?rev=941776&r1=941775&r2=941776&view=diff > ============================================================================== > --- > incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java > (original) > +++ > incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java > Thu May 6 15:22:31 2010 > @@ -34,6 +34,7 @@ import java.util.Properties; > import java.util.Set; > import java.util.Map.Entry; > > +import org.apache.aries.util.VersionRange; > import org.apache.aries.jpa.container.ManagedPersistenceUnitInfo; > import org.apache.aries.jpa.container.ManagedPersistenceUnitInfoFactory; > import org.apache.aries.jpa.container.parsing.ParsedPersistenceUnit; > @@ -41,21 +42,21 @@ import org.apache.aries.jpa.container.pa > import org.apache.aries.jpa.container.parsing.PersistenceDescriptorParser; > import > org.apache.aries.jpa.container.parsing.PersistenceDescriptorParserException; > import > org.apache.aries.jpa.container.unit.impl.ManagedPersistenceUnitInfoFactoryImpl; > -import org.apache.aries.util.VersionRange; > -import org.apache.aries.util.tracker.MultiBundleTracker; > +import org.apache.aries.util.tracker.RecursiveBundleTracker; > import org.osgi.framework.Bundle; > import org.osgi.framework.BundleContext; > import org.osgi.framework.BundleEvent; > import org.osgi.framework.Constants; > import org.osgi.framework.ServiceReference; > import org.osgi.framework.Version; > +import org.osgi.util.tracker.BundleTrackerCustomizer; > import org.slf4j.Logger; > import org.slf4j.LoggerFactory; > > /** > * This class locates, parses and manages persistence units defined in OSGi > bundles. > */ > -public class PersistenceBundleManager extends MultiBundleTracker > +public class PersistenceBundleManager implements BundleTrackerCustomizer > { > /** Logger */ > private static final Logger _logger = > LoggerFactory.getLogger("org.apache.aries.jpa.container"); > @@ -86,6 +87,7 @@ public class PersistenceBundleManager ex > private PersistenceDescriptorParser parser; > /** Configuration for this extender */ > private Properties config; > + private final RecursiveBundleTracker tracker; > > /** > * Create the extender. Note that it will not start tracking > @@ -94,9 +96,9 @@ public class PersistenceBundleManager ex > */ > public PersistenceBundleManager(BundleContext ctx) > { > - super(ctx, Bundle.INSTALLED | Bundle.RESOLVED | Bundle.STARTING | > - Bundle.ACTIVE | Bundle.STOPPING); > this.ctx = ctx; > + tracker = new RecursiveBundleTracker(ctx, Bundle.INSTALLED | > Bundle.RESOLVED | Bundle.STARTING | > + Bundle.ACTIVE | Bundle.STOPPING, this); > } > > /** > @@ -109,7 +111,6 @@ public class PersistenceBundleManager ex > > > @SuppressWarnings("unchecked") > - �...@override > public void open() { > //Create the pluggable ManagedPersistenceUnitInfoFactory > String className = > config.getProperty(ManagedPersistenceUnitInfoFactory.DEFAULT_PU_INFO_FACTORY_KEY); > @@ -127,9 +128,15 @@ public class PersistenceBundleManager ex > if(persistenceUnitFactory == null) > persistenceUnitFactory = new ManagedPersistenceUnitInfoFactoryImpl(); > > - super.open(); > + tracker.open(); > } > > + public void close() > + { > + if (tracker != null) { > + tracker.close(); > + } > + } > public Object addingBundle(Bundle bundle, BundleEvent event) > { > EntityManagerFactoryManager mgr = setupManager(bundle, null, true); > > Modified: > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AbstractBundleTrackerCustomizer.java > URL: > http://svn.apache.org/viewvc/incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AbstractBundleTrackerCustomizer.java?rev=941776&r1=941775&r2=941776&view=diff > ============================================================================== > --- > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AbstractBundleTrackerCustomizer.java > (original) > +++ > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/AbstractBundleTrackerCustomizer.java > Thu May 6 15:22:31 2010 > @@ -1,83 +0,0 @@ > -/** > - * 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.util.tracker; > - > -import java.util.List; > - > -import org.osgi.framework.Bundle; > -import org.osgi.framework.BundleContext; > -import org.osgi.framework.BundleEvent; > -import org.osgi.service.framework.CompositeBundle; > -import org.osgi.util.tracker.BundleTracker; > -import org.osgi.util.tracker.BundleTrackerCustomizer; > - > -/** > - * This class provides code to track <code>CompositeBundle></code>s. > - */ > -public abstract class AbstractBundleTrackerCustomizer implements > BundleTrackerCustomizer { > - > - public AbstractBundleTrackerCustomizer() { > - super(); > - } > - > - protected void customizedProcessBundle(BundleTrackerCustomizer btc, > Bundle b, BundleEvent event, int stateMask) { > - if (b instanceof CompositeBundle) { > - // check if the compositeBundle is already tracked in the > - // BundleTrackerFactory > - String bundleScope = b.getSymbolicName() + "_" > - + b.getVersion().toString(); > - List<BundleTracker> btList = BundleTrackerFactory > - .getBundleTrackerList(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(btc, 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(btc, b, bundleScope, stateMask); > - } > - } > - } > - } > - > - private void openTracker(BundleTrackerCustomizer btc, 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, btc); > - bt.open(); > - BundleTrackerFactory.registerBundleTracker(bundleScope, bt); > - } > - > -} > > 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=941776&r1=941775&r2=941776&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 > Thu May 6 15:22:31 2010 > @@ -1,40 +0,0 @@ > -/** > - * 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.util.tracker; > - > -import org.osgi.framework.Bundle; > -import org.osgi.framework.BundleEvent; > - > -public abstract class AriesBundleTrackerCustomizer extends > AbstractBundleTrackerCustomizer { > - > - public AriesBundleTrackerCustomizer() { > - } > - > - public Object addingBundle(Bundle b, BundleEvent event) { > - customizedProcessBundle(this, b, event, Bundle.STARTING | > Bundle.ACTIVE | Bundle.STOPPING); > - return b; > - } > - > - public void modifiedBundle(Bundle b, BundleEvent event, Object arg2) { > - customizedProcessBundle(this, b, event, Bundle.STARTING | > Bundle.ACTIVE | Bundle.STOPPING); > - } > - > - public void removedBundle(Bundle b, BundleEvent event, Object arg2) { > - } > -} > > Added: > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java > URL: > http://svn.apache.org/viewvc/incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java?rev=941776&view=auto > ============================================================================== > --- > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java > (added) > +++ > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java > Thu May 6 15:22:31 2010 > @@ -0,0 +1,160 @@ > +/** > + * 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.util.tracker; > + > +import java.util.HashSet; > +import java.util.List; > +import java.util.Set; > + > +import org.osgi.framework.Bundle; > +import org.osgi.framework.BundleContext; > +import org.osgi.framework.BundleEvent; > +import org.osgi.service.framework.CompositeBundle; > +import org.osgi.util.tracker.BundleTracker; > +import org.osgi.util.tracker.BundleTrackerCustomizer; > + > +/** > + * A BundleTracker which will track bundles in the given context, and also > + * bundles in any child contexts. This should be used instead of the > + * normal non-recursive BundleTracker when registering bundle tracker > + * customizers. > + */ > +public class InternalRecursiveBundleTracker extends BundleTracker > +{ > + private final int mask; > + > + private final Set<BundleContext> alreadyRecursedContexts = new > HashSet<BundleContext>(); > + > + private final BundleTrackerCustomizer customizer; > + > + public InternalRecursiveBundleTracker(BundleContext context, int stateMask, > + BundleTrackerCustomizer customizer) > + { > + super(context, stateMask, null); > + mask = stateMask; > + this.customizer = customizer; > + } > + > + /* > + * (non-Javadoc) > + * @see > org.osgi.util.tracker.BundleTracker#addingBundle(org.osgi.framework.Bundle, > org.osgi.framework.BundleEvent) > + */ > + �...@override > + public Object addingBundle(Bundle b, BundleEvent event) > + { > + Object o = null; > + > + if (b instanceof CompositeBundle) { > + customizedProcessBundle(this, b, event); > + o = b; > + } else { > + // Delegate to our customizer for normal bundles > + if (customizer != null) { > + o = customizer.addingBundle(b, event); > + } > + } > + > + return o; > + } > + > + /* > + * (non-Javadoc) > + * @see > org.osgi.util.tracker.BundleTracker#modifiedBundle(org.osgi.framework.Bundle, > org.osgi.framework.BundleEvent, java.lang.Object) > + */ > + �...@override > + public void modifiedBundle(Bundle b, BundleEvent event, Object object) > + { > + if (b instanceof CompositeBundle) { > + customizedProcessBundle(this, b, event); > + } else { > + // Delegate to our customizer for normal bundles > + if (customizer != null) { > + customizer.modifiedBundle(b, event, object); > + } > + } > + } > + > + /* > + * (non-Javadoc) > + * @see > org.osgi.util.tracker.BundleTracker#removedBundle(org.osgi.framework.Bundle, > org.osgi.framework.BundleEvent, java.lang.Object) > + */ > + �...@override > + public void removedBundle(Bundle b, BundleEvent event, Object object) > + { > + if (b instanceof CompositeBundle) { > + // We should have already picked up the stopping event on the CBA > itself > + } else { > + if (customizer != null) { > + customizer.removedBundle(b, event, object); > + } > + } > + } > + > + protected void customizedProcessBundle(BundleTrackerCustomizer btc, Bundle > b, BundleEvent event) > + { > + if (b instanceof CompositeBundle) { > + CompositeBundle cb = (CompositeBundle) b; > + // check if the compositeBundle is already tracked in the > + // BundleTrackerFactory > + String bundleScope = cb.getSymbolicName() + "_" + > cb.getVersion().toString(); > + List<BundleTracker> btList = > BundleTrackerFactory.getBundleTrackerList(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 (cb.getState() == Bundle.INSTALLED || cb.getState() == > Bundle.RESOLVED || cb.getState() == Bundle.STARTING || cb.getState() == > Bundle.ACTIVE) { > + openTracker(btc, cb, bundleScope, mask); > + } > + } else { > + if (event.getType() == BundleEvent.STOPPING) { > + // if CompositeBundle is being stopped, let's remove the bundle > + // tracker(s) associated with the composite bundle > + BundleContext compositeBundleContext = ((CompositeBundle) > b).getCompositeFramework() > + .getBundleContext(); > + alreadyRecursedContexts.remove(compositeBundleContext); > + if (btList != null) { > + // unregister the bundlescope off the factory and close > + // bundle trackers > + > BundleTrackerFactory.unregisterAndCloseBundleTracker(bundleScope); > + } > + } else if (event.getType() == BundleEvent.INSTALLED > + || event.getType() == BundleEvent.STARTING) { > + openTracker(btc, cb, bundleScope, mask); > + } > + } > + } > + } > + > + private synchronized void openTracker(BundleTrackerCustomizer btc, > CompositeBundle cb, > + String bundleScope, int stateMask) > + { > + // let's process each of the bundle in the CompositeBundle > + BundleContext compositeBundleContext = > cb.getCompositeFramework().getBundleContext(); > + if (!alreadyRecursedContexts.contains(compositeBundleContext)) { > + alreadyRecursedContexts.add(compositeBundleContext); > + > + // let's track each of the bundle in the CompositeBundle > + BundleTracker bt = new > InternalRecursiveBundleTracker(compositeBundleContext, stateMask, > + customizer); > + bt.open(); > + BundleTrackerFactory.registerBundleTracker(bundleScope, bt); > + } > + } > +} > > Propchange: > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java > ------------------------------------------------------------------------------ > svn:keywords = Date Revision > > Propchange: > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Modified: > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/MultiBundleTracker.java > URL: > http://svn.apache.org/viewvc/incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/MultiBundleTracker.java?rev=941776&r1=941775&r2=941776&view=diff > ============================================================================== > --- > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/MultiBundleTracker.java > (original) > +++ > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/MultiBundleTracker.java > Thu May 6 15:22:31 2010 > @@ -1,136 +0,0 @@ > -/** > - * 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.util.tracker; > - > -import org.osgi.framework.Bundle; > -import org.osgi.framework.BundleContext; > -import org.osgi.framework.BundleEvent; > -import org.osgi.framework.ServiceReference; > -import org.osgi.service.framework.CompositeBundle; > -import org.osgi.util.tracker.BundleTracker; > - > -/** > - * <p>This class supports the tracking of composite bundles. It allows > clients to ignore any > - * events related to framework bundles, as it will automatically handle > these events. In > - * order to use this class clients must create a subclass and implement the > methods of the > - * <code>BundleTrackerCustomizer</code> interface. In spite of this, > instances of this class > - * MUST NOT be passed as a parameter to any <code>BundleTracker</code>.</p> > - */ > -public abstract class MultiBundleTracker extends > AbstractBundleTrackerCustomizer { > - private static final int COMPOSITE_BUNDLE_MASK = > - Bundle.STARTING | Bundle.ACTIVE | Bundle.STOPPING; > - > - private final BundleTracker tracker; > - > - /** > - * Constructor > - * > - * @param context - The <code>BundleContext</code> against which the > tracking is done. > - * @param stateMask - The bit mask of the ORing of the bundle states to > be tracked. The > - * mask must contain the flags <code>Bundle.STARTING | Bundle.ACTIVE | > Bundle.STOPPING</code> > - * as a minimum. > - * @throws IllegalArgumentException - If the provided bit mask does not > contain required > - * flags > - */ > - public MultiBundleTracker(BundleContext context, int stateMask) { > - if ((stateMask & COMPOSITE_BUNDLE_MASK) != COMPOSITE_BUNDLE_MASK) > - throw new IllegalArgumentException(); > - > - if (areMultipleFrameworksAvailable(context)) { > - tracker = new InternalBundleTracker(context, stateMask); > - } else { > - tracker = new BundleTracker(context, stateMask, this); > - } > - } > - > - private static boolean areMultipleFrameworksAvailable(BundleContext > context) { > - ServiceReference sr = > context.getServiceReference("org.osgi.service.framework.CompositeBundleFactory"); > - return sr != null; > - } > - > - /** > - * Start tracking bundles that match the bit mask provided at creation > time. > - * > - * @see BundleTracker#open() > - */ > - public void open() { > - tracker.open(); > - } > - > - /** > - * Stop the tracking of bundles > - * > - * @see BundleTracker#close() > - */ > - public void close() { > - tracker.close(); > - } > - > - //This implementation of a BundleTracker is based on the implementation > - //in org.apache.aries.util.tracker.AriesBundleTrackerCustomizer > - private class InternalBundleTracker extends BundleTracker { > - private final int mask; > - > - public InternalBundleTracker(BundleContext context, int stateMask) { > - super(context, stateMask, null); > - > - mask = stateMask; > - } > - > - /* > - * (non-Javadoc) > - * @see > org.osgi.util.tracker.BundleTracker#addingBundle(org.osgi.framework.Bundle, > org.osgi.framework.BundleEvent) > - */ > - public Object addingBundle(Bundle b, BundleEvent event) { > - Object o = null; > - > - if (b instanceof CompositeBundle) { > - customizedProcessBundle(this, b, event, mask); > - o = b; > - } > - else { > - o = MultiBundleTracker.this.addingBundle(b, event); > - } > - > - return o; > - } > - > - /* > - * (non-Javadoc) > - * @see > org.osgi.util.tracker.BundleTracker#modifiedBundle(org.osgi.framework.Bundle, > org.osgi.framework.BundleEvent, java.lang.Object) > - */ > - public void modifiedBundle(Bundle b, BundleEvent event, Object > object) { > - if (b instanceof CompositeBundle) { > - customizedProcessBundle(this, b, event, mask); > - } > - else { > - MultiBundleTracker.this.modifiedBundle(b, event, object); > - } > - } > - > - /* > - * (non-Javadoc) > - * @see > org.osgi.util.tracker.BundleTracker#removedBundle(org.osgi.framework.Bundle, > org.osgi.framework.BundleEvent, java.lang.Object) > - */ > - public void removedBundle(Bundle b, BundleEvent event, Object > object) { > - if (!(b instanceof CompositeBundle)) > - MultiBundleTracker.this.removedBundle(b, event, object); > - } > - } > -} > > Added: > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java > URL: > http://svn.apache.org/viewvc/incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java?rev=941776&view=auto > ============================================================================== > --- > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java > (added) > +++ > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java > Thu May 6 15:22:31 2010 > @@ -0,0 +1,89 @@ > +/** > + * 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.util.tracker; > + > +import org.osgi.framework.Bundle; > +import org.osgi.framework.BundleContext; > +import org.osgi.framework.ServiceReference; > +import org.osgi.util.tracker.BundleTracker; > +import org.osgi.util.tracker.BundleTrackerCustomizer; > + > +/** > + * <p>This class supports the tracking of composite bundles. It allows > clients to ignore any > + * events related to framework bundles, as it will automatically handle > these events. In > + * order to use this class clients must create a subclass and implement the > methods of the > + * <code>BundleTrackerCustomizer</code> interface. In spite of this, > instances of this class > + * MUST NOT be passed as a parameter to any <code>BundleTracker</code>.</p> > + * > + * The model for using this is that classes should instantiate it > + * and pass it a 'vanilla' bundle tracker. > + * @author pradine > + * > + */ > +public final class RecursiveBundleTracker { > + private static final int COMPOSITE_BUNDLE_MASK = > + Bundle.INSTALLED | Bundle.STARTING | Bundle.ACTIVE | Bundle.STOPPING; > + > + private final BundleTracker tracker; > + > + /** > + * Constructor > + * > + * @param context - The <code>BundleContext</code> against which the > tracking is done. > + * @param stateMask - The bit mask of the ORing of the bundle states to > be tracked. The > + * mask must contain the flags <code>Bundle.STARTING | Bundle.ACTIVE | > Bundle.STOPPING</code> > + * as a minimum. > + * @throws IllegalArgumentException - If the provided bit mask does not > contain required > + * flags > + */ > + public RecursiveBundleTracker(BundleContext context, int stateMask, > BundleTrackerCustomizer customizer) { > + // We always need INSTALLED events so we can recursively listen to the > frameworks > + if ((stateMask & COMPOSITE_BUNDLE_MASK) != COMPOSITE_BUNDLE_MASK) > + throw new IllegalArgumentException(); > + if (areMultipleFrameworksAvailable(context)) { > + tracker = new InternalRecursiveBundleTracker(context, stateMask, > customizer); > + } else { > + tracker = new BundleTracker(context, stateMask, customizer); > + } > + } > + > + private static boolean areMultipleFrameworksAvailable(BundleContext > context) { > + ServiceReference sr = > context.getServiceReference("org.osgi.service.framework.CompositeBundleFactory"); > + return sr != null; > + } > + > + /** > + * Start tracking bundles that match the bit mask provided at creation > time. > + * > + * @see BundleTracker#open() > + */ > + public void open() { > + tracker.open(); > + } > + > + /** > + * Stop the tracking of bundles > + * > + * @see BundleTracker#close() > + */ > + public void close() { > + tracker.close(); > + } > + > +} > > Propchange: > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java > ------------------------------------------------------------------------------ > svn:keywords = Date Revision > > Propchange: > incubator/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > >
