aries-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From lin...@apache.org
Subject svn commit: r941776 - in /incubator/aries/trunk: blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/ jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/ util/src/main/java/org/apache/aries/util/tracker/
Date Thu, 06 May 2010 15:22:31 GMT
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



Mime
View raw message