Class AbstractExtender

java.lang.Object
org.apache.felix.utils.extender.AbstractExtender
All Implemented Interfaces:
EventListener, org.osgi.framework.BundleActivator, org.osgi.framework.BundleListener, org.osgi.framework.SynchronousBundleListener, org.osgi.util.tracker.BundleTrackerCustomizer

public abstract class AbstractExtender extends Object implements org.osgi.framework.BundleActivator, org.osgi.util.tracker.BundleTrackerCustomizer, org.osgi.framework.SynchronousBundleListener
Base class to write bundle extenders. This extender tracks started bundles (or starting if they have a lazy activation policy) and will create an Extension for each of them to manage it. The extender will handle all concurrency and synchronization issues, see Extension for more information about the additional constraints. The extender guarantee that all extensions will be stopped synchronously with the STOPPING event of a given bundle and that all extensions will be stopped before the extender bundle is stopped.
  • Field Details

    • extensions

      private final ConcurrentMap<org.osgi.framework.Bundle,Extension> extensions
    • destroying

      private final ConcurrentMap<org.osgi.framework.Bundle,FutureTask> destroying
    • stopping

      private volatile boolean stopping
    • stopped

      private volatile boolean stopped
    • synchronous

      private boolean synchronous
    • preemptiveShutdown

      private boolean preemptiveShutdown
    • context

      private org.osgi.framework.BundleContext context
    • executors

      private ExecutorService executors
    • tracker

      private org.osgi.util.tracker.BundleTracker tracker
  • Constructor Details

    • AbstractExtender

      public AbstractExtender()
  • Method Details

    • isSynchronous

      public boolean isSynchronous()
      Check if the extender is synchronous or not. If the flag is set, the extender will start the extension synchronously with the bundle being tracked or started. Else, the starting of the extension will be delegated to a thread pool.
      Returns:
      if the extender is synchronous
    • isPreemptiveShutdown

      public boolean isPreemptiveShutdown()
      Check if the extender performs a preemptive shutdown of all extensions when the framework is being stopped. The default behavior is to wait for the framework to stop the bundles and stop the extension at that time.
      Returns:
      if the extender use a preemptive shutdown
    • getBundleContext

      public org.osgi.framework.BundleContext getBundleContext()
    • getExecutors

      public ExecutorService getExecutors()
    • setSynchronous

      public void setSynchronous(boolean synchronous)
    • setPreemptiveShutdown

      public void setPreemptiveShutdown(boolean preemptiveShutdown)
    • isStopping

      public boolean isStopping()
    • start

      public void start(org.osgi.framework.BundleContext context) throws Exception
      Specified by:
      start in interface org.osgi.framework.BundleActivator
      Throws:
      Exception
    • stop

      public void stop(org.osgi.framework.BundleContext context) throws Exception
      Specified by:
      stop in interface org.osgi.framework.BundleActivator
      Throws:
      Exception
    • doStart

      protected void doStart() throws Exception
      Throws:
      Exception
    • doStop

      protected void doStop() throws Exception
      Throws:
      Exception
    • startTracking

      protected void startTracking()
    • stopTracking

      protected void stopTracking()
    • createExecutor

      protected ExecutorService createExecutor()
      Create the executor used to start extensions asynchronously.
      Returns:
      an
    • chooseBundlesToDestroy

      protected Collection<org.osgi.framework.Bundle> chooseBundlesToDestroy(Set<org.osgi.framework.Bundle> bundles)
    • bundleChanged

      public void bundleChanged(org.osgi.framework.BundleEvent event)
      Specified by:
      bundleChanged in interface org.osgi.framework.BundleListener
    • addingBundle

      public Object addingBundle(org.osgi.framework.Bundle bundle, org.osgi.framework.BundleEvent event)
      Specified by:
      addingBundle in interface org.osgi.util.tracker.BundleTrackerCustomizer
    • modifiedBundle

      public void modifiedBundle(org.osgi.framework.Bundle bundle, org.osgi.framework.BundleEvent event, Object object)
      Specified by:
      modifiedBundle in interface org.osgi.util.tracker.BundleTrackerCustomizer
    • removedBundle

      public void removedBundle(org.osgi.framework.Bundle bundle, org.osgi.framework.BundleEvent event, Object object)
      Specified by:
      removedBundle in interface org.osgi.util.tracker.BundleTrackerCustomizer
    • createExtension

      private void createExtension(org.osgi.framework.Bundle bundle)
    • destroyExtension

      private void destroyExtension(org.osgi.framework.Bundle bundle)
    • doCreateExtension

      protected abstract Extension doCreateExtension(org.osgi.framework.Bundle bundle) throws Exception
      Create the extension for the given bundle, or null if the bundle is not to be extended.
      Parameters:
      bundle - the bundle to extend
      Returns:
      The extension
      Throws:
      Exception - If something goes wrong
    • debug

      protected abstract void debug(org.osgi.framework.Bundle bundle, String msg)
    • warn

      protected abstract void warn(org.osgi.framework.Bundle bundle, String msg, Throwable t)
    • error

      protected abstract void error(String msg, Throwable t)