blob: 228d3eff40843d323b7a9ce4166a3f5321101584 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2014 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Sergey Stupin - contributions for adding annotation processing support to ajc
*******************************************************************************/
package org.eclipse.jdt.internal.compiler.apt.dispatch;
import org.eclipse.jdt.internal.compiler.batch.CompilationUnit;
import javax.lang.model.element.Element;
import javax.tools.FileObject;
import javax.tools.JavaFileManager;
import java.io.*;
import java.net.URI;
/**
* @author s.stupin
*/
public final class AjBatchFilerImpl extends BatchFilerImpl {
public AjBatchFilerImpl(BaseAnnotationProcessorManager dispatchManager, BatchProcessingEnvImpl env) {
super(dispatchManager, env);
}
@Override
public FileObject createResource(JavaFileManager.Location location, CharSequence pkg, CharSequence relativeName, Element... originatingElements) throws IOException {
final String name = String.valueOf(relativeName);
final FileObject resource = super.createResource(location, pkg, relativeName, originatingElements);
return name.endsWith(".aj") ? new HookedFileObject(resource) : resource;
}
private final class HookedFileObject implements FileObject {
private final FileObject fileObject;
private boolean _closed = false;
HookedFileObject(FileObject fileObject) {
this.fileObject = fileObject;
}
@Override
public URI toUri() {
return fileObject.toUri();
}
@Override
public String getName() {
return fileObject.getName();
}
@Override
public InputStream openInputStream() throws IOException {
return fileObject.openInputStream();
}
@Override
public OutputStream openOutputStream() throws IOException {
return new ForwardingOutputStream(fileObject.openOutputStream());
}
@Override
public Reader openReader(boolean ignoreEncodingErrors) throws IOException {
return fileObject.openReader(ignoreEncodingErrors);
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return fileObject.getCharContent(ignoreEncodingErrors);
}
@Override
public Writer openWriter() throws IOException {
return new ForwardingWriter(fileObject.openWriter());
}
@Override
public long getLastModified() {
return fileObject.getLastModified();
}
@Override
public boolean delete() {
return fileObject.delete();
}
private void onClose() {
if (_closed)
return;
_closed = true;
final String name = fileObject.getName();
final CompilationUnit unit = new CompilationUnit(null, name, null /* encoding */);
addNewUnit(unit);
}
private final class ForwardingWriter extends Writer {
private final Writer writer;
public ForwardingWriter(Writer writer) {
this.writer = writer;
}
@Override
public void write(int c) throws IOException {
writer.write(c);
}
@Override
public void write(char[] cbuf) throws IOException {
writer.write(cbuf);
}
@Override
public void write(String str) throws IOException {
writer.write(str);
}
@Override
public void write(String str, int off, int len) throws IOException {
writer.write(str, off, len);
}
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
writer.write(cbuf, off, len);
}
@Override
public void flush() throws IOException {
writer.flush();
}
@Override
public void close() throws IOException {
writer.close();
onClose();
}
@Override
public Writer append(CharSequence csq) throws IOException {
return writer.append(csq);
}
@Override
public Writer append(CharSequence csq, int start, int end) throws IOException {
return writer.append(csq, start, end);
}
@Override
public Writer append(char c) throws IOException {
return writer.append(c);
}
}
private final class ForwardingOutputStream extends OutputStream {
private final OutputStream stream;
public ForwardingOutputStream(OutputStream stream) {
this.stream = stream;
}
@Override
public void write(byte[] b) throws IOException {
stream.write(b);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
stream.write(b, off, len);
}
@Override
public void flush() throws IOException {
stream.flush();
}
@Override
public void close() throws IOException {
stream.close();
onClose();
}
@Override
public void write(int b) throws IOException {
stream.write(b);
}
}
}
}