/***************************************************************************************************
 * Copyright (c) 2005 Eteration A.S. and Gorkem Ercan. 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: Gorkem Ercan - initial API and implementation
 *               
 **************************************************************************************************/
package org.eclipse.jst.server.generic.internal.core.util;

import java.util.ArrayList;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IRegistryChangeListener;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.server.generic.core.internal.CorePlugin;
/**
 * Utilities for handling the extension points.
 *
 * @author Gorkem Ercan
 */
public class ExtensionPointUtil {
    /**
     * serverdefinition extension id
     */
    public static final String SERVERDEFINITION_EXTENSION_ID = "serverdefinition"; //$NON-NLS-1$
    public static final String RUNTIMEDEFINITION_EXTENSION_ID = "runtimedefinition"; //$NON-NLS-1$
    private static final String GENERICPUBLISHER_EXTENSION_ID = "genericpublisher"; //$NON-NLS-1$
    private static final String EXTENSION_SERVER_TYPE = "serverTypes";//$NON-NLS-1$

    /**
     * Returns serverdefinition extensions
     * @return serverdefinition Extensions
     */
    public static IExtension[] getGenericServerDefinitionExtensions(){
        return getExtensions(CorePlugin.PLUGIN_ID+"."+SERVERDEFINITION_EXTENSION_ID); //$NON-NLS-1$
    }

    /**
     * Returns runtimedefinition extensions
     * @return runtimedefinition Extensions
     */
    public static IExtension[] getGenericServerRuntimeDefinitionExtensions(){
        return getExtensions(CorePlugin.PLUGIN_ID+"."+RUNTIMEDEFINITION_EXTENSION_ID); //$NON-NLS-1$
    }
    
    /**
     * Returns publisher extensions
     * @return genericpublisher extensions
     */
    public static IExtension[] getGenericPublisherExtension(){
        return getExtensions(CorePlugin.PLUGIN_ID+"."+GENERICPUBLISHER_EXTENSION_ID); //$NON-NLS-1$
    }

    private static IExtension[] getExtensions(String extensionId){
        IExtensionPoint extensionPoint=getExtensionPoint(extensionId);
        IExtension[] extensions = extensionPoint.getExtensions();
        return extensions;
    }
 
    private static IExtensionPoint getExtensionPoint(String id)
    {
        IExtensionRegistry registry = Platform.getExtensionRegistry();
        IExtensionPoint extensionPoint= registry.getExtensionPoint(id);
        return extensionPoint;
    }
    
    
    /**
     * Returns the configuration elements
     *
     * @param extension
     * @return configurationElements
     */
    public static IConfigurationElement[] getConfigurationElements(IExtension extension){
        return extension!=null?extension.getConfigurationElements():null;
    }
    
    /**
     * Add listener to extension registry.
     * @param listener
     */
    public static void addRegistryListener(IRegistryChangeListener listener){
		IExtensionRegistry registry = Platform.getExtensionRegistry();
		registry.addRegistryChangeListener(listener, CorePlugin.PLUGIN_ID);
    }
    /**
     * Retrieves the list of servers with the given launch configuration ID.
     * Returns an empty array if there is none.
     * @param launchConfigId
     * @return
     */
    public static String[] getServerTypesFromLaunchConfig(String launchConfigId){
        IExtensionRegistry registry = Platform.getExtensionRegistry();
        IConfigurationElement[] cf = registry.getConfigurationElementsFor("org.eclipse.wst.server.core", EXTENSION_SERVER_TYPE); //$NON-NLS-1$
        ArrayList list = new ArrayList();
        for( int i = 0; i < cf.length; i++ )
        {      
            String id =  cf[i].getAttribute( "launchConfigId" ); //$NON-NLS-1$
            if (id != null && id.equals( launchConfigId ))
            {
                list.add( cf[i].getAttribute( "id" ) ); //$NON-NLS-1$
            }
               
        };
        return (String[])list.toArray(new String[list.size()]);
       
    }
}
