161 lines · 5.1 KB · Java
RawDownload
/* * Copyright (c) 1995, 2004, 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 sun.tools.java; import java.util.Enumeration;import java.io.File;import java.io.IOException; /** * This class is used to represent the classes in a package. * * WARNING: The contents of this source file are not part of any * supported API.  Code that depends on them does so at its own risk: * they are subject to change or removal without notice. */publicclass Package {    /**     * The path which we use to locate source files.     */    ClassPath sourcePath;     /**     * The path which we use to locate class (binary) files.     */    ClassPath binaryPath;     /**     * The path name of the package.     */    String pkg;     /**     * Create a package given a class path, and package name.     */    public Package(ClassPath path, Identifier pkg) throws IOException {        this(path, path, pkg);    }     /**     * Create a package given a source path, binary path, and package     * name.     */    public Package(ClassPath sourcePath,                   ClassPath binaryPath,                   Identifier pkg)    throws IOException {        if (pkg.isInner())            pkg = Identifier.lookup(pkg.getQualifier(), pkg.getFlatName());        this.sourcePath = sourcePath;        this.binaryPath = binaryPath;        this.pkg = pkg.toString().replace('.', File.separatorChar);    }     /**     * Check if a class is defined in this package.     * (If it is an inner class name, it is assumed to exist     * only if its binary file exists.  This is somewhat pessimistic.)     */    public boolean classExists(Identifier className) {        return getBinaryFile(className) != null ||                !className.isInner() &&               getSourceFile(className) != null;    }     /**     * Check if the package exists     */    public boolean exists() {        // Look for the directory on our binary path.        ClassFile dir = binaryPath.getDirectory(pkg);        if (dir != null && dir.isDirectory()) {            return true;        }         if (sourcePath != binaryPath) {            // Look for the directory on our source path.            dir = sourcePath.getDirectory(pkg);            if (dir != null && dir.isDirectory()) {                return true;            }        }         /* Accommodate ZIP files without CEN entries for directories         * (packages): look on class path for at least one binary         * file or one source file with the right package prefix         */        String prefix = pkg + File.separator;         return binaryPath.getFiles(prefix, ".class").hasMoreElements()            || sourcePath.getFiles(prefix, ".java").hasMoreElements();    }     private String makeName(String fileName) {        return pkg.equals("") ? fileName : pkg + File.separator + fileName;    }     /**     * Get the .class file of a class     */    public ClassFile getBinaryFile(Identifier className) {        className = Type.mangleInnerType(className);        String fileName = className.toString() + ".class";        return binaryPath.getFile(makeName(fileName));    }     /**     * Get the .java file of a class     */    public ClassFile getSourceFile(Identifier className) {        // The source file of an inner class is that of its outer class.        className = className.getTopName();        String fileName = className.toString() + ".java";        return sourcePath.getFile(makeName(fileName));    }     public ClassFile getSourceFile(String fileName) {        if (fileName.endsWith(".java")) {            return sourcePath.getFile(makeName(fileName));        }        return null;    }     public Enumeration getSourceFiles() {        return sourcePath.getFiles(pkg, ".java");    }     public Enumeration getBinaryFiles() {        return binaryPath.getFiles(pkg, ".class");    }     public String toString() {        if (pkg.equals("")) {            return "unnamed package";        }        return "package " + pkg;    }}