package io.trygvis.container.compiler; import org.apache.commons.io.output.ByteArrayOutputStream; import javax.tools.FileObject; import javax.tools.ForwardingJavaFileManager; import javax.tools.JavaFileObject; import javax.tools.SimpleJavaFileObject; import javax.tools.StandardJavaFileManager; import java.io.CharArrayWriter; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; import java.net.URI; import java.util.HashMap; import java.util.Map; public class InMemoryJavaFileManager extends ForwardingJavaFileManager { public final Map codes = new HashMap<>(); public InMemoryJavaFileManager(StandardJavaFileManager standardFileManager) { super(standardFileManager); } @Override public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException { System.out.println("io.trygvis.container.compiler.InMemoryJavaFileManager.getFileForOutput"); throw new RuntimeException(""); } @Override public JavaFileObject getJavaFileForOutput(Location location, final String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException { System.out.println("io.trygvis.container.compiler.InMemoryJavaFileManager.getJavaFileForOutput"); return new SimpleJavaFileObject(URI.create("wat://woot/" + className.replace('.', '/') + ".java"), kind) { String code; @Override public Writer openWriter() throws IOException { return new CharArrayWriter() { @Override public void close() { super.close(); System.out.println("Closing writer to: className = " + className); code = super.toString(); codes.put(className, code); } }; } @Override public OutputStream openOutputStream() throws IOException { return new ByteArrayOutputStream() { @Override public void close() throws IOException { super.close(); // ignored for now // System.out.println("Closing output stream to: className = " + className); // System.out.println(new String(super.toByteArray())); } }; } @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { if(code == null) { throw new FileNotFoundException(className); } return code; } }; } }