/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpdt.internal.compiler.batch; import java.io.File; import net.sourceforge.phpdt.core.compiler.CharOperation; import net.sourceforge.phpdt.internal.compiler.env.INameEnvironment; import net.sourceforge.phpdt.internal.compiler.env.NameEnvironmentAnswer; //import net.sourceforge.phpdt.internal.compiler.util.SuffixConstants; public class FileSystem implements INameEnvironment, SuffixConstants { Classpath[] classpaths; String[] knownFileNames; interface Classpath { NameEnvironmentAnswer findClass(char[] typeName, String qualifiedPackageName, String qualifiedBinaryFileName); boolean isPackage(String qualifiedPackageName); /** * This method resets the environment. The resulting state is equivalent * to a new name environment without creating a new object. */ void reset(); } /* * classPathNames is a collection is Strings representing the full path of * each class path initialFileNames is a collection is Strings, the trailing * '.java' will be removed if its not already. */ // public FileSystem(String[] classpathNames, String[] initialFileNames, // String encoding) { // this(classpathNames, initialFileNames, encoding, null); // } // public FileSystem(String[] classpathNames, String[] initialFileNames, // String encoding, int[] classpathDirectoryModes) { // int classpathSize = classpathNames.length; // this.classpaths = new Classpath[classpathSize]; // String[] pathNames = new String[classpathSize]; // int problemsOccured = 0; // for (int i = 0; i < classpathSize; i++) { // // try { // File file = new File(convertPathSeparators(classpathNames[i])); // if (file.isDirectory()) { // if (file.exists()) { // if (classpathDirectoryModes == null) { // this.classpaths[i] = new ClasspathDirectory(file, // encoding); // } else { // this.classpaths[i] = new ClasspathDirectory(file, // encoding, classpathDirectoryModes[i]); // } // pathNames[i] = ((ClasspathDirectory) this.classpaths[i]).path; // } // } else { // //String lowercaseClasspathName = classpathNames[i].toLowerCase(); // // if (lowercaseClasspathName.endsWith(SUFFIX_STRING_jar) // // || lowercaseClasspathName.endsWith(SUFFIX_STRING_zip)) { // // this.classpaths[i] = this.getClasspathJar(file); // will // // throw an IOException if file does not exist // // pathNames[i] = classpathNames[i].substring(0, // // classpathNames[i].lastIndexOf('.')); // // } // } // // } catch (IOException e) { // // this.classpaths[i] = null; // // } // if (this.classpaths[i] == null) // problemsOccured++; // } // if (problemsOccured > 0) { // Classpath[] newPaths = new Classpath[classpathSize // - problemsOccured]; // String[] newNames = new String[classpathSize - problemsOccured]; // for (int i = 0, current = 0; i < classpathSize; i++) // if (this.classpaths[i] != null) { // newPaths[current] = this.classpaths[i]; // newNames[current++] = pathNames[i]; // } // classpathSize = newPaths.length; // this.classpaths = newPaths; // pathNames = newNames; // } // // this.knownFileNames = new String[initialFileNames.length]; // for (int i = initialFileNames.length; --i >= 0;) { // String fileName = initialFileNames[i]; // String matchingPathName = null; // if (fileName.lastIndexOf(".") != -1) //$NON-NLS-1$ // fileName = fileName.substring(0, fileName.lastIndexOf('.')); // remove // // trailing // // ".java" // // fileName = convertPathSeparators(fileName); // for (int j = 0; j < classpathSize; j++) // if (fileName.startsWith(pathNames[j])) // matchingPathName = pathNames[j]; // if (matchingPathName == null) // this.knownFileNames[i] = fileName; // leave as is... // else // this.knownFileNames[i] = fileName.substring(matchingPathName // .length()); // } // } public void cleanup() { for (int i = 0, max = this.classpaths.length; i < max; i++) this.classpaths[i].reset(); } // private String convertPathSeparators(String path) { // return File.separatorChar == '/' ? path.replace('\\', '/') : path // .replace('/', '\\'); // } // private NameEnvironmentAnswer findClass(String qualifiedTypeName, char[] // typeName){ // for (int i = 0, length = this.knownFileNames.length; i < length; i++) // if (qualifiedTypeName.equals(this.knownFileNames[i])) // return null; // looking for a file which we know was provided at the // beginning of the compilation // // String qualifiedBinaryFileName = qualifiedTypeName + SUFFIX_STRING_class; // String qualifiedPackageName = // qualifiedTypeName.length() == typeName.length // ? "" //$NON-NLS-1$ // : qualifiedBinaryFileName.substring(0, qualifiedTypeName.length() - // typeName.length - 1); // String qp2 = File.separatorChar == '/' ? qualifiedPackageName : // qualifiedPackageName.replace('/', File.separatorChar); // if (qualifiedPackageName == qp2) { // for (int i = 0, length = this.classpaths.length; i < length; i++) { // NameEnvironmentAnswer answer = this.classpaths[i].findClass(typeName, // qualifiedPackageName, qualifiedBinaryFileName); // if (answer != null) return answer; // } // } else { // String qb2 = qualifiedBinaryFileName.replace('/', File.separatorChar); // for (int i = 0, length = this.classpaths.length; i < length; i++) { // Classpath p = this.classpaths[i]; // NameEnvironmentAnswer answer = (p instanceof ClasspathJar) // ? p.findClass(typeName, qualifiedPackageName, qualifiedBinaryFileName) // : p.findClass(typeName, qp2, qb2); // if (answer != null) return answer; // } // } // return null; // } public NameEnvironmentAnswer findType(char[][] compoundName) { // if (compoundName != null) // return findClass( // new String(CharOperation.concatWith(compoundName, '/')), // compoundName[compoundName.length - 1]); return null; } public NameEnvironmentAnswer findType(char[] typeName, char[][] packageName) { // if (typeName != null) // return findClass( // new String(CharOperation.concatWith(packageName, typeName, '/')), // typeName); return null; } // public ClasspathJar getClasspathJar(File file) throws IOException { // return new ClasspathJar(new ZipFile(file), true); // } public boolean isPackage(char[][] compoundName, char[] packageName) { String qualifiedPackageName = new String(CharOperation.concatWith( compoundName, packageName, '/')); String qp2 = File.separatorChar == '/' ? qualifiedPackageName : qualifiedPackageName.replace('/', File.separatorChar); if (qualifiedPackageName == qp2) { for (int i = 0, length = this.classpaths.length; i < length; i++) if (this.classpaths[i].isPackage(qualifiedPackageName)) return true; } // else { // for (int i = 0, length = this.classpaths.length; i < length; i++) { // Classpath p = this.classpaths[i]; // if ((p instanceof ClasspathJar) ? p.isPackage(qualifiedPackageName) : // p.isPackage(qp2)) // return true; // } // } return false; } }