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 detectsDuplicateExportedPackagesOnIndependentPlugins() throws Exception { fooPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().exportingPackages(getFooExportedPackages()).build()); barPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().exportingPackages(getBarExportedPackages()).build()); final List<ArtifactPluginDescriptor> pluginDescriptors = createPluginDescriptors(fooPlugin, barPlugin); Map<String, List<String>> pluginsPerPackage = new HashMap<>(); pluginsPerPackage.put("org.foo", asList("bar, foo")); pluginsPerPackage.put("org.foo.mule", asList("bar, foo")); String expectedErrorMessage = new DuplicateExportedPackageException(pluginsPerPackage).getMessage(); this.expectedException.expect(DuplicateExportedPackageException.class); this.expectedException.expectMessage(expectedErrorMessage); dependenciesResolver.resolve(emptySet(), pluginDescriptors, true); }
final ClassLoaderModel.ClassLoaderModelBuilder classLoaderModelBuilder = new ClassLoaderModel.ClassLoaderModelBuilder(); classLoaderModelBuilder .exportingPackages(new HashSet<>(getAttribute(attributes, EXPORTED_PACKAGES))) .exportingPrivilegedPackages(new HashSet<>(getAttribute(attributes, PRIVILEGED_EXPORTED_PACKAGES)), new HashSet<>(getAttribute(attributes, PRIVILEGED_ARTIFACTS_IDS)))
bundleDependencyOptional.map(bundleDependency -> { JarInfo jarInfo = fileJarExplorer.explore(bundleDependency.getBundleUri()); classLoaderModelBuilder.exportingPackages(jarInfo.getPackages()); classLoaderModelBuilder.exportingResources(jarInfo.getResources()); return bundleDependency;
private ClassLoaderModel createHeavyPackageClassLoaderModel(File artifactFile, Map<String, Object> attributes) { File classLoaderModelDescriptor = getClassLoaderModelDescriptor(artifactFile); org.mule.tools.api.classloader.model.ClassLoaderModel packagerClassLoaderModel = deserialize(classLoaderModelDescriptor); File deployableArtifactRepositoryFolder = getDeployableArtifactRepositoryFolder(artifactFile); final ClassLoaderModel.ClassLoaderModelBuilder classLoaderModelBuilder = new ClassLoaderModel.ClassLoaderModelBuilder(); classLoaderModelBuilder .exportingPackages(new HashSet<>(getAttribute(attributes, EXPORTED_PACKAGES))) .exportingPrivilegedPackages(new HashSet<>(getAttribute(attributes, PRIVILEGED_EXPORTED_PACKAGES)), new HashSet<>(getAttribute(attributes, PRIVILEGED_ARTIFACTS_IDS))) .exportingResources(new HashSet<>(getAttribute(attributes, EXPORTED_RESOURCES))); Set<BundleDependency> patchBundleDependencies = getPatchedBundledDependencies(artifactFile, deployableArtifactRepositoryFolder); Set<BundleDependency> bundleDependencies = packagerClassLoaderModel.getDependencies().stream().map(artifact -> { Optional<BundleDependency> patchedBundledDependency = patchBundleDependencies.stream().filter(bundleDependency -> bundleDependency.getDescriptor().getGroupId() .equals(artifact.getArtifactCoordinates().getGroupId()) && bundleDependency.getDescriptor().getArtifactId().equals(artifact.getArtifactCoordinates().getArtifactId())) .findAny(); return patchedBundledDependency .orElse(createBundleDependencyFromPackagerDependency(deployableArtifactRepositoryFolder).apply(artifact)); }).collect(toSet()); loadUrls(artifactFile, classLoaderModelBuilder, bundleDependencies); classLoaderModelBuilder.dependingOn(bundleDependencies); return classLoaderModelBuilder.build(); }
@Test public void sanitizesTransitiveDependantPluginExportedPackages() throws Exception { fooPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().exportingPackages(getFooExportedPackages()).build()); bazPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().exportingPackages(getBazExportedPackages()) .dependingOn(singleton(FOO_PLUGIN_DESCRIPTOR)).build()); barPlugin.setClassLoaderModel(new ClassLoaderModel.ClassLoaderModelBuilder().exportingPackages(getBarExportedPackages()) .dependingOn(singleton(BAZ_PLUGIN_DESCRIPTOR)).build()); final List<ArtifactPluginDescriptor> pluginDescriptors = createPluginDescriptors(fooPlugin, barPlugin, bazPlugin); final List<ArtifactPluginDescriptor> resolvedPluginDescriptors = dependenciesResolver.resolve( emptySet(), pluginDescriptors); assertResolvedPlugins(resolvedPluginDescriptors, fooPlugin, bazPlugin, barPlugin); assertPluginExportedPackages(fooPlugin, "org.foo", "org.foo.mule"); assertPluginExportedPackages(bazPlugin, "org.baz"); assertPluginExportedPackages(barPlugin, "org.bar", "org.bar.mule"); }
@Test public void detectsDuplicateExportedPackagesOnIndependentPlugins() throws Exception { fooPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().exportingPackages(getFooExportedPackages()).build()); barPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().exportingPackages(getBarExportedPackages()).build()); final List<ArtifactPluginDescriptor> pluginDescriptors = createPluginDescriptors(fooPlugin, barPlugin); Map<String, List<String>> pluginsPerPackage = new HashMap<>(); pluginsPerPackage.put("org.foo", asList("bar, foo")); pluginsPerPackage.put("org.foo.mule", asList("bar, foo")); String expectedErrorMessage = new DuplicateExportedPackageException(pluginsPerPackage).getMessage(); this.expectedException.expect(DuplicateExportedPackageException.class); this.expectedException.expectMessage(expectedErrorMessage); dependenciesResolver.resolve(emptySet(), pluginDescriptors); }
@Test public void sanitizesDependantPluginExportedPackages() throws Exception { fooPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().exportingPackages(getFooExportedPackages()).build()); barPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().dependingOn(singleton(FOO_PLUGIN_DESCRIPTOR)) .exportingPackages(getBarExportedPackages()).build()); final List<ArtifactPluginDescriptor> pluginDescriptors = createPluginDescriptors(fooPlugin, barPlugin); final List<ArtifactPluginDescriptor> resolvedPluginDescriptors = dependenciesResolver.resolve( emptySet(), pluginDescriptors); assertResolvedPlugins(resolvedPluginDescriptors, fooPlugin, barPlugin); assertPluginExportedPackages(fooPlugin, "org.foo", "org.foo.mule"); assertPluginExportedPackages(barPlugin, "org.bar", "org.baz", "org.bar.mule"); }
@Test public void verifiesPolicyTemplateDoesNotExportPackages() throws Exception { PolicyTemplateDescriptor policyTemplateDescriptor = new PolicyTemplateDescriptor(POLICY_NAME); ClassLoaderModel classLoaderModel = new ClassLoaderModel.ClassLoaderModelBuilder().exportingPackages(Collections.singleton("org.foo")).build(); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage(POLICY_EXPORTED_PACKAGES_ERROR); policyTemplateDescriptor.setClassLoaderModel(classLoaderModel); }
@Test public void sanitizesTransitiveDependantPluginExportedPackages() throws Exception { fooPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().exportingPackages(getFooExportedPackages()).build()); bazPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().exportingPackages(getBazExportedPackages()) .dependingOn(singleton(FOO_PLUGIN_DESCRIPTOR)).build()); barPlugin.setClassLoaderModel(new ClassLoaderModel.ClassLoaderModelBuilder().exportingPackages(getBarExportedPackages()) .dependingOn(singleton(BAZ_PLUGIN_DESCRIPTOR)).build()); final List<ArtifactPluginDescriptor> pluginDescriptors = createPluginDescriptors(fooPlugin, barPlugin, bazPlugin); final List<ArtifactPluginDescriptor> resolvedPluginDescriptors = dependenciesResolver.resolve( emptySet(), pluginDescriptors, true); assertResolvedPlugins(resolvedPluginDescriptors, fooPlugin, bazPlugin, barPlugin); assertPluginExportedPackages(fooPlugin, "org.foo", "org.foo.mule"); assertPluginExportedPackages(bazPlugin, "org.baz"); assertPluginExportedPackages(barPlugin, "org.bar", "org.bar.mule"); }
@Test public void sanitizesDependantPluginExportedPackages() throws Exception { fooPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().exportingPackages(getFooExportedPackages()).build()); barPlugin.setClassLoaderModel(new ClassLoaderModelBuilder().dependingOn(singleton(FOO_PLUGIN_DESCRIPTOR)) .exportingPackages(getBarExportedPackages()).build()); final List<ArtifactPluginDescriptor> pluginDescriptors = createPluginDescriptors(fooPlugin, barPlugin); final List<ArtifactPluginDescriptor> resolvedPluginDescriptors = dependenciesResolver.resolve( emptySet(), pluginDescriptors, true); assertResolvedPlugins(resolvedPluginDescriptors, fooPlugin, barPlugin); assertPluginExportedPackages(fooPlugin, "org.foo", "org.foo.mule"); assertPluginExportedPackages(barPlugin, "org.bar", "org.baz", "org.bar.mule"); }
@Test public void verifiesPolicyTemplateDoesNotExportPackages() throws Exception { PolicyTemplateDescriptor policyTemplateDescriptor = new PolicyTemplateDescriptor(POLICY_NAME); ClassLoaderModel classLoaderModel = new ClassLoaderModel.ClassLoaderModelBuilder().exportingPackages(Collections.singleton("org.foo")).build(); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage(POLICY_EXPORTED_PACKAGES_ERROR); policyTemplateDescriptor.setClassLoaderModel(classLoaderModel); }