/******************************************************************************* | |
* Copyright (c) 2009 Shane Clarke. | |
* All rights reserved. This program and the accompanying materials | |
* are 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: | |
* Shane Clarke - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.jst.ws.internal.jaxws.ui.annotations.correction; | |
import java.util.ArrayList; | |
import java.util.HashSet; | |
import java.util.List; | |
import java.util.Set; | |
import javax.jws.Oneway; | |
import javax.jws.WebMethod; | |
import javax.jws.WebParam; | |
import javax.jws.WebResult; | |
import javax.jws.WebService; | |
import javax.jws.soap.SOAPBinding; | |
import javax.jws.soap.SOAPMessageHandlers; | |
import javax.xml.ws.WebServiceProvider; | |
import org.eclipse.core.runtime.CoreException; | |
import org.eclipse.jdt.apt.core.util.EclipseMessager; | |
import org.eclipse.jdt.core.ICompilationUnit; | |
import org.eclipse.jdt.core.dom.ASTNode; | |
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; | |
import org.eclipse.jdt.core.dom.CompilationUnit; | |
import org.eclipse.jdt.core.dom.IBinding; | |
import org.eclipse.jdt.core.dom.ITypeBinding; | |
import org.eclipse.jdt.core.dom.MemberValuePair; | |
import org.eclipse.jdt.core.dom.MethodDeclaration; | |
import org.eclipse.jdt.core.dom.Modifier; | |
import org.eclipse.jdt.core.dom.NormalAnnotation; | |
import org.eclipse.jdt.core.dom.SimpleName; | |
import org.eclipse.jdt.core.dom.SingleVariableDeclaration; | |
import org.eclipse.jdt.core.dom.StringLiteral; | |
import org.eclipse.jdt.internal.ui.JavaPluginImages; | |
import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; | |
import org.eclipse.jdt.ui.JavaElementImageDescriptor; | |
import org.eclipse.jdt.ui.text.java.IInvocationContext; | |
import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; | |
import org.eclipse.jdt.ui.text.java.IProblemLocation; | |
import org.eclipse.jdt.ui.text.java.IQuickFixProcessor; | |
import org.eclipse.jst.ws.internal.jaxws.core.JAXWSCoreMessages; | |
import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIMessages; | |
import org.eclipse.swt.graphics.Image; | |
import org.eclipse.ui.ISharedImages; | |
import org.eclipse.ui.PlatformUI; | |
@SuppressWarnings({ "restriction", "deprecation" }) | |
public class JAXWSQuickFixProcessor implements IQuickFixProcessor { | |
public boolean hasCorrections(ICompilationUnit unit, int problemId) { | |
if (problemId == EclipseMessager.APT_QUICK_FIX_PROBLEM_ID) { | |
return true; | |
} | |
return false; | |
} | |
public IJavaCompletionProposal[] getCorrections(IInvocationContext context, IProblemLocation[] locations) | |
throws CoreException { | |
if (locations == null || locations.length == 0) { | |
return null; | |
} | |
List<IJavaCompletionProposal> proposals = new ArrayList<IJavaCompletionProposal>(); | |
Set<String> handled = new HashSet<String>(); | |
for (IProblemLocation problemLocation : locations) { | |
String[] problemArguments = problemLocation.getProblemArguments(); | |
if (problemArguments.length >= 2) { | |
String problem = problemArguments[1]; | |
if (handled.add(problem)) { | |
process(context, problemLocation, proposals); | |
} | |
} | |
} | |
return (IJavaCompletionProposal[]) proposals.toArray(new IJavaCompletionProposal[proposals.size()]); | |
} | |
private void process(IInvocationContext context, IProblemLocation problemLocation, | |
List<IJavaCompletionProposal> proposals) throws CoreException { | |
String problem = problemLocation.getProblemArguments()[1]; | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_ENPOINTINTERFACE_MUST_IMPLEMENT)) { | |
addUnimplementedMethodsProposal(context, problemLocation, proposals); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBMETHOD_ONLY_SUPPORTED_ON_CLASSES_WITH_WEBSERVICE)) { | |
addAnnotationToTypeProposal(context, proposals, WebService.class); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_ENPOINTINTERFACE_NO_NAME_ATTRIBUTE) | |
|| problem.equals(JAXWSCoreMessages.WEBSERVICE_PORTNAME_SEI) | |
|| problem.equals(JAXWSCoreMessages.WEBSERVICE_SERVICENAME_SEI) | |
|| problem.equals(JAXWSCoreMessages.WEBSERVICE_ENDPOINTINTERFACE_SEI) | |
|| problem.equals(JAXWSCoreMessages.WEBMETHOD_EXCLUDE_NOT_ALLOWED_ON_SEI)) { | |
addRemoveMemberValuePairProposal(context, problemLocation, proposals, false); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBMETHOD_EXCLUDE_SPECIFIED_NO_OTHER_ATTRIBUTES_ALLOWED)) { | |
addRemoveMemberValuePairProposal(context, problemLocation, proposals, true); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_ENPOINTINTERFACE_NO_WEBMETHODS)) { | |
addRemoveAnnotationProposal(context, problemLocation, proposals, WebMethod.class); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_ENPOINTINTERFACE_NO_SOAPBINDING) | |
|| problem.equals(JAXWSCoreMessages.SOAPBINDING_NO_RPC_STYLE_ON_METHODS)) { | |
addRemoveAnnotationProposal(context, problemLocation, proposals, SOAPBinding.class); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_ENPOINTINTERFACE_NO_WEBRESULT)) { | |
addRemoveAnnotationProposal(context, problemLocation, proposals, WebResult.class); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_ENPOINTINTERFACE_NO_WEBPARAM)) { | |
addRemoveAnnotationProposal(context, problemLocation, proposals, WebParam.class); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_ENPOINTINTERFACE_NO_ONEWAY)) { | |
addRemoveAnnotationProposal(context, problemLocation, proposals, Oneway.class); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_PUBLIC_ABSTRACT_FINAL)) { | |
addChangeModifierProposal(context, problemLocation, proposals, 5); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_DEFAULT_PUBLIC_CONSTRUCTOR)) { | |
addConstructorProposal(context, problemLocation, proposals, 5); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_WEBSERVICEPROVIDER_COMBINATION)) { | |
addRemoveAnnotationProposal(context, problemLocation, proposals, WebServiceProvider.class); | |
} | |
if (problem.equals(JAXWSCoreMessages.HANDLER_CHAIN_SOAP_MESSAGE_HANDLERS)) { | |
addRemoveAnnotationProposal(context, problemLocation, proposals, SOAPMessageHandlers.class); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_OVERRIDE_FINALIZE)) { | |
addRemoveMethodProposal(context, problemLocation, proposals); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBMETHOD_ONLY_ON_PUBLIC_METHODS) | |
|| problem.equals(JAXWSCoreMessages.WEBMETHOD_NO_STATIC_MODIFIER_ALLOWED) | |
|| problem.equals(JAXWSCoreMessages.WEBMETHOD_NO_FINAL_MODIFIER_ALLOWED)) { | |
addChangeModifierProposal(context, problemLocation, proposals, 5); | |
addRemoveAnnotationProposal(context, problemLocation, proposals, WebMethod.class); | |
} | |
} | |
private void addAnnotationToTypeProposal(IInvocationContext context, List<IJavaCompletionProposal> proposals, | |
Class<? extends java.lang.annotation.Annotation> annotationClass) { | |
String displayString = JAXWSUIMessages.bind(JAXWSUIMessages.ADD_ANNOTATION, annotationClass.getSimpleName()); | |
Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); | |
proposals.add(new AddAnnotationToTypeCorrectionProposal(context, annotationClass, displayString, 5, image)); | |
} | |
private void addRemoveMethodProposal(IInvocationContext context, IProblemLocation problemLocation, | |
List<IJavaCompletionProposal> proposals) { | |
ASTNode selectedNode = problemLocation.getCoveringNode(context.getASTRoot()); | |
if (selectedNode.getParent() instanceof NormalAnnotation) { | |
NormalAnnotation normalAnnotation = (NormalAnnotation) selectedNode.getParent(); | |
ASTNode parentNode = normalAnnotation.getParent(); | |
if (parentNode instanceof MethodDeclaration) { | |
selectedNode = ((MethodDeclaration) parentNode).getName(); | |
} | |
if (parentNode instanceof SingleVariableDeclaration) { | |
SingleVariableDeclaration singleVariableDeclaration = (SingleVariableDeclaration) parentNode; | |
selectedNode = ((MethodDeclaration) singleVariableDeclaration.getParent()).getName(); | |
} | |
} | |
if (selectedNode instanceof SimpleName) { | |
SimpleName methodName = (SimpleName) selectedNode; | |
String displayString = JAXWSUIMessages.bind(JAXWSUIMessages.REMOVE_METHOD, methodName.getIdentifier()); | |
Image image = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_DELETE); | |
proposals.add(new RemoveMethodCorrectionProposal(context, methodName, displayString, 5, image)); | |
} | |
} | |
private void addRemoveAnnotationProposal(IInvocationContext context, IProblemLocation problemLocation, | |
List<IJavaCompletionProposal> proposals, Class<? extends java.lang.annotation.Annotation> annotation) { | |
ASTNode coveringNode = problemLocation.getCoveringNode(context.getASTRoot()); | |
ASTNode parentNode = coveringNode.getParent(); | |
String displayString = JAXWSUIMessages.bind(JAXWSUIMessages.REMOVE_ANNOTATION, annotation.getSimpleName()); | |
Image image = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_DELETE); | |
proposals.add(new RemoveAnnotationCorrectionProposal(context, annotation, parentNode, displayString, 5, image)); | |
} | |
private void addRemoveMemberValuePairProposal(IInvocationContext context, IProblemLocation problemLocation, | |
List<IJavaCompletionProposal> proposals, boolean removeAllOtherMVPs) { | |
ASTNode coveringNode = problemLocation.getCoveringNode(context.getASTRoot()); | |
if (coveringNode.getParent() instanceof MemberValuePair) { | |
MemberValuePair memberValuePair = (MemberValuePair) coveringNode.getParent(); | |
String displayString = JAXWSUIMessages.bind(JAXWSUIMessages.REMOVE_MEMBERVALUEPAIR, memberValuePair | |
.toString()); | |
if (removeAllOtherMVPs) { | |
displayString = JAXWSUIMessages.REMOVE_ALL_OTHER_MEMBERVALUEPAIRS; | |
} | |
Image image = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_DELETE); | |
proposals.add(new RemoveMemberValuePairCorrectionProposal(context, memberValuePair, | |
removeAllOtherMVPs, displayString, 5, image)); | |
} | |
} | |
private void addUnimplementedMethodsProposal(IInvocationContext context, IProblemLocation problemLocation, | |
List<IJavaCompletionProposal> proposals) { | |
ASTNode endpointInterfaceValue = problemLocation.getCoveringNode(context.getASTRoot()); | |
if (endpointInterfaceValue instanceof StringLiteral) { | |
ASTNode endpointInterfaceMVP = endpointInterfaceValue.getParent(); | |
ASTNode webServiceAnnotation = endpointInterfaceMVP.getParent(); | |
ASTNode typeDeclaration = webServiceAnnotation.getParent(); | |
String endpointInterface = ((StringLiteral) endpointInterfaceValue).getLiteralValue(); | |
Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); | |
proposals.add(new AddUnimplementedMethodCorrectionProposal(context, typeDeclaration, endpointInterface, | |
JAXWSUIMessages.ADD_UNIMPLEMENTED_METHODS, 5, image)); | |
} | |
} | |
private void addChangeModifierProposal(IInvocationContext context, IProblemLocation problemLocation, | |
List<IJavaCompletionProposal> proposals, int relevance) { | |
ASTNode selectedNode = problemLocation.getCoveringNode(context.getASTRoot()); | |
if (!(selectedNode instanceof SimpleName)) { | |
return; | |
} | |
IBinding binding = ((SimpleName) selectedNode).resolveBinding(); | |
if (binding != null) { | |
String bindingName = binding.getName(); | |
String displayString = ""; | |
int excludedModifiers = 0; | |
int includedModifiers = 0; | |
String problem = problemLocation.getProblemArguments()[1]; | |
if(problem.equals(JAXWSCoreMessages.WEBMETHOD_ONLY_ON_PUBLIC_METHODS)) { | |
excludedModifiers = ~(Modifier.PUBLIC); | |
includedModifiers = Modifier.PUBLIC ; | |
displayString = JAXWSUIMessages.bind(JAXWSUIMessages.CHANGE_METHOD_VISIBILITY, "public"); //$NON-NLS-1$ | |
} | |
if(problem.equals(JAXWSCoreMessages.WEBMETHOD_NO_FINAL_MODIFIER_ALLOWED)) { | |
excludedModifiers = Modifier.FINAL; | |
displayString = JAXWSUIMessages.bind(JAXWSUIMessages.REMOVE_FINAL_MODIFIER, bindingName); | |
} | |
if(problem.equals(JAXWSCoreMessages.WEBMETHOD_NO_STATIC_MODIFIER_ALLOWED)) { | |
excludedModifiers = Modifier.STATIC; | |
displayString = JAXWSUIMessages.bind(JAXWSUIMessages.REMOVE_STATIC_MODIFIER, bindingName); | |
} | |
if (problem.equals(JAXWSCoreMessages.WEBSERVICE_PUBLIC_ABSTRACT_FINAL)) { | |
excludedModifiers = Modifier.ABSTRACT | Modifier.FINAL; | |
displayString = JAXWSUIMessages.REMOVE_ILLEGAL_MODIFIER; | |
} | |
Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); | |
proposals.add(new ChangeModifierCorrectionProposal(context, binding, includedModifiers, | |
excludedModifiers, displayString, 5, image)); | |
} | |
} | |
private void addConstructorProposal(IInvocationContext context, IProblemLocation problemLocation, | |
List<IJavaCompletionProposal> proposals, int relevance) { | |
CompilationUnit astRoot = context.getASTRoot(); | |
ASTNode selectedNode = problemLocation.getCoveringNode(astRoot); | |
ITypeBinding typeBinding = ((AbstractTypeDeclaration) selectedNode.getParent()).resolveBinding(); | |
if (typeBinding != null && typeBinding.isFromSource()) { | |
String displayString = JAXWSUIMessages.bind(JAXWSUIMessages.CREATE_CONSTRUCTOR, | |
typeBinding.getTypeDeclaration().getName()); | |
Image image = JavaElementImageProvider.getDecoratedImage(JavaPluginImages.DESC_MISC_PUBLIC, | |
JavaElementImageDescriptor.CONSTRUCTOR, JavaElementImageProvider.SMALL_SIZE); | |
proposals.add(new NewDefaultConstructorCorrectionProposal(context, typeBinding, displayString, 5, | |
image)); | |
} | |
} | |
} |