/*******************************************************************************
 * Copyright (c) 2004, 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.jem.internal.proxy.core;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.logging.Level;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.pde.core.plugin.*;

/**
 * Contribute to classpath PDE entries that are needed for a launch.
 * <p>
 * This is a special class that should not be referenced directly from code. Reference it through the interface that it implements.
 * 
 * @see org.eclipse.jem.internal.proxy.core.IPDEContributeClasspath
 * @since 1.0.2
 */
class PDEContributeClasspath implements IPDEContributeClasspath {

	public void getPDEContributions(IConfigurationContributionController controller, IConfigurationContributionInfo info) throws CoreException {
		if (!info.getPluginIds().isEmpty()) {
			Collection pluginIds = info.getPluginIds().keySet();

			IPluginModelBase[] allModels = PluginRegistry.getAllModels();
			List fragments = new ArrayList();
			for (int i = 0; i < allModels.length; i++) {
				if (allModels[i].isFragmentModel()) {
					fragments.add(allModels[i]);
				}
			}

			for (Iterator itr = fragments.iterator(); itr.hasNext();) {
				IFragmentModel fragmentModel = (IFragmentModel) itr.next();
				IFragment fragment = fragmentModel.getFragment();
				if (pluginIds.contains(fragment.getPluginId())) {
					// We'll do a cheat for now and assume fragment is for same version of plugin. PDECore actually
					// checks the version of the fragment against the version of the plugin to see they are for each
					// other, but we'll just assume they are for now. Change this later if we actually do run into this case.
					IResource resource = fragment.getModel().getUnderlyingResource();
					if (resource != null) {
						IProject fragProject = resource.getProject();
						if (fragProject.hasNature(JavaCore.NATURE_ID)) {
							controller.contributeProject(fragProject);
						}
						continue;
					}

					IPluginLibrary[] libraries = fragment.getLibraries();
					for (int j = 0; j < libraries.length; j++) {
						IPluginLibrary library = libraries[j];
						String name = library.getName();
						String expandedName = expandLibraryName(name);

						IPluginModelBase model = library.getPluginModel();
						URL url = getPath(model, expandedName);
						if (url != null)
							controller.contributeClasspath(url, IConfigurationContributionController.APPEND_USER_CLASSPATH);
					}
				}
			}
		}

		return;
	}

	private URL getPath(IPluginModelBase model, String libraryName) {
		try {
			IResource resource = model.getUnderlyingResource();
			if (resource != null) {
				IResource jarFile = resource.getProject().findMember(libraryName);
				if (jarFile != null)
					return jarFile.getFullPath().toFile().toURL();
			} else {
				File file = new File(model.getInstallLocation(), libraryName);
				if (file.exists())
					return file.toURL();
			}
		} catch (MalformedURLException e) {
			ProxyPlugin.getPlugin().getLogger().log(e, Level.WARNING);
		}
		return null;
	}

	/**
	 * This utility method was originally copied from method of same name, in org.eclipse.pde.internal.core.ClasspathUtilCore. It was not API, and
	 * seems safe enough to copy here. But, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=182555 
	 * in case there is ever an API method provided to codify these Eclipse rules. 
	 */
	private static String expandLibraryName(String source) {
		if (source == null || source.length() == 0)
			return ""; //$NON-NLS-1$
		if (source.indexOf("$ws$") != -1) //$NON-NLS-1$
			source = source.replaceAll("\\$ws\\$", //$NON-NLS-1$
					"ws" + IPath.SEPARATOR + TargetPlatform.getWS()); //$NON-NLS-1$
		if (source.indexOf("$os$") != -1) //$NON-NLS-1$
			source = source.replaceAll("\\$os\\$", //$NON-NLS-1$
					"os" + IPath.SEPARATOR + TargetPlatform.getOS()); //$NON-NLS-1$
		if (source.indexOf("$nl$") != -1) //$NON-NLS-1$
			source = source.replaceAll("\\$nl\\$", //$NON-NLS-1$
					"nl" + IPath.SEPARATOR + TargetPlatform.getNL()); //$NON-NLS-1$
		if (source.indexOf("$arch$") != -1) //$NON-NLS-1$
			source = source.replaceAll("\\$arch\\$", //$NON-NLS-1$
					"arch" + IPath.SEPARATOR + TargetPlatform.getOSArch()); //$NON-NLS-1$
		return source;
	}
}
