/*******************************************************************************
* 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.text.MessageFormat;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.PartInitException;
import org.jboss.tools.common.CommonPlugin;
import org.jboss.tools.common.el.core.ELCorePlugin;
import org.jboss.tools.common.el.core.ElCoreMessages;
import org.jboss.tools.common.el.core.parser.LexicalToken;
import org.jboss.tools.common.el.core.resolver.TypeInfoCollector.MemberInfo;
/**
* @author Alexey Kazakov
*/
public class JavaMemberELSegmentImpl extends ELSegmentImpl implements JavaMemberELSegment {
protected IJavaElement element;
protected Set<IJavaElement> allElements;
protected MemberInfo memberInfo;
protected boolean hasSetter;
protected boolean hasGetter;
protected Map<String, TypeInfoCollector.MethodInfo> unpairedGettersOrSetters;
public JavaMemberELSegmentImpl(LexicalToken token) {
super(token);
}
/* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.JavaMemberElSegment#getJavaElement()
*/
public IJavaElement getJavaElement() {
if(element==null && memberInfo!=null) {
element = memberInfo.getJavaElement();
}
return element;
}
/* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.JavaMemberElSegment#getMemberInfo()
*/
public MemberInfo getMemberInfo() {
return memberInfo;
}
/* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.JavaMemberElSegment#hasGetter()
*/
public boolean hasGetter() {
return hasGetter;
}
/* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.JavaMemberElSegment#hasSetter()
*/
public boolean hasSetter() {
return hasSetter;
}
/**
* @param element the element to set
*/
public void setElement(IJavaElement element) {
this.element = element;
try {
setResource(element.getUnderlyingResource());
} catch (JavaModelException e) {
ELCorePlugin.getDefault().logError(e);
}
}
/**
* Adds a Java Element for the Segment
*
* @param element
*/
public void addJavaElement(IJavaElement element) {
if (this.allElements == null) {
this.allElements = new HashSet<IJavaElement>();
}
this.allElements.add(element);
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.JavaMemberELSegment#getAllJavaElements()
*/
public IJavaElement[] getAllJavaElements() {
if (this.allElements == null || this.allElements.size() == 0) {
return new IJavaElement[0];
}
return (IJavaElement[])this.allElements.toArray(new IJavaElement[this.allElements.size()]);
}
/**
* @return the hasSetter
*/
public boolean isHasSetter() {
return hasSetter;
}
/**
* @param hasSetter the hasSetter to set
*/
public void setHasSetter(boolean hasSetter) {
this.hasSetter = hasSetter;
}
/**
* @return the hasGetter
*/
public boolean isHasGetter() {
return hasGetter;
}
/**
* @param hasGetter the hasGetter to set
*/
public void setHasGetter(boolean hasGetter) {
this.hasGetter = hasGetter;
}
/**
* @param memberInfo the memberInfo to set
*/
public void setMemberInfo(MemberInfo memberInfo) {
this.memberInfo = memberInfo;
if(memberInfo!=null && memberInfo.getJavaElement()!=null) {
this.setElement(memberInfo.getJavaElement());
}
}
/**
* @return Map of unpaired getters and setters (getters/setters without proper setters/getters).
* of all properties used in EL.
* Key - name of property.
* Value - MethodInfo of existed getter/setter.
*/
public Map<String, TypeInfoCollector.MethodInfo> getUnpairedGettersOrSetters() {
if (unpairedGettersOrSetters == null) {
unpairedGettersOrSetters = new HashMap<String, TypeInfoCollector.MethodInfo>();
}
return unpairedGettersOrSetters;
}
/**
* Clear Map of unpaired getters and setters.
*/
public void clearUnpairedGettersOrSetters() {
getUnpairedGettersOrSetters().clear();
}
public IOpenableReference[] getOpenable() {
IOpenableReference[] os = super.getOpenable();
if(getJavaElement() != null && getJavaElement().exists()) {
IOpenableReference openable = new IOpenableReference() {
@Override
public boolean open() {
try {
return JavaUI.openInEditor(getJavaElement()) != null;
} catch (PartInitException e) {
CommonPlugin.getDefault().logError(e);
} catch (JavaModelException e) {
CommonPlugin.getDefault().logError(e);
}
return false;
}
@Override
public String getLabel() {
IJavaElement javaElement = getJavaElement();
String name = ""; //$NON-NLS-1$
IType type = null;
if(javaElement instanceof IType){
name = javaElement.getElementName();
type = (IType)javaElement;
}else if(javaElement instanceof IMethod){
type = ((IMethod) javaElement).getDeclaringType();
name = type.getElementName()+"."+javaElement.getElementName()+"()"; //$NON-NLS-1$ //$NON-NLS-2$
}else if(javaElement instanceof IField){
type = ((IField) javaElement).getDeclaringType();
name = type.getElementName()+"."+javaElement.getElementName(); //$NON-NLS-1$
}
if(type != null)
name += " - "+type.getPackageFragment().getElementName(); //$NON-NLS-1$
return MessageFormat.format(ElCoreMessages.Open, name);
}
@Override
public Image getImage() {
return null;
}
};
if(os.length > 0) {
IOpenableReference[] os1 = new IOpenableReference[os.length + 1];
System.arraycopy(os, 0, os1, 0, os.length);
os1[os.length] = openable;
return os1;
}
return new IOpenableReference[]{openable};
}
return os;
}
}