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.Map; import java.util.TreeMap; public class InMemoryJavaFileManager extends ForwardingJavaFileManager { public final Map codes = new TreeMap<>(); public InMemoryJavaFileManager(StandardJavaFileManager standardFileManager) { super(standardFileManager); } @Override public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException { throw new RuntimeException(""); } @Override public JavaFileObject getJavaFileForOutput(Location location, final String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException { 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; } }; } @Override public boolean isSameFile(FileObject a, FileObject b) { return a.toUri().compareTo(b.toUri()) == 0; // System.out.println("a = " + a); // System.out.println("b = " + b); // return super.isSameFile(a, b); } }