package org.mdkt.compiler; import javax.tools.FileObject; import javax.tools.ForwardingJavaFileManager; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import java.io.IOException; import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; /** * Created by trung on 5/3/15. Edited by turpid-monkey on 9/25/15, completed * support for multiple compile units. */ public class ExtendedStandardJavaFileManager extends ForwardingJavaFileManager { private Map compiledCode; private DynamicClassLoader cl; /** * Creates a new instance of ForwardingJavaFileManager. * * @param fileManager delegate to this file manager * @param cl */ protected ExtendedStandardJavaFileManager(JavaFileManager fileManager, DynamicClassLoader cl, CompiledCode[] compiledCode) { super(fileManager); this.cl = cl; this.compiledCode = Arrays.stream(compiledCode).collect(Collectors.toMap(CompiledCode::getClassName, c -> c)); } @Override public JavaFileObject getJavaFileForOutput( JavaFileManager.Location location, String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException { try { CompiledCode innerClass = compiledCode.get(className); if (innerClass == null) { innerClass = new CompiledCode(className); compiledCode.put(className, innerClass); } cl.addCode(innerClass); return innerClass; } catch (Exception e) { throw new RuntimeException( "Error while creating in-memory output file for " + className, e); } } @Override public ClassLoader getClassLoader(JavaFileManager.Location location) { return cl; } }