@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())); } }
/** * Creates a {@link ClassLoaderModel} with the current configuration. * @return a non null {@link ClassLoaderModel} */ public ClassLoaderModel build() { return new ClassLoaderModel(urls.toArray(new URL[0]), packages, resources, dependencies, privilegedExportedPackages, privilegedArtifacts, includeTestDependencies); } }
private ClassLoaderModelBuilder createBuilderWithoutExportedPackages(ClassLoaderModel originalClassLoaderModel) { ClassLoaderModelBuilder classLoaderModelBuilder = new ClassLoaderModelBuilder() .dependingOn(originalClassLoaderModel.getDependencies()) .exportingPrivilegedPackages(originalClassLoaderModel.getPrivilegedExportedPackages(), originalClassLoaderModel.getPrivilegedArtifacts()) .exportingResources(originalClassLoaderModel.getExportedResources()); for (URL url : originalClassLoaderModel.getUrls()) { classLoaderModelBuilder.containing(url); } return classLoaderModelBuilder; }
private ArtifactClassLoaderFilter createArtifactClassLoaderFilter(ClassLoaderModel classLoaderModel, ClassLoaderLookupPolicy classLoaderLookupPolicy) { Set<String> artifactExportedPackages = sanitizeExportedPackages(classLoaderLookupPolicy, classLoaderModel.getExportedPackages()); return new DefaultArtifactClassLoaderFilter(artifactExportedPackages, classLoaderModel.getExportedResources()); }
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; }
@Test public void classLoaderModelWithPluginDependency() throws Exception { D desc = createArtifactDescriptor(getArtifactRootFolder() + "/plugin-dependency"); ClassLoaderModel classLoaderModel = desc.getClassLoaderModel(); assertThat(classLoaderModel.getDependencies().size(), is(1)); assertThat(classLoaderModel.getDependencies(), hasItem(testEmptyPluginDependencyMatcher())); assertThat(classLoaderModel.getUrls().length, is(1)); assertThat(asList(classLoaderModel.getUrls()), not(hasItem(classLoaderModel.getDependencies().iterator().next()))); }
protected void listLibraries(ApplicationDescriptor descriptor) { // Excludes the application URL URL[] urls = descriptor.getClassLoaderModel().getUrls(); urls = Arrays.copyOfRange(urls, 1, urls.length); listItems(stream(urls).map(url -> toFile(url).getName()).collect(toList()), "Application libraries:"); } }
private List<ArtifactPluginDescriptor> getPluginDescriptors(ArtifactPluginDescriptor descriptor, List<ArtifactPluginDescriptor> artifactPluginDescriptors) { return artifactPluginDescriptors.stream() .filter(d -> isDependencyPlugin(descriptor.getClassLoaderModel().getDependencies(), d)).collect(toList()); }
@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")); }
@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())); }
@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); } }
for (String exportedPackage : dependencyPluginDescriptor.getClassLoaderModel().getExportedPackages()) { pluginsLookupPolicies.put(exportedPackage, lookupStrategy); for (String exportedPackage : dependencyPluginDescriptor.getClassLoaderModel().getPrivilegedExportedPackages()) { pluginsLookupPolicies.put(exportedPackage, lookupStrategy);
@Test public void sanitizesExportedResources() { Set<String> exportedResources = new HashSet<>(); exportedResources.add("META-INF\\schemas\\schema.xml"); exportedResources.add("META-INF\\README.txt"); ClassLoaderModel classLoaderModel = new ClassLoaderModel.ClassLoaderModelBuilder().exportingResources(exportedResources).build(); assertThat(classLoaderModel.getExportedResources(), containsInAnyOrder("META-INF/schemas/schema.xml", "META-INF/README.txt")); } }
private boolean isPrivilegedPluginDependency(ArtifactPluginDescriptor descriptor, ArtifactPluginDescriptor dependencyPluginDescriptor) { if (dependencyPluginDescriptor.getClassLoaderModel().getPrivilegedExportedPackages().isEmpty()) { return false; } return dependencyPluginDescriptor.getClassLoaderModel().getPrivilegedArtifacts().stream().filter( a -> a.startsWith(descriptor .getBundleDescriptor() .getGroupId() + ":" + descriptor .getBundleDescriptor() .getArtifactId())) .findFirst().isPresent(); }
@Test public void classLoaderModelWithPluginDependencyWithAnotherPlugin() throws Exception { D desc = createArtifactDescriptor(getArtifactRootFolder() + "/plugin-dependency-with-another-plugin"); ClassLoaderModel classLoaderModel = desc.getClassLoaderModel(); assertThat(classLoaderModel.getDependencies().size(), is(2)); assertThat(classLoaderModel.getDependencies(), hasItems(dependantPluginDependencyMatcher(), emptyPluginDependencyMatcher())); assertThat(classLoaderModel.getUrls().length, is(1)); classLoaderModel.getDependencies().stream() .forEach(bundleDependency -> { assertThat(asList(classLoaderModel.getUrls()), not(hasItem(bundleDependency.getBundleUri()))); }); }
/** * @inherited */ @Override public ArtifactClassLoader create(String artifactId, ServiceDescriptor descriptor, ClassLoader parent, ClassLoaderLookupPolicy lookupPolicy) { return new MuleArtifactClassLoader(artifactId, descriptor, descriptor.getClassLoaderModel().getUrls(), parent, lookupPolicy); } }
private boolean isResolvedPlugin(ArtifactPluginDescriptor descriptor, List<ArtifactPluginDescriptor> resolvedPlugins) { boolean isResolved = descriptor.getClassLoaderModel().getDependencies().isEmpty(); if (!isResolved && hasPluginDependenciesResolved(descriptor.getClassLoaderModel().getDependencies(), resolvedPlugins)) { isResolved = true; } return isResolved; }
@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())); assertThat(toFile(desc.getClassLoaderModel().getUrls()[1]).getPath(), endsWith(getArtifactRootFolder() + "test/repository/org/mule/test/shared/1.0.0/shared-1.0.0.jar")); assertThat(desc.getClassLoaderModel().getExportedPackages(), contains("org.foo")); assertThat(desc.getClassLoaderModel().getExportedResources(), containsInAnyOrder("META-INF/MANIFEST.MF", "README.txt")); }
@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")); }
@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); } }