code: private void cacheFeaturesForName(String featureName) {
          if (nameToNonApplicableResources.containsKey(featureName)) {
              return; // We've already cached all features for this name
          }
  
          if (repositoryConnection != null) {
              List<ApplicableToProduct> nonApplicable = new ArrayList<>();
  
              for (RepositoryResource resource : getResourcesForName(featureName)) {
                  if (!isApplicable(resource)) {
                      nonApplicable.add((ApplicableToProduct) resource); // Safe cast as both samples and features are ApplicableToProducts
                  } else if (resource.getType() == ResourceType.FEATURE) {
                      addFeature((EsaResource) resource);
                  }
              }
  
              nameToNonApplicableResources.put(featureName, nonApplicable);
          }
      }
docs: Go to the repository (if available) and find all the features for the given name
  <p>
  Each feature that's applicable is then added to the repository, the rest are added to {@link #nameToNonApplicableResources}
  <p>
  This is needed to allow us to find features with a blank appliesTo (which aren't returned by {@link RepositoryConnectionList#getMatchingEsas(ProductDefinition)}) and to give
  better error messages where the user has tried to install a feature which is available but which isn't applicable to their products.
  
  @param featureName the short or symbolic name of the feature