/**********************************************************************
 * Copyright (c) 2002,2003 QNX Software Systems Ltd. and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Common Public License v0.5
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v05.html
 * 
 * Contributors: 
 * QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.core;

import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICOwner;
import org.eclipse.cdt.core.ICOwnerInfo;
import org.eclipse.core.resources.IProject;
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.IStatus;
import org.eclipse.core.runtime.Status;

public class COwner implements ICOwnerInfo {
	String ownerID;
	String fPlatform;
	IExtension extension;
	
	public COwner(String id) throws CoreException {
		ownerID = id;
		IExtensionPoint extpoint = CCorePlugin.getDefault().getDescriptor().getExtensionPoint("CProject");
		extension =  extpoint.getExtension(ownerID);
		
		if (extension == null) {
			IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1, "Invalid CDTProject owner ID", (Throwable)null);
			throw new CoreException(status);
		}
	}

	public String getID() {
		return ownerID;
	}
	
	public String getName() {
		return extension == null ? null : extension.getLabel();
	}

	public String getPlatform() {
		if ( fPlatform == null ) {
			IConfigurationElement element[] = extension.getConfigurationElements();
			for( int i = 0; i < element.length; i++ ) {
				if ( element[i].getName().equalsIgnoreCase("cproject") ) {
					fPlatform = element[i].getAttribute("platform");
					break;
				}
			}
		}
		return fPlatform == null ? "*" : fPlatform;
	}
	
	void configure(IProject project, ICDescriptor cproject) throws CoreException {
		IConfigurationElement element[] = extension.getConfigurationElements();
		for( int i = 0; i < element.length; i++ ) {
			if ( element[i].getName().equalsIgnoreCase("cproject") ) {
				ICOwner owner = (ICOwner) element[i].createExecutableExtension("class");
				owner.configure(cproject);
				return;
			}
		}
		IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1, "Invalid CDTProject owner extension", (Throwable)null);
		throw new CoreException(status);
	}

	void update(IProject project, ICDescriptor cproject, String extensionID) throws CoreException {
		IConfigurationElement element[] = extension.getConfigurationElements();
		for( int i = 0; i < element.length; i++ ) {
			if ( element[i].getName().equalsIgnoreCase("cproject") ) {
				ICOwner owner = (ICOwner) element[i].createExecutableExtension("class");
				owner.update(cproject, extensionID);
				return;
			}
		}
		IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1, "Invalid CDTProject owner extension", (Throwable)null);
		throw new CoreException(status);
	}

}
