blob: 028caccafe1999e046edb94ae69bef3bb2810047 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2018 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.debug.ui.launcher;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.CorrectionEngine;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaModelMarker;
import org.eclipse.jdt.core.IJavaModelStatusConstants;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.debug.ui.jres.ExecutionEnvironmentsPreferencePage;
import org.eclipse.jdt.internal.debug.ui.jres.JREsPreferencePage;
import org.eclipse.jdt.internal.launching.JREContainerInitializer;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.text.correction.CorrectionMessages;
import org.eclipse.jdt.internal.ui.text.java.hover.ConfigureProblemSeverityAction;
import org.eclipse.jdt.internal.ui.text.java.hover.ConfigureProblemSeverityAction.PreferencePage;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IMarkerResolution;
import org.eclipse.ui.IMarkerResolution2;
import org.eclipse.ui.IMarkerResolutionGenerator2;
import org.eclipse.ui.IMarkerResolutionRelevance;
/**
* Generates quick fixes for unbound JREs.
*/
public class JreResolutionGenerator implements IMarkerResolutionGenerator2 {
private final static IMarkerResolution[] NO_RESOLUTION = new IMarkerResolution[0];
/**
* @see org.eclipse.ui.IMarkerResolutionGenerator#getResolutions(org.eclipse.core.resources.IMarker)
*/
@Override
public IMarkerResolution[] getResolutions(IMarker marker) {
try {
if(JavaRuntime.JRE_CONTAINER_MARKER.equals(marker.getType())) {
OpenPreferencePageResolution openPreferencePageResolution = new OpenPreferencePageResolution(ExecutionEnvironmentsPreferencePage.ID, new String[] {
ExecutionEnvironmentsPreferencePage.ID,
JREsPreferencePage.ID }, LauncherMessages.JreResolutionGenerator_open_ee_prefs, LauncherMessages.JreResolutionGenerator_opens_ee_prefs);
IJavaProject project = getJavaProject(marker);
IPath container = null;
for (IClasspathEntry entry : project.getRawClasspath()) {
if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
IPath path = entry.getPath();
if (JavaRuntime.JRE_CONTAINER.equals(path.segment(0))) {
container = path;
}
}
}
boolean noVM = container == null || JREContainerInitializer.resolveVM(container) == null;
if (noVM) {
return new IMarkerResolution[] { openPreferencePageResolution };
}
ConfigureSeverityResolution configureSeverityResolution = new ConfigureSeverityResolution(project, JavaRuntime.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE);
return new IMarkerResolution[] { openPreferencePageResolution, configureSeverityResolution };
} else if (JavaRuntime.JRE_COMPILER_COMPLIANCE_MARKER.equals(marker.getType())) {
IJavaProject project = getJavaProject(marker);
OpenPropertyPageResolution openPropertyPageResolution = new OpenPropertyPageResolution(project, JavaUI.ID_COMPILER_COMPLIANCE_PROPERTY_PAGE, new String[] {
JavaUI.ID_COMPILER_COMPLIANCE_PROPERTY_PAGE,
JavaUI.ID_JAVA_BUILD_PREFERENCE_PROPERTY_PAGE }, LauncherMessages.JreResolutionGenerator_open_cc_props, LauncherMessages.JreResolutionGenerator_opens_cc_props);
ConfigureSeverityResolution configureSeverityResolution = new ConfigureSeverityResolution(project, JavaRuntime.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE);
return new IMarkerResolution[] { openPropertyPageResolution, configureSeverityResolution };
}
int id = marker.getAttribute(IJavaModelMarker.ID, -1);
switch (id) {
// unbound classpath container
case IJavaModelStatusConstants.CP_CONTAINER_PATH_UNBOUND :
String[] arguments = CorrectionEngine.getProblemArguments(marker);
IPath path = new Path(arguments[0]);
if (path.segment(0).equals(JavaRuntime.JRE_CONTAINER)) {
// unbound JRE_CONTAINER
if (JREResolution.getAllVMs().length > 0) {
IJavaProject project = getJavaProject(marker);
return new IMarkerResolution[]{new SelectSystemLibraryQuickFix(path, project)};
}
// define a new JRE
return new IMarkerResolution[]{new DefineSystemLibraryQuickFix()};
}
break;
// unbound classpath variable
case IJavaModelStatusConstants.CP_VARIABLE_PATH_UNBOUND :
arguments = CorrectionEngine.getProblemArguments(marker);
path = new Path(arguments[0]);
if (path.segment(0).equals(JavaRuntime.JRELIB_VARIABLE)) {
// unbound JRE_LIB
if (JREResolution.getAllVMs().length > 0) {
return new IMarkerResolution[]{new SelectDefaultSystemLibraryQuickFix()};
}
// define a new default JRE
return new IMarkerResolution[]{new DefineSystemLibraryQuickFix()};
}
break;
// deprecated JRE library variables
case IJavaModelStatusConstants.DEPRECATED_VARIABLE :
arguments = CorrectionEngine.getProblemArguments(marker);
path = new Path(arguments[0]);
if (path.segment(0).equals(JavaRuntime.JRELIB_VARIABLE) ||
path.segment(0).equals(JavaRuntime.JRE_CONTAINER)) {
IJavaProject project = getJavaProject(marker);
return new IMarkerResolution[] {new SelectSystemLibraryQuickFix(path, project)};
}
break;
}
}
catch(CoreException ce) {}
return NO_RESOLUTION;
}
/**
* Returns the java project from the specified marker, or <code>null</code> if the marker
* does not have an associated java project
* @param marker
* @return the associated java project or <code>null</code>
*/
protected IJavaProject getJavaProject(IMarker marker) {
return JavaCore.create(marker.getResource().getProject());
}
/* (non-Javadoc)
* @see org.eclipse.ui.IMarkerResolutionGenerator2#hasResolutions(org.eclipse.core.resources.IMarker)
*/
@Override
public boolean hasResolutions(IMarker marker) {
try {
String type = marker.getType();
return IJavaModelMarker.BUILDPATH_PROBLEM_MARKER.equals(type) ||
JavaRuntime.JRE_CONTAINER_MARKER.equals(type) ||
JavaRuntime.JRE_COMPILER_COMPLIANCE_MARKER.equals(type);
} catch (CoreException ce) {}
return false;
}
private static class ConfigureSeverityResolution implements IMarkerResolution2, IMarkerResolutionRelevance {
private final IJavaProject fProject;
private String fOptionId;
public ConfigureSeverityResolution(IJavaProject project, String optionId) {
fProject = project;
fOptionId = optionId;
}
@Override
public String getDescription() {
return null;
}
@Override
public Image getImage() {
return JavaPluginImages.get(JavaPluginImages.IMG_CONFIGURE_PROBLEM_SEVERITIES);
}
@Override
public String getLabel() {
return CorrectionMessages.ConfigureProblemSeveritySubProcessor_name;
}
@Override
public int getRelevanceForResolution() {
return -1;
}
@Override
public void run(IMarker marker) {
ConfigureProblemSeverityAction problemSeverityAction = new ConfigureProblemSeverityAction(fProject, fOptionId, JavaRuntime.ID_PLUGIN, PreferencePage.BUILDING, null);
problemSeverityAction.run();
}
}
}