/*******************************************************************************
 * Copyright (c) 2005 The Regents of the University of California. 
 * This material was produced under U.S. Government contract W-7405-ENG-36 
 * for Los Alamos National Laboratory, which is operated by the University 
 * of California for the U.S. Department of Energy. The U.S. Government has 
 * rights to use, reproduce, and distribute this software. NEITHER THE 
 * GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR 
 * ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified 
 * to produce derivative works, such modified software should be clearly marked, 
 * so as not to confuse it with the version available from LANL.
 * 
 * Additionally, 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
 * 
 * LA-CC 04-115
 *******************************************************************************/
package org.eclipse.ptp.internal.core;

import java.io.File;
import java.util.ArrayList;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.ptp.core.IModelManager;
import org.eclipse.ptp.core.PTPCorePlugin;
import org.eclipse.ptp.core.elementcontrols.IPUniverseControl;
import org.eclipse.ptp.core.elementcontrols.IResourceManagerControl;
import org.eclipse.ptp.core.elements.IPJob;
import org.eclipse.ptp.core.elements.IPUniverse;
import org.eclipse.ptp.core.elements.IResourceManager;
import org.eclipse.ptp.core.elements.events.IResourceManagerErrorEvent;
import org.eclipse.ptp.core.events.INewResourceManagerEvent;
import org.eclipse.ptp.core.events.IRemoveResourceManagerEvent;
import org.eclipse.ptp.core.listeners.IModelManagerChildListener;
import org.eclipse.ptp.internal.core.elements.PUniverse;
import org.eclipse.ptp.internal.core.events.NewResourceManagerEvent;
import org.eclipse.ptp.internal.core.events.RemoveResourceManagerEvent;
import org.eclipse.ptp.internal.rmsystem.ResourceManagerPersistence;
import org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory;
import org.eclipse.ptp.rmsystem.IResourceManagerFactory;

public class ModelManager implements IModelManager {
	private class RMStartupJob extends Job {
		private IResourceManagerControl resourceManager;
		
		public RMStartupJob(IResourceManagerControl rm) {
			super("Starting Resource Manager: " + rm.getName());
			resourceManager = rm;
		}

		@Override
		protected IStatus run(IProgressMonitor monitor) {
			try {
	            try {
	            	monitor.beginTask("Starting resource manager", 100);
	            	resourceManager.startUp(new SubProgressMonitor(monitor, 100));
	            } catch (CoreException e) {
	                return e.getStatus();
	            }
	            if (monitor.isCanceled()) {
	                return Status.CANCEL_STATUS;
	            }
	            return Status.OK_STATUS;
			} finally {
				monitor.done();
			}
        }
		
	}
	
	private IResourceManagerFactory[] resourceManagerFactories;
	
	private final ListenerList resourceManagerListeners = new ListenerList();

	// protected IPMachine machine = null;
	protected IPJob processRoot = null;

	protected IPUniverseControl universe = new PUniverse();
	protected ILaunchConfiguration config = null;
	
