blob: 3652db19e910cf9213d5b39b60cc7c9182b0d34e [file] [log] [blame]
/*******************************************************************************
* 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.resolver;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.jst.jsf.context.IModelContext;
import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
import org.eclipse.jst.jsf.context.symbol.ISymbol;
import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
/**
* A symbol context resolver
* Clients may NOT sub-class.
*
* @author cbateman
*
*/
/*package*/ final class SymbolContextResolver extends AbstractSymbolContextResolver
{
private final IStructuredDocumentContext _context;
private IWorkspaceContextResolver _wkspResolver; // = null; lazy created through getWorkspaceResolver
/**
* @param context
*/
/* package */SymbolContextResolver(IStructuredDocumentContext context)
{
_context = context;
}
public ISymbol getVariable(String name)
{
final IFile file = getFile();
if (file != null)
{
final DesignTimeApplicationManager manager =
DesignTimeApplicationManager.getInstance(file.getProject());
if (manager != null)
{
final DTFacesContext facesContext = manager.getFacesContext(file);
return manager.getVariableResolver().
resolveVariable(facesContext, name, file);
}
}
return null;
}
public ISymbol[] getAllVariables()
{
final IFile file = getFile();
if (file != null)
{
final DesignTimeApplicationManager manager =
DesignTimeApplicationManager.getInstance(file.getProject());
if (manager != null)
{
final DTFacesContext facesContext = manager.getFacesContext(file);
if (facesContext != null)
{
return manager.getVariableResolver().
getAllVariables(facesContext, file);
}
}
}
return ISymbol.EMPTY_SYMBOL_ARRAY;
}
public ISymbol getProperty(ISymbol symbol, Object propertyName)
{
final IFile file = getFile();
if (file != null)
{
final DesignTimeApplicationManager manager =
DesignTimeApplicationManager.getInstance(file.getProject());
if (manager != null)
{
return manager.getPropertyResolver().getProperty(symbol, propertyName);
}
}
return null;
}
public ISymbol[] getProperties(ISymbol symbol)
{
final IFile file = getFile();
if (file != null)
{
final DesignTimeApplicationManager manager =
DesignTimeApplicationManager.getInstance(file.getProject());
if (manager != null)
{
return manager.getPropertyResolver().getAllProperties(symbol);
}
}
return ISymbol.EMPTY_SYMBOL_ARRAY;
}
public IMethodSymbol getMethod(IObjectSymbol base, Object methodName)
{
final IFile file = getFile();
if (file != null)
{
final DesignTimeApplicationManager manager =
DesignTimeApplicationManager.getInstance(file.getProject());
if (manager != null)
{
return manager.getMethodResolver().getMethod(base, methodName);
}
}
return null;
}
public ISymbol[] getMethods(IObjectSymbol base)
{
final IFile file = getFile();
if (file != null)
{
final DesignTimeApplicationManager manager =
DesignTimeApplicationManager.getInstance(file.getProject());
if (manager != null)
{
return manager.getMethodResolver().getMethods(base);
}
}
return new IMethodSymbol[0];
}
public boolean canResolveContext(IModelContext modelContext)
{
return modelContext.getAdapter(IStructuredDocumentContext.class) != null;
}
/**
* @return a lazily loaded workspace resolver for this resolver's context
*/
protected final IWorkspaceContextResolver getWorkspaceResolver()
{
if (_wkspResolver == null)
{
_wkspResolver = getWorkspaceResolver(_context);
}
return _wkspResolver;
}
private IWorkspaceContextResolver getWorkspaceResolver(final IStructuredDocumentContext context)
{
return IStructuredDocumentContextResolverFactory.INSTANCE
.getWorkspaceContextResolver(context);
}
/**
* @return the underlying IFile for my context or null if can't be determined
*/
protected final IFile getFile()
{
return getFile(getWorkspaceResolver());
}
private IFile getFile(final IWorkspaceContextResolver resolver)
{
if (resolver != null)
{
IResource curRes = resolver.getResource();
if (curRes instanceof IFile)
{
return (IFile) curRes;
}
}
return null;
}
@Override
public boolean hasSameResolution(IModelContext modelContext)
{
if (canResolveContext(modelContext))
{
return getFile().equals(getFile(getWorkspaceResolver((IStructuredDocumentContext) modelContext)));
}
// if we can't even resolve the context, then we certainly don't have
// the same resolution
return false;
}
}