/******************************************************************************* * Copyright (c) 2007-2012 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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 * * Contributor: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.jsf.model; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.resource.ImageDescriptor; import org.jboss.tools.common.el.core.ca.AbstractELCompletionEngine; import org.jboss.tools.common.el.core.model.ELInvocationExpression; import org.jboss.tools.common.el.core.parser.ELParserFactory; import org.jboss.tools.common.el.core.parser.ELParserUtil; import org.jboss.tools.common.el.core.resolver.ELContext; import org.jboss.tools.common.el.core.resolver.IVariable; import org.jboss.tools.common.el.core.resolver.TypeInfoCollector; import org.jboss.tools.common.el.core.resolver.TypeInfoCollector.MemberInfo; import org.jboss.tools.common.model.project.IModelNature; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.jsf.JSFModelPlugin; import org.jboss.tools.jsf.model.pv.JSFPromptingProvider; /** * Utility class used to collect info for EL * * @author Viacheslav Kabanovich */ public class JSFELCompletionEngine extends AbstractELCompletionEngine<JSFELCompletionEngine.IJSFVariable> { private static final ImageDescriptor JSF_EL_PROPOSAL_IMAGE = JSFModelPlugin.getDefault().getImageDescriptorFromRegistry(JSFModelPlugin.CA_JSF_EL_IMAGE_PATH); private static ELParserFactory factory = ELParserUtil.getJbossFactory(); /* * (non-Javadoc) * @see org.jboss.tools.common.el.core.ca.AbstractELCompletionEngine#getELProposalImageForMember(org.jboss.tools.common.el.core.resolver.TypeInfoCollector.MemberInfo) */ @Override public ImageDescriptor getELProposalImageForMember(MemberInfo memberInfo) { return JSF_EL_PROPOSAL_IMAGE; } public JSFELCompletionEngine() {} /* * (non-Javadoc) * @see org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine#log(java.lang.Exception) */ @Override protected void log(Exception e) { JSFModelPlugin.getPluginLog().logError(e); } /* * (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELCompletionEngine#getParserFactory() */ @Override public ELParserFactory getParserFactory() { return factory; } /* * (non-Javadoc) * @see org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine#resolveVariables(org.eclipse.core.resources.IFile, org.jboss.tools.common.el.core.model.ELInvocationExpression, boolean, boolean) */ @Override public List<IJSFVariable> resolveVariables(IFile file, ELContext context, ELInvocationExpression expr, boolean isFinal, boolean onlyEqualNames, int offset) { IModelNature project = EclipseResourceUtil.getModelNature(file.getProject()); return resolveVariables(file, context, project, expr, isFinal, onlyEqualNames, offset); } /** * * @param project * @param expr * @param isFinal * @param onlyEqualNames * @return */ private List<IJSFVariable> resolveVariables(IFile file, ELContext context, IModelNature project, ELInvocationExpression expr, boolean isFinal, boolean onlyEqualNames, int offset) { List<IJSFVariable> resolvedVars = EMPTY_VARIABLES_LIST; if (project == null) return EMPTY_VARIABLES_LIST; String varName = expr.toString(); if (varName != null) { resolvedVars = resolveVariables(project, context, varName, onlyEqualNames, offset); } if (resolvedVars != null && !resolvedVars.isEmpty()) { if(isFinal) { return resolvedVars; } List<IJSFVariable> newResolvedVars = new ArrayList<IJSFVariable>(); for (IJSFVariable var : resolvedVars) { // Do filter by equals (name) // In case of the last pass - do not filter by startsWith(name) instead of equals if (varName.equals(var.getName())) { newResolvedVars.add(var); } } return newResolvedVars; } else if (varName != null && (varName.startsWith("\"") || varName.startsWith("'")) && (varName.endsWith("\"") || varName.endsWith("'"))) { IJavaProject jp = EclipseResourceUtil.getJavaProject(file.getProject()); if(jp!=null) { try { IType type = jp.findType("java.lang.String"); if (type != null) { IMethod m = type.getMethod("toString", new String[0]); if (m != null) { IJSFVariable v = new Variable("String", m); List<IJSFVariable> newResolvedVars = new ArrayList<IJSFVariable>(); newResolvedVars.add(v); return newResolvedVars; } } } catch (JavaModelException e) { JSFModelPlugin.getDefault().logError(e); } } } return EMPTY_VARIABLES_LIST; } static final JSFPromptingProvider PROVIDER = new JSFPromptingProvider(); protected List<IJSFVariable> resolveVariables(IModelNature project, ELContext context, String varName, boolean onlyEqualNames, int offset) { if(project == null) return null; List<IJSFVariable> beans = PROVIDER.getVariables(project.getModel()); List<IJSFVariable> resolvedVariables = EMPTY_VARIABLES_LIST; for (IJSFVariable variable: beans) { String n = variable.getName(); boolean add = (onlyEqualNames) ? (n.equals(varName)) : (n.startsWith(varName)); if(add) { if(resolvedVariables == EMPTY_VARIABLES_LIST) { resolvedVariables = new ArrayList<IJSFVariable>(); } resolvedVariables.add(variable); } } return resolvedVariables; } /* * (non-Javadoc) * @see org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine#getMemberInfoByVariable(org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine.IVariable, boolean) */ @Override protected TypeInfoCollector.MemberInfo getMemberInfoByVariable(IJSFVariable var, ELContext context, boolean onlyEqualNames, int offset) { return TypeInfoCollector.createMemberInfo(((IJSFVariable)var).getSourceMember()); } public static interface IJSFVariable extends IVariable { public IMember getSourceMember(); } public static class Variable implements IJSFVariable { private String name; private IMember source; public Variable(String name, IMember source) { this.name = name; this.source = source; } /* * (non-Javadoc) * @see org.jboss.tools.jsf.model.JSFELCompletionEngine.IJSFVariable#getSourceMember() */ @Override public IMember getSourceMember() { return source; } /* * (non-Javadoc) * @see org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine.IVariable#getName() */ @Override public String getName() { return name; } } @Override protected boolean isStaticMethodsCollectingEnabled() { return false; } }