/*******************************************************************************
 * Copyright (c) 2006 Oracle Corporation.
 * 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:
 *    Cameron Bateman/Oracle - initial API and implementation
 * 
 ********************************************************************************/

package org.eclipse.jst.jsf.context.symbol.source;

import java.util.List;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jst.jsf.common.JSFCommonPlugin;
import org.eclipse.jst.jsf.context.symbol.ISymbol;

/**
 * Must be sub-classed by all contextSymbolFactory extension point implementors
 * to create context configured symbols
 * 
 * <p><b>Provisional API - subject to change</b></p>
 * 
 * @author cbateman
 *
 */
public abstract class AbstractContextSymbolFactory
{
    /**
     * @param symbolName -- the symbol name
     * @param scope -- the scope of the symbol
     * @param context -- the context; must be supported (call supports(context))
     * @param problems -- populated with problems found during symbol construction.
     * @return a new ISymbol configured for the name, scope and context or null
     * if the arguments are invalid but some other reason a symbol cannot be created.
     * @throws IllegalArgumentException if this method is called with context
     * for which supports(context) == false or if scope does not conform
     * to exactly one of the ISymbolConstants.SYMBOL_SCOPE_* constants
     * @deprecated Use the new create method instead.
     */
    @Deprecated
    public final ISymbol  create(final String symbolName, final int scope, final IAdaptable context, final List problems)
    {
        if (!supports(context))
        {
            throw new IllegalArgumentException("Unsupported context"); //$NON-NLS-1$
        }
        else if (!ISymbolConstants.isValid(scope))
        {
            throw new IllegalArgumentException("Unsupported symbol constant:"+scope); //$NON-NLS-1$
        }

        try
        {
            return internalCreate(symbolName, scope, context, problems, null);
        }
        catch (final Exception e)
        {
            JSFCommonPlugin.log(e, "During execution of context symbol factory: "+this.getClass().getName());
            return null;
        }
    }

    /**
     * The same as create(symbolName, scope, context, problems), except it calls
     * the internalCreate with additionalInfo.  By default this has the same
     * effect.
     * 
     * @param symbolName
     * @param scope
     * @param context
     * @param problems
     * @param additionalInfo
     * @return the new Symbol
     */
    public final ISymbol  create(final String symbolName, final int scope, final IAdaptable context, final List problems, final IAdditionalContextSymbolInfo additionalInfo)
    {
        if (!supports(context))
        {
            throw new IllegalArgumentException("Unsupported context"); //$NON-NLS-1$
        }
        else if (!ISymbolConstants.isValid(scope))
        {
            throw new IllegalArgumentException("Unsupported symbol constant:"+scope); //$NON-NLS-1$
        }

        try
        {
            return internalCreate(symbolName, scope, context, problems, additionalInfo);
        }
        catch (final Exception e)
        {
            JSFCommonPlugin.log(e, "During execution of context symbol factory: "+this.getClass().getName());
            return null;
        }
    }


    /**
     * Use of this method is DISCOURAGED.  It is preferable to move functionality
     * to the new internalCreate method and have this one call it with null.
     * 
     * This method will eventually be deprecated and removed
     * 
     * @param symbolName
     * @param scope
     * @param context
     * @param problems -- see problems arg on create
     * @return a new ISymbol for the name, scope and context; may return null
     * @deprecated Use the new internalCreate instead.  Ignore the new
     * additionalInfo parameter if you do not need it.
     */
    @Deprecated
    protected ISymbol internalCreate(final String symbolName, final int scope, final IAdaptable context, final List problems)
    {
        // do nothing by default
        return null;
    }

    /**
     * NOTE: when migrating to this method, ensure that the other internalCreate
     * method in your implementation doesn't create inconsistent behaviour.
     * 
     * @param symbolName
     * @param scope
     * @param context Will conform to restrictions you set out in supports().
     * @param problems CURRENTLY IGNORED.
     * @param additionalInfo May be null
     * @since 3.0
     * @return a new ISymbol for the name, scope and context, but with the option
     * to also consult additionalInfo passed by the framework.  may return null.
     */
    protected ISymbol internalCreate(final String symbolName, final int scope, final IAdaptable context, final List problems, final IAdditionalContextSymbolInfo additionalInfo)
    {
        // by default, call the other internalCreate for backward compatibility.
        // implementers can override to do things with the additional info
        return internalCreate(symbolName, scope, context, problems);
    }

    /**
     * @param context
     * @return true if this factory supports the context
     */
    public abstract boolean  supports(IAdaptable context);
}
