code: public Set<String> queryFeatureNames() {
          Set<String> result = null;
          try {
              //if you change the 'null' arg, don't forget to implement the exception handler block!
              ServiceReference<?>[] refs = this.systemBundleCtx.getAllServiceReferences(ServerFeatures.class.getName(), null);
              if (refs != null && refs.length > 0) {
                  result = new HashSet<String>();
                  //if we somehow had more than one eligible service, we will use them all.
                  //result will then be the aggregate of all data.
                  for (ServiceReference<?> sr : refs) {
                      ServerFeatures sf = (ServerFeatures) this.systemBundleCtx.getService(sr);
                      String infos[] = sf.getServerFeatureNames();
                      for (String info : infos) {
                          result.add(info);
                      }
                  }
              }
          } catch (InvalidSyntaxException e) {
              //tough for the filter 'null' to be invalid..
          }
  
          //sort the list alpha.. just makes it neater to debug missing files..
          ArrayList<String> sorted = new ArrayList<String>();
          if (result != null)
              sorted.addAll(result);
          Collections.sort(sorted);
          result = new LinkedHashSet<String>(); //linked set will preserve order
  
          //maybe addAll will work here, it's not clear, the intent is to preserve the sorted order.
          for (String s : sorted) {
              result.add(s);
          }
          return result;
      }
docs: Query feature information
  
  @param osRequest contains any os filtering request information.
  @return A set containing the absolute paths for all files comprising the currently configured features