Skip to content

Commit

Permalink
HADOOP-18931. FileSystem.getFileSystemClass() to log the jar the .cla…
Browse files Browse the repository at this point in the history
…ss came from (#6197)


Set the log level of logger org.apache.hadoop.fs.FileSystem to DEBUG to see this.

Contributed by Viraj Jasani
  • Loading branch information
virajjasani authored Jun 14, 2024
1 parent 2bde5cc commit 240fddc
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3581,7 +3581,15 @@ public static Class<? extends FileSystem> getFileSystemClass(String scheme,
throw new UnsupportedFileSystemException("No FileSystem for scheme "
+ "\"" + scheme + "\"");
}
LOGGER.debug("FS for {} is {}", scheme, clazz);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("FS for {} is {}", scheme, clazz);
final String jarLocation = ClassUtil.findContainingJar(clazz);
if (jarLocation != null) {
LOGGER.debug("Jar location for {} : {}", clazz, jarLocation);
} else {
LOGGER.debug("Class location for {} : {}", clazz, ClassUtil.findClassLocation(clazz));
}
}
return clazz;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,25 @@ public class ClassUtil {
* @return a jar file that contains the class, or null.
*/
public static String findContainingJar(Class<?> clazz) {
ClassLoader loader = clazz.getClassLoader();
String classFile = clazz.getName().replaceAll("\\.", "/") + ".class";
return findContainingResource(clazz.getClassLoader(), clazz.getName(), "jar");
}

/**
* Find the absolute location of the class.
*
* @param clazz the class to find.
* @return the class file with absolute location, or null.
*/
public static String findClassLocation(Class<?> clazz) {
return findContainingResource(clazz.getClassLoader(), clazz.getName(), "file");
}

private static String findContainingResource(ClassLoader loader, String clazz, String resource) {
String classFile = clazz.replaceAll("\\.", "/") + ".class";
try {
for(final Enumeration<URL> itr = loader.getResources(classFile);
itr.hasMoreElements();) {
for (final Enumeration<URL> itr = loader.getResources(classFile); itr.hasMoreElements();) {
final URL url = itr.nextElement();
if ("jar".equals(url.getProtocol())) {
if (resource.equals(url.getProtocol())) {
String toReturn = url.getPath();
if (toReturn.startsWith("file:")) {
toReturn = toReturn.substring("file:".length());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,47 @@

import java.io.File;

import org.junit.Assert;
import org.apache.hadoop.fs.viewfs.ViewFileSystem;

import org.apache.log4j.Logger;
import org.assertj.core.api.Assertions;
import org.junit.Test;

public class TestClassUtil {

@Test(timeout=10000)
public void testFindContainingJar() {
String containingJar = ClassUtil.findContainingJar(Logger.class);
Assert.assertNotNull("Containing jar not found for Logger",
containingJar);
String containingJar = ClassUtil.findContainingJar(Assertions.class);
Assertions
.assertThat(containingJar)
.describedAs("Containing jar for %s", Assertions.class)
.isNotNull();
File jarFile = new File(containingJar);
Assert.assertTrue("Containing jar does not exist on file system ",
jarFile.exists());
Assert.assertTrue("Incorrect jar file " + containingJar,
jarFile.getName().matches("reload4j.*[.]jar"));
Assertions
.assertThat(jarFile)
.describedAs("Containing jar %s", jarFile)
.exists();
Assertions
.assertThat(jarFile.getName())
.describedAs("Containing jar name %s", jarFile.getName())
.matches("assertj-core.*[.]jar");
}

@Test(timeout = 10000)
public void testFindContainingClass() {
String classFileLocation = ClassUtil.findClassLocation(ViewFileSystem.class);
Assertions
.assertThat(classFileLocation)
.describedAs("Class path for %s", ViewFileSystem.class)
.isNotNull();
File classFile = new File(classFileLocation);
Assertions
.assertThat(classFile)
.describedAs("Containing class file %s", classFile)
.exists();
Assertions
.assertThat(classFile.getName())
.describedAs("Containing class file name %s", classFile.getName())
.matches("ViewFileSystem.class");
}

}

0 comments on commit 240fddc

Please sign in to comment.