	public ModelManager() {
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#addListener(org.eclipse.ptp.core.listeners.IModelManagerChildListener)
	 */
	public void addListener(IModelManagerChildListener listener) {
		resourceManagerListeners.add(listener);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#addResourceManager(org.eclipse.ptp.core.elementcontrols.IResourceManagerControl)
	 */
	public synchronized void addResourceManager(IResourceManagerControl rm) {
		universe.addResourceManager(rm);
		fireNewResourceManager(rm);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#addResourceManagers(org.eclipse.ptp.core.elementcontrols.IResourceManagerControl[])
	 */
	public synchronized void addResourceManagers(IResourceManagerControl[] rms) {
		for (IResourceManagerControl rm : rms) {
			addResourceManager(rm);
		}
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#getPTPConfiguration()
	 */
	public ILaunchConfiguration getPTPConfiguration() {
		return config;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#getResourceManagerFactories()
	 */
	public IResourceManagerFactory[] getResourceManagerFactories()
	{
		if (resourceManagerFactories != null) {
			return resourceManagerFactories;
		}
		
		final ArrayList<AbstractResourceManagerFactory> factoryList = new ArrayList<AbstractResourceManagerFactory>();
	
		IExtensionRegistry registry = Platform.getExtensionRegistry();
		IExtensionPoint extensionPoint = registry.getExtensionPoint("org.eclipse.ptp.core.resourcemanager");
		final IExtension[] extensions = extensionPoint.getExtensions();
		
		for (int iext = 0; iext < extensions.length; ++iext) {
			final IExtension ext = extensions[iext];
			
			final IConfigurationElement[] elements = ext.getConfigurationElements();
		
			for (int i=0; i< elements.length; i++)
			{
				IConfigurationElement ce = elements[i];
				try {
					AbstractResourceManagerFactory factory = (AbstractResourceManagerFactory) ce.createExecutableExtension("class");
					factory.setId(ce.getAttribute("id"));
					factoryList.add(factory);
				} catch (CoreException e) {
					PTPCorePlugin.log(e);
				}
			}
		}
		resourceManagerFactories =
			(IResourceManagerFactory[]) factoryList.toArray(
					new IResourceManagerFactory[factoryList.size()]);
	
		return resourceManagerFactories;
	}
	
	/**
	 * Find the resource manager factory corresponding to the supplied ID.
	 * @param id
	 * @return the requested resource manager factory
	 */
	public IResourceManagerFactory getResourceManagerFactory(String id)
	{
		IResourceManagerFactory[] factories = getResourceManagerFactories();
		for (int i=0; i<factories.length; i++)
		{
			if (factories[i].getId().equals(id)) return factories[i];
		}
		
		throw new RuntimeException("Unable to find resource manager factory");
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelPresentation#getUniverse()
	 */
	public IPUniverse getUniverse() {
		return universe;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.elements.listeners.IResourceManagerListener#handleEvent(org.eclipse.ptp.core.elements.events.IResourceManagerErrorEvent)
	 */
	public void handleEvent(IResourceManagerErrorEvent e) {
		// Ignore - handled by listener on RM		
	}
	
	public void loadResourceManagers() throws CoreException {
        ResourceManagerPersistence rmp = new ResourceManagerPersistence();
        rmp.loadResourceManagers(getResourceManagersFile(), getResourceManagerFactories());
        IResourceManagerControl[] resourceManagers = rmp.getResourceManagerControls();
        IResourceManagerControl[] rmsNeedStarting = rmp.getResourceManagerControlsNeedStarting();
        addResourceManagers(resourceManagers);
        startResourceManagers(rmsNeedStarting);
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#removeListener(org.eclipse.ptp.core.listeners.IModelManagerChildListener)
	 */
	public void removeListener(IModelManagerChildListener listener) {
		resourceManagerListeners.remove(listener);
	}

    /* (non-Javadoc)
     * @see org.eclipse.ptp.core.IModelManager#removeResourceManager(org.eclipse.ptp.core.elementcontrols.IResourceManagerControl)
     */
    public synchronized void removeResourceManager(IResourceManagerControl rm) {
		universe.removeResourceManager(rm);
		fireRemoveResourceManager(rm);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#removeResourceManagers(org.eclipse.ptp.core.elementcontrols.IResourceManagerControl[])
	 */
	public synchronized void removeResourceManagers(IResourceManagerControl[] rms) {
		for (IResourceManagerControl rm : rms) {
			removeResourceManager(rm);
		}
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#saveResourceManagers()
	 */
	public void saveResourceManagers() {
		ResourceManagerPersistence.saveResourceManagers(getResourceManagersFile(),
				universe.getResourceManagerControls());
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#setPTPConfiguration(org.eclipse.debug.core.ILaunchConfiguration)
	 */
	public void setPTPConfiguration(ILaunchConfiguration config) {
		this.config = config;
	}

    /* (non-Javadoc)
     * @see org.eclipse.ptp.core.IModelManager#shutdown()
     */
    public void shutdown() throws CoreException {
		saveResourceManagers();
		stopResourceManagers();
		shutdownResourceManagers();
		resourceManagerListeners.clear();
	}

    /**
	 * shuts down all of the resource managers.
	 */
	private synchronized void shutdownResourceManagers() {
		IResourceManagerControl[] resourceManagers = universe.getResourceManagerControls();
		for (int i = 0; i<resourceManagers.length; ++i) {
			resourceManagers[i].dispose();
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#start()
	 */
	public void start() throws CoreException {
		loadResourceManagers();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ptp.core.IModelManager#stopResourceManagers()
	 */
	public void stopResourceManagers() throws CoreException {
		IResourceManager[] resourceManagers = universe.getResourceManagers();
		for (int i = 0; i<resourceManagers.length; ++i) {
			resourceManagers[i].shutdown();
		}
	}

	/**
	 * @param rm
	 */
	private void fireNewResourceManager(final IResourceManager rm) {
		INewResourceManagerEvent event = 
			new NewResourceManagerEvent(this, rm);
		for (Object listener : resourceManagerListeners.getListeners()) {
			((IModelManagerChildListener)listener).handleEvent(event);
		}
	}

	/**
	 * @param rm
	 */
	private void fireRemoveResourceManager(final IResourceManager rm) {
		IRemoveResourceManagerEvent event = 
			new RemoveResourceManagerEvent(this, rm);
		for (Object listener : resourceManagerListeners.getListeners()) {
			((IModelManagerChildListener)listener).handleEvent(event);
		}
	}


	/**
	 * @return
	 */
	private File getResourceManagersFile() {
		final PTPCorePlugin plugin = PTPCorePlugin.getDefault();
		return plugin.getStateLocation().append("resourceManagers.xml").toFile();
	}

	/**
	 * @param rmsNeedStarting
	 * @throws CoreException
	 */
	private void startResourceManagers(IResourceManagerControl[] rmsNeedStarting) throws CoreException {
        for (final IResourceManagerControl rm : rmsNeedStarting) {
            Job job = new RMStartupJob(rm);
            job.schedule();
        }
    }

}