docs: public Set<InstallLicense> getFeatureLicense(Collection<String> featureIds, File fromDir, String toExtension, boolean offlineOnly, Locale locale) throws InstallException {
          Set<InstallLicense> licenses = new HashSet<InstallLicense>();
          ArrayList<InstallAsset> installAssets = new ArrayList<InstallAsset>();
          ArrayList<String> unresolvedFeatures = new ArrayList<String>();
          Collection<ESAAsset> autoFeatures = getResolveDirector().getAutoFeature(fromDir, toExtension);
          getResolveDirector().resolve(featureIds, fromDir, toExtension, offlineOnly, installAssets, unresolvedFeatures);
          if (!offlineOnly && !unresolvedFeatures.isEmpty()) {
              log(Level.FINEST, "getFeatureLicense() determined unresolved features: " + unresolvedFeatures.toString() + " from " + fromDir.getAbsolutePath());
              licenses = getFeatureLicense(unresolvedFeatures, locale, null, null);
          }
          if (installAssets.isEmpty()) {
              return licenses;
          }
          getResolveDirector().resolveAutoFeatures(autoFeatures, installAssets);
          Map<String, InstallLicenseImpl> licenseIds = new HashMap<String, InstallLicenseImpl>();
          for (InstallAsset installAsset : installAssets) {
              if (installAsset.isFeature()) {
                  ESAAsset esa = (ESAAsset) installAsset;
                  if (esa.isPublic()) {
                      ExeInstallAction.incrementNumOfLocalFeatures();
                  }
                  LicenseProvider lp = esa.getLicenseProvider(locale);
                  String licenseId = esa.getLicenseId();
                  if (licenseId != null && !licenseId.isEmpty()) {
                      InstallLicenseImpl ili = licenseIds.get(licenseId);
                      if (ili == null) {
                          ili = new InstallLicenseImpl(licenseId, null, lp);
                          licenseIds.put(licenseId, ili);
                      }
                      ili.addFeature(esa.getProvideFeature());
                  }
              }
          }
          licenses.addAll(licenseIds.values());
          return licenses;
      }