//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library;

import java.util.List;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.epf.library.configuration.ConfigurationData;
import org.eclipse.epf.library.configuration.ConfigurationProperties;
import org.eclipse.epf.library.configuration.SupportingElementData;
import org.eclipse.epf.library.configuration.closure.ConfigurationClosure;
import org.eclipse.epf.library.configuration.closure.DependencyManager;
import org.eclipse.epf.library.edit.util.MethodElementPropertyMgr;
import org.eclipse.epf.library.layout.ElementLayoutManager;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodLibrary;

/**
 * Manages a method configuration.
 * 
 * @author Kelvin Low
 * @since 1.0
 */
public class ConfigurationManager implements IConfigurationManager {

	// If true, generate debug traces.
	protected static boolean debug = LibraryPlugin.getDefault().isDebugging();

	// The managed method configuraiton.
	protected MethodConfiguration config;
	
	// The managed configuraiton data.
	private ConfigurationData configData;
	
	private SupportingElementData supportingElementData;
	
	private ConfigurationProperties configProps;

	// The containing method library for the managed method configuration.
	protected MethodLibrary library;

	// The library manager for the containing method library.
	protected ILibraryManager libraryManager;

	// The dependency manager.
	protected DependencyManager dependencyManager;

	// The layout manager.
	protected ElementLayoutManager layoutManager;

	// The configuration closure.
	protected ConfigurationClosure closure;

	protected AdapterFactoryContentProvider afcp;

	/**
	 * Creates a new instance.
	 * 
	 * @param config
	 *            a method configuration
	 */
	public ConfigurationManager(MethodConfiguration config) {
		this.config = config;
		
		if (! ConfigurationData.ignoreSupportingPlugin) {
			supportingElementData = new SupportingElementData(config);
		}
		configData = ConfigurationData.newConfigurationData(config);
				
		configProps = new ConfigurationProperties(config);
		MethodElementPropertyMgr.getInstance().register(config, configProps);

		library = LibraryServiceUtil.getMethodLibrary(config);

		libraryManager = LibraryService.getInstance()
				.getLibraryManager(library);
		afcp = new AdapterFactoryContentProvider(libraryManager
				.getAdapterFactory());

		dependencyManager = new DependencyManager(library, config);

		if (config == null) {
			layoutManager = new ElementLayoutManager();
		} else {
			layoutManager = new ElementLayoutManager(config);
			// closure = new ConfigurationClosure(this, config);
		}
	}

	/**
	 * Gets the method configuration managed by this configuration manager.
	 * 
	 * @return a method configuration
	 */
	public MethodConfiguration getMethodConfiguration() {
		return config;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.epf.library.IConfigurationManager#getConfigurationData()
	 */
	public ConfigurationData getConfigurationData() {
		return configData;
	}
	
	public SupportingElementData getSupportingElementData() {
		return supportingElementData;
	}
	
	/**
	 * Gets the containing method library for the managed method configuration.
	 * 
	 * @return a method library
	 */
	public MethodLibrary getMethodLibrary() {
		return library;
	}

	/**
	 * Gets the adapter factory.
	 * 
	 * @return an adapter factory
	 */
	public AdapterFactory getAdapterFactory() {
		return libraryManager.getAdapterFactory();
	}

	/**
	 * Gets the adapter factory content provider.
	 * 
	 * @return an adapter factory content provider
	 */
	public AdapterFactoryContentProvider getContentProvider() {
		return afcp;
	}

	/**
	 * Gets the dependency manager.
	 * 
	 * @return a dependency manager
	 */
	public DependencyManager getDependencyManager() {
		return dependencyManager;
	}

	/**
	 * Returns the element layout manager.
	 * 
	 * @return an element layout manager
	 */
	public ElementLayoutManager getElementLayoutManager() {
		return layoutManager;
	}

	/**
	 * Gets the configuration closure.
	 * 
	 * @return a configuration closure
	 */
	public ConfigurationClosure getConfigurationClosure() {
		return closure;
	}

	/**
	 * Makes a configuration closure.
	 */
	public void makeConfigurationClosure() {
		if (closure != null) {
			closure.fixErrors();
		}
	}

	/**
	 * Returns a list of method plug-ins in the containing method library.
	 * 
	 * @return a list of method plug-ins
	 */
	public List getMethodPlugins() {
		return library.getMethodPlugins();
	}

	/**
	 * Disposes all resources allocated by this configuration manager.
	 */
	public void dispose() {
		configData.dispose();
		configData = null;
		config = null;
		library = null;
		libraryManager = null;
		dependencyManager = null;
		layoutManager = null;
		closure = null;
		MethodElementPropertyMgr.getInstance().unregister(config);
		configProps = null;
	}

	public ConfigurationProperties getConfigurationProperties() {
		return configProps;
	}

}
