/*******************************************************************************
 * 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.internal.launching.registry;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.wst.xsl.internal.launching.DebuggerDescriptor;
import org.eclipse.wst.xsl.internal.launching.LaunchingPlugin;

public class DebuggerRegistryReader extends AbstractRegistryReader
{
	public static final String TAG_DEBUGGER = "debugger";
	public static final String ATT_ID = "id";
	public static final String ATT_CLASSNAME = "className";
	public static final String ATT_CLASSPATH = "classpath";
	public static final String ATT_NAME = "name";
	public static final String ATT_PROCESSOR_TYPE_ID = "processorTypeId";

	private DebuggerRegistry registry;

	@Override
	protected boolean readElement(IConfigurationElement element)
	{
		if (!element.getName().equals(TAG_DEBUGGER))
			return false;

		String id = element.getAttribute(ATT_ID);
		if (id == null)
		{
			logMissingAttribute(element, ATT_ID);
			return true;
		}

		String className = element.getAttribute(ATT_CLASSNAME);
		if (className == null)
		{
			logMissingAttribute(element, ATT_CLASSNAME);
			return true;
		}

		String classpath = element.getAttribute(ATT_CLASSPATH);
		if (classpath == null)
		{
			logMissingAttribute(element, ATT_CLASSPATH);
			return true;
		}

		String[] entries = classpath.split(";");
		for (int i = 0; i < entries.length; i++)
		{
			String string = entries[i];
			entries[i] = string.trim();
		}

		String name = element.getAttribute(ATT_NAME);
		if (name == null)
		{
			logMissingAttribute(element, ATT_NAME);
			return true;
		}

		String processorTypeId = element.getAttribute(ATT_PROCESSOR_TYPE_ID);
		if (processorTypeId == null)
		{
			logMissingAttribute(element, ATT_PROCESSOR_TYPE_ID);
			return true;
		}

		registry.addDebugger(new DebuggerDescriptor(id, element.getContributor().getName(), className, entries, name, processorTypeId));

		return true;
	}

	public void readElement(DebuggerRegistry registry, IConfigurationElement element)
	{
		this.registry = registry;
		readElement(element);
	}

	public void addConfigs(DebuggerRegistry registry)
	{
		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
		this.registry = registry;
		readRegistry(extensionRegistry, LaunchingPlugin.PLUGIN_ID, "debugger");
	}
}
