/*******************************************************************************
 * 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);
            }
        }
    }
}