/*******************************************************************************
 * 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.designtime.context;

import java.io.PrintStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jst.jsf.common.JSFCommonPlugin;
import org.eclipse.jst.jsf.context.symbol.ISymbol;
import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider;
import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProviderFactory;


/**
 * A designtime proxy for the Faces ExternalContext
 * 
 * Clients may sub-class.
 * 
 * @author cbateman
 *
 */
public class DTJSPExternalContext extends AbstractDTExternalContext 
{
    /**
     * 
     */
    private final IFile     _jspFile;

    /**
     * Construct a default external context
     * 
     * @param jspFile
     */
    protected DTJSPExternalContext(final IAdaptable  jspFile)
    {
        if (jspFile instanceof IFile)
        {
            _jspFile = (IFile) jspFile;
        }
        else if (jspFile != null)
        {
            IFile file = (IFile) jspFile.getAdapter(IFile.class);
            
            if (file != null)
            {
                _jspFile = file;
            }
            else
            {
                _jspFile = null;
                throw new AssertionError("jspFile must be adapable to an IFile"); //$NON-NLS-1$
            }
        }
        else
        {
            _jspFile = null;
            throw new AssertionError("jspFile must be adapable to an IFile"); //$NON-NLS-1$
        }
    }

    @Override
    protected Map doGetMapForScope(final int scopeMask) 
    {
        final Map  map = new HashMap();
        
        for (final Iterator it = JSFCommonPlugin.getSymbolSourceProviders().iterator(); it.hasNext();)
        {
            final ISymbolSourceProviderFactory  factory = (ISymbolSourceProviderFactory) it.next();
            final ISymbolSourceProvider provider = factory.createInstance(_jspFile.getProject());
            
            final ISymbol[] symbols = provider.getSymbols(_jspFile, scopeMask);
            
            for (int i = 0; i < symbols.length; i++)
            {
                map.put(symbols[i].getName(), symbols[i]);
            }
        }

        return map;
    }

    /**
     * @param stream
     */
    public final void trace(PrintStream stream)
    {
        String[]  scopeNames = {ISymbolConstants.SYMBOL_SCOPE_REQUEST_STRING, 
                                ISymbolConstants.SYMBOL_SCOPE_SESSION_STRING, 
                                ISymbolConstants.SYMBOL_SCOPE_APPLICATION_STRING,
                                ISymbolConstants.SYMBOL_SCOPE_NONE_STRING
                                };
        Map[]     symbolMaps = {getRequestMap(), getSessionMap(), getApplicationMap(), getNoneMap()};

        for (int i = 0; i < scopeNames.length; i++)
        {
            stream.println("--------------"); //$NON-NLS-1$
            stream.println(scopeNames[i]+" Scope:"); //$NON-NLS-1$
            stream.println("--------------"); //$NON-NLS-1$

            for (final Iterator it = symbolMaps[i].values().iterator(); it.hasNext();)
            {
                ISymbol symbol = (ISymbol) it.next();
                System.out.println(symbol.getName());
            }
        }
    }
}
