/*******************************************************************************
 * 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.jem.internal.proxy.ide;
/*
 *  $RCSfile: IDERegistration.java,v $
 *  $Revision: 1.11 $  $Date: 2005/08/24 20:39:06 $ 
 */

import java.net.URL;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.*;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.JavaRuntime;

import org.eclipse.jem.internal.proxy.core.*;
import org.eclipse.jem.internal.proxy.ide.awt.IDERegisterAWT;
import org.eclipse.jem.internal.proxy.remote.LocalFileConfigurationContributorController;
/**
 * This is the registration class for starting an IDERemote VM.
 */

public class IDERegistration {
	
	public static ProxyFactoryRegistry startAnImplementation(
		IConfigurationContributor[] contributors,
		boolean attachAWT,
		IProject project,
		String vmName,
		String pluginName,
		IProgressMonitor pm) throws CoreException {
			IDERegistration idereg = new IDERegistration(pluginName);
			return idereg.startImplementation(contributors, attachAWT, project, vmName, pm); 
		}
	
	public IDERegistration() {
	}
	
	private IDERegistration(String pluginName) {
		this.pluginName = pluginName;
	}
	private String pluginName;	

	/**
	 * This will create a remote VM and return an initialized REMProxyFactoryRegistry.
	 * Passed in are:
	 *      project: The project this is being started on. Must not be null and must be a JavaProject. (Currently ignored for IDE).
	 *      attachAWT: Should AWT be attached to this implementation.
	 *      contributors: Contributors to the configuration. Can be null.
	 *      pm: ProgressMonitor to use. Must not be null.
	 *      vmName: Name for the vm. Can be null.
	 */
	public ProxyFactoryRegistry startImplementation(
		IConfigurationContributor[] contributors,
		boolean attachAWT,
		IProject project,
		String vmName,
		IProgressMonitor pm)
		throws CoreException {

		URL[] classPaths = null;
		IJavaProject javaProject = null;
		if (project != null) {
			javaProject = JavaCore.create(project);
			// Add in the paths for the project	 	
			classPaths = ProxyLaunchSupport.convertStringPathsToURL(JavaRuntime.computeDefaultRuntimeClassPath(javaProject));
		} else
			classPaths = new URL[0];

		final IJavaProject jp = javaProject;

		final ProxyLaunchSupport.LaunchInfo launchInfo = new ProxyLaunchSupport.LaunchInfo();
		contributors = ProxyLaunchSupport.fillInLaunchInfo(contributors == null ? ProxyLaunchSupport.EMPTY_CONFIG_CONTRIBUTORS : contributors, launchInfo, jp != null ? jp.getElementName() : null);
		final LocalFileConfigurationContributorController controller = new LocalFileConfigurationContributorController(classPaths, new URL[3][], launchInfo);
		final IConfigurationContributor[] contribs = contributors;
		for (int i = 0; i < contributors.length; i++) {
			final int ii = i;
			// Run in safe mode so that anything happens we don't go away.
			Platform.run(new ISafeRunnable() {
				public void handleException(Throwable exception) {
					// Don't need to do anything. Platform.run logs it for me.
				}

				public void run() throws Exception {
					contribs[ii].initialize(launchInfo.getConfigInfo());
				}
			});				
		}			
		for (int i = 0; i < contributors.length; i++) {
			final int ii = i;
			// Run in safe mode so that anything happens we don't go away.
			Platform.run(new ISafeRunnable() {
				public void handleException(Throwable exception) {
					// Don't need to do anything. Platform.run logs it for me.
				}

				public void run() throws Exception {
					contribs[ii].contributeClasspaths(controller);
				}
			});				
		}
		classPaths = controller.getFinalClasspath();

		final BaseProxyFactoryRegistry registry = (BaseProxyFactoryRegistry) createIDEProxyFactoryRegistry(vmName, pluginName, classPaths);
		ProxyLaunchSupport.performExtensionRegistrations(registry, launchInfo);
		for (int i = 0; i < contribs.length; i++) {
			final int ii = i;
			// Run in safe mode so that anything happens we don't go away.
			Platform.run(new ISafeRunnable() {
				public void handleException(Throwable exception) {
					// Don't need to do anything. Platform.run logs it for me.
				}

				public void run() throws Exception {
					contribs[ii].contributeToRegistry(registry);
				}
			});	
		}

		return registry;
	}

	public static ProxyFactoryRegistry createIDEProxyFactoryRegistry(String aName, String aPluginName, URL[] otherURLs) {
		// Create the registry.
		IDEProxyFactoryRegistry registry =
			new IDEProxyFactoryRegistry(aName, IDEProxyFactoryRegistry.createSpecialLoader(aPluginName, otherURLs));
		initRegistry(registry);
		return registry;
	}

	public static ProxyFactoryRegistry createIDEProxyFactoryRegistry(String aName, ClassLoader loader) {
		// Create the registry.
		IDEProxyFactoryRegistry registry = new IDEProxyFactoryRegistry(aName, loader);
		initRegistry(registry);
		return registry;
	}

	private static void initRegistry(IDEProxyFactoryRegistry registry) {
		new IDEStandardBeanTypeProxyFactory(registry);
		new IDEStandardBeanProxyFactory(registry);
		new IDEMethodProxyFactory(registry);
		// Always support AWT for now
		IDERegisterAWT.registerAWT(registry);
	}
}
