Details
-
Improvement
-
Status: Resolved
-
Minor
-
Resolution: Fixed
-
None
-
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
- links to