package com.revolsys.swing.scripting;
import java.io.IOException;
import java.net.URI;
import java.security.SecureClassLoader;
import javax.tools.FileObject;
import javax.tools.ForwardingJavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.JavaFileObject.Kind;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import com.revolsys.util.Exceptions;
import com.revolsys.util.UrlUtil;
public class InMemoryJavaFileManager extends ForwardingJavaFileManager<StandardJavaFileManager> {
private final URIJavaFileObject javaFile;
private InMemoryJavaFile classFile;
public InMemoryJavaFileManager(final URIJavaFileObject javaFile) {
super(ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null));
this.javaFile = javaFile;
try {
final String className = UrlUtil.getFileBaseName(javaFile.toUri().toURL());
this.classFile = new InMemoryJavaFile(new URI("memory:/" + className + ".class"), Kind.CLASS);
} catch (final Throwable e) {
Exceptions.throwUncheckedException(e);
}
}
@Override
public ClassLoader getClassLoader(final Location location) {
return new SecureClassLoader() {
@Override
protected Class<?> findClass(final String name) throws ClassNotFoundException {
final byte[] data = InMemoryJavaFileManager.this.classFile.getData();
return super.defineClass(name, data, 0, data.length);
}
};
}
@Override
public JavaFileObject getJavaFileForOutput(final Location location, final String className,
final Kind kind, final FileObject sibling) throws IOException {
if (sibling == this.javaFile) {
return this.classFile;
} else {
return super.getJavaFileForOutput(location, className, kind, sibling);
}
}
}