@Override protected ClassLoaderLookupPolicy getParentLookupPolicy(ArtifactClassLoader parentClassLoader) { Map<String, LookupStrategy> lookupStrategies = new HashMap<>(); DomainDescriptor descriptor = parentClassLoader.getArtifactDescriptor(); descriptor.getClassLoaderModel().getExportedPackages().forEach(p -> lookupStrategies.put(p, PARENT_FIRST)); for (ArtifactPluginDescriptor artifactPluginDescriptor : descriptor.getPlugins()) { artifactPluginDescriptor.getClassLoaderModel().getExportedPackages() .forEach(p -> lookupStrategies.put(p, PARENT_FIRST)); } return parentClassLoader.getClassLoaderLookupPolicy().extend(lookupStrategies); } }
private ClassLoaderLookupPolicy getApplicationClassLoaderLookupPolicy(ArtifactClassLoader parent, DomainDescriptor descriptor) { final Map<String, LookupStrategy> pluginsLookupStrategies = new HashMap<>(); for (ArtifactPluginDescriptor artifactPluginDescriptor : descriptor.getPlugins()) { artifactPluginDescriptor.getClassLoaderModel().getExportedPackages() .forEach(p -> pluginsLookupStrategies.put(p, PARENT_FIRST)); } return parent.getClassLoaderLookupPolicy().extend(pluginsLookupStrategies); }
private ClassLoaderLookupPolicy getApplicationClassLoaderLookupPolicy(ArtifactClassLoader parent, ApplicationDescriptor descriptor) { final Map<String, LookupStrategy> pluginsLookupStrategies = new HashMap<>(); for (ArtifactPluginDescriptor artifactPluginDescriptor : descriptor.getPlugins()) { artifactPluginDescriptor.getClassLoaderModel().getExportedPackages() .forEach(p -> pluginsLookupStrategies.put(p, PARENT_FIRST)); } return parent.getClassLoaderLookupPolicy().extend(pluginsLookupStrategies); }
private void verifyPluginExportedPackages(List<ArtifactPluginDescriptor> plugins) { final Map<String, List<String>> exportedPackages = new HashMap<>(); boolean error = false; for (ArtifactPluginDescriptor plugin : plugins) { for (String packageName : plugin.getClassLoaderModel().getExportedPackages()) { List<String> exportedOn = exportedPackages.get(packageName); if (exportedOn == null) { exportedOn = new LinkedList<>(); exportedPackages.put(packageName, exportedOn); } else { error = true; } exportedOn.add(plugin.getName()); } } if (error) { throw new DuplicateExportedPackageException(exportedPackages); } }
@Override protected ClassLoaderLookupPolicy getParentLookupPolicy(ArtifactClassLoader parentClassLoader) { if (!usesCustomDomain) { return super.getParentLookupPolicy(parentClassLoader); } Map<String, LookupStrategy> lookupStrategies = new HashMap<>(); DomainDescriptor descriptor = parentClassLoader.getArtifactDescriptor(); descriptor.getClassLoaderModel().getExportedPackages().forEach(p -> lookupStrategies.put(p, PARENT_FIRST)); for (ArtifactPluginDescriptor artifactPluginDescriptor : descriptor.getPlugins()) { artifactPluginDescriptor.getClassLoaderModel().getExportedPackages() .forEach(p -> lookupStrategies.put(p, PARENT_FIRST)); } return parentClassLoader.getClassLoaderLookupPolicy().extend(lookupStrategies); }
private ArtifactClassLoaderFilter createPluginClassLoaderFilter(ArtifactPluginDescriptor pluginDescriptor, Set<String> parentArtifactExportedPackages, ClassLoaderLookupPolicy classLoaderLookupPolicy) { Set<String> sanitizedArtifactExportedPackages = sanitizeExportedPackages(classLoaderLookupPolicy, pluginDescriptor.getClassLoaderModel().getExportedPackages()); Set<String> replacedPackages = parentArtifactExportedPackages.stream().filter(p -> sanitizedArtifactExportedPackages.contains(p)).collect(toSet()); if (!replacedPackages.isEmpty()) { sanitizedArtifactExportedPackages.removeAll(replacedPackages); logger.warn("Exported packages from plugin '" + pluginDescriptor.getName() + "' are provided by the artifact owner: " + replacedPackages); } return new DefaultArtifactClassLoaderFilter(sanitizedArtifactExportedPackages, pluginDescriptor.getClassLoaderModel().getExportedResources()); }
@Override public void setClassLoaderModel(ClassLoaderModel classLoaderModel) { checkArgument(classLoaderModel.getExportedPackages().isEmpty(), POLICY_EXPORTED_PACKAGES_ERROR); checkArgument(classLoaderModel.getExportedResources().isEmpty(), POLICY_EXPORTED_RESOURCE_ERROR); super.setClassLoaderModel(classLoaderModel); } }
private Set<String> findDependencyPackageClosure(Set<BundleDependency> pluginDependencies, List<ArtifactPluginDescriptor> resolvedPlugins) { Set<String> exportedPackages = new HashSet<>(); for (BundleDependency pluginDependency : pluginDependencies) { final Optional<String> classifier = pluginDependency.getDescriptor().getClassifier(); if (classifier.isPresent() && MULE_PLUGIN_CLASSIFIER.equals(classifier.get())) { ArtifactPluginDescriptor dependencyDescriptor = findArtifactPluginDescriptor(pluginDependency, resolvedPlugins); exportedPackages.addAll(dependencyDescriptor.getClassLoaderModel().getExportedPackages()); exportedPackages .addAll(findDependencyPackageClosure(dependencyDescriptor.getClassLoaderModel().getDependencies(), resolvedPlugins)); } } return exportedPackages; }
private ArtifactClassLoaderFilter createArtifactClassLoaderFilter(ClassLoaderModel classLoaderModel, ClassLoaderLookupPolicy classLoaderLookupPolicy) { Set<String> artifactExportedPackages = sanitizeExportedPackages(classLoaderLookupPolicy, classLoaderModel.getExportedPackages()); return new DefaultArtifactClassLoaderFilter(artifactExportedPackages, classLoaderModel.getExportedResources()); }
private void assertPluginExportedPackages(ArtifactPluginDescriptor pluginDescriptor, String... exportedPackages) { assertThat(pluginDescriptor.getClassLoaderModel().getExportedPackages().size(), equalTo(exportedPackages.length)); assertThat(pluginDescriptor.getClassLoaderModel().getExportedPackages(), containsInAnyOrder(exportedPackages)); }
private ClassLoaderModelBuilder createBuilderWithoutDependency(ClassLoaderModel originalClassLoaderModel, BundleDependency dependencyToBeExcluded) { ClassLoaderModelBuilder classLoaderModelBuilder = new ClassLoaderModelBuilder() .dependingOn(originalClassLoaderModel.getDependencies().stream() .filter(dependency -> !dependency.equals(dependencyToBeExcluded)) .collect(toSet())) .exportingPackages(originalClassLoaderModel.getExportedPackages()) .exportingPrivilegedPackages(originalClassLoaderModel.getPrivilegedExportedPackages(), originalClassLoaderModel.getPrivilegedArtifacts()) .exportingResources(originalClassLoaderModel.getExportedResources()); for (URL url : originalClassLoaderModel.getUrls()) { classLoaderModelBuilder.containing(url); } return classLoaderModelBuilder; }
private void sanitizeExportedPackages(ArtifactPluginDescriptor pluginDescriptor, List<ArtifactPluginDescriptor> resolvedPlugins) { final Set<String> packagesExportedByDependencies = findDependencyPackageClosure(pluginDescriptor.getClassLoaderModel().getDependencies(), resolvedPlugins); ClassLoaderModel originalClassLoaderModel = pluginDescriptor.getClassLoaderModel(); final Set<String> exportedClassPackages = new HashSet<>(originalClassLoaderModel.getExportedPackages()); exportedClassPackages.removeAll(packagesExportedByDependencies); pluginDescriptor.setClassLoaderModel(createBuilderWithoutExportedPackages(originalClassLoaderModel) .exportingPackages(exportedClassPackages).build()); }
@Test public void createsClassLoaderModelFromFolder() throws Exception { File policyFolder = temporaryFolder.newFolder(); File libFolder = new File(policyFolder, LIB_DIR); assertThat(libFolder.mkdir(), is(true)); File file1 = new File(libFolder, "test1.jar"); stringToFile(file1.getAbsolutePath(), "foo"); File file2 = new File(libFolder, "test2.jar"); stringToFile(file2.getAbsolutePath(), "foo"); ClassLoaderModel classLoaderModel = classLoaderModelLoader.load(policyFolder, null, POLICY); assertThat(classLoaderModel.getUrls().length, equalTo(3)); assertThat(classLoaderModel.getUrls()[0], equalTo(policyFolder.toURI().toURL())); assertThat(asList(classLoaderModel.getUrls()), allOf(hasItem(file1.toURI().toURL()), hasItem(file2.toURI().toURL()))); assertThat(classLoaderModel.getDependencies(), is(empty())); assertThat(classLoaderModel.getExportedPackages(), is(empty())); assertThat(classLoaderModel.getExportedResources(), is(empty())); } }
for (String exportedPackage : dependencyPluginDescriptor.getClassLoaderModel().getExportedPackages()) { pluginsLookupPolicies.put(exportedPackage, lookupStrategy);
for (ArtifactPluginDescriptor artifactPluginDescriptor : artifactPluginDescriptors) { final ArtifactClassLoaderFilter classLoaderFilter = createPluginClassLoaderFilter(artifactPluginDescriptor, artifactDescriptor.getClassLoaderModel().getExportedPackages(), parentLookupPolicy); regionClassLoader.addClassLoader(artifactPluginClassLoaders.get(artifactPluginIndex), classLoaderFilter);
@Test public void loadsDescriptorFromJson() throws Exception { String artifactPath = getArtifactRootFolder() + "/no-dependencies"; D desc = createArtifactDescriptor(artifactPath); assertThat(desc.getMinMuleVersion(), is(new MuleVersion("4.0.0"))); assertThat(desc.getConfigResources(), hasSize(1)); assertThat(desc.getConfigResources(), hasItem(getDefaultConfigurationResourceLocation())); ClassLoaderModel classLoaderModel = desc.getClassLoaderModel(); assertThat(classLoaderModel.getDependencies().isEmpty(), is(true)); assertThat(classLoaderModel.getUrls().length, is(1)); assertThat(toFile(classLoaderModel.getUrls()[0]).getPath(), is(getArtifact(artifactPath).getAbsolutePath())); assertThat(classLoaderModel.getExportedPackages().isEmpty(), is(true)); assertThat(classLoaderModel.getExportedResources().isEmpty(), is(true)); assertThat(classLoaderModel.getDependencies().isEmpty(), is(true)); }
@Test public void readsRuntimeLibs() throws Exception { DeployableFileBuilder artifactFileBuilder = (DeployableFileBuilder) createArtifactFileBuilder() .dependingOn(new JarFileBuilder("runtime", echoTestJarFile)); unzip(artifactFileBuilder.getArtifactFile(), getArtifactFolder()); D desc = createArtifactDescriptor(); assertThat(desc.getClassLoaderModel().getUrls().length, equalTo(2)); assertThat(toFile(desc.getClassLoaderModel().getUrls()[0]).getPath(), equalTo(getArtifactFolder().toString())); assertThat(desc.getClassLoaderModel().getExportedPackages(), is(empty())); Path expectedPathEnd = get(getArtifactRootFolder(), "test", "repository", "org", "mule", "test", "runtime", "1.0.0", "runtime-1.0.0.jar"); assertThat(toFile(desc.getClassLoaderModel().getUrls()[1]).getPath(), endsWith(expectedPathEnd.toString())); }
@Test public void readsSharedLibs() throws Exception { DeployableFileBuilder artifactFileBuilder = (DeployableFileBuilder) createArtifactFileBuilder() .dependingOnSharedLibrary(new JarFileBuilder("shared", echoTestJarFile)); unzip(artifactFileBuilder.getArtifactFile(), getArtifactFolder()); D desc = createArtifactDescriptor(); assertThat(desc.getClassLoaderModel().getUrls().length, equalTo(2)); assertThat(toFile(desc.getClassLoaderModel().getUrls()[0]).getPath(), equalTo(getArtifactFolder().toString())); Path expectedPathEnd = get(getArtifactRootFolder(), "test", "repository", "org", "mule", "test", "shared", "1.0.0", "shared-1.0.0.jar"); assertThat(toFile(desc.getClassLoaderModel().getUrls()[1]).getPath(), endsWith(expectedPathEnd.toString())); assertThat(desc.getClassLoaderModel().getExportedPackages(), contains("org.foo")); assertThat(desc.getClassLoaderModel().getExportedResources(), containsInAnyOrder("META-INF/MANIFEST.MF", "README.txt")); }
private void assertPluginExportedPackages(ArtifactPluginDescriptor pluginDescriptor, String... exportedPackages) { assertThat(pluginDescriptor.getClassLoaderModel().getExportedPackages().size(), equalTo(exportedPackages.length)); assertThat(pluginDescriptor.getClassLoaderModel().getExportedPackages(), containsInAnyOrder(exportedPackages)); }
@Test public void readsRuntimeLibs() throws Exception { DeployableFileBuilder artifactFileBuilder = (DeployableFileBuilder) createArtifactFileBuilder() .dependingOn(new JarFileBuilder("runtime", echoTestJarFile)); unzip(artifactFileBuilder.getArtifactFile(), getArtifactFolder()); D desc = createArtifactDescriptor(); assertThat(desc.getClassLoaderModel().getUrls().length, equalTo(2)); assertThat(toFile(desc.getClassLoaderModel().getUrls()[0]).getPath(), equalTo(getArtifactFolder().toString())); assertThat(desc.getClassLoaderModel().getExportedPackages(), is(empty())); assertThat(toFile(desc.getClassLoaderModel().getUrls()[1]).getPath(), endsWith(getArtifactRootFolder() + "test/repository/org/mule/test/runtime/1.0.0/runtime-1.0.0.jar")); }