in atomos/src/main/java/org/apache/felix/atomos/impl/modules/AtomosModules.java [214:269]
ModuleLayer findModuleLayer(Configuration config, List<AtomosLayer> parents,
LoaderType loaderType)
{
if (config == null)
{
return null;
}
if (config.equals(thisConfig))
{
return thisModule.getLayer();
}
if (Configuration.empty().equals(config))
{
return ModuleLayer.empty();
}
List<ModuleLayer> parentLayers = parents.stream().sequential().map(
(a) -> a.adapt(ModuleLayer.class).get()).collect(Collectors.toList());
ModuleLayer.Controller controller;
switch (loaderType)
{
case SINGLE:
return ModuleLayer.defineModulesWithOneLoader(config, parentLayers,
null).layer();
case OSGI:
ConcurrentHashMap<String, ModuleConnectLoader> classLoaders = new ConcurrentHashMap<>();
Function<String, ClassLoader> clf = (moduleName) -> {
ResolvedModule m = config.findModule(moduleName).orElse(null);
if (m == null || m.configuration() != config)
{
return null;
}
return classLoaders.computeIfAbsent(moduleName, (mn) -> {
try
{
return new ModuleConnectLoader(m, this);
}
catch (IOException e)
{
throw new UncheckedIOException(e);
}
});
};
controller = ModuleLayer.defineModules(config, parentLayers, clf);
controller.layer().modules().forEach((m) -> {
ModuleConnectLoader loader = (ModuleConnectLoader) m.getClassLoader();
loader.initEdges(m, config, classLoaders);
});
return controller.layer();
case MANY:
return ModuleLayer.defineModulesWithManyLoaders(config, parentLayers,
null).layer();
default:
throw new UnsupportedOperationException(loaderType.toString());
}
}