/*******************************************************************************
* Copyright (c) 2012 VMware, Inc.
* 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:
* VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.quickfix.jdt.proposals;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.Annotation;
import org.eclipse.jdt.core.dom.BodyDeclaration;
import org.eclipse.jdt.core.dom.ChildListPropertyDescriptor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.MemberValuePair;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.NormalAnnotation;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
import org.eclipse.jdt.internal.ui.text.correction.ASTResolving;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ide.eclipse.quickfix.QuickfixImages;
import org.springframework.ide.eclipse.quickfix.jdt.util.ProposalCalculatorUtil;
/**
* Quickfix proposal for adding @Autowired to method or field declaration
* @author Terry Denney
*/
public class AddAutowireCompletionProposal extends AnnotationCompletionProposal {
private final BodyDeclaration decl;
private final Param[] params;
public AddAutowireCompletionProposal(BodyDeclaration decl, ICompilationUnit cu, Param... params) {
super(getDisplayName(params), cu, QuickfixImages.getImage(QuickfixImages.ANNOTATION));
this.decl = decl;
this.params = params;
}
private Annotation createAnnotation(String qualifiedName, String simpleName, CompilationUnit astRoot, AST ast,
ASTRewrite astRewrite, ImportRewrite importRewrite, boolean memberValuePair, ASTNode precedingNode) {
if (!ProposalCalculatorUtil.containsImport(getCompilationUnit(), qualifiedName)) {
importRewrite.addImport(qualifiedName);
}
Annotation annotation;
if (memberValuePair) {
annotation = ast.newNormalAnnotation();
}
else {
annotation = ast.newMarkerAnnotation();
}
annotation.setTypeName(ast.newSimpleName(simpleName));
ChildListPropertyDescriptor property;
if (decl instanceof FieldDeclaration) {
property = FieldDeclaration.MODIFIERS2_PROPERTY;
}
else {
property = MethodDeclaration.MODIFIERS2_PROPERTY;
}
if (precedingNode != null) {
astRewrite.getListRewrite(decl, property).insertBefore(annotation, precedingNode, null);
}
else {
astRewrite.getListRewrite(decl, property).insertFirst(annotation, null);
}
return annotation;
}
@SuppressWarnings("unchecked")
@Override
protected ASTRewrite getRewrite() throws CoreException {
CompilationUnit astRoot = ASTResolving.findParentCompilationUnit(decl);
ASTRewrite astRewrite = ASTRewrite.create(astRoot.getAST());
AST ast = astRewrite.getAST();
ImportRewrite importRewrite = createImportRewrite(astRoot);
if (params.length == 0) {
createAnnotation(Autowired.class.getCanonicalName(), Autowired.class.getSimpleName(), astRoot, ast,
astRewrite, importRewrite, false, null);
}
else {
NormalAnnotation autowiredAnnotation = (NormalAnnotation) createAnnotation(Autowired.class
.getCanonicalName(), Autowired.class.getSimpleName(), astRoot, ast, astRewrite, importRewrite,
true, null);
for (int i = 0; i < params.length; i++) {
switch (params[i]) {
case REQUIRED:
MemberValuePair requiredValue = ast.newMemberValuePair();
requiredValue.setName(ast.newSimpleName("required"));
requiredValue.setValue(ast.newBooleanLiteral(false));
addLinkedPosition(astRewrite.track(requiredValue.getValue()), i == 0, "Autowire");
autowiredAnnotation.values().add(requiredValue);
break;
// case QUALIFIER:
// SingleMemberAnnotation qualifierAnnotation =
// (SingleMemberAnnotation) createAnnotation(
// Qualifier.class.getCanonicalName(),
// Qualifier.class.getSimpleName(), astRoot, ast,
// astRewrite, importRewrite, false, autowiredAnnotation);
// StringLiteral qualifierValue = ast.newStringLiteral();
// qualifierValue.setLiteralValue("qualifier");
// qualifierAnnotation.setValue(qualifierValue);
// addLinkedPosition(astRewrite.track(qualifierValue), i == 0,
// "Qualifier");
// break;
}
}
}
return astRewrite;
}
private static String getDisplayName(Param[] params) {
StringBuffer buf = new StringBuffer();
buf.append("Add @Autowired");
if (params.length > 0) {
for (int i = 0; i < params.length; i++) {
if (i > 0) {
buf.append(", ");
}
buf.append(getParamName(params[i]));
}
}
return buf.toString();
}
private static String getParamName(Param param) {
switch (param) {
case REQUIRED:
return "(required=false)";
// case QUALIFIER:
// return "qualifier";
}
return null;
}
public enum Param {
REQUIRED, QUALIFIER
}
}