Java tutorial
/******************************************************************************* * Copyright (c) 2010 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.cdi.ui.marker; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.resources.IFile; 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.jdt.internal.corext.util.JavaConventionsUtil; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.source.Annotation; import org.eclipse.ui.IMarkerResolution; import org.eclipse.ui.IMarkerResolutionGenerator2; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.texteditor.DocumentProviderRegistry; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation; import org.jboss.tools.cdi.core.CDIConstants; import org.jboss.tools.cdi.core.CDICoreNature; import org.jboss.tools.cdi.core.CDIUtil; import org.jboss.tools.cdi.core.IBean; import org.jboss.tools.cdi.core.ICDIProject; import org.jboss.tools.cdi.core.IClassBean; import org.jboss.tools.cdi.core.IDecorator; import org.jboss.tools.cdi.core.IInjectionPoint; import org.jboss.tools.cdi.core.IInterceptor; import org.jboss.tools.cdi.core.IStereotype; import org.jboss.tools.cdi.core.IStereotyped; import org.jboss.tools.cdi.internal.core.impl.CDIProject; import org.jboss.tools.cdi.internal.core.refactoring.CDIMarkerResolutionUtils; import org.jboss.tools.cdi.internal.core.validation.CDIValidationErrorManager; import org.jboss.tools.cdi.ui.CDIUIPlugin; import org.jboss.tools.common.EclipseUtil; import org.jboss.tools.common.java.IAnnotationDeclaration; import org.jboss.tools.common.model.util.EclipseJavaUtil; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.common.quickfix.IQuickFix; import org.jboss.tools.common.quickfix.IQuickFixGenerator; import org.jboss.tools.common.refactoring.MarkerResolutionUtils; import org.jboss.tools.common.validation.java.TempJavaProblem; import org.jboss.tools.common.validation.java.TempJavaProblemAnnotation; /** * @author Daniel Azarov */ public class CDIProblemMarkerResolutionGenerator implements IMarkerResolutionGenerator2, IQuickFixGenerator { private static final String JAVA_EXTENSION = "java"; //$NON-NLS-1$ private static final String XML_EXTENSION = "xml"; //$NON-NLS-1$ private static final int MARKER_RESULUTION_NUMBER_LIMIT = 7; @Override public IMarkerResolution[] getResolutions(IMarker marker) { try { return findResolutions(marker); } catch (CoreException ex) { CDIUIPlugin.getDefault().logError(ex); } return new IMarkerResolution[] {}; } /** * return message id or -1 if impossible to find * @param marker * @return */ private int getMessageID(IMarker marker) throws CoreException { Integer attribute = ((Integer) marker.getAttribute(CDIValidationErrorManager.MESSAGE_ID_ATTRIBUTE_NAME)); if (attribute != null) return attribute.intValue(); return -1; } private int getMessageID(TemporaryAnnotation annotation) { if (annotation.getAttributes() != null) { Integer attribute = ((Integer) annotation.getAttributes() .get(CDIValidationErrorManager.MESSAGE_ID_ATTRIBUTE_NAME)); if (attribute != null) return attribute.intValue(); } return -1; } private IQuickFix[] findXMLResolutions(IFile file, int messageId, int start, int end, boolean asYouType) throws JavaModelException { IJavaProject javaProject = EclipseUtil.getJavaProject(file.getProject()); FileEditorInput input = new FileEditorInput(file); IDocumentProvider provider = DocumentProviderRegistry.getDefault().getDocumentProvider(input); try { provider.connect(input); } catch (CoreException e) { CDIUIPlugin.getDefault().logError(e); } IDocument document = provider.getDocument(input); String text = ""; try { text = document.get(start, end - start); } catch (BadLocationException e) { CDIUIPlugin.getDefault().logError(e); } finally { provider.disconnect(input); } boolean correctTypeName = JavaConventionsUtil.validatePackageName(text, javaProject).isOK(); if (messageId == CDIValidationErrorManager.UNKNOWN_ALTERNATIVE_BEAN_CLASS_NAME_ID) { IJavaElement element = findJavaElementByQualifiedName(javaProject, text); if (element == null && correctTypeName) { return new IQuickFix[] { new CreateCDIElementMarkerResolution(file.getProject(), text, CreateCDIElementMarkerResolution.CREATE_BEAN_CLASS) }; } } else if (messageId == CDIValidationErrorManager.UNKNOWN_ALTERNATIVE_ANNOTATION_NAME_ID) { IJavaElement element = findJavaElementByQualifiedName(javaProject, text); if (element == null && correctTypeName) { return new IQuickFix[] { new CreateCDIElementMarkerResolution(file.getProject(), text, CreateCDIElementMarkerResolution.CREATE_STEREOTYPE) }; } } else if (messageId == CDIValidationErrorManager.ILLEGAL_ALTERNATIVE_BEAN_CLASS_ID) { IJavaElement element = getTypeToAddAlternativeToBean(javaProject, text, asYouType); if (element != null) { return new IQuickFix[] { new AddAnnotationMarkerResolution(element, CDIConstants.ALTERNATIVE_ANNOTATION_TYPE_NAME) }; } } else if (messageId == CDIValidationErrorManager.ILLEGAL_ALTERNATIVE_ANNOTATION_ID) { IJavaElement element = getTypeToAddAlternativeToStereotype(javaProject, text, asYouType); if (element != null) { return new IQuickFix[] { new AddAnnotationMarkerResolution(element, CDIConstants.ALTERNATIVE_ANNOTATION_TYPE_NAME) }; } } else if (messageId == CDIValidationErrorManager.UNKNOWN_DECORATOR_BEAN_CLASS_NAME_ID) { IJavaElement element = findJavaElementByQualifiedName(javaProject, text); if (element == null && correctTypeName) { return new IQuickFix[] { new CreateCDIElementMarkerResolution(file.getProject(), text, CreateCDIElementMarkerResolution.CREATE_DECORATOR) }; } } else if (messageId == CDIValidationErrorManager.UNKNOWN_INTERCEPTOR_CLASS_NAME_ID) { IJavaElement element = findJavaElementByQualifiedName(javaProject, text); if (element == null && correctTypeName) { return new IQuickFix[] { new CreateCDIElementMarkerResolution(file.getProject(), text, CreateCDIElementMarkerResolution.CREATE_INTERCEPTOR) }; } } return new IQuickFix[] {}; } private IQuickFix[] findJavaResolutions(ICompilationUnit compilationUnit, int problemId, int offset, ICDIMarkerResolutionGeneratorExtension[] extensions, boolean asYouType) throws JavaModelException { if (problemId == CDIValidationErrorManager.ILLEGAL_PRODUCER_FIELD_IN_SESSION_BEAN_ID) { IField field = findNonStaticField(compilationUnit, offset); if (field != null) { return new IQuickFix[] { new MakeFieldStaticMarkerResolution(field) }; } } else if (problemId == CDIValidationErrorManager.ILLEGAL_PRODUCER_METHOD_IN_SESSION_BEAN_ID || problemId == CDIValidationErrorManager.ILLEGAL_DISPOSER_IN_SESSION_BEAN_ID || problemId == CDIValidationErrorManager.ILLEGAL_OBSERVER_IN_SESSION_BEAN_ID) { IMethod method = findMethod(compilationUnit, offset); if (method != null) { List<IType> types = findLocalAnnotattedInterfaces(method); if (types.size() == 0 && !Flags.isPublic(method.getFlags())) { return new IQuickFix[] { new MakeMethodPublicMarkerResolution(method) }; } else { IQuickFix[] resolutions = new IQuickFix[types.size() + 1]; for (int i = 0; i < types.size(); i++) { resolutions[i] = new MakeMethodBusinessMarkerResolution(method, types.get(i)); } resolutions[types.size()] = new AddLocalBeanMarkerResolution(method); return resolutions; } } } else if (problemId == CDIValidationErrorManager.MULTIPLE_DISPOSERS_FOR_PRODUCER_ID) { IMethod method = findMethod(compilationUnit, offset); if (method != null) { return new IQuickFix[] { new DeleteAllDisposerDuplicantMarkerResolution(method) }; } } else if (problemId == CDIValidationErrorManager.MULTIPLE_INJECTION_CONSTRUCTORS_ID) { IMethod method = findMethod(compilationUnit, offset); if (method != null) { return new IQuickFix[] { new DeleteAllInjectedConstructorsMarkerResolution(method) }; } } else if (problemId == CDIValidationErrorManager.AMBIGUOUS_INJECTION_POINTS_ID || problemId == CDIValidationErrorManager.UNSATISFIED_INJECTION_POINTS_ID) { List<IMarkerResolution> resolutions = new ArrayList<IMarkerResolution>(); IInjectionPoint injectionPoint = findInjectionPoint(compilationUnit, offset, asYouType); if (injectionPoint != null) { List<IBean> beans; if (problemId == CDIValidationErrorManager.AMBIGUOUS_INJECTION_POINTS_ID) { beans = findBeans(injectionPoint); } else { beans = findLegalBeans(injectionPoint); } for (int i = beans.size() - 1; i >= 0; i--) { IBean bean = beans.get(i); for (ICDIMarkerResolutionGeneratorExtension extension : extensions) { if (extension.shouldBeExtended(problemId, bean)) { List<IQuickFix> addings = extension.getResolutions(problemId, bean); resolutions.addAll(addings); beans.remove(bean); break; } } } if (beans.size() < MARKER_RESULUTION_NUMBER_LIMIT) { for (int i = 0; i < beans.size(); i++) { resolutions.add(new MakeInjectedPointUnambiguousMarkerResolution(injectionPoint, beans, i)); } } else { resolutions.add(new SelectBeanMarkerResolution(injectionPoint, beans)); } } return resolutions.toArray(new IQuickFix[] {}); } else if (problemId == CDIValidationErrorManager.NOT_PASSIVATION_CAPABLE_BEAN_ID) { IType type = findTypeWithNoSerializable(compilationUnit, offset); if (type != null) { return new IQuickFix[] { new AddSerializableInterfaceMarkerResolution(type) }; } } else if (problemId == CDIValidationErrorManager.ILLEGAL_SCOPE_FOR_MANAGED_BEAN_WITH_PUBLIC_FIELD_ID) { IField field = findPublicField(compilationUnit, offset); CDICoreNature cdiNature = CDIUtil.getCDINatureWithProgress(field.getUnderlyingResource().getProject()); if (cdiNature != null) { ICDIProject cdiProject = CDIUtil.getCDIProject((IFile) compilationUnit.getUnderlyingResource(), cdiNature, asYouType); if (cdiProject != null) { Collection<IBean> beans = cdiProject.getBeans(field.getUnderlyingResource().getFullPath()); if (!beans.isEmpty()) { IBean bean = beans.iterator().next(); if (field != null) { return new IQuickFix[] { new MakeFieldProtectedMarkerResolution(field), new MakeBeanScopedDependentMarkerResolution(compilationUnit, bean) }; } } } } } else if (problemId == CDIValidationErrorManager.MISSING_RETENTION_ANNOTATION_IN_QUALIFIER_TYPE_ID || problemId == CDIValidationErrorManager.MISSING_RETENTION_ANNOTATION_IN_SCOPE_TYPE_ID || problemId == CDIValidationErrorManager.MISSING_RETENTION_ANNOTATION_IN_STEREOTYPE_TYPE_ID) { TypeAndAnnotation ta = findTypeAndAnnotation(compilationUnit, offset, CDIConstants.RETENTION_ANNOTATION_TYPE_NAME); if (ta != null) { if (ta.annotation == null) { return new IQuickFix[] { new AddRetentionAnnotationMarkerResolution(ta.type) }; } else { return new IQuickFix[] { new ChangeAnnotationMarkerResolution(ta.annotation, CDIConstants.RETENTION_POLICY_RUNTIME_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.MISSING_TARGET_ANNOTATION_IN_QUALIFIER_TYPE_ID) { TypeAndAnnotation ta = findTypeAndAnnotation(compilationUnit, offset, CDIConstants.TARGET_ANNOTATION_TYPE_NAME); if (ta != null) { if (ta.annotation == null) { return new IQuickFix[] { new AddTargetAnnotationMarkerResolution(ta.type, new String[] { CDIConstants.ELEMENT_TYPE_TYPE_NAME, CDIConstants.ELEMENT_TYPE_METHOD_NAME, CDIConstants.ELEMENT_TYPE_FIELD_NAME, CDIConstants.ELEMENT_TYPE_PARAMETER_NAME }), new AddTargetAnnotationMarkerResolution(ta.type, new String[] { CDIConstants.ELEMENT_TYPE_FIELD_NAME, CDIConstants.ELEMENT_TYPE_PARAMETER_NAME }) }; } else { return new IQuickFix[] { new ChangeAnnotationMarkerResolution(ta.annotation, new String[] { CDIConstants.ELEMENT_TYPE_TYPE_NAME, CDIConstants.ELEMENT_TYPE_METHOD_NAME, CDIConstants.ELEMENT_TYPE_FIELD_NAME, CDIConstants.ELEMENT_TYPE_PARAMETER_NAME }), new ChangeAnnotationMarkerResolution(ta.annotation, new String[] { CDIConstants.ELEMENT_TYPE_FIELD_NAME, CDIConstants.ELEMENT_TYPE_PARAMETER_NAME }) }; } } } else if (problemId == CDIValidationErrorManager.MISSING_TARGET_ANNOTATION_IN_STEREOTYPE_TYPE_ID) { TypeAndAnnotation ta = findTypeAndAnnotation(compilationUnit, offset, CDIConstants.TARGET_ANNOTATION_TYPE_NAME); if (ta != null) { if (ta.annotation == null) { return new IQuickFix[] { new AddTargetAnnotationMarkerResolution(ta.type, new String[] { CDIConstants.ELEMENT_TYPE_TYPE_NAME, CDIConstants.ELEMENT_TYPE_METHOD_NAME, CDIConstants.ELEMENT_TYPE_FIELD_NAME }), new AddTargetAnnotationMarkerResolution(ta.type, new String[] { CDIConstants.ELEMENT_TYPE_METHOD_NAME, CDIConstants.ELEMENT_TYPE_FIELD_NAME }), new AddTargetAnnotationMarkerResolution(ta.type, new String[] { CDIConstants.ELEMENT_TYPE_TYPE_NAME }), new AddTargetAnnotationMarkerResolution(ta.type, new String[] { CDIConstants.ELEMENT_TYPE_METHOD_NAME }), new AddTargetAnnotationMarkerResolution(ta.type, new String[] { CDIConstants.ELEMENT_TYPE_FIELD_NAME }) }; } else { return new IQuickFix[] { new ChangeAnnotationMarkerResolution(ta.annotation, new String[] { CDIConstants.ELEMENT_TYPE_TYPE_NAME, CDIConstants.ELEMENT_TYPE_METHOD_NAME, CDIConstants.ELEMENT_TYPE_FIELD_NAME }), new ChangeAnnotationMarkerResolution(ta.annotation, new String[] { CDIConstants.ELEMENT_TYPE_METHOD_NAME, CDIConstants.ELEMENT_TYPE_FIELD_NAME }), new ChangeAnnotationMarkerResolution(ta.annotation, new String[] { CDIConstants.ELEMENT_TYPE_TYPE_NAME }), new ChangeAnnotationMarkerResolution(ta.annotation, new String[] { CDIConstants.ELEMENT_TYPE_METHOD_NAME }), new ChangeAnnotationMarkerResolution(ta.annotation, new String[] { CDIConstants.ELEMENT_TYPE_FIELD_NAME }) }; } } } else if (problemId == CDIValidationErrorManager.MISSING_TARGET_ANNOTATION_IN_SCOPE_TYPE_ID) { TypeAndAnnotation ta = findTypeAndAnnotation(compilationUnit, offset, CDIConstants.TARGET_ANNOTATION_TYPE_NAME); if (ta != null) { if (ta.annotation == null) { return new IQuickFix[] { new AddTargetAnnotationMarkerResolution(ta.type, new String[] { CDIConstants.ELEMENT_TYPE_TYPE_NAME, CDIConstants.ELEMENT_TYPE_METHOD_NAME, CDIConstants.ELEMENT_TYPE_FIELD_NAME }) }; } else { return new IQuickFix[] { new ChangeAnnotationMarkerResolution(ta.annotation, new String[] { CDIConstants.ELEMENT_TYPE_TYPE_NAME, CDIConstants.ELEMENT_TYPE_METHOD_NAME, CDIConstants.ELEMENT_TYPE_FIELD_NAME }) }; } } } else if (problemId == CDIValidationErrorManager.MISSING_NONBINDING_FOR_ANNOTATION_VALUE_IN_INTERCEPTOR_BINDING_TYPE_MEMBER_ID || problemId == CDIValidationErrorManager.MISSING_NONBINDING_FOR_ANNOTATION_VALUE_IN_QUALIFIER_TYPE_MEMBER_ID || problemId == CDIValidationErrorManager.MISSING_NONBINDING_FOR_ARRAY_VALUE_IN_INTERCEPTOR_BINDING_TYPE_MEMBER_ID || problemId == CDIValidationErrorManager.MISSING_NONBINDING_FOR_ARRAY_VALUE_IN_QUALIFIER_TYPE_MEMBER_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IAnnotation annotation = getAnnotation(element, CDIConstants.NON_BINDING_ANNOTATION_TYPE_NAME); if (element instanceof IMember && annotation == null) { return new IQuickFix[] { new AddAnnotationMarkerResolution((IMember) element, CDIConstants.NON_BINDING_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.DISPOSER_ANNOTATED_INJECT_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement injectElement = findJavaElementByAnnotation(element, CDIConstants.INJECT_ANNOTATION_TYPE_NAME); IJavaElement disposesElement = findJavaElementByAnnotation(element, CDIConstants.DISPOSES_ANNOTATION_TYPE_NAME); if (injectElement != null && disposesElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(injectElement, CDIConstants.INJECT_ANNOTATION_TYPE_NAME), new DeleteAnnotationMarkerResolution(disposesElement, CDIConstants.DISPOSES_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.PRODUCER_ANNOTATED_INJECT_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement injectElement = findJavaElementByAnnotation(element, CDIConstants.INJECT_ANNOTATION_TYPE_NAME); IJavaElement produsesElement = findJavaElementByAnnotation(element, CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME); if (injectElement != null && produsesElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(injectElement, CDIConstants.INJECT_ANNOTATION_TYPE_NAME), new DeleteAnnotationMarkerResolution(produsesElement, CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.OBSERVER_ANNOTATED_INJECT_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement injectElement = findJavaElementByAnnotation(element, CDIConstants.INJECT_ANNOTATION_TYPE_NAME); IJavaElement observerElement = findJavaElementByAnnotation(element, CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME); if (injectElement != null && observerElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(injectElement, CDIConstants.INJECT_ANNOTATION_TYPE_NAME), new DeleteAnnotationMarkerResolution(observerElement, CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.CONSTRUCTOR_PARAMETER_ANNOTATED_OBSERVES_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement observerElement = findJavaElementByAnnotation(element, CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME); if (observerElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(observerElement, CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.DISPOSER_IN_INTERCEPTOR_ID || problemId == CDIValidationErrorManager.DISPOSER_IN_DECORATOR_ID || problemId == CDIValidationErrorManager.CONSTRUCTOR_PARAMETER_ANNOTATED_DISPOSES_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement disposerElement = findJavaElementByAnnotation(element, CDIConstants.DISPOSES_ANNOTATION_TYPE_NAME); if (disposerElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(disposerElement, CDIConstants.DISPOSES_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.PRODUCER_IN_INTERCEPTOR_ID || problemId == CDIValidationErrorManager.PRODUCER_IN_DECORATOR_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement producerElement = findJavaElementByAnnotation(element, CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME); if (producerElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(producerElement, CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.STEREOTYPE_DECLARES_NON_EMPTY_NAME_ID) { TypeAndAnnotation ta = findTypeAndAnnotation(compilationUnit, offset, CDIConstants.NAMED_QUALIFIER_TYPE_NAME); if (ta != null && ta.annotation != null && ta.type != null) { return new IQuickFix[] { new ChangeAnnotationMarkerResolution(ta.annotation), new DeleteAnnotationMarkerResolution(ta.type, CDIConstants.NAMED_QUALIFIER_TYPE_NAME) }; } } else if (problemId == CDIValidationErrorManager.INTERCEPTOR_HAS_NAME_ID || problemId == CDIValidationErrorManager.DECORATOR_HAS_NAME_ID) { TypeAndAnnotation ta = findTypeAndAnnotation(compilationUnit, offset, CDIConstants.NAMED_QUALIFIER_TYPE_NAME); if (ta != null && ta.type != null) { CDICoreNature cdiNature = CDIUtil .getCDINatureWithProgress(ta.type.getUnderlyingResource().getProject()); if (cdiNature != null) { ICDIProject cdiProject = CDIUtil.getCDIProject((IFile) compilationUnit.getUnderlyingResource(), cdiNature, asYouType); ; IType declarationType = findNamedDeclarationType(cdiProject, ta.type, problemId == CDIValidationErrorManager.DECORATOR_HAS_NAME_ID); ArrayList<IMarkerResolution> resolutions = new ArrayList<IMarkerResolution>(); if (declarationType != null) { IAnnotation annotation = getAnnotation(declarationType, CDIConstants.NAMED_QUALIFIER_TYPE_NAME); if (annotation != null) { resolutions.add(new DeleteAnnotationMarkerResolution(declarationType, CDIConstants.NAMED_QUALIFIER_TYPE_NAME)); } if (!declarationType.equals(ta.type)) { annotation = getAnnotation(ta.type, declarationType.getFullyQualifiedName()); if (annotation != null) { resolutions.add(new DeleteAnnotationMarkerResolution(ta.type, declarationType.getFullyQualifiedName())); } } } if (!resolutions.isEmpty()) { return resolutions.toArray(new IQuickFix[] {}); } } } } else if (problemId == CDIValidationErrorManager.STEREOTYPE_IS_ANNOTATED_TYPED_ID) { TypeAndAnnotation ta = findTypeAndAnnotation(compilationUnit, offset, CDIConstants.TYPED_ANNOTATION_TYPE_NAME); if (ta != null && ta.annotation != null && ta.type != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(ta.type, CDIConstants.TYPED_ANNOTATION_TYPE_NAME) }; } } else if (problemId == CDIValidationErrorManager.INTERCEPTOR_ANNOTATED_SPECIALIZES_ID || problemId == CDIValidationErrorManager.DECORATOR_ANNOTATED_SPECIALIZES_ID) { TypeAndAnnotation ta = findTypeAndAnnotation(compilationUnit, offset, CDIConstants.SPECIALIZES_ANNOTATION_TYPE_NAME); if (ta != null && ta.annotation != null && ta.type != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(ta.type, CDIConstants.SPECIALIZES_ANNOTATION_TYPE_NAME) }; } } else if (problemId == CDIValidationErrorManager.PRODUCER_PARAMETER_ILLEGALLY_ANNOTATED_DISPOSES_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement producerElement = findJavaElementByAnnotation(element, CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME); IJavaElement disposerElement = findJavaElementByAnnotation(element, CDIConstants.DISPOSES_ANNOTATION_TYPE_NAME); if (producerElement != null && disposerElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(producerElement, CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME), new DeleteAnnotationMarkerResolution(disposerElement, CDIConstants.DISPOSES_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.PRODUCER_PARAMETER_ILLEGALLY_ANNOTATED_OBSERVES_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement producerElement = findJavaElementByAnnotation(element, CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME); IJavaElement observerElement = findJavaElementByAnnotation(element, CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME); if (producerElement != null && observerElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(producerElement, CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME), new DeleteAnnotationMarkerResolution(observerElement, CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.OBSERVER_PARAMETER_ILLEGALLY_ANNOTATED_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement disposerElement = findJavaElementByAnnotation(element, CDIConstants.DISPOSES_ANNOTATION_TYPE_NAME); IJavaElement observerElement = findJavaElementByAnnotation(element, CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME); if (disposerElement != null && observerElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(disposerElement, CDIConstants.DISPOSES_ANNOTATION_TYPE_NAME), new DeleteAnnotationMarkerResolution(observerElement, CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.OBSERVER_IN_DECORATOR_ID || problemId == CDIValidationErrorManager.OBSERVER_IN_INTERCEPTOR_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement observerElement = findJavaElementByAnnotation(element, CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME); if (observerElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(observerElement, CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.SESSION_BEAN_ANNOTATED_INTERCEPTOR_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement interceptorElement = findJavaElementByAnnotation(element, CDIConstants.INTERCEPTOR_ANNOTATION_TYPE_NAME); if (interceptorElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(interceptorElement, CDIConstants.INTERCEPTOR_ANNOTATION_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.SESSION_BEAN_ANNOTATED_DECORATOR_ID) { IJavaElement element = findJavaElement(compilationUnit, offset); if (element != null) { IJavaElement decoratorElement = findJavaElementByAnnotation(element, CDIConstants.DECORATOR_STEREOTYPE_TYPE_NAME); if (decoratorElement != null) { return new IQuickFix[] { new DeleteAnnotationMarkerResolution(decoratorElement, CDIConstants.DECORATOR_STEREOTYPE_TYPE_NAME) }; } } } else if (problemId == CDIValidationErrorManager.PARAM_INJECTION_DECLARES_EMPTY_NAME_ID) { List<IMarkerResolution> resolutions = getAddNameResolutions(compilationUnit, offset, asYouType); return resolutions.toArray(new IQuickFix[] {}); } else if (problemId == CDIValidationErrorManager.MULTIPLE_DISPOSING_PARAMETERS_ID) { ILocalVariable parameter = findParameter(compilationUnit, offset); if (parameter != null) { return new IQuickFix[] { new DeleteAllOtherAnnotationsFromParametersMarkerResolution( CDIConstants.DISPOSES_ANNOTATION_TYPE_NAME, parameter, (IFile) parameter.getUnderlyingResource()) }; } } else if (problemId == CDIValidationErrorManager.MULTIPLE_OBSERVING_PARAMETERS_ID) { ILocalVariable parameter = findParameter(compilationUnit, offset); if (parameter != null) { return new IQuickFix[] { new DeleteAllOtherAnnotationsFromParametersMarkerResolution( CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME, parameter, (IFile) parameter.getUnderlyingResource()) }; } } return new IQuickFix[] {}; } private IMarkerResolution[] findResolutions(IMarker marker) throws CoreException { int messageId = getMessageID(marker); if (messageId == -1) return new IMarkerResolution[] {}; final IFile file = (IFile) marker.getResource(); Integer attribute = ((Integer) marker.getAttribute(IMarker.CHAR_START)); if (attribute == null) return new IMarkerResolution[] {}; final int start = attribute.intValue(); attribute = ((Integer) marker.getAttribute(IMarker.CHAR_END)); if (attribute == null) return new IMarkerResolution[] {}; final int end = attribute.intValue(); ICDIMarkerResolutionGeneratorExtension[] extensions = CDIQuickFixExtensionManager.getInstances(); if (JAVA_EXTENSION.equals(file.getFileExtension())) { ICompilationUnit compilationUnit = EclipseUtil.getCompilationUnit(file); return findJavaResolutions(compilationUnit, messageId, start, extensions, false); } else if (XML_EXTENSION.equals(file.getFileExtension())) { return findXMLResolutions(file, messageId, start, end, false); } return new IMarkerResolution[] {}; } private List<IMarkerResolution> getAddNameResolutions(ICompilationUnit compilationUnit, int start, boolean asYouType) throws JavaModelException { List<IMarkerResolution> resolutions = new ArrayList<IMarkerResolution>(); ILocalVariable parameter = findParameter(compilationUnit, start); if (parameter != null) { IAnnotation namedAnnotation = getAnnotation(parameter, CDIConstants.NAMED_QUALIFIER_TYPE_NAME); if (namedAnnotation != null) { CDICoreNature cdiNature = CDIUtil .getCDINatureWithProgress(compilationUnit.getUnderlyingResource().getProject()); if (cdiNature == null) return resolutions; ICDIProject cdiProject = CDIUtil.getCDIProject((IFile) compilationUnit.getUnderlyingResource(), cdiNature, asYouType); if (cdiProject == null) { return resolutions; } Collection<IBean> allBeans = CDIUtil.getFilteredBeans(cdiProject, compilationUnit.getUnderlyingResource().getFullPath()); IInjectionPoint ip = CDIUtil.findInjectionPoint(allBeans, parameter, start); if (ip != null) { List<IBean> beans; beans = findLegalBeans(ip); if (beans.size() == 0) { beans = findBeans(ip); } if (beans.size() < MARKER_RESULUTION_NUMBER_LIMIT) { for (IBean bean : beans) { if (bean.getName() != null && !bean.getName().isEmpty()) { resolutions.add(new AddNameMarkerResolution(namedAnnotation, bean.getName())); } } } } } if (resolutions.size() == 0) { resolutions.add(new AddNameMarkerResolution(namedAnnotation, parameter.getElementName())); } } return resolutions; } private IType getTypeToAddAlternativeToBean(IJavaProject javaProject, String qualifiedName, boolean asYouType) throws JavaModelException { IType type = null; try { type = javaProject.findType(qualifiedName); } catch (JavaModelException ex) { CDIUIPlugin.getDefault().logError(ex); } if (type != null) { CDICoreNature cdiNature = CDIUtil.getCDINatureWithProgress(javaProject.getProject()); if (cdiNature != null) { ICDIProject cdiProject = CDIUtil.getCDIProject((IFile) type.getUnderlyingResource(), cdiNature, asYouType); if (cdiProject != null) { IClassBean classBean = cdiProject.getBeanClass(type); if (classBean != null && !classBean.isAlternative()) { return type; } } } } return null; } private IType getTypeToAddAlternativeToStereotype(IJavaProject javaProject, String qualifiedName, boolean asYouType) throws JavaModelException { IType type = null; try { type = javaProject.findType(qualifiedName); } catch (JavaModelException ex) { CDIUIPlugin.getDefault().logError(ex); } if (type != null) { CDICoreNature cdiNature = CDIUtil.getCDINatureWithProgress(javaProject.getProject()); if (cdiNature != null) { ICDIProject cdiProject = CDIUtil.getCDIProject((IFile) type.getUnderlyingResource(), cdiNature, asYouType); if (cdiProject != null) { IStereotype stereotype = cdiProject.getStereotype(qualifiedName); if (stereotype != null && !stereotype.isAlternative()) { return type; } } } } return null; } private IJavaElement findJavaElementByQualifiedName(IJavaProject javaProject, String qualifiedName) { try { return javaProject.findType(qualifiedName); } catch (JavaModelException ex) { CDIUIPlugin.getDefault().logError(ex); } return null; } private IType findNamedDeclarationType(ICDIProject cdiProject, IType type, boolean isItDecorator) { IType declarationType = null; IBean bean = null; IAnnotationDeclaration declaration = null; if (isItDecorator) { bean = findDecoratorByType(cdiProject.getDecorators(), type); } else { bean = findInterceptorByType(cdiProject.getInterceptors(), type); } if (bean != null) { declaration = findNamedDeclaration(bean); if (declaration != null) { declarationType = declaration.getType(); } } return declarationType; } private IDecorator findDecoratorByType(IDecorator[] decorators, IType type) { for (IDecorator decorator : decorators) { if (decorator.getBeanClass().equals(type)) return decorator; } return null; } private IInterceptor findInterceptorByType(IInterceptor[] interceptors, IType type) { for (IInterceptor interceptor : interceptors) { if (interceptor.getBeanClass().equals(type)) return interceptor; } return null; } private IAnnotationDeclaration findNamedDeclaration(IStereotyped stereotyped) { IAnnotationDeclaration declaration = stereotyped.getAnnotation(CDIConstants.NAMED_QUALIFIER_TYPE_NAME); // if (declaration == null) { // declaration = stereotyped.getAnnotation(CDIConstants.DECORATOR_STEREOTYPE_TYPE_NAME); // } if (declaration == null) { declaration = CDIUtil.getNamedStereotypeDeclaration(stereotyped); } return declaration; } private List<IBean> findLegalBeans(IInjectionPoint injectionPoint) { IBean[] bs = injectionPoint.getCDIProject().getBeans(); String injectionPointTypeName = injectionPoint.getClassBean().getBeanClass().getFullyQualifiedName(); String injectionPointPackage = null; int dotLastIndex = injectionPointTypeName.lastIndexOf(CDIMarkerResolutionUtils.DOT); if (dotLastIndex < 0) injectionPointPackage = ""; else injectionPointPackage = injectionPointTypeName.substring(0, dotLastIndex); ArrayList<IBean> beans = new ArrayList<IBean>(); for (IBean bean : bs) { if (CDIProject.containsType(bean.getLegalTypes(), injectionPoint.getType())) { boolean isPublic = true; try { isPublic = Flags.isPublic(bean.getBeanClass().getFlags()); } catch (JavaModelException ex) { CDIUIPlugin.getDefault().logError(ex); } String beanTypeName = bean.getBeanClass().getFullyQualifiedName(); String beanPackage = null; dotLastIndex = beanTypeName.lastIndexOf(CDIMarkerResolutionUtils.DOT); if (dotLastIndex < 0) beanPackage = ""; else beanPackage = beanTypeName.substring(0, dotLastIndex); if ((isPublic || injectionPointPackage.equals(beanPackage)) && bean.getBeanClass().getResource() != null) beans.add(bean); } } return beans; } private IInjectionPoint findInjectionPoint(ICompilationUnit compilationUnit, int start, boolean asYouType) throws JavaModelException { IJavaElement element = findJavaElement(compilationUnit, start); if (element == null) return null; CDICoreNature cdiNature = CDIUtil .getCDINatureWithProgress(compilationUnit.getUnderlyingResource().getProject()); if (cdiNature == null) return null; ICDIProject cdiProject = CDIUtil.getCDIProject((IFile) compilationUnit.getUnderlyingResource(), cdiNature, asYouType); if (cdiProject == null) { return null; } Collection<IBean> allBeans = CDIUtil.getFilteredBeans(cdiProject, compilationUnit.getUnderlyingResource().getFullPath()); IInjectionPoint ip = CDIUtil.findInjectionPoint(allBeans, element, start); return ip; } private List<IBean> findBeans(IInjectionPoint injectionPoint) { ICDIProject cdiProject = injectionPoint.getCDIProject(); List<IBean> beans = CDIUtil.getSortedBeans(cdiProject, false, injectionPoint); for (int i = beans.size() - 1; i >= 0; i--) { if (beans.get(i).getBeanClass().getResource() == null) beans.remove(i); } return beans; } private 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; } private IType findTypeWithNoSerializable(ICompilationUnit compilationUnit, int start) throws JavaModelException { IJavaElement javaElement = findJavaElement(compilationUnit, start); if (javaElement instanceof IType) { IType type = (IType) javaElement; if (!type.isBinary()) { String shortName = CDIMarkerResolutionUtils .getShortName(AddSerializableInterfaceMarkerResolution.SERIALIZABLE); String[] interfaces = type.getSuperInterfaceNames(); for (String name : interfaces) { if (name.equals(shortName)) return null; } return type; } } return null; } class TypeAndAnnotation { IType type; IAnnotation annotation; public TypeAndAnnotation(IType type) { this.type = type; } public TypeAndAnnotation(IType type, IAnnotation annotation) { this(type); this.annotation = annotation; } } private TypeAndAnnotation findTypeAndAnnotation(ICompilationUnit compilationUnit, int start, String annotationQualifiedName) throws JavaModelException { IJavaElement javaElement = findJavaElement(compilationUnit, start); if (javaElement instanceof IType) { IType type = (IType) javaElement; if (!type.isBinary()) { IAnnotation annotation = getAnnotation(type, annotationQualifiedName); if (annotation != null) { return new TypeAndAnnotation(type, annotation); } return new TypeAndAnnotation(type); } } return null; } private IJavaElement findJavaElement(ICompilationUnit compilationUnit, int start) { try { return compilationUnit == null ? null : compilationUnit.getElementAt(start); } catch (JavaModelException ex) { CDIUIPlugin.getDefault().logError(ex); } return null; } private 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) { CDIUIPlugin.getDefault().logError(ex); } } return null; } private List<IType> findLocalAnnotattedInterfaces(IMethod method) throws JavaModelException { ArrayList<IType> types = new ArrayList<IType>(); if (method.getTypeParameters().length > 0) return types; IType type = method.getDeclaringType(); String[] is = type.getSuperInterfaceNames(); for (int i = 0; i < is.length; i++) { String f = EclipseJavaUtil.resolveType(type, is[i]); IType t = EclipseResourceUtil.getValidType(type.getJavaProject().getProject(), f); if (t != null && t.isInterface()) { IAnnotation localAnnotation = EclipseJavaUtil.findAnnotation(t, t, CDIConstants.LOCAL_ANNOTATION_TYPE_NAME); if (localAnnotation != null) { if (isMethodExists(t, method)) { types.clear(); return types; } types.add(t); } } } return types; } private boolean isMethodExists(IType interfaceType, IMethod method) { IMethod existingMethod = interfaceType.getMethod(method.getElementName(), method.getParameterTypes()); if (existingMethod.exists()) return true; return false; } private 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) { CDIUIPlugin.getDefault().logError(ex); } return null; } private 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) { CDIUIPlugin.getDefault().logError(ex); } return null; } @Override public boolean hasResolutions(IMarker marker) { if (marker.exists()) { try { return getMessageID(marker) >= 0; } catch (CoreException ex) { CDIUIPlugin.getDefault().logError(ex); } } return false; } private IAnnotation getAnnotation(IJavaElement element, String annotationQualifiedName) { if (element instanceof IAnnotatable) { String shortName = CDIMarkerResolutionUtils.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) { CDIUIPlugin.getDefault().logError(e); } } return null; } private 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; } @Override public boolean hasProposals(Annotation annotation, Position position) { if (annotation instanceof TempJavaProblemAnnotation || annotation instanceof TemporaryAnnotation) { return true; } return false; } @Override public IJavaCompletionProposal[] getProposals(Annotation annotation, Position position) { if (annotation instanceof TempJavaProblemAnnotation) { TempJavaProblemAnnotation javaAnnotation = (TempJavaProblemAnnotation) annotation; int messageId = javaAnnotation.getId() - TempJavaProblem.TEMP_PROBLEM_ID; ICompilationUnit compilationUnit = javaAnnotation.getCompilationUnit(); if (compilationUnit != null) { int start = position.getOffset(); ICDIMarkerResolutionGeneratorExtension[] extensions = CDIQuickFixExtensionManager.getInstances(); try { return findJavaResolutions(compilationUnit, messageId, start, extensions, true); } catch (JavaModelException e) { CDIUIPlugin.getDefault().logError(e); } } } else if (annotation instanceof TemporaryAnnotation) { TemporaryAnnotation tempAnnotation = (TemporaryAnnotation) annotation; IFile file = MarkerResolutionUtils.getFile(); int messageId = getMessageID(tempAnnotation); int start = tempAnnotation.getPosition().getOffset(); int end = start + tempAnnotation.getPosition().getLength(); try { return findXMLResolutions(file, messageId, start, end, true); } catch (JavaModelException e) { CDIUIPlugin.getDefault().logError(e); } } return new IJavaCompletionProposal[] {}; } }