docs: @Override
      protected void doExecute(ExecutionContext context) {
          CommandConsole commandConsole = context.getCommandConsole();
  
          ManifestFileProcessor processor = new ManifestFileProcessor();
  
          for (Map.Entry<String, Map<String, ProvisioningFeatureDefinition>> prodFeatureEntries : processor.getFeatureDefinitionsByProduct().entrySet()) {
              String productName = prodFeatureEntries.getKey();
              boolean headingPrinted = false;
              for (Map.Entry<String, ProvisioningFeatureDefinition> entry : prodFeatureEntries.getValue().entrySet()) {
                  // entry.getKey() this is the longer Subsystem-SymbolicName
                  FeatureDefinition featureDefintion = entry.getValue();
                  String featureName = featureDefintion.getFeatureName();
  
                  if (featureDefintion.getVisibility() == Visibility.PUBLIC) {
                      if (productName.equals(ManifestFileProcessor.CORE_PRODUCT_NAME)) {
                          commandConsole.printInfoMessage(featureName);
                      } else {
                          if (headingPrinted == false) {
                              commandConsole.printlnInfoMessage("");
                              commandConsole.printInfoMessage("Product Extension: ");
                              commandConsole.printlnInfoMessage(productName);
                              headingPrinted = true;
                          }
                          int colonIndex = featureName.indexOf(":");
                          commandConsole.printInfoMessage(featureName.substring(colonIndex + 1));
                      }
  
                      commandConsole.printInfoMessage(" [");
                      commandConsole.printInfoMessage(featureDefintion.getVersion().toString());
                      commandConsole.printlnInfoMessage("]");
                  }
              }
          }
  
      }