/******************************************************************************* * 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.internal.symbols; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jst.jsf.context.symbol.ISymbol; import org.eclipse.jst.jsf.context.symbol.source.AbstractSymbolSourceProviderFactory; import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants; import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider; import org.eclipse.jst.jsf.core.internal.JSFCorePlugin; import org.eclipse.jst.jsf.designtime.internal.jsp.JSPModelProcessor; import org.eclipse.jst.jsf.designtime.symbols.FileContextUtil; import org.eclipse.jst.jsf.designtime.symbols.SymbolUtil; /** * Self-factory for a symbol provider that derives symbol information from * meta-data annotations on tag attributes that declare runtime EL variables * * @author cbateman * */ public class JSPTagVariableSymbolSourceProvider extends AbstractSymbolSourceProviderFactory implements ISymbolSourceProvider { protected ISymbolSourceProvider create(IProject project) { return this; } public ISymbol[] getSymbols(IAdaptable context, int symbolScopeMask) { final IFile fileContext = FileContextUtil.deriveIFileFromContext(context); if (isProvider(fileContext) && fileContext.isAccessible()) { JSPModelProcessor modelProcessor = null; try { modelProcessor = JSPModelProcessor.get(fileContext); // ensure internal model is sync'ed with document // but don't force refresh modelProcessor.refresh(!JSPModelProcessor.FORCE_REFRESH, JSPModelProcessor.RUN_ON_CURRENT_THREAD); final List<ISymbol> symbols = new ArrayList(); if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_REQUEST) != 0) { symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_REQUEST_STRING).values()); } if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_SESSION) != 0) { symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_SESSION_STRING).values()); } if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_APPLICATION) != 0) { symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_APPLICATION_STRING).values()); } if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_NONE) != 0) { symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_NONE_STRING).values()); } if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_VIEW) != 0) { symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_VIEW_STRING).values()); } if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_FLASH) != 0) { symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_FLASH_STRING).values()); } return symbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY); } catch (Exception e) { JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring model processor",e)); //$NON-NLS-1$ // fall-through to empty symbol array } } return ISymbol.EMPTY_SYMBOL_ARRAY; } public ISymbol[] getSymbols(String prefix, IAdaptable context, int symbolScopeMask) { return SymbolUtil. filterSymbolsByPrefix(getSymbols(context, symbolScopeMask), prefix); } public boolean isProvider(IAdaptable context) { IFile file = FileContextUtil.deriveIFileFromContext(context); return (file != null && file.getProject() == this.getProject()); } }