You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Luca Burgazzoli (Jira)" <ji...@apache.org> on 2021/02/01 17:09:00 UTC

[jira] [Created] (CAMEL-16127) Revisit PackageScanResourceResolver

Luca Burgazzoli created CAMEL-16127:
---------------------------------------

             Summary: Revisit PackageScanResourceResolver
                 Key: CAMEL-16127
                 URL: https://issues.apache.org/jira/browse/CAMEL-16127
             Project: Camel
          Issue Type: Improvement
          Components: camel-core, camel-core-api
            Reporter: Luca Burgazzoli
             Fix For: 3.9.0


The PackageScanResourceResolver has two methods to resolve resources:

{code:java}
Set<InputStream> findResources(String location) throws Exception;
Set<String> findResourceNames(String location) throws Exception;
{code}

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());
}
{code}

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

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

{code:java}
Map<String, ThrowingSupplier<InputStream>> findResources();

default Collection<String> findResourceNames()  throws Exception {
    return findResources().keySet():
}

default Collection<InputStream> findResourceStreams() throws Exception {
    List<InputStream> streams = new ArrayList();
    for (ThrowingSupplier<InputStream> supplier : findResources().values()) {
        streams.add(supplier.get());
    }

    return streams;
}
{code}




--
This message was sent by Atlassian Jira
(v8.3.4#803005)