[wildfly-dev] JBoss Modules - "advanced" PathFilter for ResourceLoaderSpec?

Jaikiran Pai jai.forums2013 at gmail.com
Thu Dec 8 06:59:04 EST 2016


(Using this list since I couldn't find a place to ask JBoss Modules 
question anywhere else, feel free to direct me there if there's one)

Hello everyone :)

I have been using JBoss Modules for one of the projects I'm involved in. 
The usage there is pretty much similar to how we use it for setting up 
classloaders in WildFly server for deployments. A new module M1 gets 
dynamically created and assigned to a component and this module is added 
with dependencies to some pre-defined static modules A, B, C and such.  
M1 also gets N number of resource roots (backed by ResourceLoaderSpec), 
each pointing to a jar file within some well known directory. So to put 
in some sort of a code, it looks like:

// add each jar as a resource root for the module
for (final File jar : jars) {
     final ResourceLoader jarResourceLoader;
     try {
         jarResourceLoader = 
ResourceLoaders.createJarResourceLoader(jar.getName(), new JarFile(jar));
     } catch (IOException e) {
         // log and continue
         logger.warn("....", e);
         continue;
     }
moduleSpecBuilder.addResourceRoot(ResourceLoaderSpec.createResourceLoaderSpec(jarResourceLoader));
}



All works fine without any issues and the module M1 has access to the 
resources in these jars. Now there are times where the components for 
which I've created this module M1 and attach these jars, "accidentally" 
ship/package jars which have resources (classes to be precise) which are 
also exposed/present in one of the dependency modules (remember A, B, 
C...). So this then leads to the same old thing where I have go back and 
tell my users not to package such jars.

I want to try and make this a bit more robust and get away with having 
to tell users not to package xyz jars. I had a look at the 
ResourceLoaderSpec interface and it takes a PathFilter 
https://github.com/jboss-modules/jboss-modules/blob/1.x/src/main/java/org/jboss/modules/ResourceLoaderSpec.java#L48 
which gets me one step closer to what I want to achieve. So if I know 
that static module A, B, C etc... expose classes belonging to package 
foo.bar.blah, I can setup a PathFilter on these jar resource loader to 
skip/decline the path in the accept() method. I think that should work 
out fine (I need to test it out tonight) and I wouldn't have to worry 
that some jar packaged within that component will introduce these 
classes belonging to the foo.bar.blah package.

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?


-Jaikiran
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/wildfly-dev/attachments/20161208/3d763a58/attachment.html 


More information about the wildfly-dev mailing list