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