/*******************************************************************************
* Copyright (c) 2011-2013 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.cdi.seam.core.international.el;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.jboss.tools.cdi.core.CDICoreNature;
import org.jboss.tools.cdi.core.CDICorePlugin;
import org.jboss.tools.cdi.core.CDIImages;
import org.jboss.tools.cdi.seam.core.CDISeamCorePlugin;
import org.jboss.tools.cdi.seam.core.international.BundleModelFactory;
import org.jboss.tools.cdi.seam.core.international.IBundle;
import org.jboss.tools.cdi.seam.core.international.IBundleModel;
import org.jboss.tools.cdi.seam.core.international.IProperty;
import org.jboss.tools.cdi.seam.core.international.impl.BundleImpl;
import org.jboss.tools.cdi.seam.core.international.impl.LocalizedValue;
import org.jboss.tools.cdi.seam.core.international.impl.PropertyImpl;
import org.jboss.tools.common.el.core.ca.AbstractELCompletionEngine;
import org.jboss.tools.common.el.core.ca.MessagesELTextProposal;
import org.jboss.tools.common.el.core.model.ELArgumentInvocation;
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.model.ELObjectType;
import org.jboss.tools.common.el.core.model.ELPropertyInvocation;
import org.jboss.tools.common.el.core.parser.ELParser;
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.parser.LexicalToken;
import org.jboss.tools.common.el.core.resolver.ELContext;
import org.jboss.tools.common.el.core.resolver.ELResolution;
import org.jboss.tools.common.el.core.resolver.ELResolutionImpl;
import org.jboss.tools.common.el.core.resolver.ELSegmentImpl;
import org.jboss.tools.common.el.core.resolver.IRelevanceCheck;
import org.jboss.tools.common.el.core.resolver.IVariable;
import org.jboss.tools.common.el.core.resolver.TypeInfoCollector.MemberInfo;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.util.PositionHolder;
import org.jboss.tools.common.text.TextProposal;
import org.jboss.tools.common.util.StringUtil;
import org.jboss.tools.jst.web.kb.IResourceBundle;
import org.jboss.tools.jst.web.kb.el.MessagePropertyELSegmentImpl;
import org.jboss.tools.jst.web.kb.internal.ResourceBundle;
/**
*
* @author Victor V. Rubezhny
*
*/
public class CDIInternationalMessagesELResolver extends AbstractELCompletionEngine<IVariable> {
private static final List<Variable> EMPTY_VARIABLES = Collections.unmodifiableList(new ArrayList<Variable>());
/*
* (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 CDIImages.MESSAGE_BUNDLE_IMAGE;
}
private static ELParserFactory factory = ELParserUtil.getDefaultFactory();
public CDIInternationalMessagesELResolver() {}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.ELResolver#getParserFactory()
*/
@Override
public ELParserFactory getParserFactory() {
return factory;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.ca.AbstractELCompletionEngine#log(java.lang.Exception)
*/
@Override
protected void log(Exception e) {
CDISeamCorePlugin.getDefault().logError(e);
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.ELResolver2#getProposals(org.jboss.tools.common.el.core.resolver.ELContext, java.lang.String)
*/
@Override
public List<TextProposal> getProposals(ELContext context, String el, int offset) {
return getCompletions(el, false, 0, context);
}
public List<TextProposal> getCompletions(String elString,
boolean returnEqualedVariablesOnly, int position, ELContext context) {
IProject project = context == null ? null :
context.getResource() == null ? null :
context.getResource().getProject();
if (project == null)
return null;
if (!CDICorePlugin.getCDI(project, true).getExtensionManager().isCDIExtensionAvailable(CDISeamCorePlugin.CDI_INTERNATIONAL_RUNTIME_EXTENTION))
return null;
IBundleModel bundleModel = BundleModelFactory.getBundleModel(project);
IResourceBundle[] bundles = bundleModel == null ? null : findResourceBundles(bundleModel);
if (bundles == null)
return null;
List<TextProposal> proposals = null;
try {
proposals = getCompletions(context.getResource(), null, elString.subSequence(0, elString.length()), position, returnEqualedVariablesOnly, bundles);
} catch (StringIndexOutOfBoundsException e) {
log(e);
} catch (BadLocationException e) {
log(e);
}
return proposals;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.ELResolver2#resolve(org.jboss.tools.common.el.core.resolver.ELContext, org.jboss.tools.common.el.core.model.ELExpression)
*/
@Override
public ELResolution resolve(ELContext context, ELExpression operand, int offset) {
ELResolutionImpl resolution = resolveELOperand(operand, context, true);
if(resolution != null)
resolution.setContext(context);
return resolution;
}
public ELResolutionImpl resolveELOperand(ELExpression operand,
ELContext context, boolean returnEqualedVariablesOnly) {
IProject project = context == null ? null :
context.getResource() == null ? null :
context.getResource().getProject();
if (project == null)
return null;
CDICoreNature n = CDICorePlugin.getCDI(project, true);
if (n == null || !n.getExtensionManager().isCDIExtensionAvailable(CDISeamCorePlugin.CDI_INTERNATIONAL_RUNTIME_EXTENTION))
return null;
IBundleModel bundleModel = BundleModelFactory.getBundleModel(context.getResource().getProject());
IResourceBundle[] bundles = bundleModel == null ? null : findResourceBundles(bundleModel);
if (bundles == null)
return null;
try {
return resolveELOperand(context.getResource(), operand, returnEqualedVariablesOnly, bundles);
} catch (StringIndexOutOfBoundsException e) {
log(e);
} catch (BadLocationException e) {
log(e);
}
return null;
}
public List<TextProposal> getCompletions(IFile file, IDocument document, CharSequence prefix,
int position, boolean returnEqualedVariablesOnly, IResourceBundle[] bundles) throws BadLocationException, StringIndexOutOfBoundsException {
List<TextProposal> completions = new ArrayList<TextProposal>();
ELResolutionImpl status = resolveELOperand(file, parseOperand("" + prefix), returnEqualedVariablesOnly, bundles); //$NON-NLS-1$
if(status!=null) {
completions.addAll(status.getProposals());
}
return completions;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.ca.AbstractELCompletionEngine#parseOperand(java.lang.String)
*/
@Override
public ELExpression parseOperand(String operand) {
if(operand == null) return null;
String el = (operand.indexOf("#{") < 0 && operand.indexOf("${") < 0) ? "#{" + operand + "}" : operand; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
ELParser p = getParserFactory().createParser();
ELModel model = p.parse(el);
List<ELInstance> is = model.getInstances();
if(is.isEmpty()) return null;
return is.get(0).getExpression();
}
public ELResolutionImpl resolveELOperand(IFile file,
ELExpression operand, boolean returnEqualedVariablesOnly, IResourceBundle[] bundles)
throws BadLocationException, StringIndexOutOfBoundsException {
if(!(operand instanceof ELInvocationExpression) || file == null) {
return null;
}
ELInvocationExpression expr = (ELInvocationExpression)operand;
boolean isIncomplete = expr.getType() == ELObjectType.EL_PROPERTY_INVOCATION
&& ((ELPropertyInvocation)expr).getName() == null;
boolean isArgument = expr.getType() == ELObjectType.EL_ARGUMENT_INVOCATION;
ELResolutionImpl resolution = new ELResolutionImpl(expr);
ELInvocationExpression left = expr;
List<Variable> resolvedVariables = EMPTY_VARIABLES;
if (expr.getLeft() != null && isArgument) {
left = expr.getLeft();
resolvedVariables = resolveVariables(file, left, bundles, false,
true); // is Final and equal names are because of
// we have no more to resolve the parts of expression,
// but we have to resolve arguments of probably a message component
if (!resolvedVariables.isEmpty()) {
resolution.setLastResolvedToken(left);
ELSegmentImpl segment = new MessagePropertyELSegmentImpl(combineLexicalTokensForExpression(left));
processMessageBundleSegment(expr, (MessagePropertyELSegmentImpl)segment, resolvedVariables);
segment.setResolved(true);
for (Variable variable : resolvedVariables) {
segment.getVariables().add(variable);
}
resolution.addSegment(segment);
}
} else if (expr.getLeft() == null && isIncomplete) {
resolvedVariables = resolveVariables(file, expr, bundles, true,
returnEqualedVariablesOnly);
} else {
while(left != null) {
List<Variable> resolvedVars = resolveVariables(file,
left, bundles, left == expr,
returnEqualedVariablesOnly);
if (resolvedVars != null && !resolvedVars.isEmpty()) {
resolvedVariables = resolvedVars;
resolution.setLastResolvedToken(left);
ELSegmentImpl segment = new MessagePropertyELSegmentImpl(combineLexicalTokensForExpression(left));
processMessageBundleSegment(expr, (MessagePropertyELSegmentImpl)segment, resolvedVariables);
segment.setResolved(true);
for (Variable variable : resolvedVars) {
segment.getVariables().add(variable);
}
resolution.addSegment(segment);
// if(left.getLastToken() != left.getFirstToken()) {
// LexicalToken combined = left.getFirstToken().getNextToken().getCombinedToken(left.getLastToken());
// segment = new MessagePropertyELSegmentImpl(combined);
// processMessageBundleSegment(expr, (MessagePropertyELSegmentImpl)segment, resolvedVariables);
// segment.setResolved(true);
// for (Variable variable : resolvedVars) {
// segment.getVariables().add(variable);
// }
// resolution.addSegment(segment);
// }
break;
}
left = (ELInvocationExpression)left.getLeft();
}
}
if (resolution.getLastResolvedToken() == null &&
!returnEqualedVariablesOnly &&
expr != null &&
isIncomplete) {
// no vars are resolved
// the tokens are the part of var name ended with a separator (.)
resolvedVariables = resolveVariables(file, expr, bundles, true, returnEqualedVariablesOnly);
Set<TextProposal> proposals = new TreeSet<TextProposal>(TextProposal.KB_PROPOSAL_ORDER);
if (left != null) {
ELSegmentImpl segment = new MessagePropertyELSegmentImpl(left.getFirstToken());
processMessageBundleSegment(expr, (MessagePropertyELSegmentImpl)segment, resolvedVariables);
segment.setResolved(false);
resolution.addSegment(segment);
for (Variable var : resolvedVariables) {
String varName = var.getName();
if(varName.startsWith(operand.getText())) {
MessagesELTextProposal proposal = new MessagesELTextProposal();
proposal.setReplacementString(varName.substring(operand.getLength()));
proposal.setLabel(varName);
proposal.setPropertyName(null); // Since it's not a property
proposal.setImageDescriptor(getELProposalImageForMember(null));
proposals.add(proposal);
}
}
resolution.setProposals(proposals);
segment.setResolved(!proposals.isEmpty());
}
return resolution;
}
// Here we have a list of vars for some part of expression
// OK. we'll proceed with members of these vars
if (resolution.getLastResolvedToken() == operand) {
// First segment is the last one
Set<TextProposal> proposals = new TreeSet<TextProposal>(TextProposal.KB_PROPOSAL_ORDER);
for (Variable var : resolvedVariables) {
String varName = var.getName();
if(operand.getLength()<=varName.length()) {
MessagesELTextProposal proposal = new MessagesELTextProposal();
proposal.setReplacementString(varName.substring(operand.getLength()));
proposal.setLabel(varName);
proposal.setPropertyName(null); // Since it's not a property
proposal.setImageDescriptor(getELProposalImageForMember(null));
List<XModelObject> objects = new ArrayList<XModelObject>();
IBundleModel bundleModel = BundleModelFactory.getBundleModel(var.f.getProject());
if(bundleModel != null && bundleModel.getBundle(var.basename) != null) {
IBundle bundle = bundleModel.getBundle(var.basename);
if(bundle == null)
continue;
Map<String, XModelObject> os = ((BundleImpl)bundle).getObjects();
for (XModelObject o: os.values()) {
if (o != null) objects.add(o);
}
}
proposal.setObjects(objects);
proposals.add(proposal);
} else if(returnEqualedVariablesOnly) {
TextProposal proposal = new TextProposal();
proposal.setReplacementString(varName);
proposal.setLabel(varName);
proposal.setImageDescriptor(getELProposalImageForMember(null));
proposals.add(proposal);
}
resolution.getLastSegment().getVariables().add(var);
}
resolution.setLastResolvedToken(expr);
resolution.setProposals(proposals);
return resolution;
}
//process segments one by one
if(left != null) {
while(left != expr) {
left = (ELInvocationExpression)left.getParent();
if (left != expr) { // inside expression
ELSegmentImpl segment = new ELSegmentImpl(left.getLastToken());
segment.setResolved(true);
resolution.addSegment(segment);
resolution.setLastResolvedToken(left);
return resolution;
} else { // Last segment
resolveLastSegment((ELInvocationExpression)operand, resolvedVariables, resolution, returnEqualedVariablesOnly);
break;
}
}
} else {
ELSegmentImpl segment = new ELSegmentImpl(expr.getFirstToken());
resolution.addSegment(segment);
}
return resolution;
}
public List<Variable> resolveVariables(IFile file, ELInvocationExpression expr, IResourceBundle[] bundles, boolean isFinal, boolean onlyEqualNames) {
List<Variable> result = EMPTY_VARIABLES;
String varName = expr.toString();
for (IResourceBundle b: bundles) {
String name = b.getVar();
if(!isFinal || onlyEqualNames) {
if(!name.equals(varName)) continue;
}
if(!name.startsWith(varName)) continue;
Variable v = new Variable(name, b.getBasename(), file);
if(result == EMPTY_VARIABLES) {
result = new ArrayList<Variable>();
}
result.add(v);
}
return result;
}
protected void resolveLastSegment(ELInvocationExpression expr,
List<Variable> members,
ELResolutionImpl resolution,
boolean returnEqualedVariablesOnly) {
Set<TextProposal> kbProposals = new TreeSet<TextProposal>(TextProposal.KB_PROPOSAL_ORDER);
ELSegmentImpl segment = new ELSegmentImpl(expr.getFirstToken());
resolution.setProposals(kbProposals);
if(expr instanceof ELPropertyInvocation) {
segment = new MessagePropertyELSegmentImpl(((ELPropertyInvocation)expr).getName());
processMessagePropertySegment(expr, (MessagePropertyELSegmentImpl)segment, members);
} else if (expr instanceof ELArgumentInvocation) {
segment = new MessagePropertyELSegmentImpl(((ELArgumentInvocation)expr).getArgument().getOpenArgumentToken().getNextToken());
processMessagePropertySegment(expr, (MessagePropertyELSegmentImpl)segment, members);
}
if(segment.getToken()!=null) {
resolution.addSegment(segment);
}
if (expr.getType() == ELObjectType.EL_PROPERTY_INVOCATION && ((ELPropertyInvocation)expr).getName() == null) {
// return all the methods + properties
for (Variable mbr : members) {
processSingularMember(mbr, kbProposals);
}
} else if(expr.getType() != ELObjectType.EL_ARGUMENT_INVOCATION) {
String filter = (expr.getMemberName() == null ? "" : expr.getMemberName());
for (Variable mbr : members) {
Collection<String> keys = mbr.getKeys();
for (String key : keys) {
if(returnEqualedVariablesOnly) {
// This is used for validation.
if (key.equals(filter)) {
TextProposal kbProposal = createProposal(mbr, key);
kbProposals.add(kbProposal);
break;
}
} else if (key.startsWith(filter)) {
// This is used for CA.
MessagesELTextProposal kbProposal = createProposal(mbr, key);
if (key.indexOf('.') == -1) kbProposal.setReplacementString(key.substring(filter.length()));
else kbProposal.setReplacementString('[' + kbProposal.getReplacementString());
kbProposal.setImageDescriptor(getELProposalImageForMember(null));
kbProposals.add(kbProposal);
}
}
}
} else if(expr.getType() == ELObjectType.EL_ARGUMENT_INVOCATION) {
String filter = expr.getMemberName() == null ? "" : expr.getMemberName();
boolean b = filter.startsWith("'") || filter.startsWith("\""); //$NON-NLS-1$ //$NON-NLS-2$
boolean e = filter.length() > 1 && filter.endsWith("'") || filter.endsWith("\"");//$NON-NLS-1$ //$NON-NLS-2$
filter = StringUtil.trimQuotes(filter);
for (Variable mbr : members) {
if ((!b && filter.length() > 0) || (b && e && filter.length() == 0)) {
//Value is set as expression itself, we cannot compute it
resolution.setMapOrCollectionOrBundleAmoungTheTokens(true);
return;
}
Collection<String> keys = mbr.getKeys();
for (String key : keys) {
if(returnEqualedVariablesOnly) {
// This is used for validation.
if (key.equals(filter)) {
MessagesELTextProposal kbProposal = createProposal(mbr, key);
kbProposals.add(kbProposal);
break;
}
} else if (key.startsWith(filter)) {
// This is used for CA.
MessagesELTextProposal kbProposal = createProposal(mbr, key);
String existingString = expr.getMemberName() == null ? "" : expr.getMemberName();
// Because we're in argument invocation we should fix the proposal by surrounding it with quotes as needed
String replacement = kbProposal.getReplacementString();
String label = kbProposal.getLabel();
if (!replacement.startsWith("'")) {
replacement = '\'' + key + '\'';
label = "['" + key + "']";
}
replacement = replacement.substring(existingString.length());
kbProposal.setReplacementString(replacement);
kbProposal.setLabel(label);
kbProposals.add(kbProposal);
}
}
}
}
segment.setResolved(!kbProposals.isEmpty());
if (resolution.isResolved()){
resolution.setLastResolvedToken(expr);
}
}
private void processMessageBundleSegment(ELInvocationExpression expr, MessagePropertyELSegmentImpl segment, List<Variable> variables) {
if(segment.getToken() == null)
return;
for(Variable variable : variables){
if(isRelevant(expr, variable)) {
IBundleModel bundleModel = BundleModelFactory.getBundleModel(variable.f.getProject());
if(bundleModel == null) return;
if(bundleModel.getBundle(variable.basename) == null)
return;
segment.setBaseName(variable.basename);
segment.setBundleOnlySegment(true);
IBundle bundle = bundleModel.getBundle(variable.basename);
if(bundle == null)
continue;
Map<String, XModelObject> os = ((BundleImpl)bundle).getObjects();
for (XModelObject o: os.values()) {
segment.addObject(o);
}
}
}
}
/*
* Checks that name of variable is equal to the beginning of expression, which can take more than one token (like a.b.c)
*/
private boolean isRelevant(ELInvocationExpression expr, Variable variable) {
LexicalToken t = expr.getFirstToken();
StringBuilder sb = new StringBuilder();
sb.append(t.getText());
boolean ok = sb.toString().equals(variable.name);
while(!ok && t != null && t != expr.getLastToken()) {
t = t.getNextToken();
sb.append(t.getText());
ok = sb.toString().equals(variable.name);
}
return ok;
}
private void processMessagePropertySegment(ELInvocationExpression expr, MessagePropertyELSegmentImpl segment, List<Variable> variables){
if(segment.getToken() == null)
return;
for(Variable variable : variables){
if(isRelevant(expr, variable)) {
IBundleModel bundleModel = BundleModelFactory.getBundleModel(variable.f.getProject());
if(bundleModel == null) return;
IBundle bundle = bundleModel.getBundle(variable.basename);
if(bundle == null)
return;
String propertyName = segment.getToken().getText();
IProperty prop = bundle.getProperty(StringUtil.trimQuotes(propertyName));
if(prop != null) {
Map<String, LocalizedValue> values = ((PropertyImpl)prop).getValues();
for (LocalizedValue value: values.values()) {
XModelObject p = value.getObject();
segment.addObject(p);
segment.setBaseName(variable.basename);
PositionHolder h = PositionHolder.getPosition(p, null);
h.update();
segment.setMessagePropertySourceReference(h.getStart(), prop.getName().length());
IFile propFile = (IFile)p.getAdapter(IFile.class);
if(propFile == null)
continue;
segment.setMessageBundleResource(propFile);
}
}
}
}
}
public boolean findPropertyLocation(XModelObject property, String content, MessagePropertyELSegmentImpl segment) {
String name = property.getAttributeValue("name"); //$NON-NLS-1$
String nvs = property.getAttributeValue("name-value-separator"); //$NON-NLS-1$
int i = content.indexOf(name + nvs);
if(i < 0) return false;
segment.setMessagePropertySourceReference(i, name.length());
return true;
}
private MessagesELTextProposal createProposal(Variable mbr, String proposal) {
MessagesELTextProposal kbProposal = new MessagesELTextProposal();
if (proposal.indexOf('.') != -1) {
kbProposal.setReplacementString('\'' + proposal + '\'');
kbProposal.setLabel("['" + proposal + "']");
} else {
kbProposal.setReplacementString(proposal);
kbProposal.setLabel(proposal);
}
kbProposal.setAlternateMatch(proposal);
kbProposal.setImageDescriptor(getELProposalImageForMember(null));
List<XModelObject> objects = new ArrayList<XModelObject>();
IBundleModel bundleModel = BundleModelFactory.getBundleModel(mbr.f.getProject());
if(bundleModel != null) {
IBundle bundle = bundleModel.getBundle(mbr.basename);
if(bundle != null) {
IProperty prop = bundle.getProperty(proposal);
if(prop != null) {
Map<String, LocalizedValue> values = ((PropertyImpl)prop).getValues();
for (LocalizedValue value: values.values()) {
XModelObject p = value.getObject();
if (p != null) objects.add(p);
}
}
}
}
kbProposal.setBaseName(mbr.basename);
kbProposal.setPropertyName(proposal);
kbProposal.setObjects(objects);
return kbProposal;
}
protected void processSingularMember(Variable mbr, Set<TextProposal> kbProposals) {
// Surround the "long" keys containing the dots with [' ']
TreeSet<String> keys = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
keys.addAll(mbr.getKeys());
for(String key: keys) {
if (key == null || key.length() == 0)
continue;
MessagesELTextProposal proposal = createProposal(mbr, key);
if (key.indexOf('.') != -1) {
proposal.setReplacementString("['" + key + "']"); //$NON-NLS-1$ //$NON-NLS-2$
proposal.setLabel("['" + key + "']");
} else {
proposal.setReplacementString(key);
proposal.setLabel(key);
}
kbProposals.add(proposal);
}
}
static class Variable implements IVariable {
IFile f;
String name;
String basename;
public Variable(String name, String basename, IFile f) {
this.name = name;
this.basename = basename;
this.f = f;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.IVariable#getName()
*/
@Override
public String getName() {
return name;
}
public String getBasename() {
return basename;
}
public Collection<String> getKeys() {
TreeSet<String> result = new TreeSet<String>();
IBundleModel bundleModel = BundleModelFactory.getBundleModel(f.getProject());
if(bundleModel != null) {
IBundle bundle = bundleModel.getBundle(basename);
if(bundle != null) {
result.addAll(bundle.getPropertyNames());
}
}
return result;
}
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.ca.AbstractELCompletionEngine#getMemberInfoByVariable(org.jboss.tools.common.el.core.resolver.IVariable, boolean)
*/
@Override
protected MemberInfo getMemberInfoByVariable(IVariable var, ELContext context,
boolean onlyEqualNames, int offset) {
return null;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.ca.AbstractELCompletionEngine#resolveVariables(org.eclipse.core.resources.IFile, org.jboss.tools.common.el.core.model.ELInvocationExpression, boolean, boolean)
*/
@Override
public List<IVariable> resolveVariables(IFile file, ELContext context,
ELInvocationExpression expr, boolean isFinal, boolean onlyEqualNames, int offset) {
return null;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.ca.AbstractELCompletionEngine#isStaticMethodsCollectingEnabled()
*/
@Override
protected boolean isStaticMethodsCollectingEnabled() {
return false;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.ca.AbstractELCompletionEngine#createRelevanceCheck(org.eclipse.jdt.core.IJavaElement)
*/
@Override
public IRelevanceCheck createRelevanceCheck(IJavaElement element) {
return IRRELEVANT;
}
IResourceBundle[] findResourceBundles (IBundleModel model) {
Map<String, IResourceBundle> result = new HashMap<String, IResourceBundle>();
for (String basename : model.getAllAvailableBundles()) {
String var = "bundles." + basename;
IResourceBundle resourceBundle = new ResourceBundle(basename, var);
result.put(var, resourceBundle);
}
return result.values().toArray(new IResourceBundle[0]);
}
}