langtools/src/share/classes/com/sun/tools/apt/mirror/apt/FilerImpl.java
changeset 11870 bc664cc5f2a0
parent 11863 ac6277ec304a
parent 11869 d659025e6575
child 11871 08f8da764f8f
--- a/langtools/src/share/classes/com/sun/tools/apt/mirror/apt/FilerImpl.java	Thu Feb 16 13:01:46 2012 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,354 +0,0 @@
-/*
- * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.tools.apt.mirror.apt;
-
-
-import java.io.*;
-import java.util.Collection;
-import java.util.EnumMap;
-import java.util.HashSet;
-import java.util.Set;
-
-import com.sun.mirror.apt.Filer;
-import com.sun.tools.apt.mirror.declaration.DeclarationMaker;
-import com.sun.tools.javac.util.Context;
-import com.sun.tools.javac.util.Options;
-import com.sun.tools.javac.util.Position;
-import com.sun.tools.apt.util.Bark;
-
-import static com.sun.mirror.apt.Filer.Location.*;
-
-
-/**
- * Implementation of Filer.
- */
-@SuppressWarnings("deprecation")
-public class FilerImpl implements Filer {
-    /*
-     * The Filer class must maintain a number of constraints.  First,
-     * multiple attempts to open the same path within the same
-     * invocation of apt results in an IOException being thrown.  For
-     * example, trying to open the same source file twice:
-     *
-     * createSourceFile("foo.Bar")
-     * ...
-     * createSourceFile("foo.Bar")
-     *
-     * is disallowed as is opening a text file that happens to have
-     * the same name as a source file:
-     *
-     * createSourceFile("foo.Bar")
-     * ...
-     * createTextFile(SOURCE_TREE, "foo", new File("Bar"), null)
-     *
-     * Additionally, creating a source file that corresponds to an
-     * already created class file (or vice versa) generates at least a
-     * warning.  This is an error if -XclassesAsDecls is being used
-     * since you can't create the same type twice.  However, if the
-     * Filer is used to create a text file named *.java that happens
-     * to correspond to an existing class file, a warning is *not*
-     * generated.  Similarly, a warning is not generated for a binary
-     * file named *.class and an existing source file.
-     *
-     * The reason for this difference is that source files and class
-     * files are registered with apt and can get passed on as
-     * declarations to the next round of processing.  Files that are
-     * just named *.java and *.class are not processed in that manner;
-     * although having extra source files and class files on the
-     * source path and class path can alter the behavior of the tool
-     * and any final compile.
-     */
-
-    private enum FileKind {
-        SOURCE {
-            void register(File file, String name, FilerImpl that) throws IOException {
-                // Check for corresponding class file
-                if (that.filesCreated.contains(new File(that.locations.get(CLASS_TREE),
-                                                        that.nameToPath(name, ".class")))) {
-
-                    that.bark.aptWarning("CorrespondingClassFile", name);
-                    if (that.opts.get("-XclassesAsDecls") != null)
-                        throw new IOException();
-                }
-                that.sourceFileNames.add(file.getPath());
-            }
-        },
-
-        CLASS  {
-            void register(File file, String name, FilerImpl that) throws IOException {
-                if (that.filesCreated.contains(new File(that.locations.get(SOURCE_TREE),
-                                                        that.nameToPath(name, ".java")))) {
-                    that.bark.aptWarning("CorrespondingSourceFile", name);
-                    if (that.opts.get("-XclassesAsDecls") != null)
-                        throw new IOException();
-                }
-                // Track the binary name instead of the filesystem location
-                that.classFileNames.add(name);
-            }
-        },
-
-        OTHER  {
-            // Nothing special to do
-            void register(File file, String name, FilerImpl that) throws IOException {}
-        };
-
-        abstract void register(File file, String name, FilerImpl that) throws IOException;
-    }
-
-    private final Options opts;
-    private final DeclarationMaker declMaker;
-    private final com.sun.tools.apt.main.AptJavaCompiler comp;
-
-    // Platform's default encoding
-    private final static String DEFAULT_ENCODING =
-            new OutputStreamWriter(new ByteArrayOutputStream()).getEncoding();
-
-    private String encoding;    // name of charset used for source files
-
-    private final EnumMap<Location, File> locations;    // where new files go
-
-
-    private static final Context.Key<FilerImpl> filerKey =
-            new Context.Key<FilerImpl>();
-
-    // Set of files opened.
-    private Collection<Flushable> wc;
-
-    private Bark bark;
-
-    // All created files.
-    private final Set<File> filesCreated;
-
-    // Names of newly created source files
-    private HashSet<String> sourceFileNames = new HashSet<String>();
-
-    // Names of newly created class files
-    private HashSet<String> classFileNames  = new HashSet<String>();
-
-    private boolean roundOver;
-
-    public static FilerImpl instance(Context context) {
-        FilerImpl instance = context.get(filerKey);
-        if (instance == null) {
-            instance = new FilerImpl(context);
-        }
-        return instance;
-    }
-
-    // flush all output streams;
-    public void flush() {
-        for(Flushable opendedFile: wc) {
-            try {
-                opendedFile.flush();
-                if (opendedFile instanceof FileOutputStream) {
-                    try {
-                        ((FileOutputStream) opendedFile).getFD().sync() ;
-                    } catch (java.io.SyncFailedException sfe) {}
-                }
-            } catch (IOException e) { }
-        }
-    }
-
-    private FilerImpl(Context context) {
-        context.put(filerKey, this);
-        opts = Options.instance(context);
-        declMaker = DeclarationMaker.instance(context);
-        bark = Bark.instance(context);
-        comp = com.sun.tools.apt.main.AptJavaCompiler.instance(context);
-        roundOver = false;
-        this.filesCreated = comp.getAggregateGenFiles();
-
-        // Encoding
-        encoding = opts.get("-encoding");
-        if (encoding == null) {
-            encoding = DEFAULT_ENCODING;
-        }
-
-        wc = new HashSet<Flushable>();
-
-        // Locations
-        locations = new EnumMap<Location, File>(Location.class);
-        String s = opts.get("-s");      // location for new source files
-        String d = opts.get("-d");      // location for new class files
-        locations.put(SOURCE_TREE, new File(s != null ? s : "."));
-        locations.put(CLASS_TREE,  new File(d != null ? d : "."));
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public PrintWriter createSourceFile(String name) throws IOException {
-        String pathname = nameToPath(name, ".java");
-        File file = new File(locations.get(SOURCE_TREE),
-                             pathname);
-        PrintWriter pw = getPrintWriter(file, encoding, name, FileKind.SOURCE);
-        return pw;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public OutputStream createClassFile(String name) throws IOException {
-        String pathname = nameToPath(name, ".class");
-        File file = new File(locations.get(CLASS_TREE),
-                             pathname);
-        OutputStream os = getOutputStream(file, name, FileKind.CLASS);
-        return os;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public PrintWriter createTextFile(Location loc,
-                                      String pkg,
-                                      File relPath,
-                                      String charsetName) throws IOException {
-        File file = (pkg.length() == 0)
-                        ? relPath
-                        : new File(nameToPath(pkg), relPath.getPath());
-        if (charsetName == null) {
-            charsetName = encoding;
-        }
-        return getPrintWriter(loc, file.getPath(), charsetName, null, FileKind.OTHER);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public OutputStream createBinaryFile(Location loc,
-                                         String pkg,
-                                         File relPath) throws IOException {
-        File file = (pkg.length() == 0)
-                        ? relPath
-                        : new File(nameToPath(pkg), relPath.getPath());
-        return getOutputStream(loc, file.getPath(), null, FileKind.OTHER);
-    }
-
-
-    /**
-     * Converts the canonical name of a top-level type or package to a
-     * pathname.  Suffix is ".java" or ".class" or "".
-     */
-    private String nameToPath(String name, String suffix) throws IOException {
-        if (!DeclarationMaker.isJavaIdentifier(name.replace('.', '_'))) {
-            bark.aptWarning("IllegalFileName", name);
-            throw new IOException();
-        }
-        return name.replace('.', File.separatorChar) + suffix;
-    }
-
-    private String nameToPath(String name) throws IOException {
-        return nameToPath(name, "");
-    }
-
-    /**
-     * Returns a writer for a text file given its location, its
-     * pathname relative to that location, and its encoding.
-     */
-    private PrintWriter getPrintWriter(Location loc, String pathname,
-                                       String encoding, String name, FileKind kind) throws IOException {
-        File file = new File(locations.get(loc), pathname);
-        return getPrintWriter(file, encoding, name, kind);
-    }
-
-    /**
-     * Returns a writer for a text file given its encoding.
-     */
-    private PrintWriter getPrintWriter(File file,
-                                       String encoding, String name, FileKind kind) throws IOException {
-        prepareFile(file, name, kind);
-        PrintWriter pw =
-            new PrintWriter(
-                    new BufferedWriter(
-                         new OutputStreamWriter(new FileOutputStream(file),
-                                                encoding)));
-        wc.add(pw);
-        return pw;
-    }
-
-    /**
-     * Returns an output stream for a binary file given its location
-     * and its pathname relative to that location.
-     */
-    private OutputStream getOutputStream(Location loc, String pathname, String name, FileKind kind)
-                                                        throws IOException {
-        File file = new File(locations.get(loc), pathname);
-        return getOutputStream(file, name, kind);
-    }
-
-    private OutputStream getOutputStream(File file, String name, FileKind kind) throws IOException {
-        prepareFile(file, name, kind);
-        OutputStream os = new FileOutputStream(file);
-        wc.add(os);
-        return os;
-
-    }
-
-    public Set<String> getSourceFileNames() {
-        return sourceFileNames;
-    }
-
-    public Set<String> getClassFileNames() {
-        return classFileNames;
-    }
-
-    public void roundOver() {
-        roundOver = true;
-    }
-
-    /**
-     * Checks that the file has not already been created during this
-     * invocation.  If not, creates intermediate directories, and
-     * deletes the file if it already exists.
-     */
-    private void prepareFile(File file, String name, FileKind kind) throws IOException {
-        if (roundOver) {
-            bark.aptWarning("NoNewFilesAfterRound", file.toString());
-            throw new IOException();
-        }
-
-        if (filesCreated.contains(file)) {
-            bark.aptWarning("FileReopening", file.toString());
-            throw new IOException();
-        } else {
-            if (file.exists()) {
-                file.delete();
-            } else {
-                File parent = file.getParentFile();
-                if (parent != null && !parent.exists()) {
-                    if(!parent.mkdirs()) {
-                        bark.aptWarning("BadParentDirectory", file.toString());
-                        throw new IOException();
-                    }
-                }
-            }
-
-            kind.register(file, name, this);
-            filesCreated.add(file);
-        }
-    }
-}