@Override public List<MuleModule> getModules() { return moduleRepository.getModules(); } }
/** * Creates the classLoader to represent the Mule container. * * @param parentClassLoader parent classLoader. Can be null. * @return a non null {@link ArtifactClassLoader} containing container code that can be used as parent classloader for other * mule artifacts. */ public ArtifactClassLoader createContainerClassLoader(final ClassLoader parentClassLoader) { final List<MuleModule> muleModules = moduleRepository.getModules(); final ClassLoaderLookupPolicy containerLookupPolicy = getContainerClassLoaderLookupPolicy(parentClassLoader, muleModules); return createArtifactClassLoader(parentClassLoader, muleModules, containerLookupPolicy, new ArtifactDescriptor("mule")); }
private ClassLoaderLookupPolicy extendLookupPolicyForPrivilegedAccess(ClassLoaderLookupPolicy childClassLoaderLookupPolicy, ModuleRepository moduleRepository, TestContainerClassLoaderFactory testContainerClassLoaderFactory, PluginUrlClassification pluginUrlClassification) { ContainerOnlyLookupStrategy containerOnlyLookupStrategy = new ContainerOnlyLookupStrategy(testContainerClassLoaderFactory.getContainerClassLoader().getClassLoader()); Map<String, LookupStrategy> privilegedLookupStrategies = new HashMap<>(); for (MuleModule module : moduleRepository.getModules()) { if (hasPrivilegedApiAccess(pluginUrlClassification, module)) { for (String packageName : module.getPrivilegedExportedPackages()) { privilegedLookupStrategies.put(packageName, containerOnlyLookupStrategy); } } } if (privilegedLookupStrategies.isEmpty()) { return childClassLoaderLookupPolicy; } else { return childClassLoaderLookupPolicy.extend(privilegedLookupStrategies); } }
@Test public void createsPluginWithPrivilegedContainerAccess() throws Exception { MuleModule privilegedModule = mock(MuleModule.class); when(privilegedModule.getPrivilegedArtifacts()).thenReturn(singleton(PLUGIN_ARTIFACT_ID1)); when(privilegedModule.getPrivilegedExportedPackages()).thenReturn(singleton(PRIVILEGED_PACKAGE)); when(moduleRepository.getModules()).thenReturn(singletonList(privilegedModule)); List<ArtifactPluginDescriptor> artifactPluginDescriptors = singletonList(plugin1Descriptor); ArgumentCaptor<Map> mapArgumentCaptor = forClass(Map.class); when(regionOwnerLookupPolicy.extend(mapArgumentCaptor.capture())).thenReturn(pluginLookupPolicy); List<ArtifactClassLoader> pluginClassLoaders = factory.createPluginClassLoaders(regionClassLoader, artifactPluginDescriptors, regionOwnerLookupPolicy); assertThat(pluginClassLoaders, contains(pluginClassLoader1)); Map<String, LookupStrategy> value = mapArgumentCaptor.getValue(); assertThat(value, hasEntry(equalTo(PRIVILEGED_PACKAGE), instanceOf(ContainerOnlyLookupStrategy.class))); }
private ContainerClassLoaderFactory createClassLoaderExportingBootstrapProperties() { final ModuleRepository moduleRepository = mock(ModuleRepository.class); final ContainerClassLoaderFactory factory = new ContainerClassLoaderFactory(moduleRepository); final List<MuleModule> modules = new ArrayList<>(); modules.add(new TestModuleBuilder("module1").exportingResources(BOOTSTRAP_PROPERTIES).build()); when(moduleRepository.getModules()).thenReturn(modules); return factory; } }
for (MuleModule module : moduleRepository.getModules()) { if (module.getPrivilegedArtifacts() .contains(descriptor.getBundleDescriptor().getGroupId() + ":" + descriptor.getBundleDescriptor().getArtifactId())) {
@Test public void createsClassLoaderLookupPolicy() { final ModuleRepository moduleRepository = mock(ModuleRepository.class); final ContainerClassLoaderFactory factory = new ContainerClassLoaderFactory(moduleRepository); final List<MuleModule> modules = new ArrayList<>(); modules.add(new TestModuleBuilder("module1").exportingPackages("org.foo1", "org.foo1.bar").build()); modules.add(new TestModuleBuilder("module2").exportingPackages("org.foo2").build()); when(moduleRepository.getModules()).thenReturn(modules); final ArtifactClassLoader containerClassLoader = factory.createContainerClassLoader(this.getClass().getClassLoader()); final ClassLoaderLookupPolicy classLoaderLookupPolicy = containerClassLoader.getClassLoaderLookupPolicy(); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.foo1.Foo"), instanceOf(ContainerOnlyLookupStrategy.class)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.foo1.bar.Bar"), instanceOf(ContainerOnlyLookupStrategy.class)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.foo2.Fo"), instanceOf(ContainerOnlyLookupStrategy.class)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.foo2.bar.Bar"), sameInstance(CHILD_FIRST)); }
@Test public void considersJreExtensions() { final ModuleRepository moduleRepository = mock(ModuleRepository.class); final ContainerClassLoaderFactory factory = new ContainerClassLoaderFactory(moduleRepository); final List<MuleModule> modules = new ArrayList<>(); modules.add(new TestModuleBuilder("jre1") .exportingPackages("org.w3c.dom.test", "javax.test", "java.applet", "org.w3c.dom", "org.omg.test").build()); modules.add(new TestModuleBuilder("jre2") .exportingPackages("org.ietf.jgss", "org.ietf.jgss.test", "org.xml.sax", "org.xml.sax.test").build()); when(moduleRepository.getModules()).thenReturn(modules); final ArtifactClassLoader containerClassLoader = factory.createContainerClassLoader(this.getClass().getClassLoader()); final ClassLoaderLookupPolicy classLoaderLookupPolicy = containerClassLoader.getClassLoaderLookupPolicy(); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.w3c.dom.Foo"), sameInstance(PARENT_FIRST)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.w3c.dom.test.Foo"), sameInstance(PARENT_FIRST)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("javax.test.Bar"), sameInstance(PARENT_FIRST)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.omg.test.Bar"), sameInstance(PARENT_FIRST)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.ietf.jgss.Bar"), sameInstance(PARENT_FIRST)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.ietf.jgss.test.Bar"), sameInstance(PARENT_FIRST)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.xml.sax.Foo"), sameInstance(PARENT_FIRST)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.xml.sax.test.Bar"), sameInstance(PARENT_FIRST)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("java.applet.Applet"), instanceOf(ContainerOnlyLookupStrategy.class)); assertThat(classLoaderLookupPolicy.getClassLookupStrategy("org.foo2.bar.Bar"), sameInstance(CHILD_FIRST)); }
private ClassLoaderLookupPolicy extendLookupPolicyForPrivilegedAccess(ClassLoaderLookupPolicy childClassLoaderLookupPolicy, ModuleRepository moduleRepository, TestContainerClassLoaderFactory testContainerClassLoaderFactory, PluginUrlClassification pluginUrlClassification) { ContainerOnlyLookupStrategy containerOnlyLookupStrategy = new ContainerOnlyLookupStrategy(testContainerClassLoaderFactory.getContainerClassLoader().getClassLoader()); Map<String, LookupStrategy> privilegedLookupStrategies = new HashMap<>(); for (MuleModule module : moduleRepository.getModules()) { if (hasPrivilegedApiAccess(pluginUrlClassification, module)) { for (String packageName : module.getPrivilegedExportedPackages()) { privilegedLookupStrategies.put(packageName, containerOnlyLookupStrategy); } } } if (privilegedLookupStrategies.isEmpty()) { return childClassLoaderLookupPolicy; } else { return childClassLoaderLookupPolicy.extend(privilegedLookupStrategies); } }
@Test public void createsPluginWithPrivilegedContainerAccess() throws Exception { MuleModule privilegedModule = mock(MuleModule.class); when(privilegedModule.getPrivilegedArtifacts()).thenReturn(singleton(PLUGIN_ARTIFACT_ID1)); when(privilegedModule.getPrivilegedExportedPackages()).thenReturn(singleton(PRIVILEGED_PACKAGE)); when(moduleRepository.getModules()).thenReturn(singletonList(privilegedModule)); List<ArtifactPluginDescriptor> artifactPluginDescriptors = singletonList(plugin1Descriptor); ArgumentCaptor<Map> mapArgumentCaptor = forClass(Map.class); when(regionOwnerLookupPolicy.extend(mapArgumentCaptor.capture())).thenReturn(pluginLookupPolicy); List<ArtifactClassLoader> pluginClassLoaders = factory.createPluginClassLoaders(regionClassLoader, artifactPluginDescriptors, regionOwnerLookupPolicy); assertThat(pluginClassLoaders, contains(pluginClassLoader1)); Map<String, LookupStrategy> value = mapArgumentCaptor.getValue(); assertThat(value, hasEntry(equalTo(PRIVILEGED_PACKAGE), instanceOf(ContainerOnlyLookupStrategy.class))); }