/*******************************************************************************
 * Copyright (c) 2009 Red Hat 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:
 *     Red Hat - Initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.common.internal.modulecore.util;

import java.util.ArrayList;
import java.util.Arrays;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.common.frameworks.CommonFrameworksPlugin;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;

/**
 * A Utility class to help find current and possible manifest entries
 */
public class JavaModuleComponentUtility {

	private static IJavaComponentDiscerner[] discerners;
	protected static IJavaComponentDiscerner[] getDiscerners() {
		if( discerners == null ) {
			discerners = loadDiscerners();
		}
		return discerners == null ? new IJavaComponentDiscerner[]{} : discerners;
	}
	
	private static IJavaComponentDiscerner[] loadDiscerners() {
		ArrayList<IJavaComponentDiscerner> list = new ArrayList<IJavaComponentDiscerner>();
        IExtensionRegistry registry = Platform.getExtensionRegistry();
        IConfigurationElement[] cf = registry.getConfigurationElementsFor(
        		CommonFrameworksPlugin.PLUGIN_ID, "JavaComponentDiscerner"); //$NON-NLS-1$
        for( int i = 0; i < cf.length; i++ ) {
        	try {
                list.add((IJavaComponentDiscerner)cf[i].createExecutableExtension("class")); //$NON-NLS-1$
        	} catch( CoreException ce ) {
        		// TODO log
        	}
        }
        return list.toArray(new IJavaComponentDiscerner[list.size()]);
	}
	
	public static IProject[] findParentProjects(IProject child) {
		IJavaComponentDiscerner[] extensions = getDiscerners();
		ArrayList<IProject> list = new ArrayList<IProject>();
		for( int i = 0; i < extensions.length; i++ ) {
			list.addAll(Arrays.asList(extensions[i].findParentProjects(child)));
		}
		return list.toArray(new IProject[list.size()]);
	}
	
	public static IVirtualReference[] findPossibleManifestEntries(IProject parentProject, IProject childProject) {
		IJavaComponentDiscerner[] extensions = getDiscerners();
		ArrayList<IVirtualReference> list = new ArrayList<IVirtualReference>();
		for( int i = 0; i < extensions.length; i++ ) {
			list.addAll(Arrays.asList(extensions[i].findPossibleManifestEntries(parentProject, childProject)));
		}
		return list.toArray(new IVirtualReference[list.size()]);
	}

	public static IVirtualReference[] findPossibleManifestEntries(IProject parentProject, IProject childProject, IVirtualReference[] current) {
		IJavaComponentDiscerner[] extensions = getDiscerners();
		ArrayList<IVirtualReference> list = new ArrayList<IVirtualReference>();
		for( int i = 0; i < extensions.length; i++ ) {
			list.addAll(Arrays.asList(extensions[i].findPossibleManifestEntries(parentProject, childProject, current)));
		}
		return list.toArray(new IVirtualReference[list.size()]);
	}

	public static IVirtualReference[] findCurrentManifestEntries(IProject parentProject, IProject childProject) {
		IJavaComponentDiscerner[] extensions = getDiscerners();
		ArrayList<IVirtualReference> list = new ArrayList<IVirtualReference>();
		for( int i = 0; i < extensions.length; i++ ) {
			list.addAll(Arrays.asList(extensions[i].findCurrentManifestEntries(parentProject, childProject)));
		}
		return list.toArray(new IVirtualReference[list.size()]);
	}
}
