/******************************************************************************* * 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; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IMarker; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.ISourceRange; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.internal.ui.text.correction.AssistContext; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; import org.eclipse.ui.IMarkerResolution; import org.eclipse.ui.IMarkerResolutionGenerator2; import org.springframework.ide.eclipse.beans.core.autowire.internal.provider.AutowireDependencyProvider; import org.springframework.ide.eclipse.quickfix.jdt.processors.AutowireRequiredNotFoundAnnotationQuickAssistProcessor; import org.springframework.ide.eclipse.quickfix.jdt.processors.QualifierAnnotationQuickAssistProcessor; import org.springsource.ide.eclipse.commons.core.StatusHandler; /** * Marker resolution generator for @Autowired/@Qualifier as defined by * {@link AutowireDependencyProvider} * * @author Terry Denney * @author Martin Lippert */ public class AutowireMarkerResolutionGenerator implements IMarkerResolutionGenerator2 { @SuppressWarnings("unchecked") public IMarkerResolution[] getResolutions(IMarker marker) { if (hasResolutions(marker)) { String problemType = marker.getAttribute(AutowireDependencyProvider.AUTOWIRE_PROBLEM_TYPE, null); String handle = marker.getAttribute("JAVA_HANDLE", null); IJavaElement javaElement = JavaCore.create(handle); try { if (javaElement instanceof IMember) { List<IJavaCompletionProposal> proposals = new ArrayList<IJavaCompletionProposal>(); IMember member = (IMember) javaElement; ICompilationUnit compilationUnit = member.getCompilationUnit(); ISourceRange sourceRange = member.getSourceRange(); AssistContext assistContext = new AssistContext(compilationUnit, null, sourceRange.getOffset(), sourceRange.getLength()); ASTNode node = assistContext.getCoveringNode(); if (node instanceof MethodDeclaration) { MethodDeclaration decl = (MethodDeclaration) node; // SimpleName name = decl.getName(); if (problemType.equals(AutowireDependencyProvider.TOO_MANY_MATCHING_BEANS)) { proposals.addAll(new QualifierAnnotationQuickAssistProcessor().getAssists(decl, assistContext)); } else if (problemType.equals(AutowireDependencyProvider.REQUIRED_NO_MATCH)) { proposals.addAll(new AutowireRequiredNotFoundAnnotationQuickAssistProcessor().getAssists( decl, assistContext)); } } else if (node instanceof FieldDeclaration) { FieldDeclaration decl = (FieldDeclaration) node; List<VariableDeclarationFragment> fragments = decl.fragments(); // SimpleName name = fragments.get(0).getName(); if (fragments.size() > 0) { if (problemType.equals(AutowireDependencyProvider.TOO_MANY_MATCHING_BEANS)) { proposals.addAll(new QualifierAnnotationQuickAssistProcessor().getAssists(decl, assistContext)); } else if (problemType.equals(AutowireDependencyProvider.REQUIRED_NO_MATCH)) { proposals.addAll(new AutowireRequiredNotFoundAnnotationQuickAssistProcessor() .getAssists(decl, assistContext)); } } } List<IMarkerResolution> resolutions = new ArrayList<IMarkerResolution>(); for (IJavaCompletionProposal proposal : proposals) { if (proposal instanceof IMarkerResolution) { resolutions.add((IMarkerResolution) proposal); } } return resolutions.toArray(new IMarkerResolution[resolutions.size()]); } } catch (JavaModelException e) { StatusHandler.log(e.getStatus()); } } return new IMarkerResolution[0]; } public boolean hasResolutions(IMarker marker) { String problemType = marker.getAttribute(AutowireDependencyProvider.AUTOWIRE_PROBLEM_TYPE, null); String handle = marker.getAttribute("JAVA_HANDLE", null); return problemType != null && handle != null; } }