/*******************************************************************************
* 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.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.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 ImageDescriptor JSF_EL_PROPOSAL_IMAGE =
JSFModelPlugin.getDefault().getImageDescriptorFromRegistry(JSFModelPlugin.CA_JSF_EL_IMAGE_PATH);
/*
* (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;
}
/* (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, ELContext context, 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, ELContext context,ELInvocationExpression expr, boolean isFinal, boolean onlyEqualNames, int offset) {
List<IJSF2ManagedBean> beans = EMPTY_VARIABLES_LIST;
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 && !manager.isMetadataComplete()) {
if(onlyEqualNames) {
resolvedBeans = manager.getManagedBeans(varName);
if(beans == EMPTY_VARIABLES_LIST) {
beans = new ArrayList<IJSF2ManagedBean>();
}
beans.addAll(resolvedBeans);
} else {
resolvedBeans = manager.getManagedBeans();
for (IJSF2ManagedBean bean : resolvedBeans) {
if(bean.getName().startsWith(varName)) {
if(beans == EMPTY_VARIABLES_LIST) {
beans = new ArrayList<IJSF2ManagedBean>();
}
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()
*/
@Override
public ELParserFactory getParserFactory() {
return factory;
}
@Override
protected boolean isStaticMethodsCollectingEnabled() {
return true;
}
}