/*******************************************************************************
 * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
 * 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:
 *     Doug Satchwell (Chase Technology Ltd) - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.jaxp.launching.internal.registry;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.wst.xsl.jaxp.launching.IProcessorInstall;
import org.eclipse.wst.xsl.jaxp.launching.IProcessorJar;
import org.eclipse.wst.xsl.jaxp.launching.JAXPRuntime;
import org.eclipse.wst.xsl.jaxp.launching.ProcessorInstall;
import org.eclipse.wst.xsl.jaxp.launching.internal.JAXPLaunchingPlugin;
import org.eclipse.wst.xsl.jaxp.launching.internal.ProcessorPreferences;

public class ProcessorRegistry
{
	private final List<ProcessorInstall> contributedInstalls = new ArrayList<ProcessorInstall>();
	private List<IProcessorInstall> userInstalls = new ArrayList<IProcessorInstall>();
	private IProcessorInstall defaultProcessor;
	private IProcessorInstall jreDefaultProcessor;
	private IProcessorInstall[] installs;

	public ProcessorRegistry()
	{
		initializeFromStorage();
	}

	private void initializeFromStorage()
	{
		// read from the registry
		ProcessorRegistryReader registryReader = new ProcessorRegistryReader();
		registryReader.addConfigs(this);
		// find the jre default
		for (Iterator<ProcessorInstall> iter = contributedInstalls.iterator(); iter.hasNext();)
		{
			IProcessorInstall install = (IProcessorInstall) iter.next();
			if (install.getId().equals(JAXPRuntime.JRE_DEFAULT_PROCESSOR_ID))
			{
				jreDefaultProcessor = install;
				break;
			}
		}
		// read from the preferences
		addPersistedVMs();
	}

	private void addPersistedVMs()
	{
		// Try retrieving the VM preferences from the preference store
		String vmXMLString = JAXPLaunchingPlugin.getDefault().getPluginPreferences().getString(JAXPRuntime.PREF_PROCESSOR_XML);

		// If the preference was found, load VMs from it into memory
		if (vmXMLString.length() > 0)
		{
			try
			{
				ByteArrayInputStream inputStream = new ByteArrayInputStream(vmXMLString.getBytes());
				ProcessorPreferences prefs = ProcessorPreferences.fromXML(inputStream);
				String defaultProcessorId = prefs.getDefaultProcessorId();
				userInstalls = prefs.getProcessors();
				for (Iterator<IProcessorInstall> iter = userInstalls.iterator(); iter.hasNext();)
				{
					IProcessorInstall install = (IProcessorInstall) iter.next();
					if (install.getId().equals(defaultProcessorId))
					{
						defaultProcessor = install;
					}
				}
				if (defaultProcessor == null)
				{
					for (Iterator<ProcessorInstall> iter = contributedInstalls.iterator(); iter.hasNext();)
					{
						IProcessorInstall install = (IProcessorInstall) iter.next();
						if (defaultProcessor == null && install.getId().equals(defaultProcessorId))
						{
							defaultProcessor = install;
						}
					}
				}
			}
			catch (CoreException e)
			{
				JAXPLaunchingPlugin.log(e);
			}
		}
		// make the JRE the default default
		if (defaultProcessor == null)
		{
			defaultProcessor = jreDefaultProcessor;
		}
	}

	public void addProcessor(String bundleId, String id, String label, String processorTypeId, String classpath, String debuggerId, String supports)
	{
		IProcessorJar[] jars = ProcessorInstall.createJars(bundleId, classpath);
		contributedInstalls.add(new ProcessorInstall(id, label, processorTypeId, jars, debuggerId, supports, true));
	}

	public void addProcessor(IProcessorInstall install)
	{
		if (!install.isContributed())
			userInstalls.add(install);
		IProcessorInstall[] newinstalls = new IProcessorInstall[installs.length + 1];
		System.arraycopy(installs, 0, newinstalls, 0, installs.length);
		newinstalls[installs.length] = install;
		installs = newinstalls;
	}

	public void removeProcessor(int index)
	{
		IProcessorInstall removed = installs[index];
		if (!removed.isContributed())
			userInstalls.remove(removed);
		IProcessorInstall[] newinstalls = new IProcessorInstall[installs.length - 1];
		System.arraycopy(installs, 0, newinstalls, 0, index);
		System.arraycopy(installs, index + 1, newinstalls, index, newinstalls.length - index);
		installs = newinstalls;
	}

	public IProcessorInstall[] getProcessors()
	{
		if (installs == null)
		{
			installs = new IProcessorInstall[contributedInstalls.size() + userInstalls.size()];
			int startIndex = 0;
			for (int i = 0; i < contributedInstalls.size(); i++)
			{
				installs[i] = (IProcessorInstall) contributedInstalls.get(i);
				startIndex = i + 1;
			}
			for (int i = 0; i < userInstalls.size(); i++)
			{
				installs[startIndex + i] = (IProcessorInstall) userInstalls.get(i);
			}
		}
		return installs;
	}

	public IProcessorInstall[] getProcessors(String id)
	{
		IProcessorInstall[] installs = getProcessors();
		List<IProcessorInstall> result = new ArrayList<IProcessorInstall>();
		for (IProcessorInstall type : installs)
		{
			if (type.getProcessorType().getId().equals(id))
				result.add(type);
		}
		return (IProcessorInstall[]) result.toArray(new IProcessorInstall[0]);
	}

	public void setDefaultProcessor(IProcessorInstall defaultInstall)
	{
		defaultProcessor = defaultInstall;
	}

	public IProcessorInstall getDefaultProcessor()
	{
		return defaultProcessor;
	}

	public IProcessorInstall getJREDefaultProcessor()
	{
		return jreDefaultProcessor;
	}

	public IProcessorInstall[] getContributedProcessors()
	{
		return (IProcessorInstall[]) contributedInstalls.toArray(new IProcessorInstall[0]);
	}
}
