
org.unlaxer.compiler.CustomClassloaderJavaFileManager Maven / Gradle / Ivy
package org.unlaxer.compiler;
import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
import javax.tools.FileObject;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.StandardLocation;
/*
* modified and repackage below sources for java9 and j2ee container
* https://atamur.blogspot.com/2009/10/using-built-in-javacompiler-with-custom.html
*
* @author atamur
* @author opa
* @since 15-Oct-2009
*/
public class CustomClassloaderJavaFileManager implements JavaFileManager {
private final ClassLoader classLoader;
private final StandardJavaFileManager standardFileManager;
private final PackageInternalsFinder finder;
private final JavaFileManagerContext javaFileManagerContext;
public CustomClassloaderJavaFileManager(ClassLoader classLoader, StandardJavaFileManager standardFileManager) {
this(classLoader, standardFileManager, new JavaFileManagerContext());
}
public CustomClassloaderJavaFileManager(ClassLoader classLoader, StandardJavaFileManager standardFileManager,
JavaFileManagerContext javaFileManagerContext) {
this.classLoader = classLoader;
this.standardFileManager = standardFileManager;
this.javaFileManagerContext = javaFileManagerContext;
finder = new PackageInternalsFinder(classLoader,javaFileManagerContext.jarURLStringFromURL);
}
@Override
public ClassLoader getClassLoader(Location location) {
return classLoader;
}
@Override
public String inferBinaryName(Location location, JavaFileObject file) {
if (file instanceof CustomJavaFileObject) {
return ((CustomJavaFileObject) file).binaryName();
}
return standardFileManager.inferBinaryName(location, file);
}
@Override
public boolean isSameFile(FileObject a, FileObject b) {
throw new UnsupportedOperationException();
}
@Override
public boolean handleOption(String current, Iterator remaining) {
throw new UnsupportedOperationException();
}
@Override
public boolean hasLocation(Location location) {
return location == StandardLocation.CLASS_PATH || location == StandardLocation.PLATFORM_CLASS_PATH;
}
@Override
public JavaFileObject getJavaFileForInput(Location location, String className, JavaFileObject.Kind kind)
throws IOException {
throw new UnsupportedOperationException();
}
@Override
public JavaFileObject getJavaFileForOutput(Location location, String className, JavaFileObject.Kind kind,
FileObject sibling) throws IOException {
throw new UnsupportedOperationException();
}
@Override
public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException {
throw new UnsupportedOperationException();
}
@Override
public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling)
throws IOException {
throw new UnsupportedOperationException();
}
@Override
public void flush() throws IOException {
}
@Override
public void close() throws IOException {
}
@Override
public Iterable list(Location location, String packageName, Set kinds,
boolean recurse) throws IOException {
if (javaFileManagerContext.matchForStandardFileManager.test(location)) {
return standardFileManager.list(location, packageName, kinds, recurse);
} else if (location == StandardLocation.CLASS_PATH && kinds.contains(JavaFileObject.Kind.CLASS)) {
if (packageName.startsWith("java.")) {// a hack to let standard manager handle locations like "java.lang" or "java.util". Prob would make
return standardFileManager.list(location, packageName, kinds, recurse);
} else {
return finder.find(packageName);
}
}
return Collections.emptyList();
}
@Override
public int isSupportedOption(String option) {
return -1;
}
public Location getLocationForModule(Location location, String moduleName) throws IOException {
return standardFileManager.getLocationForModule(location, moduleName);
}
public Location getLocationForModule(Location location, JavaFileObject fo) throws IOException {
return standardFileManager.getLocationForModule(location, fo);
}
public Iterable> listLocationsForModules(Location location) throws IOException {
return standardFileManager.listLocationsForModules(location);
}
public String inferModuleName(Location location) throws IOException {
return standardFileManager.inferModuleName(location);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy