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,