/*******************************************************************************
 * Copyright (c) 2001, 2005 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.j2ee.commonarchivecore.internal.util;


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;

import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.RuntimeClasspathEntry;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.RuntimeClasspathEntryImpl;

import com.ibm.icu.util.StringTokenizer;


public class ClasspathUtil {

	public static void processManifest(String inPath, List rtClasspath, Set processedPaths) {
		ArrayList paths = getManifestPaths(inPath);
		for (int i = 0; i < paths.size(); i++) {
			RuntimeClasspathEntry entry = (RuntimeClasspathEntry) paths.get(i);
			if (!processedPaths.contains(entry)) {
				processedPaths.add(entry);
				rtClasspath.add(entry);
				processManifest(entry.getAbsolutePath(), rtClasspath, processedPaths);
			}
		}
	}

	protected static RuntimeClasspathEntry createRuntimeClasspathEntry(String absolutePath, String manifestValue) {
		RuntimeClasspathEntry entry = new RuntimeClasspathEntryImpl();
		entry.setAbsolutePath(absolutePath);
		entry.setManifestValue(manifestValue);
		return entry;
	}

	protected static ArrayList getManifestPaths(String path) {
		ArrayList manifestPaths = new ArrayList();
		File f = new File(path);
		if (f.exists()) {
			if (f.isDirectory()) {
				File manifestFile = new File(path + File.separator + "META-INF" + File.separator + "MANIFEST.MF"); //$NON-NLS-1$ //$NON-NLS-2$
				if (manifestFile.exists()) {
					FileInputStream inputStream = null;
					try {
						inputStream = new FileInputStream(manifestFile);
						Manifest manifest = new Manifest(inputStream);
						manifestPaths = getManifestClassPaths(manifest, f.getParent());
					} catch (IOException e) {
						//Ignore
					} finally {
						if (null != inputStream) {
							try {
								inputStream.close();
							} catch (IOException ex) {
								Logger.getLogger().logError(ex);
							}
						}
					}
				}
			} else {
				JarFile jarFile = null;
				try {
					jarFile = new JarFile(f);
					Manifest manifest = jarFile.getManifest();
					if (manifest != null)
						manifestPaths = getManifestClassPaths(manifest, f.getParent());
				} catch (IOException e) {
					//Ignore
				} finally {
					if (jarFile != null)
						try {
							jarFile.close();
						} catch (IOException ex) {
							//Ignore
						}
				}
			}
		}
		return manifestPaths;
	}

	protected static ArrayList getManifestClassPaths(Manifest manifest, String archivePath) {
		ArrayList pathList = new ArrayList();
		Attributes main = manifest.getMainAttributes();
		String classPath = main.getValue(Attributes.Name.CLASS_PATH);
		if (classPath != null) {
			StringTokenizer st = new StringTokenizer(classPath, " "); //$NON-NLS-1$
			while (st.hasMoreTokens()) {
				String token = st.nextToken();
				String path = archivePath + File.separator + token;
				path = normalizePath(path);
				if (new File(path).exists()) {
					pathList.add(createRuntimeClasspathEntry(path, token));
				}
			}
		}
		return pathList;
	}

	public static String normalizePath(String path) {
		File f = new File(path);
		try {
			f = f.getCanonicalFile();
		} catch (Exception ex) {
			//Ignore
		}
		return f.getPath();
	}
}
