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 ArtifactClassLoaderFilter createArtifactClassLoaderFilter(ClassLoaderModel classLoaderModel, ClassLoaderLookupPolicy classLoaderLookupPolicy) { Set<String> artifactExportedPackages = sanitizeExportedPackages(classLoaderLookupPolicy, classLoaderModel.getExportedPackages()); return new DefaultArtifactClassLoaderFilter(artifactExportedPackages, classLoaderModel.getExportedResources()); }
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; }
@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")); } }
@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())); } }
@Test @Description("Heavyweight packaged apps will deploy ok with shared libraries information in classloader-model.json") public void sharedLibrariesAreReadFromModel() throws Exception { URL patchedAppUrl = getClass().getClassLoader().getResource(Paths.get(APPS_FOLDER, "shared-libraries-in-model").toString()); ClassLoaderModel classLoaderModel = buildClassLoaderModel(toFile(patchedAppUrl)); assertThat(classLoaderModel.getExportedResources(), is(not(empty()))); }
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; }
@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 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 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())); } }
@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 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")); }