/*******************************************************************************
 * Copyright (c) 2005, 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jee.archive.internal;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jst.jee.archive.AbstractArchiveLoadAdapter;
import org.eclipse.jst.jee.archive.ArchiveModelLoadException;
import org.eclipse.jst.jee.archive.IArchiveResource;



public class ZipFileArchiveLoadAdapterImpl extends AbstractArchiveLoadAdapter {
	protected ZipFile zipFile;

	public ZipFileArchiveLoadAdapterImpl() {
		super();
	}

	public ZipFileArchiveLoadAdapterImpl(ZipFile zipFile) {
		super();
		this.zipFile = zipFile;
	}

	public void close() {
		super.close();
		try {
			getZipFile().close();
		} catch (IOException e) {
			// Ignore
		}
	}

	public boolean containsArchiveResource(IPath resourcePath) {
		ZipEntry entry = getZipFile().getEntry(resourcePath.toString());
		return entry != null;
	}
	
	public IArchiveResource getArchiveResource(IPath filePath) {
		ZipEntry entry = getZipFile().getEntry(filePath.toString());
		IArchiveResource aFile = null;
		if (entry != null) {
			aFile = createFile(entry);
		}
		return aFile;
	}

	public java.util.List getArchiveResources() {
		List list = new ArrayList();
		Enumeration entries = getZipFile().entries();
		while (entries.hasMoreElements()) {
			ZipEntry entry = (ZipEntry) entries.nextElement();
			IArchiveResource aFile = createFile(entry);
			list.add(aFile);
		}
		return list;
	}

	protected IArchiveResource createFile(ZipEntry entry) {
		IPath path = new Path(entry.getName()).makeRelative();
		IArchiveResource aFile = null;
		if (!entry.isDirectory()) {
			aFile = createFile(path);
			aFile.setSize(entry.getSize());
			aFile.setLastModified(entry.getTime());
		} else { // always include directories
			aFile = createDirectory(path);
			aFile.setSize(entry.getSize());
			aFile.setLastModified(entry.getTime());
		}
		return aFile;
	}

	public java.io.InputStream getInputStream(IArchiveResource aFile) throws IOException, FileNotFoundException {
		try {
			IPath path = aFile.getPath();
			String uri = path.toString();
			ZipEntry entry = getZipFile().getEntry(uri);
			if (entry == null) {
				// this is a hack, but zip files are sensitive to the difference
				// between '/' and '\\'
				// so the hack is to try all combinations to see if any exist
				char[] chars = uri.toCharArray();
				int[] slashIndices = new int[chars.length];
				int slashCount = 0;
				for (int i = 0; i < uri.length(); i++) {
					if (chars[i] == '/' || chars[i] == '\\') {
						slashIndices[slashCount] = i;
						slashCount++;
					}
				}
				int slashPow = (int) Math.pow(2, slashCount);
				boolean foundIt = false;
				for (int i = 0; i < slashPow && !foundIt; i++) {
					for (int j = 0; j < slashCount; j++) {
						if ((i >> j & 1) == 1) {
							chars[slashIndices[j]] = '/';
						} else {
							chars[slashIndices[j]] = '\\';
						}
					}
					entry = getZipFile().getEntry(new String(chars));
					if (entry != null) {
						foundIt = true;
					}
				}
				if (entry == null) {
					throw new FileNotFoundException(uri);
				}
			}
			return new java.io.BufferedInputStream(getZipFile().getInputStream(entry));
		} catch (IllegalStateException zipClosed) {
			throw new IOException(zipClosed.toString());
		}
	}

	public java.util.zip.ZipFile getZipFile() {
		return zipFile;
	}

	public void setZipFile(java.util.zip.ZipFile newZipFile) {
		zipFile = newZipFile;
	}
	
	public String toString() {
		return zipFile.getName();
	}

	public boolean containsModelObject(IPath modelObjectPath) {
		return false;
	}

	public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException {
		throw new ArchiveModelLoadException("Simple Zip Archives have no model objects."); //$NON-NLS-1$
	}

}
