Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-16127

Revisit PackageScanResourceResolver

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Resolved
    • Minor
    • Resolution: Fixed
    • None
    • 3.8.0
    • camel-core, camel-core-api
    • None
    • Unknown

    Description

      The PackageScanResourceResolver has two methods to resolve resources:

      Set<InputStream> findResources(String location) throws Exception;
      Set<String> findResourceNames(String location) throws Exception;
      

      The default implementation provided by DefaultPackageScanResourceResolver is:

      @Override
      public Set<String> findResourceNames(String location) throws Exception {
          Set<KeyValueHolder<String, InputStream>> answer = new LinkedHashSet<>();
          doFindResources(location, answer);
          return answer.stream().map(KeyValueHolder::getKey).collect(Collectors.toSet());
      }
      @Override
      public Set<InputStream> findResources(String location) throws Exception {
          Set<KeyValueHolder<String, InputStream>> answer = new LinkedHashSet<>();
          doFindResources(location, answer);
          return answer.stream().map(KeyValueHolder::getValue).collect(Collectors.toSet());
      }
      

      There are two issues here:
      1. findResourceNames leaks resources as the InpuStreams found by doFindResources are never closed.
      2. is is not possible to correlate an InputStream with the related resource name which would be useful for CAMEL-15560

      I'd propose to refactor this interface to something like:

      Map<String, ThrowingSupplier<InputStream>> findResources();
      
      default Collection<String> findResourceNames()  throws Exception {
          return findResources().keySet():
      }
      
      default Collection<InputStream> findResourceStreams() throws Exception {
          Collection<ThrowingSupplier<InputStream>> values = findResources().values();
          List<InputStream> answer = new ArrayList(values.size());
          for (ThrowingSupplier<InputStream> supplier : values) {
              streams.add(supplier.get());
          }
      
          return answer;
      }
      

      Attachments

        Issue Links

          Activity

            People

              lb Luca Burgazzoli
              lb Luca Burgazzoli
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: