/******************************************************************************* * 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.common.el.core.resolver; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.jdt.core.IJavaElement; import org.jboss.tools.common.el.core.model.ELExpression; import org.jboss.tools.common.el.core.model.ELInvocationExpression; import org.jboss.tools.common.text.TextProposal; /** * @author Alexey Kazakov */ public class ELResolutionImpl implements ELResolution { protected ELContext context; protected List<ELSegment> segments = new ArrayList<ELSegment>(); protected ELExpression operand; protected Set<TextProposal> proposals = new HashSet<TextProposal>(); protected ELInvocationExpression lastResolvedToken; protected boolean mapOrCollectionOrBundleAmoungTheTokens; protected String value; public ELResolutionImpl(ELExpression operand) { setSourceOperand(operand); } /* (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#findSegmentsByJavaElement(org.eclipse.jdt.core.IJavaElement) */ public List<ELSegment> findSegmentsByVariable(IVariable variable) { ArrayList<ELSegment> list = new ArrayList<ELSegment>(); for(ELSegment segment : segments){ if(segment.isResolved()) { for(IVariable var : segment.getVariables()){ if(var.getName().equals(variable.getName())){ list.add(segment); } } } } return list; } /* (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#findSegmentsByJavaElement(org.eclipse.jdt.core.IJavaElement) */ public List<ELSegment> findSegmentsByJavaElement(IJavaElement element) { ArrayList<ELSegment> list = new ArrayList<ELSegment>(); for(ELSegment segment : segments){ if(segment.isResolved() && segment instanceof JavaMemberELSegment) { JavaMemberELSegment javaSegment = (JavaMemberELSegment)segment; if(javaSegment.getJavaElement() != null && javaSegment.getJavaElement().equals(element)) { list.add(segment); } } } return list; } /* (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#findSegmentsByMessageProperty(String, String) */ public List<ELSegment> findSegmentsByMessageProperty(String baseName, String propertyName) { ArrayList<ELSegment> list = new ArrayList<ELSegment>(); for(ELSegment segment : segments){ if(segment instanceof MessagePropertyELSegment && ((MessagePropertyELSegment)segment).getBaseName() != null){ if(((MessagePropertyELSegment)segment).getBaseName().equals(baseName) && segment.getToken().getText().equals(propertyName)) list.add(segment); } } return list; } /* (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#findSegmentByOffset(int) */ public ELSegment findSegmentByOffset(int offset) { for(ELSegment segment : segments){ if(segment.getSourceReference() != null && segment.getSourceReference().getStartPosition() <= offset && segment.getSourceReference().getStartPosition()+segment.getSourceReference().getLength() > offset) return segment; } return null; } /* (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#getContext() */ public ELContext getContext() { return context; } /* (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#getSegments() */ public List<ELSegment> getSegments() { return segments; } /** * Adds a segment * @param segment */ public void addSegment(ELSegment segment) { segments.add(segment); } /* (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#getSourceOperand() */ public ELExpression getSourceOperand() { return operand; } /* (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#getUnresolvedSegment() */ public ELSegment getUnresolvedSegment() { for (ELSegment segment : segments) { if(!segment.isResolved()) { return segment; } } return null; } /* (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#isResolved() */ public boolean isResolved() { return !segments.isEmpty() && getUnresolvedSegment()==null; } /** * @return the proposals */ public Set<TextProposal> getProposals() { return proposals; } /** * @param proposals the proposals to set */ public void setProposals(Set<TextProposal> proposals) { this.proposals = proposals; } /** * @param operand the operand to set */ public void setSourceOperand(ELExpression operand) { this.operand = operand; } /** * @param context the context to set */ public void setContext(ELContext context) { this.context = context; } /** * @param segments the segments to set */ public void setSegments(List<ELSegment> segments) { this.segments = segments; } /** * @return the lastResolvedToken */ public ELInvocationExpression getLastResolvedToken() { return lastResolvedToken; } /** * @param lastResolvedToken the lastResolvedToken to set */ public void setLastResolvedToken(ELInvocationExpression lastResolvedToken) { this.lastResolvedToken = lastResolvedToken; } /** * @return the mapOrCollectionOrBundleAmoungTheTokens */ public boolean isMapOrCollectionOrBundleAmoungTheTokens() { return mapOrCollectionOrBundleAmoungTheTokens; } /** * @param mapOrCollectionOrBundleAmoungTheTokens the mapOrCollectionOrBundleAmoungTheTokens to set */ public void setMapOrCollectionOrBundleAmoungTheTokens( boolean mapOrCollectionOrBundleAmoungTheTokens) { this.mapOrCollectionOrBundleAmoungTheTokens = mapOrCollectionOrBundleAmoungTheTokens; } /* * (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#getLastSegment() */ public ELSegment getLastSegment() { if(!getSegments().isEmpty()) { return getSegments().get(getSegments().size()-1); } return null; } /* * (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#getNumberOfResolvedSegments() */ public int getNumberOfResolvedSegments() { int i = 0; for (ELSegment segment : segments) { if(segment.isResolved()) { i++; } else { break; } } return i; } /* * (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#getValue() */ public String getValue() { if(value==null) { value = operand.toString(); } return value; } /** * @param value */ public void setValue(String value) { this.value = value; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { if(segments!=null) { StringBuffer result = new StringBuffer("["); //$NON-NLS-1$ for (ELSegment segment : segments) { result.append(segment.toString()).append(';'); } result.append(']'); return result.toString(); } return super.toString(); } /* * (non-Javadoc) * @see org.jboss.tools.common.el.core.resolver.ELResolution#isValidatable() */ @Override public boolean isValidatable() { for (ELSegment segment : segments) { if(!segment.isValidatable()) { return false; } } return true; } }