/*******************************************************************************
 * 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.resolver.structureddocument.internal.impl;

import java.util.Iterator;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jst.jsf.context.internal.provisional.AbstractDelegatingFactory;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.IDOMContextResolver;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.IMetadataContextResolver;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.IStructuredDocumentContextResolverFactory;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.ITaglibContextResolver;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.IWorkspaceContextResolver;
import org.eclipse.jst.jsf.context.structureddocument.internal.provisional.IStructuredDocumentContext;
import org.eclipse.jst.jsf.context.structureddocument.internal.provisional.IStructuredDocumentContextFactory;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;

/**
 * Implements a factory for creating context resolvers for structured document
 * contexts.
 * 
 * @author cbateman
 *
 */
public class StructuredDocumentContextResolverFactory extends
		AbstractDelegatingFactory implements
		IStructuredDocumentContextResolverFactory 
{
	/* static attributes */
	private static StructuredDocumentContextResolverFactory  INSTANCE;

	/**
	 * @return an instance (possibly shared) of the this factory
	 */
	public synchronized static StructuredDocumentContextResolverFactory getInstance()
	{
		if (INSTANCE == null)
		{
			INSTANCE = new StructuredDocumentContextResolverFactory();
		}
		
		return INSTANCE;
	}

	/**
	 * Constructor
	 */
	protected StructuredDocumentContextResolverFactory() 
	{
		super(new Class[] {IStructuredDocumentContextResolverFactory.class});
	}

	/**
	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.IStructuredDocumentContextResolverFactory#getDOMContextResolver(org.eclipse.jst.jsf.context.structureddocument.internal.provisional.IStructuredDocumentContext)
	 */
	public IDOMContextResolver getDOMContextResolver(IStructuredDocumentContext context) 
	{
        IDOMContextResolver  resolver = internalGetDOMResolver(context);
        
        if (resolver == null)
        {
            resolver = delegateGetDOMResolver(context);
        }
        
        return resolver;
    }
    private IDOMContextResolver internalGetDOMResolver(IStructuredDocumentContext context)
    {
        if (context.getStructuredDocument() instanceof IStructuredDocument)
        {
            return new DOMContextResolver(context);
        }
        
        return null;
    }
    
    private IDOMContextResolver delegateGetDOMResolver(IStructuredDocumentContext context)
    {
        synchronized(_delegates)
        {
            for (final Iterator it = _delegates.iterator(); it.hasNext();)
            {
                IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
                IDOMContextResolver contextResolver = delegateFactory.getDOMContextResolver(context);
                
                if (contextResolver != null)
                {
                    return contextResolver;
                }
            }
            
            return null;
        }
    }

    
	/**
	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.IStructuredDocumentContextResolverFactory#getTextRegionResolver(org.eclipse.jst.jsf.context.structureddocument.internal.provisional.IStructuredDocumentContext)
	 */
	public ITextRegionContextResolver getTextRegionResolver(IStructuredDocumentContext context) 	
	{
		ITextRegionContextResolver  resolver = internalGetTextRegionResolver(context);
		
		if (resolver == null)
		{
			resolver = delegateGetTextRegionResolver(context);
		}
		
		return resolver;
	}
	private ITextRegionContextResolver internalGetTextRegionResolver(IStructuredDocumentContext context)
	{
		if (context.getStructuredDocument() instanceof IStructuredDocument)
		{
			return new TextRegionContextResolver(context);
		}
		
		return null;
	}
	
	private ITextRegionContextResolver delegateGetTextRegionResolver(IStructuredDocumentContext context)
	{
		synchronized(_delegates)
		{
			for (final Iterator it = _delegates.iterator(); it.hasNext();)
			{
				IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
				ITextRegionContextResolver contextResolver = delegateFactory.getTextRegionResolver(context);
				
				if (contextResolver != null)
				{
					return contextResolver;
				}
			}
			
			return null;
		}
	}
	
	public IWorkspaceContextResolver getWorkspaceContextResolver(IStructuredDocumentContext context)
	{
		IWorkspaceContextResolver  resolver = internalGetWorkspaceContextResolver(context);
		
		if (resolver == null)
		{
			resolver = delegateGetWorkspaceContextResolver(context);
		}
		
		return resolver;

	}
	
	private IWorkspaceContextResolver internalGetWorkspaceContextResolver(IStructuredDocumentContext context)
	{
		if (context.getStructuredDocument() instanceof IStructuredDocument)
		{
			return new WorkspaceContextResolver(context);
		}
		
		return null;
	}
	
	private IWorkspaceContextResolver delegateGetWorkspaceContextResolver(IStructuredDocumentContext context)
	{
		synchronized(_delegates)
		{
			for (final Iterator it = _delegates.iterator(); it.hasNext();)
			{
				IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
				IWorkspaceContextResolver contextResolver = delegateFactory.getWorkspaceContextResolver(context);
				
				if (contextResolver != null)
				{
					return contextResolver;
				}
			}
			
			return null;
		}
	}

    public ITaglibContextResolver getTaglibContextResolver(IStructuredDocumentContext context) {
        ITaglibContextResolver  resolver = internalGetTaglibContextResolver(context);
        
        if (resolver == null)
        {
            resolver = delegateGetTaglibContextResolver(context);
        }
        
        return resolver;
    }
    
    private ITaglibContextResolver internalGetTaglibContextResolver(IStructuredDocumentContext context)
    {
        if (context.getStructuredDocument() instanceof IStructuredDocument)
        {
            return new TaglibContextResolver(context);
        }
        
        return null;
    }
    
    private ITaglibContextResolver delegateGetTaglibContextResolver(IStructuredDocumentContext context)
    {
        synchronized(_delegates)
        {
            for (final Iterator it = _delegates.iterator(); it.hasNext();)
            {
                IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
                ITaglibContextResolver contextResolver = delegateFactory.getTaglibContextResolver(context);
                
                if (contextResolver != null)
                {
                    return contextResolver;
                }
            }
            
            return null;
        }
    }

    public IMetadataContextResolver getMetadataContextResolver(IStructuredDocumentContext context) {
        IMetadataContextResolver  resolver = internalGetMetadataContextResolver(context);
        
        if (resolver == null)
        {
            resolver = delegateGetMetadataContextResolver(context);
        }
        
        return resolver;
    }
    
    private IMetadataContextResolver internalGetMetadataContextResolver(IStructuredDocumentContext context)
    {
        if (context.getStructuredDocument() instanceof IStructuredDocument)
        {
            return new MetadataContextResolver(context);
        }
        
        return null;
    }
    
    private IMetadataContextResolver delegateGetMetadataContextResolver(IStructuredDocumentContext context)
    {
        synchronized(_delegates)
        {
            for (final Iterator it = _delegates.iterator(); it.hasNext();)
            {
                final IStructuredDocumentContextResolverFactory delegateFactory = 
                    (IStructuredDocumentContextResolverFactory) 
                        ((IAdaptable) it.next()).getAdapter
                            (IStructuredDocumentContextFactory.class);
                final IMetadataContextResolver contextResolver = 
                    delegateFactory.getMetadataContextResolver(context);
                
                if (contextResolver != null)
                {
                    return contextResolver;
                }
            }
            
            return null;
        }
    }
}
