docs: private void readCache(boolean firstInit) {
          if (cacheOk && cacheRes != null && cacheRes.exists()) {
              String line = null;
              InputStream in = null;
              BufferedReader reader = null;
              SubsystemFeatureDefinitionImpl cachedEntry = null;
  
              try {
                  in = cacheRes.get();
                  reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
  
                  while ((line = reader.readLine()) != null) {
                      if (line.startsWith("@=")) {
                          // If we're reading for the first time, re-assign the list of installed features
                          if (firstInit)
                              installedFeatures = readFeatureNameList(line.substring(2));
                      } else if (line.startsWith("XX")) {
                          // known bad manifest file
                          updateBadManifestCache(line.substring(2));
                      } else if (line.startsWith("-@")) {
                          // if we're reading for the first time, re-assign the list of configured features
                          if (firstInit)
                              configuredFeatures = readFeatureNameList(line.substring(2));
                      } else if (line.startsWith("-#")) {
                          if (line.length() > 2) {
                              configurationError = line.charAt(2) == '1';
                          }
                      } else if (!line.startsWith("-")) { // skip extraneous nested lines
                          int index = line.indexOf('=');
  
                          String symbolicName = line.substring(0, index);
                          cachedEntry = cachedFeatures.get(symbolicName);
  
                          // Get the immutable attributes from the cached feature element..
                          ImmutableAttributes cachedAttr = cachedEntry == null ? null : cachedEntry.getImmutableAttributes();
  
                          // loadAttributes will return new attributes (didn't exist before),
                          // the cachedAttributes (unchanged), or null (file no longer present OR invalid cache line )
                          ImmutableAttributes newAttr = FeatureDefinitionUtils.loadAttributes(line, cachedAttr);
  
                          if (newAttr != null) {
                              // New shiny attributes...
                              ProvisioningDetails details = new ProvisioningDetails(reader, newAttr);
                              if (cachedAttr == newAttr) {
                                  // woo-hoo!! cache hit!
                                  // the provisioning details need to be reconstituted
                                  cachedEntry.setProvisioningDetails(details);
                              } else {
                                  // Only set to is dirty if not firstInit.
                                  // On firstInit we are creating the definitions from cache for the first time here
                                  if (!!!firstInit)
                                      isDirty = true;
                                  cachedEntry = new SubsystemFeatureDefinitionImpl(newAttr, details);
                              }
                          } else if (cachedAttr != null) {
                              // so sad! the file went away or something is askew with this line...
                              isDirty = true;
                              cachedFeatures.remove(symbolicName);
                              cachedEntry = null;
                          } else {
                              // I know this happens: null cachedAttribute, null newAttribute..
                              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                                  Tr.debug(tc, "cacheAttr and newAttr BOTH null while reading cache", line);
                              }
                              isDirty = true;
                              cachedEntry = null;
                          }
  
                          // Update the associated maps we need for provisioning
                          updateMaps(cachedEntry);
                      }
                  }
              } catch (IOException ioe) {
                  cacheWarning(ioe);
              } finally {
                  FileUtils.tryToClose(reader);
                  FileUtils.tryToClose(in);
              }
          }
      }