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:"); } }
/** * @inherited */ @Override public ArtifactClassLoader create(String artifactId, ServiceDescriptor descriptor, ClassLoader parent, ClassLoaderLookupPolicy lookupPolicy) { return new MuleArtifactClassLoader(artifactId, descriptor, descriptor.getClassLoaderModel().getUrls(), parent, lookupPolicy); } }
@Override public ArtifactClassLoader create(String artifactId, ArtifactPluginDescriptor descriptor, ClassLoader parent, ClassLoaderLookupPolicy lookupPolicy) { return new MuleArtifactClassLoader(artifactId, descriptor, descriptor.getClassLoaderModel().getUrls(), parent, lookupPolicy); }
@Override protected String[] getLocalResourceLocations() { // Always the first element corresponds to the application's classes folder ClassLoaderModel classLoaderModel = this.<ApplicationDescriptor>getArtifactDescriptor().getClassLoaderModel(); return new String[] {toFile(classLoaderModel.getUrls()[0]).getPath()}; }
@Override public ArtifactClassLoader create(String artifactId, ArtifactClassLoader parent, PolicyTemplateDescriptor descriptor, List<ArtifactClassLoader> artifactPluginClassLoaders) { File rootFolder = descriptor.getRootFolder(); if (rootFolder == null || !rootFolder.exists()) { throw new IllegalArgumentException("Policy folder does not exists: " + (rootFolder != null ? rootFolder.getName() : null)); } final ClassLoaderLookupPolicy classLoaderLookupPolicy = parent.getClassLoaderLookupPolicy(); MuleDeployableArtifactClassLoader deployableArtifactClassLoader = new MuleDeployableArtifactClassLoader(artifactId, descriptor, descriptor.getClassLoaderModel().getUrls(), parent.getClassLoader(), classLoaderLookupPolicy, artifactPluginClassLoaders); return deployableArtifactClassLoader; } }
@Override public ArtifactClassLoader create(String artifactId, ArtifactClassLoader parent, ApplicationDescriptor descriptor, List<ArtifactClassLoader> artifactPluginClassLoaders) { final ClassLoaderLookupPolicy classLoaderLookupPolicy = getApplicationClassLoaderLookupPolicy(parent, descriptor); return new MuleApplicationClassLoader(artifactId, descriptor, parent.getClassLoader(), nativeLibraryFinderFactory.create(descriptor.getDataFolderName(), descriptor.getClassLoaderModel().getUrls()), Arrays.asList(descriptor.getClassLoaderModel().getUrls()), classLoaderLookupPolicy, artifactPluginClassLoaders); }
private ArtifactClassLoader getCustomDomainClassLoader(ArtifactClassLoader parent, DomainDescriptor domain, List<ArtifactClassLoader> artifactClassLoaders) { validateDomain(domain); final ClassLoaderLookupPolicy classLoaderLookupPolicy = getApplicationClassLoaderLookupPolicy(parent, domain); ArtifactClassLoader classLoader = new MuleSharedDomainClassLoader(domain, parent.getClassLoader(), classLoaderLookupPolicy, Arrays .asList(domain.getClassLoaderModel().getUrls()), artifactClassLoaders); return classLoader; }
@Test public void patchedApplicationWithWhitespaces() throws InvalidDescriptorLoaderException, IOException { ClassLoaderModel classLoaderModel = buildClassLoaderModel( new File(toFile(getClass().getClassLoader() .getResource(Paths.get(APPS_FOLDER).toString())), PATCHED_JAR_APP_WHITESPACES)); assertThat(classLoaderModel.getUrls().length, is(2)); // It was not escaping the URL for rootArtifact assertThat(classLoaderModel.getUrls()[0], equalTo( toFile(getClass().getClassLoader().getResource(Paths .get(APPS_FOLDER, PATCHED_JAR_APP_WHITESPACES).toString())).toURI() .toURL())); }
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 addJarsFromLibFolderToClassLoader() throws Exception { File libFolder = serviceFolder.newFolder(LIB_FOLDER); File jarFile = new File(libFolder, "dummy.jar"); jarFile.createNewFile(); ClassLoaderModel classLoaderModel = classLoaderModelLoader.load(serviceFolder.getRoot(), emptyMap(), SERVICE); URL[] urls = classLoaderModel.getUrls(); assertThat(urls, arrayWithSize(2)); assertThat(urls, hasItemInArray(jarFile.toURI().toURL())); }
@Test public void ignoresNonJarsFilesFromLibFolder() throws Exception { File libFolder = serviceFolder.newFolder(LIB_FOLDER); File jarFile = new File(libFolder, "dummy.txt"); jarFile.createNewFile(); ClassLoaderModel classLoaderModel = classLoaderModelLoader.load(serviceFolder.getRoot(), emptyMap(), SERVICE); // Contains only the service root assertThat(classLoaderModel.getUrls(), hasItemInArray(serviceFolder.getRoot().toURI().toURL())); } }
@Test public void addsArtifactFolderToClassLoader() throws Exception { ClassLoaderModel classLoaderModel = classLoaderModelLoader.load(serviceFolder.getRoot(), emptyMap(), SERVICE); URL[] urls = classLoaderModel.getUrls(); assertThat(urls, arrayWithSize(1)); assertThat(urls, hasItemInArray(serviceFolder.getRoot().toURI().toURL())); }
@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()))); }
@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()))); }); }
@Test public void classLoaderModelWithSingleDependency() throws Exception { D desc = createArtifactDescriptor(getArtifactRootFolder() + "/single-dependency"); ClassLoaderModel classLoaderModel = desc.getClassLoaderModel(); assertThat(classLoaderModel.getDependencies(), hasSize(1)); BundleDependency commonsCollectionDependency = classLoaderModel.getDependencies().iterator().next(); assertThat(commonsCollectionDependency, commonsCollectionDependencyMatcher()); assertThat(classLoaderModel.getUrls().length, is(2)); assertThat(asList(classLoaderModel.getUrls()), hasItem(commonsCollectionDependency.getBundleUri().toURL())); }
private ClassLoaderModel buildAndValidateModel(int expectedDependencies) throws Exception { File app = toFile(getClass().getClassLoader().getResource(Paths.get(APPS_FOLDER, "no-dependencies").toString())); MavenConfiguration mockMavenConfiguration = mock(MavenConfiguration.class, RETURNS_DEEP_STUBS); when(mockMavenConfiguration.getLocalMavenRepositoryLocation()).thenReturn(temporaryFolder.newFolder()); when(mockMavenClient.getMavenConfiguration()).thenReturn(mockMavenConfiguration); ClassLoaderModel classLoaderModel = buildClassLoaderModel(app); assertThat(classLoaderModel.getDependencies(), hasSize(expectedDependencies)); URL[] urls = classLoaderModel.getUrls(); assertThat(urls, hasItemInArray(app.toURI().toURL())); assertThat(urls, hasItemInArray(getDependencyUrl(API_BUNDLE))); assertThat(urls, hasItemInArray(getDependencyUrl(LIB_BUNDLE))); assertThat(urls, hasItemInArray(getDependencyUrl(TRAIT_BUNDLE))); return classLoaderModel; }
@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())); }
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")); }