/******************************************************************************
 * Copyright (c) 2008 Oracle
 * 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:
 *    Konstantin Komissarchik - initial implementation and ongoing maintenance
 ******************************************************************************/

package org.eclipse.wst.common.project.facet.core.util.internal;

import static org.eclipse.wst.common.project.facet.core.internal.FacetCorePlugin.createErrorStatus;
import static org.eclipse.wst.common.project.facet.core.internal.FacetCorePlugin.log;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

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.Platform;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.project.facet.core.internal.FacetCorePlugin;
import org.osgi.framework.Bundle;

/**
 * Utility methods that are helpful for implementing extension points.
 *
 * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
 */

public final class PluginUtil
{
    public static final class InvalidExtensionException

        extends Exception
    
    {
        private static final long serialVersionUID = 1L;
    }
    
	private PluginUtil() {}
    
    public static Collection<IExtension> findExtensions( final String pluginId,
                                                         final String extensionPointId )
    {
        final IExtensionRegistry registry = Platform.getExtensionRegistry();
        final IExtensionPoint point = registry.getExtensionPoint( pluginId, extensionPointId );
        
        if( point == null )
        {
            throw new RuntimeException();
        }
        
        final List<IExtension> extensions = new ArrayList<IExtension>();
        
        for( IExtension extension : point.getExtensions() )
        {
            extensions.add( extension );
        }
        
        return extensions;
    }
    
    public static Collection<IConfigurationElement> getTopLevelElements( final Collection<IExtension> extensions )
    {
        final List<IConfigurationElement> elements = new ArrayList<IConfigurationElement>();
        
        for( IExtension extension : extensions )
        {
            for( IConfigurationElement element : extension.getConfigurationElements() )
            {
                elements.add( element );
            }
        }
        
        return elements;
    }

    public static void reportMissingAttribute( final IConfigurationElement el,
                                               final String attribute )
    {
        final String pluginId = el.getContributor().getName();
        final String extPointId = el.getDeclaringExtension().getExtensionPointUniqueIdentifier();
        
        final String msg
            = Resources.bind( Resources.missingAttribute, pluginId, extPointId, el.getName(), 
                              attribute );

        FacetCorePlugin.log( msg );
    }

    public static void reportMissingElement( final IConfigurationElement el,
                                             final String element )
    {
        final String pluginId = el.getContributor().getName();
        final String extPointId = el.getDeclaringExtension().getExtensionPointUniqueIdentifier();
        
        final String msg
            = Resources.bind( Resources.missingElement, pluginId, extPointId, el.getName(), 
                              element );

        FacetCorePlugin.log( msg );
    }

    public static String findRequiredAttribute( final IConfigurationElement el,
                                                final String attribute )

        throws InvalidExtensionException

    {
        final String val = el.getAttribute( attribute );

        if( val == null )
        {
            reportMissingAttribute( el, attribute );
            throw new InvalidExtensionException();
        }

        return val;
    }

    public static IConfigurationElement findRequiredElement( final IConfigurationElement el,
                                                             final String childElement )

        throws InvalidExtensionException

    {
        final IConfigurationElement[] children = el.getChildren( childElement );

        if( children.length == 0 )
        {
            reportMissingElement( el, childElement );
            throw new InvalidExtensionException();
        }

        return children[ 0 ];
    }

    public static IConfigurationElement findOptionalElement( final IConfigurationElement el,
                                                             final String childElement )
    {
        final IConfigurationElement[] children = el.getChildren( childElement );

        if( children.length == 0 )
        {
            return null;
        }
        else
        {
            return children[ 0 ];
        }
    }
    
    public static String getElementValue( final IConfigurationElement el,
                                          final String defaultValue )
    {
        if( el != null )
        {
            String text = el.getValue();
            
            if( text != null )
            {
                text = text.trim();
                
                if( text.length() > 0 )
                {
                    return text;
                }
            }
        }
        
        return defaultValue;
    }
    
    public static <T> Class<T> loadClass( final String pluginId,
                                          final String clname )
    {
        return loadClass( pluginId, clname, null );
    }

    @SuppressWarnings( "unchecked" )
    public static <T> Class<T> loadClass( final String pluginId,
                                          final String clname,
                                          final Class<T> interfc )
    {
        final Bundle bundle = Platform.getBundle( pluginId );
        final Class cl;

        try
        {
            cl = bundle.loadClass( clname );
        }
        catch( Exception e )
        {
            final String msg
                = Resources.bind( Resources.failedToLoadClass, clname, pluginId );

            log( createErrorStatus( msg, e ) );

            return null;
        }

        if( interfc != null && ! interfc.isAssignableFrom( cl ) )
        {
            final String msg
                = Resources.bind( Resources.doesNotImplement, clname,
                                  interfc.getClass().getName() );

            log( createErrorStatus( msg ) );

            return null;
        }

        return cl;
    }

    public static <T> T instantiate( final String pluginId,
                                     final Class<T> cl )
    {
        try
        {
            return cl.newInstance();
        }
        catch( Exception e )
        {
            final String msg
                = NLS.bind( Resources.failedToInstantiate, cl.getName(), pluginId );

            log( createErrorStatus( msg, e ) );

            return null;
        }
    }

    public static <T> T instantiate( final String pluginId,
                                     final String clname )
    {
        return instantiate( pluginId, clname, (Class<T>) null );
    }

    public static <T> T instantiate( final String pluginId,
                                     final String clname,
                                     final Class<T> interfc )
    {
        final Class<T> cl = loadClass( pluginId, clname, interfc );

        if( cl == null )
        {
            return null;
        }

        return instantiate( pluginId, cl );
    }
    
    private static final class Resources

        extends NLS
    
    {
        public static String missingAttribute;
        public static String missingElement;
        public static String failedToLoadClass;
        public static String failedToInstantiate;
        public static String doesNotImplement;
    
        static
        {
            initializeMessages( PluginUtil.class.getName(), Resources.class );
        }
        
        public static String bind( final String message,
                                   final String arg1,
                                   final String arg2,
                                   final String arg3,
                                   final String arg4 )
        {
            return bind( message, new Object[] { arg1, arg2, arg3, arg4 } );
        }
    }
    
}
