/******************************************************************************* * 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.seam.ui.marker; import java.util.Collection; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.ui.IMarkerResolution; import org.eclipse.ui.IMarkerResolutionGenerator2; import org.jboss.tools.common.text.ITextSourceReference; import org.jboss.tools.seam.core.ISeamComponent; import org.jboss.tools.seam.core.ISeamJavaComponentDeclaration; import org.jboss.tools.seam.core.ISeamProject; import org.jboss.tools.seam.core.ISeamProperty; import org.jboss.tools.seam.core.ISeamXmlComponentDeclaration; import org.jboss.tools.seam.core.SeamCorePlugin; import org.jboss.tools.seam.core.SeamCoreMessages; import org.jboss.tools.seam.internal.core.SeamComponentDeclaration; import org.jboss.tools.seam.internal.core.validation.SeamCoreValidator; import org.jboss.tools.seam.ui.SeamGuiPlugin; /** * @author Daniel Azarov */ public class SeamProblemMarkerResolutionGenerator implements IMarkerResolutionGenerator2 { private static final String JAVA_EXTENSION = "java"; //$NON-NLS-1$ private static final String XML_EXTENSION = "xml"; //$NON-NLS-1$ public IMarkerResolution[] getResolutions(IMarker marker) { try { return findResolutions(marker); } catch (CoreException ex) { SeamGuiPlugin.getPluginLog().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(SeamCoreValidator.MESSAGE_ID_ATTRIBUTE_NAME)); if (attribute != null) return attribute.intValue(); return -1; } private IMarkerResolution[] findResolutions(IMarker marker) throws CoreException { int messageId = getMessageID(marker); if (messageId == -1) return new IMarkerResolution[] {}; IFile file = (IFile) marker.getResource(); Integer attribute = ((Integer) marker.getAttribute(IMarker.CHAR_START)); if (attribute == null) return new IMarkerResolution[] {}; int start = attribute.intValue(); attribute = ((Integer) marker.getAttribute(IMarker.CHAR_END)); if (attribute == null) return new IMarkerResolution[] {}; int end = attribute.intValue(); if (JAVA_EXTENSION.equals(file.getFileExtension())) { if (messageId == SeamCoreValidator.NONUNIQUE_COMPONENT_NAME_MESSAGE_ID) { return new IMarkerResolution[] { new RenameAnnotationMarkerResolution( SeamCoreMessages.RENAME_NAME_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Name", file, start, end), new DeleteAnnotationMarkerResolution( SeamCoreMessages.DELETE_NAME_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Name", file, start, end) }; } else if (messageId == SeamCoreValidator.DUPLICATE_REMOVE_MESSAGE_ID) return new IMarkerResolution[] { new DeleteAnnotationMarkerResolution( SeamCoreMessages.DELETE_REMOVE_ANNOTATION_MARKER_RESOLUTION_TITLE, "javax.ejb.Remove", file, start, end) }; else if (messageId == SeamCoreValidator.DUPLICATE_DESTROY_MESSAGE_ID) return new IMarkerResolution[] { new DeleteAnnotationMarkerResolution( SeamCoreMessages.DELETE_DESTROY_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Destroy", file, start, end) }; else if (messageId == SeamCoreValidator.DUPLICATE_CREATE_MESSAGE_ID) return new IMarkerResolution[] { new DeleteAnnotationMarkerResolution( SeamCoreMessages.DELETE_CREATE_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Create", file, start, end) }; else if (messageId == SeamCoreValidator.DUPLICATE_UNWRAP_MESSAGE_ID) return new IMarkerResolution[] { new DeleteAnnotationMarkerResolution( SeamCoreMessages.DELETE_UNWRAP_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Unwrap", file, start, end) }; else if (messageId == SeamCoreValidator.DESTROY_METHOD_BELONGS_TO_STATELESS_SESSION_BEAN_MESSAGE_ID) return new IMarkerResolution[] { new DeleteAnnotationMarkerResolution( SeamCoreMessages.DELETE_DESTROY_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Destroy", file, start, end) }; else if (messageId == SeamCoreValidator.CREATE_DOESNT_BELONG_TO_COMPONENT_MESSAGE_ID) return new IMarkerResolution[] { new AddAnnotationMarkerResolution( SeamCoreMessages.ADD_NAME_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Name", file, start, end, true), new DeleteAnnotationMarkerResolution( SeamCoreMessages.DELETE_CREATE_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Create", file, start, end) }; else if (messageId == SeamCoreValidator.UNWRAP_DOESNT_BELONG_TO_COMPONENT_MESSAGE_ID) return new IMarkerResolution[] { new AddAnnotationMarkerResolution( SeamCoreMessages.ADD_NAME_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Name", file, start, end, true), new DeleteAnnotationMarkerResolution( SeamCoreMessages.DELETE_UNWRAP_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Unwrap", file, start, end) }; else if (messageId == SeamCoreValidator.OBSERVER_DOESNT_BELONG_TO_COMPONENT_MESSAGE_ID) return new IMarkerResolution[] { new AddAnnotationMarkerResolution( SeamCoreMessages.ADD_NAME_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Name", file, start, end, true), new DeleteAnnotationMarkerResolution( SeamCoreMessages.DELETE_OBSERVER_ANNOTATION_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Observer", file, start, end) }; else if (messageId == SeamCoreValidator.STATEFUL_COMPONENT_DOES_NOT_CONTAIN_REMOVE_ID) return new IMarkerResolution[] { new AddAnnotatedMethodMarkerResolution( SeamCoreMessages.ADD_ANNOTATED_REMOVE_METHOD_MARKER_RESOLUTION_TITLE, "javax.ejb.Remove", file, start, end) }; else if (messageId == SeamCoreValidator.STATEFUL_COMPONENT_DOES_NOT_CONTAIN_DESTROY_ID) return new IMarkerResolution[] { new AddAnnotatedMethodMarkerResolution( SeamCoreMessages.ADD_ANNOTATED_DESTROY_METHOD_MARKER_RESOLUTION_TITLE, "org.jboss.seam.annotations.Destroy", file, start, end) }; else if (messageId == SeamCoreValidator.STATEFUL_COMPONENT_WRONG_SCOPE_ID) return new IMarkerResolution[] { new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.APPLICATION", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.BUSINESS_PROCESS", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.CONVERSATION", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.EVENT", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.METHOD", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.SESSION", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.UNSPECIFIED", file, start, end) }; else if (messageId == SeamCoreValidator.ENTITY_COMPONENT_WRONG_SCOPE_ID) return new IMarkerResolution[] { new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.APPLICATION", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.BUSINESS_PROCESS", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.CONVERSATION", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.EVENT", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.METHOD", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.PAGE", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.SESSION", file, start, end), new ChangeScopeMarkerResolution( SeamCoreMessages.CHANGE_SCOPETYPE_MARKER_RESOLUTION_TITLE, "ScopeType.UNSPECIFIED", file, start, end) }; }else if(XML_EXTENSION.equals(file.getFileExtension())){ if (messageId == SeamCoreValidator.UNKNOWN_COMPONENT_PROPERTY_ID){ ISeamProperty property = findSeamProperty(file, start, end); if(property != null){ if(property.getParent() != null && property.getParent() instanceof SeamComponentDeclaration){ SeamComponentDeclaration xmlDeclaration = (SeamComponentDeclaration)property.getParent(); if(xmlDeclaration == null){ return new IMarkerResolution[] {}; } for(ISeamComponent component : xmlDeclaration.getComponents()){ ISeamJavaComponentDeclaration javaDeclaration = component.getJavaDeclaration(); if(javaDeclaration != null) return new IMarkerResolution[] { new AddSetterMarkerResolution(property, javaDeclaration) }; } } } } } return new IMarkerResolution[] {}; } private ISeamProperty findSeamProperty(IFile file, int start, int end){ if(file == null) return null; IProject project = file.getProject(); if(project == null) return null; ISeamProject seamProject = SeamCorePlugin.getSeamProject(project, true); if(seamProject == null) return null; Set<ISeamComponent> components = seamProject.getComponentsByPath(file.getFullPath()); for(ISeamComponent component : components){ Set<ISeamXmlComponentDeclaration> declarations = component.getXmlDeclarations(); for(ISeamXmlComponentDeclaration declaration : declarations){ Collection<ISeamProperty> properties = declaration.getProperties(); for(ISeamProperty property : properties){ ITextSourceReference location = property.getLocationFor(ISeamXmlComponentDeclaration.NAME); if(location.getStartPosition() <= start && (location.getStartPosition()+location.getLength()) >= end) return property; } } } return null; } public boolean hasResolutions(IMarker marker) { if(marker.exists()){ try { return getMessageID(marker) >= 0; } catch (CoreException ex) { SeamGuiPlugin.getPluginLog().logError(ex); } } return false; } }