public class Module { public DelegateLoader resolveWildcard(...)
{
WildcardDelegateLoader result = new WilcardDelegateLoader(...);
return result.resolve(...); // HERE ??
}
}
I don't understand the idea behind resolve().
I thought we would simply create a single WildcardDelegateLoader for the whole wildcard requirement,
which would then get hit for every not-yet-resolved class/resource lookup.
Resulting in creating new DelegateLoader, and adding that to existing delegates -- before our wildcard "creator".
e.g.
class WildcardDelegateLoader extends FilteredDelegateLoader
{
...
protected DelegateLoader resolve(String pckg)
{
Requirement requirement = new PackageRequirement(pckg, range);
WildcardRequirementDependencyItem item = new WildcardRequirementDependencyItem(module, requirement, module.getClassLoaderState());
if (item.resolve(controller))
{
List<RequirementDependencyItem> items = module.getDependencies(); // should not be null, as this delegate was created from a requirement
items.add(item);
module.addIDependOn(item);
Module resolvedModule = item.getResolvedModule();
if (resolvedModule instanceof ClassLoaderPolicyModule)
{
ClassLoaderPolicyModule clpm = (ClassLoaderPolicyModule) resolvedModule;
DelegateLoader loader = clpm.getDelegateLoader(module, requirement);
item.setLoader(loader);
ClassLoaderPolicy policy = getPolicy();
// TODO -- add new loader to policy's delegate
// pseudo-code -- ???
List<DelegateLoader> delegates = policy.getDelegates();
delegates.add(0, loader); // make sure it's before this wildcard delegate
}
}
return null;
}
@Override
protected Class<?> doLoadClass(String className)
{
DelegateLoader loader = resolve(ClassLoaderUtils.getClassPackageName(className));
return loader != null ? loader.loadClass(className) : null;
}
And I have no idea how to hack around this dynamic loader to policy's delegates addition.
Or I completely misunderstood your impl? :-)