[wildfly-dev] JBoss Modules - "advanced" PathFilter for ResourceLoaderSpec?
David M. Lloyd
david.lloyd at redhat.com
Thu Dec 8 09:58:56 EST 2016
On 12/08/2016 08:41 AM, Jaikiran Pai wrote:
> Hi David,
>
> On Thursday 08 December 2016 07:29 PM, David M. Lloyd wrote:
>> Hi Jaikiran!
>>
>> On 12/08/2016 05:59 AM, Jaikiran Pai wrote:
>>> However, although it might work, I then have to keep a very close vigil
>>> or rather keep inspecting what packages (or resources in general) the
>>> modules A, B and C provide. Instead what I'm thinking of is a "smart"
>>> PathFilter or anything along those lines whose semantics would be to
>>> "skip/don't accept/filter out all those resources, from a resource root,
>>> if the resource is provided by any of the specified modules". So
>>> something like:
>>>
>>> ResourceLoaderSpec.createResourceLoaderSpec(jarResourceLoader,
>>> *PathFilters.excludeResourcesExposedByModules("A**:slot", "B:slot",
>>> "C:slot" ...)*);
>>>
>>>
>>> Having looked at the JBoss Modules code, I don't think this is possible
>>> currently. But that's OK. What I really want to check is, is this
>>> something that would be feasible to implement (doesn't have to be in
>>> JBoss Modules itself) and is there any obvious issues with the approach?
>>> Also, is this something that would be useful to have in JBoss Modules
>>> itself?
>> A smart filter is a pretty good idea! I think that it might make more
>> sense as part of a dependency specification though,
>
> Agreed, having it on the dependency spec makes more sense and puts it in
> the right context.
>
>
>> from a user's
>> perspective: if I say "I depend on module org.foo.bar:main" I should
>> also be able to say "...and use their packages" which would exclude all
>> paths in the source module's resource roots (other than META-INF and the
>> root path).
>
> When you say "would exclude all paths in the source module's resource
> roots...", you mean precedence will be given to the paths of the
> dependency module, right? Not literally exclude all paths of the
> source's resource roots? That way if (one or more) resource roots of the
> source module has a path "hello/world" which isn't part of the
> dependency module's paths, then it will get "accepted" and be available
> to the source module. Did I understand this right or did you intend to
> literally mean excluding all paths of the source module's resource roots?
I mean literally excluding. Dependency-first (aka "parent-first")
loading is fundamentally flawed in any non-tree graph. To boil it down
to the degenerate case, if I have two modules A and B which have a
mutual interdependency and a common resource or class, using
parent-first loading, A gets B's resource, while B gets A's resource,
which is just plain weird.
Using local-first (aka "child-first") loading (as we do) and excluding
local resource paths that are found in dependencies, A always gets A's
resource, and B always gets B's resource. If you want both, then you
simply don't override, and A gets A's and then B's, and B gets B's and
then A's.
Does that make sense?
>> In fact, maybe that ought to be the default setting, with the user
>> having to opt in to override packages. So a user might say:
>>
>> <dependencies>
>> ...
>> <module name="org.foo.bar">
>> <override-paths/> <!-- now my paths take precedence -->
>> </module>
>> ...
>> </dependencies>
>
> Yes, this looks logical.
>
>> In the programmatic API it'd be fairly straightforward as well. We
>> could add an overridePaths path filter to the dependency specification
>> (which ought to be builder-based at this point, I now realize, what with
>> the parameter explosion). Any dependency paths that are not matched by
>> that filter would be subtracted from all resource roots.
>
> Yes, this matches with my expectation.
Great! I'll open up a JIRA for this enhancement.
--
- DML
More information about the wildfly-dev
mailing list