Bug 500794 - [hcr] Selectively enable/disable Hot Code Replace per
workspace
Change-Id: Icff4846560040009d0c3f6217a29fb9f67bd66af
Signed-off-by: Josef Lehner <josef1207@googlemail.com>
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.java
index a9b44b0..0e90a66 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.java
@@ -49,6 +49,7 @@
public static String JavaDebugPreferencePage_27;
public static String JavaDebugPreferencePage_description;
+ public static String JavaDebugPreferencePage_Enable_hot_code_replace_1;
public static String JavaDebugPreferencePage_Alert_me_when_hot_code_replace_fails_1;
public static String JavaDebugPreferencePage_Alert_me_when_hot_code_replace_is_not_supported_1;
public static String JavaDebugPreferencePage_Alert_me_when_obsolete_methods_remain_1;
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.properties b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.properties
index ac30067..4b0bf61 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.properties
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.properties
@@ -17,6 +17,7 @@
ImageDescriptorRegistry_Allocating_image_for_wrong_display_1=Allocating image for wrong display
JavaDebugPreferencePage_description=General settings for Java Debugging.
+JavaDebugPreferencePage_Enable_hot_code_replace_1=Enable hot code replace
JavaDebugPreferencePage_Alert_me_when_hot_code_replace_fails_1=Show error when hot code replace &fails
JavaDebugPreferencePage_Alert_me_when_hot_code_replace_is_not_supported_1=Show error when hot code replace is not &supported
JavaDebugPreferencePage_Alert_me_when_obsolete_methods_remain_1=Show error when &obsolete methods remain after hot code replace
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugPreferencePage.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugPreferencePage.java
index 423452f..2cf30b8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugPreferencePage.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugPreferencePage.java
@@ -85,6 +85,7 @@
private Combo fWatchpoint;
// Hot code replace preference widgets
+ private Button fEnableHCRButton;
private Button fAlertHCRButton;
private Button fAlertHCRNotSupportedButton;
private Button fAlertObsoleteButton;
@@ -138,6 +139,7 @@
fWatchpoint.setFont(group.getFont());
group = SWTFactory.createGroup(composite, DebugUIMessages.JavaDebugPreferencePage_Hot_Code_Replace_2, 1, 1, GridData.FILL_HORIZONTAL);
+ fEnableHCRButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Enable_hot_code_replace_1, null, true, 1);
fAlertHCRButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Alert_me_when_hot_code_replace_fails_1, null, false, 1);
fAlertHCRNotSupportedButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Alert_me_when_hot_code_replace_is_not_supported_1, null, false, 1);
fAlertObsoleteButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Alert_me_when_obsolete_methods_remain_1, null, false, 1);
@@ -199,6 +201,7 @@
store.setValue(IJDIPreferencesConstants.PREF_OPEN_INSPECT_POPUP_ON_EXCEPTION, fOpenInspector.getSelection());
IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier());
if(prefs != null) {
+ prefs.putBoolean(JDIDebugPlugin.PREF_ENABLE_HCR, fEnableHCRButton.getSelection());
prefs.putBoolean(JDIDebugModel.PREF_SUSPEND_FOR_BREAKPOINTS_DURING_EVALUATION, fSuspendDuringEvaluations.getSelection());
int selectionIndex = fSuspendVMorThread.getSelectionIndex();
int policy = IJavaBreakpoint.SUSPEND_THREAD;
@@ -248,6 +251,7 @@
fOpenInspector.setSelection(store.getDefaultBoolean(IJDIPreferencesConstants.PREF_OPEN_INSPECT_POPUP_ON_EXCEPTION));
IEclipsePreferences prefs = DefaultScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier());
if(prefs != null) {
+ fEnableHCRButton.setSelection(prefs.getBoolean(JDIDebugPlugin.PREF_ENABLE_HCR, true));
fSuspendDuringEvaluations.setSelection(prefs.getBoolean(JDIDebugModel.PREF_SUSPEND_FOR_BREAKPOINTS_DURING_EVALUATION, true));
int value = prefs.getInt(JDIDebugPlugin.PREF_DEFAULT_BREAKPOINT_SUSPEND_POLICY, IJavaBreakpoint.SUSPEND_THREAD);
fSuspendVMorThread.select((value == IJavaBreakpoint.SUSPEND_THREAD) ? 0 : 1);
@@ -281,6 +285,7 @@
fOpenInspector.setSelection(store.getBoolean(IJDIPreferencesConstants.PREF_OPEN_INSPECT_POPUP_ON_EXCEPTION));
IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier());
if(prefs != null) {
+ fEnableHCRButton.setSelection(prefs.getBoolean(JDIDebugPlugin.PREF_ENABLE_HCR, true));
fSuspendDuringEvaluations.setSelection(prefs.getBoolean(JDIDebugModel.PREF_SUSPEND_FOR_BREAKPOINTS_DURING_EVALUATION, true));
int value = prefs.getInt(JDIDebugPlugin.PREF_DEFAULT_BREAKPOINT_SUSPEND_POLICY, IJavaBreakpoint.SUSPEND_THREAD);
fSuspendVMorThread.select((value == IJavaBreakpoint.SUSPEND_THREAD ? 0 : 1));
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPlugin.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPlugin.java
index 8ff5d0b..64520fa 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPlugin.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPlugin.java
@@ -55,6 +55,14 @@
public class JDIDebugPlugin extends Plugin implements IEclipsePreferences.IPreferenceChangeListener {
/**
+ * Boolean preference controlling if hot code replace is enabled.
+ *
+ * @since 3.11
+ */
+ public static final String PREF_ENABLE_HCR = JDIDebugPlugin
+ .getUniqueIdentifier() + ".enable_hcr"; //$NON-NLS-1$
+
+ /**
* integer preference controlling if we should, by default, suspend the VM
* instead of the thread
*
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPluginPreferenceInitializer.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPluginPreferenceInitializer.java
index a7062c6..080b144 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPluginPreferenceInitializer.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugPluginPreferenceInitializer.java
@@ -32,6 +32,7 @@
@Override
public void initializeDefaultPreferences() {
IEclipsePreferences node = DefaultScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier());
+ node.putBoolean(JDIDebugPlugin.PREF_ENABLE_HCR, true);
node.putInt(JDIDebugModel.PREF_REQUEST_TIMEOUT, JDIDebugModel.DEF_REQUEST_TIMEOUT);
node.putBoolean(JDIDebugModel.PREF_HCR_WITH_COMPILATION_ERRORS, true);
node.putBoolean(JDIDebugModel.PREF_SUSPEND_FOR_BREAKPOINTS_DURING_EVALUATION, true);
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java
index 0b9e4e2..27facfb 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java
@@ -444,6 +444,16 @@
*/
private void doHotCodeReplace(List<JDIDebugTarget> targets, List<IResource> resources,
List<String> qualifiedNames) {
+
+ // Check whether hot code replace is enabled
+ if (!Platform.getPreferencesService().getBoolean(
+ JDIDebugPlugin.getUniqueIdentifier(),
+ JDIDebugPlugin.PREF_ENABLE_HCR,
+ true,
+ null)) {
+ return; // disabled
+ }
+
MultiStatus ms = new MultiStatus(
JDIDebugPlugin.getUniqueIdentifier(),
DebugException.TARGET_REQUEST_FAILED,