/*******************************************************************************
* Copyright (c) 2015 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.quickfix;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IAnnotatable;
import org.eclipse.jdt.core.IAnnotation;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.ILocalVariable;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.ui.IMarkerResolution;
import org.eclipse.ui.IMarkerResolutionGenerator2;
import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation;
import org.jboss.tools.common.CommonPlugin;
import org.jboss.tools.common.refactoring.MarkerResolutionUtils;
abstract public class AbstractQuickFixGenerator implements IMarkerResolutionGenerator2, IQuickFixGenerator {
protected static final String JAVA_EXTENSION = "java"; //$NON-NLS-1$
protected static final String XML_EXTENSION = "xml"; //$NON-NLS-1$
protected static final int MARKER_RESULUTION_NUMBER_LIMIT = 7;
public static final String MESSAGE_ID_ATTRIBUTE_NAME = "Message_id"; //$NON-NLS-1$
abstract protected IMarkerResolution[] findResolutions(IMarker marker) throws CoreException;
@Override
public IMarkerResolution[] getResolutions(IMarker marker) {
try {
return findResolutions(marker);
} catch (CoreException ex) {
CommonPlugin.getDefault().logError(ex);
}
return new IMarkerResolution[] {};
}
@Override
public boolean hasResolutions(IMarker marker) {
if(marker.exists()){
try {
return getMessageID(marker) >= 0;
} catch (CoreException ex) {
CommonPlugin.getDefault().logError(ex);
}
}
return false;
}
protected int getMessageID(TemporaryAnnotation annotation){
if(annotation.getAttributes() != null){
Integer attribute = ((Integer) annotation.getAttributes().get(MESSAGE_ID_ATTRIBUTE_NAME));
if (attribute != null)
return attribute.intValue();
}
return -1;
}
protected int getMessageID(IMarker marker)throws CoreException{
Integer attribute = ((Integer) marker.getAttribute(MESSAGE_ID_ATTRIBUTE_NAME));
if (attribute != null)
return attribute.intValue();
return -1;
}
protected IJavaElement findJavaElementByQualifiedName(IJavaProject javaProject, String qualifiedName){
try {
return javaProject.findType(qualifiedName);
} catch (JavaModelException ex) {
CommonPlugin.getDefault().logError(ex);
}
return null;
}
protected IMethod findMethod(ICompilationUnit compilationUnit, int start){
IJavaElement javaElement = findJavaElement(compilationUnit, start);
if(javaElement instanceof IMethod){
IMethod method = (IMethod)javaElement;
if(!method.isBinary())
return method;
}
return null;
}
protected IJavaElement findJavaElement(ICompilationUnit compilationUnit, int start){
try{
return compilationUnit == null ? null : compilationUnit.getElementAt(start);
}catch(JavaModelException ex){
CommonPlugin.getDefault().logError(ex);
}
return null;
}
protected ILocalVariable findParameter(ICompilationUnit compilationUnit, int start){
IJavaElement element = findJavaElement(compilationUnit, start);
if(element instanceof IMethod){
try {
for(ILocalVariable parameter : ((IMethod) element).getParameters()){
if(parameter.getSourceRange().getOffset() <= start && parameter.getSourceRange().getOffset()+parameter.getSourceRange().getLength() > start){
return parameter;
}
}
} catch (JavaModelException ex) {
CommonPlugin.getDefault().logError(ex);
}
}
return null;
}
protected boolean isMethodExists(IType interfaceType, IMethod method){
IMethod existingMethod = interfaceType.getMethod(method.getElementName(), method.getParameterTypes());
if(existingMethod.exists())
return true;
return false;
}
protected IField findNonStaticField(ICompilationUnit compilationUnit, int start){
try{
IJavaElement javaElement = findJavaElement(compilationUnit, start);
if(javaElement instanceof IField){
IField field = (IField)javaElement;
if(!Flags.isStatic(field.getFlags()) && !field.isBinary())
return field;
}
}catch(JavaModelException ex){
CommonPlugin.getDefault().logError(ex);
}
return null;
}
protected IField findPublicField(ICompilationUnit compilationUnit, int start){
try{
IJavaElement javaElement = findJavaElement(compilationUnit, start);
if(javaElement instanceof IField){
IField field = (IField)javaElement;
if(Flags.isPublic(field.getFlags()) && !field.isBinary())
return field;
}
}catch(JavaModelException ex){
CommonPlugin.getDefault().logError(ex);
}
return null;
}
protected IAnnotation getAnnotation(IJavaElement element, String annotationQualifiedName){
if(element instanceof IAnnotatable){
String shortName = MarkerResolutionUtils.getShortName(annotationQualifiedName);
IAnnotation[] annotations;
try {
annotations = ((IAnnotatable)element).getAnnotations();
for(IAnnotation annotation : annotations){
if(annotation.getElementName().equals(annotationQualifiedName) ||
annotation.getElementName().equals(shortName))
return annotation;
}
} catch (JavaModelException e) {
CommonPlugin.getDefault().logError(e);
}
}
return null;
}
protected IJavaElement findJavaElementByAnnotation(IJavaElement element, String qualifiedName) throws JavaModelException{
IAnnotation annotation = getAnnotation(element, qualifiedName);
if(annotation != null)
return element;
if(element instanceof IMethod){
for(ILocalVariable parameter : ((IMethod)element).getParameters()){
annotation = getAnnotation(parameter, qualifiedName);
if(annotation != null)
return parameter;
}
}else if(element instanceof ILocalVariable){
IJavaElement parent = element.getParent();
if(parent != null){
annotation = getAnnotation(parent, qualifiedName);
if(annotation != null)
return parent;
}
}else if(element instanceof IType){
for(IField field : ((IType)element).getFields()){
annotation = getAnnotation(field, qualifiedName);
if(annotation != null)
return field;
}
for(IMethod method : ((IType)element).getMethods()){
annotation = getAnnotation(method, qualifiedName);
if(annotation != null)
return method;
for(ILocalVariable parameter : method.getParameters()){
annotation = getAnnotation(parameter, qualifiedName);
if(annotation != null)
return parameter;
}
}
}
if(element instanceof IMember){
annotation = getAnnotation(((IMember)element).getDeclaringType(), qualifiedName);
if(annotation != null)
return ((IMember)element).getDeclaringType();
}
return null;
}
}