| /******************************************************************************* |
| * Copyright (c) 2000, 2015 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.debug.ui; |
| |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.debug.core.DebugException; |
| import org.eclipse.debug.core.ILaunch; |
| import org.eclipse.debug.core.ILaunchConfiguration; |
| import org.eclipse.debug.ui.DebugUITools; |
| import org.eclipse.jdt.debug.core.IJavaDebugTarget; |
| import org.eclipse.jdt.debug.core.IJavaHotCodeReplaceListener; |
| import org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookLauncher; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Shell; |
| |
| public class JavaHotCodeReplaceListener implements IJavaHotCodeReplaceListener { |
| |
| private HotCodeReplaceErrorDialog fHotCodeReplaceFailedErrorDialog = null; |
| |
| private ILabelProvider fLabelProvider= DebugUITools.newDebugModelPresentation(); |
| |
| /** |
| * @see IJavaHotCodeReplaceListener#hotCodeReplaceSucceeded(IJavaDebugTarget) |
| */ |
| @Override |
| public void hotCodeReplaceSucceeded(IJavaDebugTarget target) { |
| } |
| |
| /** |
| * @see IJavaHotCodeReplaceListener#hotCodeReplaceFailed(IJavaDebugTarget, DebugException) |
| */ |
| @Override |
| public void hotCodeReplaceFailed(final IJavaDebugTarget target, final DebugException exception) { |
| if ((exception != null &&!JDIDebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_ALERT_HCR_FAILED)) || |
| ((exception == null) && !JDIDebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_ALERT_HCR_NOT_SUPPORTED))) { |
| return; |
| } |
| // do not report errors for snippet editor targets |
| // that do not support HCR. HCR is simulated by using |
| // a new class loader for each evaluation |
| ILaunch launch = target.getLaunch(); |
| if (launch.getAttribute(ScrapbookLauncher.SCRAPBOOK_LAUNCH) != null) { |
| if (!target.supportsHotCodeReplace()) { |
| return; |
| } |
| } |
| final Display display= JDIDebugUIPlugin.getStandardDisplay(); |
| if (display.isDisposed()) { |
| return; |
| } |
| |
| String name = null; |
| try { |
| name = target.getName(); |
| } |
| catch(DebugException e) { |
| name = fLabelProvider.getText(target); |
| } |
| final String vmName = name; |
| final IStatus status; |
| final String preference; |
| final String alertMessage; |
| ILaunchConfiguration config = target.getLaunch().getLaunchConfiguration(); |
| final String launchName = (config != null ? config.getName() : DebugUIMessages.JavaHotCodeReplaceListener_0); |
| if (exception == null) { |
| status = new Status(IStatus.WARNING, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, DebugUIMessages.JDIDebugUIPlugin_The_target_VM_does_not_support_hot_code_replace_1, null); |
| preference= IJDIPreferencesConstants.PREF_ALERT_HCR_NOT_SUPPORTED; |
| alertMessage= DebugUIMessages.JDIDebugUIPlugin_3; |
| } else { |
| status = new Status(IStatus.WARNING, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, exception.getMessage(), exception.getCause()); |
| preference= IJDIPreferencesConstants.PREF_ALERT_HCR_FAILED; |
| alertMessage= DebugUIMessages.JDIDebugUIPlugin_1; |
| } |
| final String title = DebugUIMessages.JDIDebugUIPlugin_Hot_code_replace_failed_1; |
| final String message = NLS.bind(DebugUIMessages.JDIDebugUIPlugin__0__was_unable_to_replace_the_running_code_with_the_code_in_the_workspace__2, new Object[] {vmName, launchName}); |
| display.asyncExec(new Runnable() { |
| @Override |
| public void run() { |
| if (display.isDisposed()) { |
| return; |
| } |
| if (fHotCodeReplaceFailedErrorDialog != null) { |
| Shell shell = fHotCodeReplaceFailedErrorDialog.getShell(); |
| if (shell != null && !shell.isDisposed()) { |
| return; |
| } |
| } |
| Shell shell= JDIDebugUIPlugin.getActiveWorkbenchShell(); |
| fHotCodeReplaceFailedErrorDialog = new HotCodeReplaceErrorDialog(shell, title, message, status, preference, alertMessage, JDIDebugUIPlugin.getDefault().getPreferenceStore(), target) { |
| @Override |
| public boolean close() { |
| fHotCodeReplaceFailedErrorDialog = null; |
| return super.close(); |
| } |
| }; |
| fHotCodeReplaceFailedErrorDialog.setBlockOnOpen(false); |
| fHotCodeReplaceFailedErrorDialog.open(); |
| } |
| }); |
| } |
| |
| /** |
| * @see IJavaHotCodeReplaceListener#obsoleteMethods(IJavaDebugTarget) |
| */ |
| @Override |
| public void obsoleteMethods(final IJavaDebugTarget target) { |
| if (!JDIDebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_ALERT_OBSOLETE_METHODS)) { |
| return; |
| } |
| final Display display= JDIDebugUIPlugin.getStandardDisplay(); |
| if (display.isDisposed()) { |
| return; |
| } |
| final String vmName= fLabelProvider.getText(target); |
| final String dialogTitle= DebugUIMessages.JDIDebugUIPlugin_Obsolete_methods_remain_1; |
| final String message= NLS.bind(DebugUIMessages.JDIDebugUIPlugin__0__contains_obsolete_methods_1, new Object[] {vmName}); |
| final IStatus status= new Status(IStatus.WARNING, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.WARNING, DebugUIMessages.JDIDebugUIPlugin_Stepping_may_be_hazardous_1, null); |
| final String toggleMessage= DebugUIMessages.JDIDebugUIPlugin_2; |
| display.asyncExec(new Runnable() { |
| @Override |
| public void run() { |
| if (display.isDisposed()) { |
| return; |
| } |
| Shell shell= JDIDebugUIPlugin.getActiveWorkbenchShell(); |
| HotCodeReplaceErrorDialog dialog= new HotCodeReplaceErrorDialog(shell, dialogTitle, message, status, IJDIPreferencesConstants.PREF_ALERT_OBSOLETE_METHODS, |
| toggleMessage, JDIDebugUIPlugin.getDefault().getPreferenceStore(), target); |
| dialog.setBlockOnOpen(false); |
| dialog.open(); |
| } |
| }); |
| } |
| |
| } |