docs: @Override
      @FFDCIgnore(IOException.class)
      public void bundleChanged(BundleEvent event) {
          boolean store = false;
          switch (event.getType()) {
              case BundleEvent.INSTALLED:
                  Bundle installerBundle = event.getOrigin();
                  if (!featureManager.equals(installerBundle)) {
                      loadCacheIfPurged();
                      //the bundle was installed by something other than the feature manager
                      //we should associate it with its installer
                      String installingBundleSN = installerBundle.getLocation();
                      Set<String> installeeBundles = Collections.synchronizedSet(new HashSet<String>());
                      Set<String> existingInstalleeBundles;
                      existingInstalleeBundles = bundleOrigins.putIfAbsent(installingBundleSN, installeeBundles);
                      if (existingInstalleeBundles == null)
                          existingInstalleeBundles = installeeBundles;
                      //add the location of the bundle being installed to the set for the origin bundle
                      existingInstalleeBundles.add(event.getBundle().getLocation());
                      //flag to store the data
                      store = true;
                      //delay the purge of the origins cache
                      delayPurge();
                  }
                  break;
              case BundleEvent.UNINSTALLED:
                  loadCacheIfPurged();
                  Bundle uninstalledBundle = event.getBundle();
                  //set the flag to store data to disk if the uninstall was one of our known installer bundles
                  store = processUninstalledInstallerBundle(uninstalledBundle.getLocation());
                  //delay the purge of the origins cache
                  delayPurge();
                  break;
              default:
                  break;
          }
          //if we had a installed or uninstalled event and the data changed
          //then we need to persist it to the workarea ready for a subsequent warm start
          if (store == true) {
              //persist the data after each event is processed
              synchronized (bundleOriginCache) {
                  FileOutputStream fos = null;
                  ObjectOutputStream oos = null;
                  try {
                      //create if it doesn't exist yet
                      boolean created = bundleOriginCache.createNewFile();
                      if (created || bundleOriginCache.exists()) {
                          oos = new ObjectOutputStream((fos = new FileOutputStream(bundleOriginCache)));
                          oos.writeObject(bundleOrigins);
                      }
                  } catch (FileNotFoundException e) {
                      //autoFFDC
                  } catch (IOException e) {
                      //manually FFDC here because we are preventing autoFFDC instrumentation for the finally block
                      FFDCFilter.processException(e, getClass().getName(), "201", new Object[] { bundleOrigins, bundleOriginCache });
                  } finally {
                      if (oos != null) {
                          try {
                              oos.close();
                          } catch (IOException e) {
                              //suppress FFDC
                          }
                      }
                      if (fos != null) {
                          try {
                              fos.close();
                          } catch (IOException e) {
                              //suppress FFDC
                          }
                      }
                  }
  
              }
          }
      }