package com.redhat.ceylon.eclipse.core.builder; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; import java.net.URI; import com.redhat.ceylon.javax.lang.model.element.Modifier; import com.redhat.ceylon.javax.lang.model.element.NestingKind; import com.redhat.ceylon.javax.tools.JavaFileObject; import com.redhat.ceylon.langtools.tools.javac.file.RelativePath.RelativeFile; final class ExplodingJavaFileObject implements JavaFileObject { private final File classFile; private final RelativeFile fileName; private final JavaFileObject javaFileObject; ExplodingJavaFileObject(File classFile, RelativeFile fileName, JavaFileObject javaFileObject) { this.classFile = classFile; this.fileName = fileName; this.javaFileObject = javaFileObject; } @Override public OutputStream openOutputStream() throws IOException { return new OutputStream() { final OutputStream jarStream = javaFileObject.openOutputStream(); final OutputStream classFileStream = new BufferedOutputStream(new FileOutputStream(classFile)); @Override public void write(int b) throws IOException { jarStream.write(b); classFileStream.write(b); } @Override public void write(byte[] b, int off, int len) throws IOException { jarStream.write(b, off, len); classFileStream.write(b, off, len); } @Override public void write(byte[] b) throws IOException { jarStream.write(b); classFileStream.write(b); } @Override public void close() throws IOException { classFileStream.close(); jarStream.close(); } @Override public void flush() throws IOException { classFileStream.flush(); jarStream.flush(); } }; } @Override public String toString() { return fileName.getPath(); } @Override public boolean delete() { return javaFileObject.delete(); } @Override public CharSequence getCharContent(boolean b) throws IOException { return javaFileObject.getCharContent(b); } @Override public long getLastModified() { return javaFileObject.getLastModified(); } @Override public String getName() { return javaFileObject.getName(); } @Override public InputStream openInputStream() throws IOException { return javaFileObject.openInputStream(); } @Override public Reader openReader(boolean b) throws IOException { return javaFileObject.openReader(b); } @Override public Writer openWriter() throws IOException { return javaFileObject.openWriter(); } @Override public URI toUri() { return javaFileObject.toUri(); } @Override public Modifier getAccessLevel() { return javaFileObject.getAccessLevel(); } @Override public Kind getKind() { return javaFileObject.getKind(); } @Override public NestingKind getNestingKind() { return javaFileObject.getNestingKind(); } @Override public boolean isNameCompatible(String simpleName, Kind kind) { return javaFileObject.isNameCompatible(simpleName, kind); } }