code: public void init() {
          isDirty = false;
  
          // If we haven't looked at anything from the cache or the filesystem, this is bootstrap time
          boolean firstInit = cachedFeatures.isEmpty();
  
          autoFeatures = new ArrayList<SubsystemFeatureDefinitionImpl>();
          knownFeatures = new HashMap<File, SubsystemFeatureDefinitionImpl>();
          knownBadFeatures = new HashMap<File, BadFeature>();
  
          // Read feature cache, this will only toss files that no longer exist
          // stale will be marked true if feature definitions were discarded.
          readCache(firstInit);
  
          // Now we need to go find / update the cache with anything new/interesting/different.
          // This will happen at most twice...
          readFeatureManifests();
  
          // If something was out of sync with the filesystem and this is the first pass,
          // reset the installed features list so we re-figure out what should be installed.
          if (isDirty && firstInit) {
              // If stale, reset to empty list as we'll be rebuilding....
              installedFeatures = Collections.emptySet();
              configuredFeatures = Collections.emptySet();
          }
      }
docs: This is called at the beginning of a provisioning operation. It re-initializes
  or refreshes the cache against what is known in the filesystem.
  <p>
  Note that for update operations (rather than initial provisioning), cachedFeatures will
  be pre-populated..