| /****************************************************************************** |
| * Copyright (c) 2007 BEA Systems, 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: |
| * rfrost@bea.com - initial API and implementation |
| ******************************************************************************/ |
| |
| package org.eclipse.jst.j2ee.internal.classpathdep.ui; |
| |
| import org.eclipse.core.commands.ExecutionException; |
| import org.eclipse.core.resources.IMarker; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jem.util.logger.proxy.Logger; |
| import org.eclipse.jface.dialogs.ErrorDialog; |
| import org.eclipse.jst.j2ee.classpathdep.UpdateClasspathAttributeUtil; |
| import org.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator; |
| import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin; |
| import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.ui.IMarkerResolution; |
| import org.eclipse.ui.IMarkerResolutionGenerator; |
| import org.eclipse.wst.validation.internal.ConfigurationConstants; |
| |
| /** |
| * IMarkerResolutionGenerator for classpath dependency validator problem markers. |
| */ |
| public final class ClasspathDependencyValidatorMarkerResolutions implements IMarkerResolutionGenerator { |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.IMarkerResolutionGenerator#getResolutions(org.eclipse.core.resources.IMarker) |
| */ |
| public IMarkerResolution[] getResolutions(final IMarker marker) { |
| // generate resolutions based on type of validation problem marker |
| String messageId = null; |
| String cpEntryPath = null; |
| try { |
| messageId = (String) marker.getAttribute(ConfigurationConstants.VALIDATION_MARKER_MESSAGEID); |
| cpEntryPath = (String) marker.getAttribute(ConfigurationConstants.VALIDATION_MARKER_GROUP); |
| } catch (CoreException ce) { |
| Logger.getLogger(J2EEUIPlugin.PLUGIN_ID).logError(ce); |
| return new IMarkerResolution[0]; |
| } |
| |
| if (messageId == null || cpEntryPath == null || cpEntryPath.length() == 0) { |
| return new IMarkerResolution[0]; |
| } |
| |
| if (ClasspathDependencyValidator.AppClientProject.equals(messageId)) { |
| // can apply to multiple cp entries so not currently supporting a quick fix... |
| } else if (ClasspathDependencyValidator.DuplicateClassFolderEntry.equals(messageId)) { |
| // quick fix removes the dependency |
| return new IMarkerResolution[] { new UpdateClasspathDependencyAttributeResolution(cpEntryPath, false) }; |
| } else if (ClasspathDependencyValidator.DuplicateArchiveName.equals(messageId)) { |
| // quick fix removes the dependency |
| return new IMarkerResolution[] { new UpdateClasspathDependencyAttributeResolution(cpEntryPath, false) }; |
| } else if (ClasspathDependencyValidator.FilteredContainer.equals(messageId)) { |
| // quick fix removes the dependency |
| return new IMarkerResolution[] { new UpdateClasspathDependencyAttributeResolution(cpEntryPath, false) }; |
| } else if (ClasspathDependencyValidator.InvalidNonWebRuntimePath.equals(messageId)) { |
| // quick fix removes the dependency |
| return new IMarkerResolution[] { new UpdateClasspathDependencyAttributeResolution(cpEntryPath, false) }; |
| } else if (ClasspathDependencyValidator.InvalidWebRuntimePath.equals(messageId)) { |
| // quick fix removes the dependency |
| return new IMarkerResolution[] { new UpdateClasspathDependencyAttributeResolution(cpEntryPath, false) }; |
| } else if (ClasspathDependencyValidator.NonTaggedExportedClasses.equals(messageId)) { |
| IResource resource = marker.getResource(); |
| if(null != resource && resource.getType() == IResource.PROJECT && !JavaEEProjectUtilities.isApplicationClientProject((IProject)resource)){ |
| // quick fix adds the dependency, and one to remove it |
| return new IMarkerResolution[] { new UpdateClasspathDependencyAttributeResolution(cpEntryPath, true), |
| new AddClasspathNonDependencyAttributeResolution(cpEntryPath)}; |
| } |
| // quick fix removes the dependency |
| return new IMarkerResolution[] { new AddClasspathNonDependencyAttributeResolution(cpEntryPath) }; |
| } else if (ClasspathDependencyValidator.ProjectClasspathEntry.equals(messageId)) { |
| // quick fix removes the dependency |
| return new IMarkerResolution[] { new UpdateClasspathDependencyAttributeResolution(cpEntryPath, false) }; |
| } else if (ClasspathDependencyValidator.RootMappingNonEARWARRef.equals(messageId)) { |
| // can apply to multiple cp entries so not currently supporting a quick fix... |
| } else if (ClasspathDependencyValidator.SourceEntry.equals(messageId)) { |
| // quick fix removes the dependency |
| return new IMarkerResolution[] { new UpdateClasspathDependencyAttributeResolution(cpEntryPath, false) }; |
| } |
| |
| return new IMarkerResolution[0]; |
| } |
| |
| private static IClasspathEntry getClasspathEntryForMarker(final IMarker marker, final String cpEntryPath) throws CoreException { |
| final IProject proj = marker.getResource().getProject(); |
| if (proj != null && proj.hasNature(JavaCore.NATURE_ID)) { |
| final IJavaProject jProject = JavaCore.create(proj); |
| if (cpEntryPath != null) { |
| IClasspathEntry[] rawCp = jProject.getRawClasspath(); |
| for (int i = 0; i < rawCp.length; i++) { |
| if (rawCp[i].getPath().toString().equals(cpEntryPath)) { |
| return rawCp[i]; |
| } |
| } |
| } |
| } |
| return null; |
| } |
| |
| /* Resolution that add/removes the classpath dependency attribute */ |
| private static final class UpdateClasspathDependencyAttributeResolution implements IMarkerResolution { |
| private final boolean add; |
| private final String cpEntryPath; |
| public UpdateClasspathDependencyAttributeResolution(final String cpEntryPath, final boolean add) { |
| this.add = add; |
| this.cpEntryPath = cpEntryPath; |
| } |
| |
| public String getLabel() { |
| if (add) { |
| return Resources.addClasspathDependencyAttribute; |
| } |
| return Resources.removeClasspathDependencyAttribute; |
| } |
| |
| public void run(final IMarker marker) { |
| final IProject proj = marker.getResource().getProject(); |
| try { |
| final IClasspathEntry cpEntry = getClasspathEntryForMarker(marker, cpEntryPath); |
| if (add) { |
| UpdateClasspathAttributeUtil.addDependencyAttribute(null, proj.getName(), cpEntry); |
| } else { |
| UpdateClasspathAttributeUtil.removeDependencyAttribute(null, proj.getName(), cpEntry); |
| } |
| } catch (CoreException ce){ |
| ErrorDialog.openError(null, Resources.errorDialogTitle, |
| Resources.errorDialogMessage, |
| ce.getStatus()); |
| } catch (ExecutionException ee){ |
| ErrorDialog.openError(null, Resources.errorDialogTitle, |
| Resources.errorDialogMessage, |
| new Status(IStatus.ERROR, J2EEUIPlugin.PLUGIN_ID, 0, ee.getLocalizedMessage(), ee)); |
| } |
| } |
| } |
| |
| /* Resolution that adds the classpath nondependency attribute */ |
| private static final class AddClasspathNonDependencyAttributeResolution implements IMarkerResolution { |
| private final String cpEntryPath; |
| public AddClasspathNonDependencyAttributeResolution(final String cpEntryPath) { |
| this.cpEntryPath = cpEntryPath; |
| } |
| |
| public String getLabel() { |
| return Resources.addClasspathNonDependencyAttribute; |
| } |
| |
| public void run(final IMarker marker) { |
| final IProject proj = marker.getResource().getProject(); |
| try { |
| final IClasspathEntry cpEntry = getClasspathEntryForMarker(marker, cpEntryPath); |
| UpdateClasspathAttributeUtil.addNonDependencyAttribute(null, proj.getName(), cpEntry); |
| } catch (CoreException ce){ |
| ErrorDialog.openError(null, Resources.errorDialogTitle, |
| Resources.errorDialogMessage, |
| ce.getStatus()); |
| } catch (ExecutionException ee){ |
| ErrorDialog.openError(null, Resources.errorDialogTitle, |
| Resources.errorDialogMessage, |
| new Status(IStatus.ERROR, J2EEUIPlugin.PLUGIN_ID, 0, ee.getLocalizedMessage(), ee)); |
| } |
| } |
| } |
| |
| private static final class Resources extends NLS { |
| public static String removeClasspathDependencyAttribute; |
| public static String addClasspathDependencyAttribute; |
| public static String addClasspathNonDependencyAttribute; |
| public static String errorDialogTitle; |
| public static String errorDialogMessage; |
| |
| static |
| { |
| initializeMessages( ClasspathDependencyValidatorMarkerResolutions.class.getName(), |
| Resources.class ); |
| } |
| } |
| |
| |
| } |