| /******************************************************************************* |
| * Copyright (c) 2008 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: |
| * Xiaonan Jiang/IBM -- extracted from https://bugs.eclipse.org/bugs/show_bug.cgi?id=206514 |
| * Cameron Bateman/Oracle - integrated. |
| * |
| ********************************************************************************/ |
| |
| package org.eclipse.jst.jsf.designtime.internal.symbols; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.jst.jsf.context.symbol.ISymbol; |
| import org.eclipse.jst.jsf.core.internal.JSFCorePlugin; |
| import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager; |
| import org.eclipse.jst.jsf.designtime.context.DTFacesContext; |
| import org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver; |
| import org.eclipse.jst.jsf.designtime.el.DefaultDTVariableResolver; |
| import org.eclipse.jst.jsf.designtime.el.IDecorativeResolver; |
| |
| /** |
| * A design time proxy for the runtime VariableResolver. |
| * |
| * @author xnjiang |
| * |
| */ |
| public class ConfigBasedDTVariableResolver extends DefaultDTVariableResolver |
| // implements IFacesConfigChangeListener |
| { |
| /** |
| * Constructor |
| */ |
| public ConfigBasedDTVariableResolver() |
| { |
| super(); |
| |
| } |
| |
| @Override |
| public ISymbol[] getAllVariables(final DTFacesContext facesContext, |
| final IAdaptable externalContextKey) |
| { |
| //final long curTime = System.nanoTime(); |
| final Map<String, ISymbol> allSymbols = new HashMap<String, ISymbol>(); |
| final ISymbol[] superSymbols = super.getAllVariables(facesContext, |
| externalContextKey); |
| for (final ISymbol superSymbol : superSymbols) |
| { |
| allSymbols.put(superSymbol.getName(), superSymbol); |
| } |
| |
| if (JSFCorePlugin.hasDecorativeVariableResolvers()) |
| { |
| final IProject project = getProject(facesContext); |
| |
| final List<AbstractDTVariableResolver> resolvers = retrieveDecorativeVariableResolvers(project); |
| for (final AbstractDTVariableResolver resolver : resolvers) |
| { |
| final ISymbol[] otherSymbols = resolver.getAllVariables( |
| facesContext, externalContextKey); |
| for (final ISymbol otherSymbol : otherSymbols) |
| { |
| // allow subsequent resolvers to replace symbols by name |
| // added previously |
| allSymbols.put(otherSymbol.getName(), otherSymbol); |
| } |
| } |
| } |
| //System.out.printf("totalAllSymbols: %d\n", Long.valueOf(System.nanoTime()- curTime)); |
| return allSymbols.values().toArray(ISymbol.EMPTY_SYMBOL_ARRAY); |
| } |
| |
| @Override |
| public ISymbol resolveVariable(final DTFacesContext context, |
| final String name, final IAdaptable externalContextKey) |
| { |
| //long curTime = System.nanoTime(); |
| if (JSFCorePlugin.hasDecorativeVariableResolvers()) |
| { |
| final IProject project = getProject(context); |
| |
| final List<AbstractDTVariableResolver> resolvers = retrieveDecorativeVariableResolvers(project); |
| |
| // we need to iterate backwards through the resolvers, since |
| // the we take the first answer we receive. |
| for (int i = resolvers.size() - 1; i >= 0; i--) |
| { |
| final ISymbol symbol = resolvers.get(i).resolveVariable( |
| context, name, externalContextKey); |
| if (symbol != null) |
| { |
| return symbol; |
| } |
| } |
| } |
| ISymbol symbol = super.resolveVariable(context, name, externalContextKey); |
| //System.out.printf("totalSymbol: %d\n", Long.valueOf(System.nanoTime()- curTime)); |
| return symbol; |
| } |
| |
| private List<AbstractDTVariableResolver> retrieveDecorativeVariableResolvers( |
| final IProject project) |
| { |
| //final long curTime = System.nanoTime(); |
| final JSFAppConfigManager manager = JSFAppConfigManager |
| .getInstance(project); |
| final List<String> variableResolvers = manager.getVariableResolvers(); |
| final List<AbstractDTVariableResolver> resolvers = new ArrayList<AbstractDTVariableResolver>(); |
| for (final String variableResolver : variableResolvers) |
| { |
| final List<String> ids = JSFCorePlugin |
| .getVariableResolversForName(variableResolver); |
| |
| for (final String id : ids) |
| { |
| final AbstractDTVariableResolver resolver = JSFCorePlugin |
| .getVariableResolvers(id).getInstance(project); |
| if (resolver instanceof IDecorativeResolver) |
| { |
| resolvers.add(resolver); |
| } |
| else |
| { |
| JSFCorePlugin.log(new Exception(), String.format("resolver %s must implement the IDecorativeResolver interface to be used", id)); |
| } |
| } |
| } |
| //System.out.printf("retrieveDecorativeVariable: %d\n", Long.valueOf(System.nanoTime()- curTime)); |
| return resolvers; |
| } |
| |
| private IProject getProject(final DTFacesContext facesContext) |
| { |
| final IResource res = facesContext.adaptContextObject(); |
| |
| if (res != null) |
| { |
| return res.getProject(); |
| } |
| return null; |
| } |
| |
| // private void checkFacesConfigForVariableResolver(final IProject project) |
| // { |
| // resolvers = new ArrayList<AbstractDTVariableResolver>(); |
| // String str = "";//$NON-NLS-1$ |
| // boolean bFirst = true; |
| // final List facesConfigs = |
| // JSFAppConfigManager.getInstance(project).getFacesConfigModels(); |
| // final Iterator itFacesConfigs = facesConfigs.iterator(); |
| // while (itFacesConfigs.hasNext()) { |
| // final FacesConfigType facesConfig = |
| // (FacesConfigType)itFacesConfigs.next(); |
| // final EList applications = facesConfig.getApplication(); |
| // for (int i=0;i<applications.size();i++) { |
| // final EList resolvers2 = |
| // ((ApplicationType)applications.get(i)).getVariableResolver(); |
| // for (int j=0;j<resolvers2.size();j++) { |
| // final VariableResolverType resolverType = |
| // (VariableResolverType)resolvers2.get(i); |
| // final AbstractDTVariableResolver resolver = |
| // JSFCorePlugin.getVariableResolvers().get(resolverType.getTextContent()); |
| // if (resolver != null) { |
| // resolvers.add(resolver); |
| // if (bFirst) { |
| // bFirst = false; |
| // } else { |
| // str += ",";//$NON-NLS-1$ |
| // } |
| // str += resolverType.getTextContent(); |
| // } |
| // } |
| // } |
| // } |
| // try { |
| // if (!str.equals("")) {//$NON-NLS-1$ |
| // project.setPersistentProperty(PERSIST_PROPERTY_KEY_VARIABLE_RESOLVERS, |
| // str); |
| // } else { |
| // project.setPersistentProperty(PERSIST_PROPERTY_KEY_VARIABLE_RESOLVERS, |
| // null); |
| // } |
| // } catch (final CoreException e) { |
| // e.printStackTrace(); |
| // } |
| // } |
| // |
| // public void notifyChanged(final Notification notification) { |
| // checkFacesConfigForVariableResolver(); |
| // } |
| |
| } |