Author: akazakov
Date: 2009-07-07 17:08:36 -0400 (Tue, 07 Jul 2009)
New Revision: 16479
Added:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/model/JSFImplicitObjectELResolver.java
Modified:
trunk/common/plugins/org.jboss.tools.common.el.core/src/org/jboss/tools/common/el/core/resolver/ELOperandResolveStatus.java
trunk/common/plugins/org.jboss.tools.common.el.core/src/org/jboss/tools/common/el/core/resolver/ELResolverFactoryManager.java
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/model/JSFELCompletionEngine.java
trunk/jst/plugins/org.jboss.tools.jst.web.kb/src/org/jboss/tools/jst/web/kb/el/AbstractELCompletionEngine.java
Log:
https://jira.jboss.org/jira/browse/JBIDE-2808
Modified:
trunk/common/plugins/org.jboss.tools.common.el.core/src/org/jboss/tools/common/el/core/resolver/ELOperandResolveStatus.java
===================================================================
---
trunk/common/plugins/org.jboss.tools.common.el.core/src/org/jboss/tools/common/el/core/resolver/ELOperandResolveStatus.java 2009-07-07
19:36:57 UTC (rev 16478)
+++
trunk/common/plugins/org.jboss.tools.common.el.core/src/org/jboss/tools/common/el/core/resolver/ELOperandResolveStatus.java 2009-07-07
21:08:36 UTC (rev 16479)
@@ -69,7 +69,6 @@
* @return true if EL is resolved.
*/
public boolean isOK() {
-// return !getProposals().isEmpty() || isMapOrCollectionOrBundleAmoungTheTokens();
return !getProposals().isEmpty() || isMapOrCollectionOrBundleAmoungTheTokens();
}
@@ -164,5 +163,4 @@
public void clearUnpairedGettersOrSetters() {
getUnpairedGettersOrSetters().clear();
}
-
-}
+}
\ No newline at end of file
Modified:
trunk/common/plugins/org.jboss.tools.common.el.core/src/org/jboss/tools/common/el/core/resolver/ELResolverFactoryManager.java
===================================================================
---
trunk/common/plugins/org.jboss.tools.common.el.core/src/org/jboss/tools/common/el/core/resolver/ELResolverFactoryManager.java 2009-07-07
19:36:57 UTC (rev 16478)
+++
trunk/common/plugins/org.jboss.tools.common.el.core/src/org/jboss/tools/common/el/core/resolver/ELResolverFactoryManager.java 2009-07-07
21:08:36 UTC (rev 16479)
@@ -10,9 +10,7 @@
******************************************************************************/
package org.jboss.tools.common.el.core.resolver;
-import java.util.HashMap;
import java.util.HashSet;
-import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IProject;
@@ -35,7 +33,7 @@
private static final ELResolverFactoryManager INSTANCE = new
ELResolverFactoryManager();
- private Map<String, ELResolver[]> resolvers = new HashMap<String,
ELResolver[]>();
+// private Map<String, ELResolver[]> resolvers = new HashMap<String,
ELResolver[]>();
private ELResolverFactoryManager() {
}
@@ -58,10 +56,10 @@
if(project==null) {
return new ELResolver[0];
}
- ELResolver[] result = resolvers.get(project.getName());
- if(result!=null) {
- return result;
- }
+// ELResolver[] result = resolvers.get(project.getName());
+// if(result!=null) {
+// return result;
+// }
Set<ELResolver> resolverSet = new HashSet<ELResolver>();
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint =
registry.getExtensionPoint("org.jboss.tools.common.el.core.elResolver");
//$NON-NLS-1$
@@ -106,8 +104,9 @@
}
}
}
- result = resolverSet.toArray(new ELResolver[resolverSet.size()]);
- resolvers.put(project.getName(), result);
- return result;
+// result = resolverSet.toArray(new ELResolver[resolverSet.size()]);
+// resolvers.put(project.getName(), result);
+// return result;
+ return resolverSet.toArray(new ELResolver[0]);
}
}
\ No newline at end of file
Modified:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/model/JSFELCompletionEngine.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/model/JSFELCompletionEngine.java 2009-07-07
19:36:57 UTC (rev 16478)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/model/JSFELCompletionEngine.java 2009-07-07
21:08:36 UTC (rev 16479)
@@ -19,9 +19,7 @@
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.ELCompletionEngine;
import org.jboss.tools.common.el.core.resolver.ELOperandResolveStatus;
-import org.jboss.tools.common.el.core.resolver.ELResolver;
import org.jboss.tools.common.el.core.resolver.TypeInfoCollector;
import org.jboss.tools.common.model.project.IModelNature;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
@@ -34,34 +32,63 @@
*
* @author Viacheslav Kabanovich
*/
-public class JSFELCompletionEngine extends
AbstractELCompletionEngine<JSFELCompletionEngine.IJSFVariable> implements
ELResolver, ELCompletionEngine {
+public class JSFELCompletionEngine extends
AbstractELCompletionEngine<JSFELCompletionEngine.IJSFVariable> {
+
private static final Image JSF_EL_PROPOSAL_IMAGE =
JSFModelPlugin.getDefault().getImage(JSFModelPlugin.CA_JSF_EL_IMAGE_PATH);
+ private static ELParserFactory factory = ELParserUtil.getDefaultFactory();
+ /*
+ * (non-Javadoc)
+ * @see org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine#getELProposalImage()
+ */
public Image getELProposalImage() {
return JSF_EL_PROPOSAL_IMAGE;
}
- private static ELParserFactory factory = ELParserUtil.getDefaultFactory();
-
public JSFELCompletionEngine() {}
+ /*
+ * (non-Javadoc)
+ * @see
org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine#log(java.lang.Exception)
+ */
protected void log(Exception e) {
JSFModelPlugin.getPluginLog().logError(e);
}
+ /*
+ * (non-Javadoc)
+ * @see org.jboss.tools.common.el.core.resolver.ELCompletionEngine#getParserFactory()
+ */
public ELParserFactory getParserFactory() {
return factory;
}
+ /*
+ * (non-Javadoc)
+ * @see
org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine#newELOperandResolveStatus(org.jboss.tools.common.el.core.model.ELInvocationExpression)
+ */
+ @Override
protected ELOperandResolveStatus newELOperandResolveStatus(ELInvocationExpression
tokens) {
return new ELOperandResolveStatus(tokens);
}
+ /*
+ * (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)
+ */
public List<IJSFVariable> resolveVariables(IFile file, ELInvocationExpression
expr, boolean isFinal, boolean onlyEqualNames) {
IModelNature project = EclipseResourceUtil.getModelNature(file.getProject());
return resolveVariables(project, expr, isFinal, onlyEqualNames);
}
+ /**
+ *
+ * @param project
+ * @param expr
+ * @param isFinal
+ * @param onlyEqualNames
+ * @return
+ */
public List<IJSFVariable> resolveVariables(IModelNature project,
ELInvocationExpression expr, boolean isFinal, boolean onlyEqualNames) {
List<IJSFVariable>resolvedVars = new ArrayList<IJSFVariable>();
@@ -91,7 +118,7 @@
return new ArrayList<IJSFVariable>();
}
- List<IJSFVariable> resolveVariables(IModelNature project, String varName, boolean
onlyEqualNames) {
+ protected List<IJSFVariable> resolveVariables(IModelNature project, String
varName, boolean onlyEqualNames) {
if(project == null) return null;
List<IJSFVariable> beans = new
JSFPromptingProvider().getVariables(project.getModel());
List<IJSFVariable> resolvedVariables = new ArrayList<IJSFVariable>();
@@ -110,13 +137,15 @@
return resolvedVariables;
}
- public static interface IJSFVariable extends IVariable {
- public String getName();
- public IMember getSourceMember();
- }
-
+ /*
+ * (non-Javadoc)
+ * @see
org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine#getMemberInfoByVariable(org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine.IVariable,
boolean)
+ */
protected TypeInfoCollector.MemberInfo getMemberInfoByVariable(IJSFVariable var, boolean
onlyEqualNames) {
return TypeInfoCollector.createMemberInfo(((IJSFVariable)var).getSourceMember());
}
-}
+ public static interface IJSFVariable extends IVariable {
+ public IMember getSourceMember();
+ }
+}
\ No newline at end of file
Added:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/model/JSFImplicitObjectELResolver.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/model/JSFImplicitObjectELResolver.java
(rev 0)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/model/JSFImplicitObjectELResolver.java 2009-07-07
21:08:36 UTC (rev 16479)
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/
+package org.jboss.tools.jsf.model;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jface.text.BadLocationException;
+import org.jboss.tools.common.el.core.model.ELExpression;
+import org.jboss.tools.common.el.core.model.ELInstance;
+import org.jboss.tools.common.el.core.model.ELInvocationExpression;
+import org.jboss.tools.common.el.core.model.ELModel;
+import org.jboss.tools.common.el.core.parser.ELParser;
+import org.jboss.tools.common.el.core.parser.ELParserUtil;
+import org.jboss.tools.common.el.core.resolver.TypeInfoCollector;
+import org.jboss.tools.common.model.project.IModelNature;
+import org.jboss.tools.common.model.util.EclipseResourceUtil;
+
+/**
+ * @author Alexey Kazakov
+ */
+public class JSFImplicitObjectELResolver extends JSFELCompletionEngine {
+
+ private static final String FACES_CONTEXT = "facesContext";
+
+ private static final Map<String, ELExpression> IMPLICT_OBJECTS_ELS = new
HashMap<String, ELExpression>();
+ static {
+ IMPLICT_OBJECTS_ELS.put("application",
parseEl("#{facesContext.externalContext.context}"));
+ IMPLICT_OBJECTS_ELS.put("applicationScope",
parseEl("#{facesContext.externalContext.applicationMap}"));
+ IMPLICT_OBJECTS_ELS.put("cookie",
parseEl("#{facesContext.externalContext.requestCookieMap}"));
+ IMPLICT_OBJECTS_ELS.put("header",
parseEl("#{facesContext.externalContext.requestHeaderMap}"));
+ IMPLICT_OBJECTS_ELS.put("headerValues",
parseEl("#{facesContext.externalContext.requestHeaderValuesMap}"));
+ IMPLICT_OBJECTS_ELS.put("initParam",
parseEl("#{facesContext.externalContext.initParameterMap}"));
+ IMPLICT_OBJECTS_ELS.put("param",
parseEl("#{facesContext.externalContext.requestParameterMap}"));
+ IMPLICT_OBJECTS_ELS.put("paramValues",
parseEl("#{facesContext.externalContext.requestParameterValuesMap}"));
+ IMPLICT_OBJECTS_ELS.put("request",
parseEl("#{facesContext.externalContext.request}"));
+ IMPLICT_OBJECTS_ELS.put("requestScope",
parseEl("#{facesContext.externalContext.requestMap}"));
+// IMPLICT_OBJECTS_ELS.put("session",
parseEl("#{facesContext.externalContext.getSession()}"));
+ IMPLICT_OBJECTS_ELS.put("session",
parseEl("#{facesContext.externalContext.request}")); // FIXME we should fix EL
resolving for methods with arguments (e.g.
#{facesContext.externalContext.getSession(true)}) See
https://jira.jboss.org/jira/browse/JBIDE-4580
+ IMPLICT_OBJECTS_ELS.put("sessionScope",
parseEl("#{facesContext.externalContext.sessionMap}"));
+ IMPLICT_OBJECTS_ELS.put("view",
parseEl("#{facesContext.viewRoot}"));
+ }
+
+ private IFile file;
+
+ /*
+ * (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)
+ */
+ public List<IJSFVariable> resolveVariables(IFile file, ELInvocationExpression
expr, boolean isFinal, boolean onlyEqualNames) {
+ this.file = file;
+ return super.resolveVariables(file, expr, isFinal, onlyEqualNames);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.jboss.tools.jsf.model.JSFELCompletionEngine#resolveVariables(org.jboss.tools.common.model.project.IModelNature,
java.lang.String, boolean)
+ */
+ @Override
+ protected List<IJSFVariable> resolveVariables(IModelNature project, String
varName, boolean onlyEqualNames) {
+ if(file.getProject() == null) {
+ return null;
+ }
+ List<IJSFVariable> resolvedVariables = new ArrayList<IJSFVariable>();
+ if(onlyEqualNames) {
+ if(FACES_CONTEXT.equals(varName)) {
+ return getFacesContextVariable();
+ }
+ } else {
+ if(FACES_CONTEXT.startsWith(varName)) {
+ resolvedVariables.addAll(getFacesContextVariable());
+ }
+ }
+ Set<String> vars = IMPLICT_OBJECTS_ELS.keySet();
+ List<String> elVars = new ArrayList<String>();
+ for (String var : vars) {
+ if(onlyEqualNames) {
+ if(var.equals(varName)) {
+ elVars.add(var);
+ }
+ } else if(var.startsWith(varName)) {
+ elVars.add(var);
+ }
+ }
+
+ for (String var : elVars) {
+ try {
+ TypeInfoCollector.MemberInfo info = resolveEL(file, IMPLICT_OBJECTS_ELS.get(var),
false);
+ if(info!=null) {
+ IType type = info.getMemberType();
+ if(type!=null) {
+ resolvedVariables.add(new Variable(var, type));
+ }
+ }
+ } catch (StringIndexOutOfBoundsException e) {
+ log(e);
+ } catch (BadLocationException e) {
+ log(e);
+ }
+ }
+ return resolvedVariables;
+ }
+
+ private static ELExpression parseEl(String el) {
+ if(el.length()>3 && el.startsWith("#{") &&
el.endsWith("}")) { //$NON-NLS-1$ //$NON-NLS-2$
+ ELParser parser = ELParserUtil.getDefaultFactory().createParser();
+ ELModel model = parser.parse(el);
+ if(model == null || model.getSyntaxErrors().size() > 0) {
+ return null;
+ }
+ List<ELInstance> is = model.getInstances();
+ if(is.size() == 0) {
+ return null;
+ }
+ return is.get(0).getExpression();
+ }
+ return null;
+ }
+
+ private List<IJSFVariable> getFacesContextVariable() {
+ IJavaProject jp = EclipseResourceUtil.getJavaProject(file.getProject());
+ List<IJSFVariable> list = new ArrayList<IJSFVariable>();
+ try {
+ IType type = jp.findType("javax.faces.context.FacesContext");
+ list.add(new Variable(FACES_CONTEXT, type));
+ } catch (JavaModelException e) {
+ log(e);
+ }
+ return list;
+ }
+
+ 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()
+ */
+ public IMember getSourceMember() {
+ return source;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine.IVariable#getName()
+ */
+ public String getName() {
+ return name;
+ }
+ }
+}
\ No newline at end of file
Property changes on:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/model/JSFImplicitObjectELResolver.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified:
trunk/jst/plugins/org.jboss.tools.jst.web.kb/src/org/jboss/tools/jst/web/kb/el/AbstractELCompletionEngine.java
===================================================================
---
trunk/jst/plugins/org.jboss.tools.jst.web.kb/src/org/jboss/tools/jst/web/kb/el/AbstractELCompletionEngine.java 2009-07-07
19:36:57 UTC (rev 16478)
+++
trunk/jst/plugins/org.jboss.tools.jst.web.kb/src/org/jboss/tools/jst/web/kb/el/AbstractELCompletionEngine.java 2009-07-07
21:08:36 UTC (rev 16479)
@@ -403,13 +403,9 @@
return status;
}
- public List<V> resolveVariables(IFile file, ELInvocationExpression expr, boolean
isFinal, boolean onlyEqualNames) {
- return new ArrayList<V>();
- }
+ abstract public List<V> resolveVariables(IFile file, ELInvocationExpression expr,
boolean isFinal, boolean onlyEqualNames);
- protected TypeInfoCollector.MemberInfo getMemberInfoByVariable(V var, boolean
onlyEqualNames) {
- return null;
- }
+ abstract protected TypeInfoCollector.MemberInfo getMemberInfoByVariable(V var, boolean
onlyEqualNames);
protected void setUsedVariables(ELOperandResolveStatus status, List<V>
resolvedVariables) {
}
@@ -418,7 +414,6 @@
return false;
}
-
protected List<TypeInfoCollector.MemberInfo> resolveSegment(ELInvocationExpression
expr,
List<TypeInfoCollector.MemberInfo> members,
ELOperandResolveStatus status,
@@ -678,5 +673,4 @@
protected void setImage(TextProposal kbProposal, V var) {
kbProposal.setImage(getELProposalImage());
}
-
-}
+}
\ No newline at end of file