--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2001, 2002 International Business Machines Corp. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+package net.sourceforge.phpdt.internal.compiler.batch;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import net.sourceforge.phpdt.internal.compiler.classfmt.ClassFileReader;
+import net.sourceforge.phpdt.internal.compiler.env.NameEnvironmentAnswer;
+
+public class ClasspathJar implements FileSystem.Classpath {
+
+ZipFile zipFile;
+Hashtable packageCache;
+boolean closeZipFileAtEnd;
+
+public ClasspathJar(File file) throws IOException {
+ this(new ZipFile(file), true);
+}
+public ClasspathJar(ZipFile zipFile, boolean closeZipFileAtEnd) throws IOException {
+ this.zipFile = zipFile;
+ this.packageCache = null;
+ this.closeZipFileAtEnd = closeZipFileAtEnd;
+}
+public NameEnvironmentAnswer findClass(char[] typeName, String qualifiedPackageName, String qualifiedBinaryFileName) {
+ if (!isPackage(qualifiedPackageName)) return null; // most common case
+
+ try {
+ ClassFileReader reader = ClassFileReader.read(zipFile, qualifiedBinaryFileName);
+ if (reader != null) return new NameEnvironmentAnswer(reader);
+ } catch (Exception e) {} // treat as if class file is missing
+ return null;
+}
+public boolean isPackage(String qualifiedPackageName) {
+ if (packageCache != null)
+ return packageCache.containsKey(qualifiedPackageName);
+
+ this.packageCache = new Hashtable(41);
+ packageCache.put("", ""); //$NON-NLS-1$ //$NON-NLS-2$
+
+ nextEntry : for (Enumeration e = zipFile.entries(); e.hasMoreElements(); ) {
+ String fileName = ((ZipEntry) e.nextElement()).getName();
+
+ // add the package name & all of its parent packages
+ int last = fileName.lastIndexOf('/');
+ while (last > 0) {
+ // extract the package name
+ String packageName = fileName.substring(0, last);
+ if (packageCache.containsKey(packageName))
+ continue nextEntry;
+ packageCache.put(packageName, packageName);
+ last = packageName.lastIndexOf('/');
+ }
+ }
+ return packageCache.containsKey(qualifiedPackageName);
+}
+public void reset() {
+ if (zipFile != null && closeZipFileAtEnd) {
+ try { zipFile.close(); } catch(IOException e) {}
+ }
+ this.packageCache = null;
+}
+public String toString() {
+ return "Classpath for jar file " + zipFile; //$NON-NLS-1$
+}
+}
\ No newline at end of file