Author: scabanovich
Date: 2011-07-07 20:11:20 -0400 (Thu, 07 Jul 2011)
New Revision: 32731
Added:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/el/
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/el/JSF2ElResolver.java
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/JSF2ManagedBean.java
Modified:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/IJSF2ManagedBean.java
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/IJSF2Project.java
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/JSF2ProjectFactory.java
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/JSF2Project.java
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/TypeDefinition.java
Log:
JBIDE-5046
https://issues.jboss.org/browse/JBIDE-5046
Added:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/el/JSF2ElResolver.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/el/JSF2ElResolver.java
(rev 0)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/el/JSF2ElResolver.java 2011-07-08
00:11:20 UTC (rev 32731)
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2009-2011 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.jsf2.bean.el;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.swt.graphics.Image;
+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.TypeInfoCollector;
+import org.jboss.tools.common.el.core.resolver.TypeInfoCollector.MemberInfo;
+import org.jboss.tools.jsf.JSFModelPlugin;
+import org.jboss.tools.jsf.jsf2.bean.model.IJSF2ManagedBean;
+import org.jboss.tools.jsf.jsf2.bean.model.IJSF2Project;
+import org.jboss.tools.jsf.jsf2.bean.model.JSF2ProjectFactory;
+
+/**
+ * @author Alexey Kazakov & Viacheslav Kabanovich
+ */
+public class JSF2ElResolver extends AbstractELCompletionEngine<IJSF2ManagedBean> {
+
+ private static ELParserFactory factory = ELParserUtil.getJbossFactory();
+
+ public static final Image JSF_EL_PROPOSAL_IMAGE =
+ JSFModelPlugin.getDefault().getImage(JSFModelPlugin.CA_JSF_EL_IMAGE_PATH);
+
+
+ /* (non-Javadoc)
+ * @see org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine#getELProposalImage()
+ */
+ @Override
+ public Image getELProposalImage() {
+ return JSF_EL_PROPOSAL_IMAGE;
+ }
+
+ /* (non-Javadoc)
+ * @see
org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine#log(java.lang.Exception)
+ */
+ @Override
+ protected void log(Exception e) {
+ JSFModelPlugin.getDefault().logError(e);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.jboss.tools.jst.web.kb.el.AbstractELCompletionEngine#getMemberInfoByVariable(org.jboss.tools.common.el.core.resolver.IVariable,
boolean)
+ */
+ @Override
+ protected MemberInfo getMemberInfoByVariable(IJSF2ManagedBean bean, boolean
onlyEqualNames, int offset) {
+ return TypeInfoCollector.createMemberInfo(bean.getBeanClass());
+ }
+
+ /*
+ * (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<IJSF2ManagedBean> resolveVariables(IFile file, ELInvocationExpression
expr, boolean isFinal, boolean onlyEqualNames, int offset) {
+ ArrayList<IJSF2ManagedBean> beans = new ArrayList<IJSF2ManagedBean>();
+
+ IProject project = file.getProject();
+ if (project == null) {
+ return beans;
+ }
+
+ String varName = expr.toString();
+
+ Set<IJSF2ManagedBean> resolvedBeans = null;
+ if (varName != null) {
+ IJSF2Project manager = JSF2ProjectFactory.getJSF2ProjectWithProgress(project);
+ if (manager != null) {
+ if(onlyEqualNames) {
+ resolvedBeans = manager.getManagedBeans(varName);
+ beans.addAll(resolvedBeans);
+ } else {
+ resolvedBeans = manager.getManagedBeans();
+ for (IJSF2ManagedBean bean : resolvedBeans) {
+ if(bean.getName().startsWith(varName)) {
+ beans.add(bean);
+ }
+ }
+ resolvedBeans.clear();
+ resolvedBeans.addAll(beans);
+ }
+ }
+ }
+ if (resolvedBeans != null && !resolvedBeans.isEmpty()) {
+ List<IJSF2ManagedBean> newResolvedVars = new
ArrayList<IJSF2ManagedBean>();
+ for (IJSF2ManagedBean var : resolvedBeans) {
+ if(!isFinal) {
+ // 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);
+ }
+ } else {
+ newResolvedVars.add(var);
+ }
+ }
+ return newResolvedVars;
+ }
+ return beans;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.jboss.tools.common.el.core.resolver.ELResolver#getParserFactory()
+ */
+ public ELParserFactory getParserFactory() {
+ return factory;
+ }
+
+ @Override
+ protected boolean isStaticMethodsCollectingEnabled() {
+ return true;
+ }
+}
\ No newline at end of file
Property changes on:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/el/JSF2ElResolver.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/IJSF2ManagedBean.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/IJSF2ManagedBean.java 2011-07-07
23:09:44 UTC (rev 32730)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/IJSF2ManagedBean.java 2011-07-08
00:11:20 UTC (rev 32731)
@@ -10,6 +10,19 @@
******************************************************************************/
package org.jboss.tools.jsf.jsf2.bean.model;
-public interface IJSF2ManagedBean {
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IType;
+import org.jboss.tools.common.el.core.resolver.IVariable;
+import org.jboss.tools.common.java.IAnnotationDeclaration;
+public interface IJSF2ManagedBean extends IVariable {
+
+ public String getName();
+
+ public IAnnotationDeclaration getManagedBeanDeclaration();
+
+ public IPath getSourcePath();
+
+ public IType getBeanClass();
+
}
Modified:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/IJSF2Project.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/IJSF2Project.java 2011-07-07
23:09:44 UTC (rev 32730)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/IJSF2Project.java 2011-07-08
00:11:20 UTC (rev 32731)
@@ -17,10 +17,12 @@
public interface IJSF2Project {
- public IJSF2ManagedBean[] getManagedBeans();
+ public Set<IJSF2ManagedBean> getManagedBeans();
public Set<IJSF2ManagedBean> getManagedBeans(IPath path);
+ public Set<IJSF2ManagedBean> getManagedBeans(String name);
+
public IProject getProject();
public Set<? extends IJSF2Project> getUsedProjects();
Modified:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/JSF2ProjectFactory.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/JSF2ProjectFactory.java 2011-07-07
23:09:44 UTC (rev 32730)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/JSF2ProjectFactory.java 2011-07-08
00:11:20 UTC (rev 32731)
@@ -10,8 +10,16 @@
******************************************************************************/
package org.jboss.tools.jsf.jsf2.bean.model;
+import java.lang.reflect.InvocationTargetException;
+
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.jboss.tools.jsf.JSFModelPlugin;
import org.jboss.tools.jsf.jsf2.bean.model.impl.JSF2Project;
+import org.jboss.tools.jsf.messages.JSFUIMessages;
import org.jboss.tools.jst.web.kb.KbProjectFactory;
import org.jboss.tools.jst.web.kb.internal.KbProject;
@@ -41,4 +49,31 @@
return result;
}
+ public static IJSF2Project getJSF2ProjectWithProgress(final IProject project){
+ final IJSF2Project jsf = getJSF2Project(project, false);
+ if(jsf != null && !jsf.isStorageResolved()){
+ if (Display.getCurrent() != null) {
+ try{
+ PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new
IRunnableWithProgress(){
+ public void run(IProgressMonitor monitor)
+ throws InvocationTargetException, InterruptedException {
+ monitor.beginTask(JSFUIMessages.BUILD_JSF2_MODEL, 10);
+ monitor.worked(3);
+ getJSF2Project(project, true);
+ monitor.worked(7);
+ }
+ });
+ }catch(InterruptedException ie){
+ JSFModelPlugin.getDefault().logError(ie);
+ }catch(InvocationTargetException ite){
+ JSFModelPlugin.getDefault().logError(ite);
+ }
+ } else {
+ getJSF2Project(project, true);
+ }
+ }
+
+ return jsf;
+ }
+
}
Added:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/JSF2ManagedBean.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/JSF2ManagedBean.java
(rev 0)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/JSF2ManagedBean.java 2011-07-08
00:11:20 UTC (rev 32731)
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.jsf2.bean.model.impl;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IType;
+import org.jboss.tools.common.java.IAnnotationDeclaration;
+import org.jboss.tools.jsf.jsf2.bean.model.IJSF2ManagedBean;
+
+/**
+ *
+ * @author Viacheslav Kabanovich
+ *
+ */
+public class JSF2ManagedBean implements IJSF2ManagedBean {
+ TypeDefinition typeDefinition;
+
+ public JSF2ManagedBean() {}
+
+ public void setDefinition(TypeDefinition d) {
+ typeDefinition = d;
+ }
+
+ @Override
+ public String getName() {
+ String result = null;
+ IAnnotationDeclaration d = getManagedBeanDeclaration();
+ if(d != null) {
+ Object m = d.getMemberValue("name");
+ if(m != null) {
+ result = m.toString();
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public IAnnotationDeclaration getManagedBeanDeclaration() {
+ return typeDefinition.getManagedBeanAnnotation();
+ }
+
+ @Override
+ public IPath getSourcePath() {
+ return typeDefinition.getType().getPath();
+ }
+
+ @Override
+ public IType getBeanClass() {
+ return typeDefinition.getType();
+ }
+
+}
Property changes on:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/JSF2ManagedBean.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/JSF2Project.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/JSF2Project.java 2011-07-07
23:09:44 UTC (rev 32730)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/JSF2Project.java 2011-07-08
00:11:20 UTC (rev 32731)
@@ -12,8 +12,10 @@
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -41,6 +43,11 @@
import org.jboss.tools.jst.web.kb.internal.KbBuilder;
import org.w3c.dom.Element;
+/**
+ *
+ * @author Viacheslav Kabanovich
+ *
+ */
public class JSF2Project implements IJSF2Project {
IProject project = null;
@@ -53,6 +60,7 @@
Set<JSF2Project> dependsOn = new HashSet<JSF2Project>();
Set<JSF2Project> usedBy = new HashSet<JSF2Project>();
+ private Set<IJSF2ManagedBean> allBeans = new HashSet<IJSF2ManagedBean>();
private Map<IPath, Set<IJSF2ManagedBean>> beansByPath = new
HashMap<IPath, Set<IJSF2ManagedBean>>();
private Map<String, Set<IJSF2ManagedBean>> beansByName = new
HashMap<String, Set<IJSF2ManagedBean>>();
private Set<IJSF2ManagedBean> namedBeans = new HashSet<IJSF2ManagedBean>();
@@ -62,8 +70,10 @@
}
@Override
- public IJSF2ManagedBean[] getManagedBeans() {
- return namedBeans.toArray(new IJSF2ManagedBean[0]);
+ public Set<IJSF2ManagedBean> getManagedBeans() {
+ Set<IJSF2ManagedBean> result = new HashSet<IJSF2ManagedBean>();
+ result.addAll(namedBeans);
+ return result;
}
@Override
@@ -75,6 +85,18 @@
}
@Override
+ public Set<IJSF2ManagedBean> getManagedBeans(String name) {
+ Set<IJSF2ManagedBean> result = new HashSet<IJSF2ManagedBean>();
+ Set<IJSF2ManagedBean> beans = beansByName.get(name);
+ if(beans != null) {
+ synchronized(beans) {
+ result.addAll(beans);
+ }
+ }
+ return result;
+ }
+
+ @Override
public IProject getProject() {
return project;
}
@@ -167,6 +189,32 @@
}
}
+ public List<TypeDefinition> getAllTypeDefinitions() {
+ Set<JSF2Project> ps = getUsedProjects(true);
+ if(ps == null || ps.isEmpty()) {
+ return getDefinitions().getTypeDefinitions();
+ }
+ List<TypeDefinition> ds = getDefinitions().getTypeDefinitions();
+ List<TypeDefinition> result = new ArrayList<TypeDefinition>();
+ result.addAll(ds);
+ Set<IType> types = new HashSet<IType>();
+ for (TypeDefinition d: ds) {
+ IType t = d.getType();
+ if(t != null) types.add(t);
+ }
+ for (JSF2Project p: ps) {
+ List<TypeDefinition> ds2 = p.getDefinitions().getTypeDefinitions();
+ for (TypeDefinition d: ds2) {
+ IType t = d.getType();
+ if(t != null && !types.contains(t)) {
+ types.add(t);
+ result.add(d);
+ }
+ }
+ }
+ return result;
+ }
+
public DefinitionContext getDefinitions() {
return definitions;
}
@@ -202,7 +250,7 @@
if(isStorageResolved) return;
isStorageResolved = true;
try {
- getProject().build(IncrementalProjectBuilder.FULL_BUILD, KbBuilder.BUILDER_ID, new
HashMap(), new NullProgressMonitor());
+ getProject().build(IncrementalProjectBuilder.FULL_BUILD, KbBuilder.BUILDER_ID, new
HashMap<String,String>(), new NullProgressMonitor());
} catch (CoreException e) {
JSFModelPlugin.getDefault().logError(e);
}
@@ -230,9 +278,67 @@
}
public void update() {
- //TODO
+ List<TypeDefinition> typeDefinitions = getAllTypeDefinitions();
+ List<IJSF2ManagedBean> beans = new ArrayList<IJSF2ManagedBean>();
+ for (TypeDefinition typeDefinition : typeDefinitions) {
+ if(typeDefinition.isManagedBean()) { //improve for managed properties
+ JSF2ManagedBean bean = new JSF2ManagedBean();
+ bean.setDefinition(typeDefinition);
+ beans.add(bean);
+ }
+
+ }
+ synchronized (beansByPath) {
+ beansByPath.clear();
+ }
+ synchronized (beansByName) {
+ beansByName.clear();
+ }
+ synchronized (namedBeans) {
+ namedBeans.clear();
+ }
+ synchronized (allBeans) {
+ allBeans.clear();
+ }
+
+ for (IJSF2ManagedBean bean: beans) {
+ addBean(bean);
+ }
}
+ public void addBean(IJSF2ManagedBean bean) {
+ String name = bean.getName();
+ if(name != null && name.length() > 0) {
+ Set<IJSF2ManagedBean> bs = beansByName.get(name);
+ if(bs == null) {
+ bs = new HashSet<IJSF2ManagedBean>();
+ synchronized (beansByName) {
+ beansByName.put(name, bs);
+ }
+ }
+ synchronized (bs) {
+ bs.add(bean);
+ }
+ synchronized (namedBeans) {
+ namedBeans.add(bean);
+ }
+ }
+ IPath path = bean.getSourcePath();
+ Set<IJSF2ManagedBean> bs = beansByPath.get(path);
+ if(bs == null) {
+ bs = new HashSet<IJSF2ManagedBean>();
+ synchronized (beansByPath) {
+ beansByPath.put(path, bs);
+ }
+ }
+ synchronized (bs) {
+ bs.add(bean);
+ }
+ synchronized (allBeans) {
+ allBeans.add(bean);
+ }
+ }
+
public void store() throws IOException {
isBuilt = true;
// File file = getStorageFile();
Modified:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/TypeDefinition.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/TypeDefinition.java 2011-07-07
23:09:44 UTC (rev 32730)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/jsf2/bean/model/impl/TypeDefinition.java 2011-07-08
00:11:20 UTC (rev 32731)
@@ -10,8 +10,14 @@
******************************************************************************/
package org.jboss.tools.jsf.jsf2.bean.model.impl;
+import org.jboss.tools.jsf.jsf2.bean.model.JSF2Constants;
+
public class TypeDefinition extends AbstractTypeDefinition {
public TypeDefinition() {}
+ public boolean isManagedBean() {
+ return isAnnotationPresent(JSF2Constants.MANAGED_BEAN_ANNOTATION_TYPE_NAME);
+ }
+
}