code: public List<EsaResource> queryFeatures(String searchStr) throws InstallException {
          List<EsaResource> features = new ArrayList<EsaResource>();
          RepositoryConnectionList loginInfo = getResolveDirector().getRepositoryConnectionList(null, null, null, this.getClass().getCanonicalName() + ".queryFeatures");
          try {
              for (ProductInfo productInfo : ProductInfo.getAllProductInfo().values()) {
                  log(Level.FINE, Messages.INSTALL_KERNEL_MESSAGES.getLogMessage("MSG_SEARCHING_FEATURES"));
                  features.addAll(loginInfo.findMatchingEsas(searchStr, new ProductInfoProductDefinition(productInfo), Visibility.PUBLIC));
                  log(Level.FINE, Messages.INSTALL_KERNEL_MESSAGES.getLogMessage("MSG_SEARCHING_ADDONS"));
                  features.addAll(loginInfo.findMatchingEsas(searchStr, new ProductInfoProductDefinition(productInfo), Visibility.INSTALL));
              }
              log(Level.FINE, " ");
          } catch (ProductInfoParseException pipe) {
              throw ExceptionUtils.create(pipe);
          } catch (DuplicateProductInfoException dpie) {
              throw ExceptionUtils.create(dpie);
          } catch (ProductInfoReplaceException pire) {
              throw ExceptionUtils.create(pire);
          } catch (RepositoryException re) {
              throw ExceptionUtils.create(re, re.getCause(), getResolveDirector().getProxy(), getResolveDirector().defaultRepo());
          }
          return features;
      }
docs: Searches for features that match the specified search string
  
  @param searchStr the search string
  @return List of EsaResources matching the search string
  @throws InstallException