Merge pull request #1094 from eclipse/CHE-1004

CHE-1004: Improve experience on Debugger configuration selection
6.19.x
Artem Zatsarynnyi 2016-04-20 16:43:15 +03:00
commit 198f7fa3d8
19 changed files with 703 additions and 514 deletions

View File

@ -0,0 +1,64 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.api.debug;
import com.google.common.base.Optional;
import org.eclipse.che.commons.annotation.Nullable;
import java.util.List;
import java.util.Map;
/**
* Facade for debug configuration related operations.
* <p>Also holds the current debug configuration.
* Current means the configuration which should be used for connecting to the debugger.
*
* @author Artem Zatsarynnyi
*/
public interface DebugConfigurationsManager {
/** Returns current debug configuration. */
Optional<DebugConfiguration> getCurrentDebugConfiguration();
/** Set current debug configuration. */
void setCurrentDebugConfiguration(@Nullable DebugConfiguration debugConfiguration);
/** Returns all debug configurations. */
List<DebugConfiguration> getConfigurations();
/**
* Creates new configuration with the given parameters.
*
* @return created {@link DebugConfiguration}
*/
DebugConfiguration createConfiguration(String typeId,
String name,
String host,
int port,
Map<String, String> connectionProperties);
/** Remove the given debug configuration. */
void removeConfiguration(DebugConfiguration configuration);
/** Add listener to be notified when some debug configuration has been changed. */
void addConfigurationsChangedListener(ConfigurationChangedListener listener);
/** Remove the given listener. */
void removeConfigurationsChangedListener(ConfigurationChangedListener listener);
/** Listener that will be called when debug configuration has been changed. */
interface ConfigurationChangedListener {
void onConfigurationAdded(DebugConfiguration configuration);
void onConfigurationRemoved(DebugConfiguration configuration);
}
}

View File

@ -25,18 +25,16 @@ import org.eclipse.che.ide.ext.debugger.client.actions.DisconnectDebuggerAction;
import org.eclipse.che.ide.ext.debugger.client.actions.EditConfigurationsAction;
import org.eclipse.che.ide.ext.debugger.client.actions.EvaluateExpressionAction;
import org.eclipse.che.ide.ext.debugger.client.actions.ResumeExecutionAction;
import org.eclipse.che.ide.ext.debugger.client.actions.SelectDebugConfigurationComboBoxAction;
import org.eclipse.che.ide.ext.debugger.client.actions.ShowHideDebuggerPanelAction;
import org.eclipse.che.ide.ext.debugger.client.actions.StepIntoAction;
import org.eclipse.che.ide.ext.debugger.client.actions.StepOutAction;
import org.eclipse.che.ide.ext.debugger.client.actions.StepOverAction;
import org.eclipse.che.ide.ext.debugger.client.configuration.DebugConfigurationsGroup;
import org.eclipse.che.ide.ext.debugger.client.debug.DebuggerPresenter;
import org.eclipse.che.ide.util.input.KeyCodeMap;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_CENTER_TOOLBAR;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_DEBUG_CONTEXT_MENU;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_RUN;
import static org.eclipse.che.ide.api.constraints.Constraints.FIRST;
import static org.eclipse.che.ide.api.constraints.Constraints.LAST;
/**
@ -52,23 +50,20 @@ import static org.eclipse.che.ide.api.constraints.Constraints.LAST;
@Extension(title = "Debugger", version = "4.1.0")
public class DebuggerExtension {
public static final String GROUP_DEBUG_CONFIGURATIONS_LIST = "DebugConfigurationsListGroup";
private static final String GROUP_DEBUG_TOOLBAR = "DebugGroupToolbar";
private static final String GROUP_DEBUG_CONFIGURATIONS_LIST_DISPLAY_NAME = "Debug";
private static final String EDIT_DEBUG_CONF_ID = "editDebugConfigurations";
private static final String DEBUG_ID = "debug";
private static final String DISCONNECT_DEBUG_ID = "disconnectDebug";
private static final String STEP_INTO_ID = "stepInto";
private static final String STEP_OVER_ID = "stepOver";
private static final String STEP_OUT_ID = "stepOut";
private static final String RESUME_EXECUTION_ID = "resumeExecution";
private static final String EVALUATE_EXPRESSION_ID = "evaluateExpression";
private static final String CHANGE_VARIABLE_VALUE_ID = "changeVariableValue";
private static final String SHOW_HIDE_DEBUGGER_PANEL_ID = "showHideDebuggerPanel";
private static final String EDIT_DEBUG_CONF_ID = "editDebugConfigurations";
private static final String DEBUG_ID = "debug";
private static final String DISCONNECT_DEBUG_ID = "disconnectDebug";
private static final String STEP_INTO_ID = "stepInto";
private static final String STEP_OVER_ID = "stepOver";
private static final String STEP_OUT_ID = "stepOut";
private static final String RESUME_EXECUTION_ID = "resumeExecution";
private static final String EVALUATE_EXPRESSION_ID = "evaluateExpression";
private static final String CHANGE_VARIABLE_VALUE_ID = "changeVariableValue";
private static final String SHOW_HIDE_DEBUGGER_PANEL_ID = "showHideDebuggerPanel";
@Inject
public DebuggerExtension(DebuggerResources debuggerResources,
DebuggerLocalizationConstant localizationConstants,
ActionManager actionManager,
DebugAction debugAction,
DisconnectDebuggerAction disconnectDebuggerAction,
@ -81,7 +76,7 @@ public class DebuggerExtension {
ChangeVariableValueAction changeVariableValueAction,
ShowHideDebuggerPanelAction showHideDebuggerPanelAction,
EditConfigurationsAction editConfigurationsAction,
SelectDebugConfigurationComboBoxAction selectDebugConfigurationComboBoxAction,
DebugConfigurationsGroup configurationsGroup,
DebuggerPresenter debuggerPresenter,
KeyBindingAgent keyBinding) {
debuggerResources.getCss().ensureInjected();
@ -89,7 +84,6 @@ public class DebuggerExtension {
final DefaultActionGroup runMenu = (DefaultActionGroup)actionManager.getAction(GROUP_RUN);
// register actions
actionManager.registerAction("selectDebugConfigurationComboBox", selectDebugConfigurationComboBoxAction);
actionManager.registerAction(EDIT_DEBUG_CONF_ID, editConfigurationsAction);
actionManager.registerAction(DEBUG_ID, debugAction);
actionManager.registerAction(DISCONNECT_DEBUG_ID, disconnectDebuggerAction);
@ -101,9 +95,17 @@ public class DebuggerExtension {
actionManager.registerAction(CHANGE_VARIABLE_VALUE_ID, changeVariableValueAction);
actionManager.registerAction(SHOW_HIDE_DEBUGGER_PANEL_ID, showHideDebuggerPanelAction);
// create group for selecting (changing) debug configurations
final DefaultActionGroup debugConfigurationsGroup = new DefaultActionGroup(localizationConstants.debugConfigurationsActionTitle(),
true,
actionManager);
debugConfigurationsGroup.add(editConfigurationsAction);
debugConfigurationsGroup.addSeparator();
debugConfigurationsGroup.add(configurationsGroup);
// add actions in main menu
runMenu.addSeparator();
runMenu.add(editConfigurationsAction, LAST);
runMenu.add(debugConfigurationsGroup, LAST);
runMenu.add(debugAction, LAST);
runMenu.add(disconnectDebuggerAction, LAST);
runMenu.addSeparator();
@ -114,23 +116,6 @@ public class DebuggerExtension {
runMenu.addSeparator();
runMenu.add(evaluateExpressionAction, LAST);
// add actions on central toolbar
final DefaultActionGroup debugToolbarGroup = new DefaultActionGroup(GROUP_DEBUG_TOOLBAR, false, actionManager);
actionManager.registerAction(GROUP_DEBUG_TOOLBAR, debugToolbarGroup);
debugToolbarGroup.add(selectDebugConfigurationComboBoxAction);
final DefaultActionGroup debugGroup = new DefaultActionGroup(actionManager);
debugGroup.add(debugAction);
debugToolbarGroup.add(debugGroup);
final DefaultActionGroup centralToolbarGroup = (DefaultActionGroup)actionManager.getAction(GROUP_CENTER_TOOLBAR);
centralToolbarGroup.add(debugToolbarGroup);
// add group for debug configurations list
final DefaultActionGroup debugConfigurationsList = new DefaultActionGroup(GROUP_DEBUG_CONFIGURATIONS_LIST_DISPLAY_NAME,
true,
actionManager);
actionManager.registerAction(GROUP_DEBUG_CONFIGURATIONS_LIST, debugConfigurationsList);
debugConfigurationsList.add(editConfigurationsAction, FIRST);
// create debugger toolbar action group
DefaultActionGroup debuggerToolbarActionGroup = new DefaultActionGroup(actionManager);
debuggerToolbarActionGroup.add(resumeExecutionAction);
@ -145,7 +130,7 @@ public class DebuggerExtension {
// add actions in 'Debug' context menu
final DefaultActionGroup debugContextMenuGroup = (DefaultActionGroup)actionManager.getAction(GROUP_DEBUG_CONTEXT_MENU);
debugContextMenuGroup.add(debugConfigurationsList);
debugContextMenuGroup.add(debugAction);
debugContextMenuGroup.addSeparator();
// keys binding

View File

@ -18,15 +18,12 @@ package org.eclipse.che.ide.ext.debugger.client;
public interface DebuggerLocalizationConstant extends com.google.gwt.i18n.client.Messages {
/* actions */
@Key("debugConfigurationsActionTitle")
String debugConfigurationsActionTitle();
@Key("editDebugConfigurationsActionTitle")
String editDebugConfigurationsActionTitle();
@Key("selectConfigurationActionText")
String selectConfigurationActionText();
@Key("selectConfigurationActionDescription")
String selectConfigurationActionDescription();
@Key("breakpoints")
String breakpoints();
@ -73,6 +70,9 @@ public interface DebuggerLocalizationConstant extends com.google.gwt.i18n.client
@Key("editDebugConfigurationsActionDescription")
String editDebugConfigurationsActionDescription();
@Key("debugConfigurationActionDescription")
String debugConfigurationActionDescription();
@Key("resumeExecutionDescription")
String resumeExecutionDescription();

View File

@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.actions;
import com.google.common.base.Optional;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@ -19,6 +20,7 @@ import org.eclipse.che.api.promises.client.PromiseError;
import org.eclipse.che.ide.api.action.AbstractPerspectiveAction;
import org.eclipse.che.ide.api.action.ActionEvent;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.eclipse.che.ide.debug.Debugger;
import org.eclipse.che.ide.debug.DebuggerManager;
import org.eclipse.che.ide.ext.debugger.client.DebuggerLocalizationConstant;
@ -32,45 +34,52 @@ import java.util.Map;
import static org.eclipse.che.ide.workspace.perspectives.project.ProjectPerspective.PROJECT_PERSPECTIVE_ID;
/**
* Action that allows to connect to the debugger with the selected debug configuration.
* Action that allows to connect to the debugger with the current debug configuration.
*
* @author Artem Zatsarynnyi
*/
@Singleton
public class DebugAction extends AbstractPerspectiveAction {
private final SelectDebugConfigurationComboBoxAction selectConfigurationAction;
private final DebuggerLocalizationConstant localizationConstants;
private final DebuggerManager debuggerManager;
private final DialogFactory dialogFactory;
private final DebuggerLocalizationConstant localizationConstants;
private final DebuggerManager debuggerManager;
private final DialogFactory dialogFactory;
private final DebugConfigurationsManager configurationsManager;
@Inject
public DebugAction(SelectDebugConfigurationComboBoxAction selectConfigurationAction,
DebuggerLocalizationConstant localizationConstants,
public DebugAction(DebuggerLocalizationConstant localizationConstants,
DebuggerResources resources,
DebuggerManager debuggerManager,
DialogFactory dialogFactory) {
DialogFactory dialogFactory,
DebugConfigurationsManager debugConfigurationsManager) {
super(Collections.singletonList(PROJECT_PERSPECTIVE_ID),
localizationConstants.debugActionTitle(),
localizationConstants.debugActionDescription(),
null,
resources.debug());
this.selectConfigurationAction = selectConfigurationAction;
this.localizationConstants = localizationConstants;
this.debuggerManager = debuggerManager;
this.dialogFactory = dialogFactory;
this.configurationsManager = debugConfigurationsManager;
}
@Override
public void updateInPerspective(ActionEvent event) {
event.getPresentation().setVisible(selectConfigurationAction.getSelectedConfiguration() != null);
Optional<DebugConfiguration> configurationOptional = configurationsManager.getCurrentDebugConfiguration();
event.getPresentation().setEnabled(configurationOptional.isPresent());
if (configurationOptional.isPresent()) {
event.getPresentation().setText(localizationConstants.debugActionTitle() + " '" + configurationOptional.get().getName() + "'");
} else {
event.getPresentation().setText(localizationConstants.debugActionTitle());
}
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
final DebugConfiguration debugConfiguration = selectConfigurationAction.getSelectedConfiguration();
if (debugConfiguration != null) {
connect(debugConfiguration);
Optional<DebugConfiguration> configurationOptional = configurationsManager.getCurrentDebugConfiguration();
if (configurationOptional.isPresent()) {
connect(configurationOptional.get());
}
}

View File

@ -1,223 +0,0 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.actions;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.api.machine.gwt.client.events.WsAgentStateEvent;
import org.eclipse.che.api.machine.gwt.client.events.WsAgentStateHandler;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.ide.api.action.AbstractPerspectiveAction;
import org.eclipse.che.ide.api.action.ActionEvent;
import org.eclipse.che.ide.api.action.ActionManager;
import org.eclipse.che.ide.api.action.CustomComponentAction;
import org.eclipse.che.ide.api.action.DefaultActionGroup;
import org.eclipse.che.ide.api.action.Presentation;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.ext.debugger.client.DebuggerLocalizationConstant;
import org.eclipse.che.ide.ext.debugger.client.DebuggerResources;
import org.eclipse.che.ide.ext.debugger.client.configuration.DebugConfigurationsManager;
import org.eclipse.che.ide.ext.debugger.client.configuration.EditDebugConfigurationsPresenter;
import org.eclipse.che.ide.ui.dropdown.DropDownListFactory;
import org.eclipse.che.ide.ui.dropdown.DropDownWidget;
import org.vectomatic.dom.svg.ui.SVGImage;
import javax.validation.constraints.NotNull;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import static org.eclipse.che.ide.ext.debugger.client.DebuggerExtension.GROUP_DEBUG_CONFIGURATIONS_LIST;
import static org.eclipse.che.ide.workspace.perspectives.project.ProjectPerspective.PROJECT_PERSPECTIVE_ID;
/**
* Action that allows user to select debug configuration from the list of all existing configurations.
*
* @author Artem Zatsarynnyi
*/
@Singleton
public class SelectDebugConfigurationComboBoxAction extends AbstractPerspectiveAction implements CustomComponentAction,
EditDebugConfigurationsPresenter.ConfigurationChangedListener,
WsAgentStateHandler {
private static final String GROUP_DEBUG_CONFIGURATIONS = "DebugConfigurationsGroup";
private static final Comparator<DebugConfiguration> CONFIGURATIONS_COMPARATOR = new ConfigurationsComparator();
private final DropDownWidget dropDownHeaderWidget;
private final DebugConfigurationsManager debugConfigurationsManager;
private final ActionManager actionManager;
private final DebuggerResources resources;
private List<DebugConfiguration> configurations;
private DefaultActionGroup configurationActions;
@Inject
public SelectDebugConfigurationComboBoxAction(DebuggerLocalizationConstant locale,
DebuggerResources resources,
ActionManager actionManager,
EventBus eventBus,
DropDownListFactory dropDownListFactory,
EditDebugConfigurationsPresenter editConfigurationsPresenter,
DebugConfigurationsManager debugConfigurationsManager) {
super(Collections.singletonList(PROJECT_PERSPECTIVE_ID),
locale.selectConfigurationActionText(),
locale.selectConfigurationActionDescription(),
null, null);
this.resources = resources;
this.actionManager = actionManager;
this.debugConfigurationsManager = debugConfigurationsManager;
this.dropDownHeaderWidget = dropDownListFactory.createDropDown(GROUP_DEBUG_CONFIGURATIONS);
configurations = new LinkedList<>();
eventBus.addHandler(WsAgentStateEvent.TYPE, this);
editConfigurationsPresenter.addConfigurationsChangedListener(this);
configurationActions = new DefaultActionGroup(GROUP_DEBUG_CONFIGURATIONS, false, actionManager);
actionManager.registerAction(GROUP_DEBUG_CONFIGURATIONS, configurationActions);
}
@Override
public void updateInPerspective(@NotNull ActionEvent event) {
}
@Override
public void actionPerformed(ActionEvent e) {
}
@Override
public Widget createCustomComponent(Presentation presentation) {
FlowPanel customComponentHeader = new FlowPanel();
FlowPanel debugIconPanel = new FlowPanel();
customComponentHeader.setStyleName(resources.getCss().selectConfigurationBox());
debugIconPanel.setStyleName(resources.getCss().selectConfigurationsBoxIconPanel());
debugIconPanel.add(new SVGImage(resources.debugIcon()));
customComponentHeader.add(debugIconPanel);
customComponentHeader.add((Widget)dropDownHeaderWidget);
return customComponentHeader;
}
/** Returns the selected debug configuration. */
@Nullable
public DebugConfiguration getSelectedConfiguration() {
if (configurations.isEmpty()) {
return null;
}
final String selectedConfigurationName = dropDownHeaderWidget.getSelectedName();
for (DebugConfiguration configuration : configurations) {
if (configuration.getName().equals(selectedConfigurationName)) {
return configuration;
}
}
return null;
}
public void setSelectedConfiguration(DebugConfiguration configuration) {
dropDownHeaderWidget.selectElement(configuration.getName(), configuration.getName());
}
/**
* Load all saved debug configurations.
*
* @param configurationToSelect
* debug configuration that should be selected after loading all configurations
*/
private void loadConfigurations(@Nullable final DebugConfiguration configurationToSelect) {
List<DebugConfiguration> debugConfigurations = debugConfigurationsManager.readConfigurations();
setDebugConfigurations(debugConfigurations, configurationToSelect);
}
/**
* Sets debug configurations to the drop-down list.
*
* @param debugConfigurations
* collection of debug configurations to set
* @param configurationToSelect
* configuration that should be selected or {@code null} if none
*/
private void setDebugConfigurations(List<DebugConfiguration> debugConfigurations,
@Nullable DebugConfiguration configurationToSelect) {
final DefaultActionGroup configurationsList = (DefaultActionGroup)actionManager.getAction(GROUP_DEBUG_CONFIGURATIONS_LIST);
configurations.clear();
configurationActions.removeAll();
if (configurationsList != null) {
configurationActions.addAll(configurationsList);
}
Collections.sort(debugConfigurations, CONFIGURATIONS_COMPARATOR);
DebugConfiguration prevConf = null;
for (DebugConfiguration configuration : debugConfigurations) {
if (prevConf == null || !configuration.getType().getId().equals(prevConf.getType().getId())) {
configurationActions.addSeparator(configuration.getType().getDisplayName());
}
configurationActions
.add(dropDownHeaderWidget.createAction(configuration.getName(), configuration.getName()));
prevConf = configuration;
}
configurations.addAll(debugConfigurations);
if (configurationToSelect != null) {
setSelectedConfiguration(configurationToSelect);
} else {
selectLastUsedConfiguration();
}
}
/** Selects the last used configuration. */
private void selectLastUsedConfiguration() {
final String configName = configurations.isEmpty() ? null : configurations.get(0).getName();
dropDownHeaderWidget.selectElement(configName, configName);
// TODO: consider to saving last used configuration name somewhere
// for now, we always select the first configuration
}
@Override
public void onConfigurationAdded(DebugConfiguration configuration) {
loadConfigurations(null);
}
@Override
public void onConfigurationRemoved(DebugConfiguration configuration) {
loadConfigurations(null);
}
@Override
public void onConfigurationsUpdated(DebugConfiguration configuration) {
loadConfigurations(configuration);
}
@Override
public void onWsAgentStarted(WsAgentStateEvent event) {
loadConfigurations(null);
}
@Override
public void onWsAgentStopped(WsAgentStateEvent event) {
}
private static class ConfigurationsComparator implements Comparator<DebugConfiguration> {
@Override
public int compare(DebugConfiguration o1, DebugConfiguration o2) {
return o1.getType().getId().compareTo(o2.getType().getId());
}
}
}

View File

@ -0,0 +1,66 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.configuration;
import com.google.common.base.Optional;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.che.ide.api.action.AbstractPerspectiveAction;
import org.eclipse.che.ide.api.action.ActionEvent;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.eclipse.che.ide.ext.debugger.client.DebuggerLocalizationConstant;
import java.util.Collections;
import static org.eclipse.che.ide.workspace.perspectives.project.ProjectPerspective.PROJECT_PERSPECTIVE_ID;
/**
* Action for selecting (changing) current debug configuration.
*
* @author Artem Zatsarynnyi
*/
public class DebugConfigurationAction extends AbstractPerspectiveAction {
private static final String TICK = "> ";
private final DebugConfigurationsManager configurationsManager;
private final DebugConfiguration configuration;
@Inject
public DebugConfigurationAction(DebugConfigurationsManager debugConfigurationsManager,
@Assisted DebugConfiguration configuration,
DebuggerLocalizationConstant localizationConstants) {
super(Collections.singletonList(PROJECT_PERSPECTIVE_ID),
configuration.getName(),
localizationConstants.debugConfigurationActionDescription(),
null,
null);
configurationsManager = debugConfigurationsManager;
this.configuration = configuration;
}
@Override
public void updateInPerspective(ActionEvent event) {
Optional<DebugConfiguration> configurationOptional = configurationsManager.getCurrentDebugConfiguration();
if (configurationOptional.isPresent() && configuration.equals(configurationOptional.get())) {
event.getPresentation().setText(TICK + configuration.getName());
} else {
event.getPresentation().setText(configuration.getName());
}
}
@Override
public void actionPerformed(ActionEvent e) {
configurationsManager.setCurrentDebugConfiguration(configuration);
}
}

View File

@ -0,0 +1,23 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.configuration;
import org.eclipse.che.ide.api.action.Action;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
/**
* Factory for creating instances of {@link DebugConfigurationAction}.
*
* @author Artem Zatsarynnyi
*/
public interface DebugConfigurationActionFactory {
Action createAction(DebugConfiguration configuration);
}

View File

@ -0,0 +1,63 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.configuration;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.ide.api.action.ActionManager;
import org.eclipse.che.ide.api.action.DefaultActionGroup;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager.ConfigurationChangedListener;
/**
* Group of {@link DebugConfigurationAction}s.
*
* @author Artem Zatsarynnyi
*/
@Singleton
public class DebugConfigurationsGroup extends DefaultActionGroup implements ConfigurationChangedListener {
private final DebugConfigurationsManager configurationsManager;
private final DebugConfigurationActionFactory debugConfigurationActionFactory;
@Inject
public DebugConfigurationsGroup(ActionManager actionManager,
DebugConfigurationsManager debugConfigurationsManager,
DebugConfigurationActionFactory debugConfigurationActionFactory) {
super(actionManager);
configurationsManager = debugConfigurationsManager;
this.debugConfigurationActionFactory = debugConfigurationActionFactory;
debugConfigurationsManager.addConfigurationsChangedListener(this);
fillActions();
}
@Override
public void onConfigurationAdded(DebugConfiguration configuration) {
fillActions();
}
@Override
public void onConfigurationRemoved(DebugConfiguration configuration) {
fillActions();
}
private void fillActions() {
removeAll();
for (DebugConfiguration configuration : configurationsManager.getConfigurations()) {
add(debugConfigurationActionFactory.createAction(configuration));
}
}
}

View File

@ -1,118 +0,0 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.configuration;
import com.google.common.base.Optional;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.ide.dto.DtoFactory;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationType;
import org.eclipse.che.ide.ext.debugger.shared.DebugConfigurationDto;
import org.eclipse.che.ide.util.loging.Log;
import org.eclipse.che.ide.util.storage.LocalStorage;
import org.eclipse.che.ide.util.storage.LocalStorageProvider;
import java.util.ArrayList;
import java.util.List;
/**
* Helps to manage debug configurations in browser's local storage.
*
* @author Artem Zatsarynnyi
*/
@Singleton
public class DebugConfigurationsManager {
public static final String LOCAL_STORAGE_DEBUG_CONF_KEY = "che-debug-configurations";
private final Optional<LocalStorage> localStorageOptional;
private final DtoFactory dtoFactory;
private final DebugConfigurationTypeRegistry debugConfigurationTypeRegistry;
@Inject
public DebugConfigurationsManager(LocalStorageProvider localStorageProvider,
DtoFactory dtoFactory,
DebugConfigurationTypeRegistry debugConfigurationTypeRegistry) {
this.dtoFactory = dtoFactory;
this.debugConfigurationTypeRegistry = debugConfigurationTypeRegistry;
localStorageOptional = Optional.fromNullable(localStorageProvider.get());
}
public List<DebugConfiguration> readConfigurations() {
final List<DebugConfiguration> configurationList = new ArrayList<>();
for (DebugConfigurationDto descriptor : readConfList()) {
final DebugConfigurationType type = debugConfigurationTypeRegistry.getConfigurationTypeById(descriptor.getType());
// skip configuration if it's type isn't registered
if (type != null) {
try {
configurationList.add(new DebugConfiguration(type,
descriptor.getName(),
descriptor.getHost(),
descriptor.getPort(),
descriptor.getConnectionProperties()));
} catch (IllegalArgumentException e) {
Log.warn(EditDebugConfigurationsPresenter.class, e.getMessage());
}
}
}
return configurationList;
}
public void addConfiguration(DebugConfiguration configuration) {
if (localStorageOptional.isPresent()) {
final DebugConfigurationDto configurationDto = dtoFactory.createDto(DebugConfigurationDto.class)
.withName(configuration.getName())
.withHost(configuration.getHost())
.withPort(configuration.getPort())
.withConnectionProperties(configuration.getConnectionProperties())
.withType(configuration.getType().getId());
final List<DebugConfigurationDto> confList = readConfList();
confList.add(configurationDto);
localStorageOptional.get().setItem(LOCAL_STORAGE_DEBUG_CONF_KEY, dtoFactory.toJson(confList));
}
}
public void removeConfiguration(String name) {
final List<DebugConfigurationDto> newList = new ArrayList<>();
for (DebugConfigurationDto debugConfigurationDto : readConfList()) {
if (!name.equals(debugConfigurationDto.getName())) {
newList.add(debugConfigurationDto);
}
}
if (localStorageOptional.isPresent()) {
localStorageOptional.get().setItem(LOCAL_STORAGE_DEBUG_CONF_KEY, dtoFactory.toJson(newList));
}
}
private List<DebugConfigurationDto> readConfList() {
List<DebugConfigurationDto> configurationsList;
if (localStorageOptional.isPresent()) {
final LocalStorage localStorage = localStorageOptional.get();
final Optional<String> data = Optional.fromNullable(localStorage.getItem(LOCAL_STORAGE_DEBUG_CONF_KEY));
if (data.isPresent() && !data.get().isEmpty()) {
configurationsList = dtoFactory.createListDtoFromJson(data.get(), DebugConfigurationDto.class);
} else {
configurationsList = new ArrayList<>(0);
}
} else {
configurationsList = new ArrayList<>(0);
}
return configurationsList;
}
}

View File

@ -0,0 +1,214 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.configuration;
import com.google.common.base.Optional;
import com.google.inject.Inject;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationType;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.eclipse.che.ide.dto.DtoFactory;
import org.eclipse.che.ide.ext.debugger.shared.DebugConfigurationDto;
import org.eclipse.che.ide.util.loging.Log;
import org.eclipse.che.ide.util.storage.LocalStorage;
import org.eclipse.che.ide.util.storage.LocalStorageProvider;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static java.util.Collections.emptyList;
/**
* Implementation of {@link DebugConfigurationsManager}.
*
* @author Artem Zatsarynnyi
*/
public class DebugConfigurationsManagerImpl implements DebugConfigurationsManager {
private static final String LOCAL_STORAGE_DEBUG_CONF_KEY = "che-debug-configurations";
private final DtoFactory dtoFactory;
private final DebugConfigurationTypeRegistry configurationTypeRegistry;
private final Optional<LocalStorage> localStorageOptional;
private final Set<ConfigurationChangedListener> configurationChangedListeners;
private final List<DebugConfiguration> configurations;
private DebugConfiguration currentDebugConfiguration;
@Inject
public DebugConfigurationsManagerImpl(LocalStorageProvider localStorageProvider,
DtoFactory dtoFactory,
DebugConfigurationTypeRegistry debugConfigurationTypeRegistry) {
this.dtoFactory = dtoFactory;
configurationTypeRegistry = debugConfigurationTypeRegistry;
localStorageOptional = Optional.fromNullable(localStorageProvider.get());
configurationChangedListeners = new HashSet<>();
configurations = new ArrayList<>();
loadConfigurations();
}
private void loadConfigurations() {
for (DebugConfigurationDto descriptor : retrieveConfigurations()) {
final DebugConfigurationType type = configurationTypeRegistry.getConfigurationTypeById(descriptor.getType());
// skip configuration if it's type isn't registered
if (type != null) {
try {
configurations.add(new DebugConfiguration(type,
descriptor.getName(),
descriptor.getHost(),
descriptor.getPort(),
descriptor.getConnectionProperties()));
} catch (IllegalArgumentException e) {
Log.warn(EditDebugConfigurationsPresenter.class, e.getMessage());
}
}
}
}
private List<DebugConfigurationDto> retrieveConfigurations() {
List<DebugConfigurationDto> configurationsList;
if (localStorageOptional.isPresent()) {
final LocalStorage localStorage = localStorageOptional.get();
final Optional<String> data = Optional.fromNullable(localStorage.getItem(LOCAL_STORAGE_DEBUG_CONF_KEY));
if (data.isPresent() && !data.get().isEmpty()) {
configurationsList = dtoFactory.createListDtoFromJson(data.get(), DebugConfigurationDto.class);
} else {
configurationsList = emptyList();
}
} else {
configurationsList = emptyList();
}
return configurationsList;
}
@Override
public Optional<DebugConfiguration> getCurrentDebugConfiguration() {
return Optional.fromNullable(currentDebugConfiguration);
}
@Override
public void setCurrentDebugConfiguration(@Nullable DebugConfiguration debugConfiguration) {
currentDebugConfiguration = debugConfiguration;
}
@Override
public List<DebugConfiguration> getConfigurations() {
return new ArrayList<>(configurations);
}
@Override
public DebugConfiguration createConfiguration(String typeId,
String name,
String host,
int port,
Map<String, String> connectionProperties) {
final DebugConfigurationType configurationType = configurationTypeRegistry.getConfigurationTypeById(typeId);
final DebugConfiguration configuration = new DebugConfiguration(configurationType,
generateUniqueConfigurationName(configurationType, name),
host,
port,
connectionProperties);
configurations.add(configuration);
saveConfigurations();
fireConfigurationAdded(configuration);
return configuration;
}
private String generateUniqueConfigurationName(DebugConfigurationType configurationType, String customName) {
Set<String> configurationNames = new HashSet<>(configurations.size());
for (DebugConfiguration configuration : configurations) {
configurationNames.add(configuration.getName());
}
final String configurationName;
if (customName == null || customName.isEmpty()) {
configurationName = "Remote " + configurationType.getDisplayName();
} else {
if (!configurationNames.contains(customName)) {
return customName;
}
configurationName = customName + " copy";
}
if (!configurationNames.contains(configurationName)) {
return configurationName;
}
for (int count = 1; count < 1000; count++) {
if (!configurationNames.contains(configurationName + "-" + count)) {
return configurationName + "-" + count;
}
}
return configurationName;
}
@Override
public void removeConfiguration(DebugConfiguration configuration) {
if (getCurrentDebugConfiguration().isPresent() && getCurrentDebugConfiguration().get().equals(configuration)) {
setCurrentDebugConfiguration(null);
}
configurations.remove(configuration);
saveConfigurations();
fireConfigurationRemoved(configuration);
}
private void saveConfigurations() {
if (localStorageOptional.isPresent()) {
List<DebugConfigurationDto> configurationDtos = new ArrayList<>();
for (DebugConfiguration configuration : configurations) {
configurationDtos.add(dtoFactory.createDto(DebugConfigurationDto.class)
.withType(configuration.getType().getId())
.withName(configuration.getName())
.withHost(configuration.getHost())
.withPort(configuration.getPort())
.withConnectionProperties(configuration.getConnectionProperties()));
}
localStorageOptional.get().setItem(LOCAL_STORAGE_DEBUG_CONF_KEY, dtoFactory.toJson(configurationDtos));
}
}
@Override
public void addConfigurationsChangedListener(ConfigurationChangedListener listener) {
configurationChangedListeners.add(listener);
}
@Override
public void removeConfigurationsChangedListener(ConfigurationChangedListener listener) {
configurationChangedListeners.remove(listener);
}
private void fireConfigurationAdded(DebugConfiguration configuration) {
for (ConfigurationChangedListener listener : configurationChangedListeners) {
listener.onConfigurationAdded(configuration);
}
}
private void fireConfigurationRemoved(DebugConfiguration configuration) {
for (ConfigurationChangedListener listener : configurationChangedListeners) {
listener.onConfigurationRemoved(configuration);
}
}
}

View File

@ -13,12 +13,12 @@ package org.eclipse.che.ide.ext.debugger.client.configuration;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.ide.CoreLocalizationConstant;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationPage;
import org.eclipse.che.ide.api.debug.DebugConfigurationPage.DirtyStateListener;
import org.eclipse.che.ide.api.debug.DebugConfigurationType;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.eclipse.che.ide.ext.debugger.client.DebuggerLocalizationConstant;
import org.eclipse.che.ide.ui.dialogs.ConfirmCallback;
import org.eclipse.che.ide.ui.dialogs.DialogFactory;
@ -29,10 +29,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Presenter for managing debug configurations.
@ -42,15 +40,12 @@ import java.util.Set;
@Singleton
public class EditDebugConfigurationsPresenter implements EditDebugConfigurationsView.ActionDelegate {
private final EditDebugConfigurationsView view;
private final DebugConfigurationTypeRegistry debugConfigurationTypeRegistry;
private final DialogFactory dialogFactory;
private final DebuggerLocalizationConstant locale;
private final CoreLocalizationConstant coreLocale;
private final DebugConfigurationsManager debugConfigurationsManager;
private final Set<ConfigurationChangedListener> configurationChangedListeners;
/** Set of the existing configuration names. */
private final Set<String> configurationNames;
private final EditDebugConfigurationsView view;
private final DebugConfigurationTypeRegistry debugConfigurationTypeRegistry;
private final DialogFactory dialogFactory;
private final DebuggerLocalizationConstant locale;
private final CoreLocalizationConstant coreLocale;
private final DebugConfigurationsManager debugConfigurationsManager;
private DebugConfiguration editedConfiguration;
private String editedConfigurationOriginName;
@ -69,8 +64,6 @@ public class EditDebugConfigurationsPresenter implements EditDebugConfigurations
this.locale = locale;
this.coreLocale = coreLocale;
this.debugConfigurationsManager = debugConfigurationsManager;
configurationChangedListeners = new HashSet<>();
configurationNames = new HashSet<>();
view.setDelegate(this);
}
@ -98,25 +91,29 @@ public class EditDebugConfigurationsPresenter implements EditDebugConfigurations
updateConfiguration(selectedConfiguration);
fetchConfigurations();
fireConfigurationUpdated(selectedConfiguration);
}
private void updateConfiguration(final DebugConfiguration selectedConfiguration) {
private void updateConfiguration(DebugConfiguration selectedConfiguration) {
if (editedConfigurationOriginName.trim().equals(selectedConfiguration.getName())) {
debugConfigurationsManager.removeConfiguration(selectedConfiguration.getName());
debugConfigurationsManager.addConfiguration(selectedConfiguration);
debugConfigurationsManager.removeConfiguration(selectedConfiguration);
debugConfigurationsManager.createConfiguration(selectedConfiguration.getType().getId(),
selectedConfiguration.getName(),
selectedConfiguration.getHost(),
selectedConfiguration.getPort(),
selectedConfiguration.getConnectionProperties());
} else {
onNameChanged();
//generate a new unique name if input one already exists
final String newName = getUniqueConfigurationName(selectedConfiguration.getType(), selectedConfiguration.getName());
debugConfigurationsManager.removeConfiguration(editedConfiguration);
DebugConfiguration conf = debugConfigurationsManager.createConfiguration(selectedConfiguration.getType().getId(),
selectedConfiguration.getName(),
selectedConfiguration.getHost(),
selectedConfiguration.getPort(),
selectedConfiguration.getConnectionProperties());
if (selectedConfiguration.equals(view.getSelectedConfiguration())) {
//update selected configuration name
view.getSelectedConfiguration().setName(newName);
view.getSelectedConfiguration().setName(conf.getName());
}
debugConfigurationsManager.removeConfiguration(editedConfigurationOriginName);
debugConfigurationsManager.addConfiguration(selectedConfiguration);
}
}
@ -139,7 +136,7 @@ public class EditDebugConfigurationsPresenter implements EditDebugConfigurations
public void onAddClicked() {
final DebugConfigurationType selectedType = view.getSelectedConfigurationType();
if (selectedType != null) {
createNewConfiguration(selectedType, null, null);
createNewConfiguration(selectedType, null, new HashMap<String, String>());
}
}
@ -183,43 +180,14 @@ public class EditDebugConfigurationsPresenter implements EditDebugConfigurations
private void createConfiguration(DebugConfigurationType type,
String customName,
@Nullable Map<String, String> connectionProperties) {
final DebugConfiguration conf = new DebugConfiguration(type,
getUniqueConfigurationName(type, customName),
"localhost",
8000,
(connectionProperties != null) ? connectionProperties
: new HashMap<String, String>());
debugConfigurationsManager.addConfiguration(conf);
Map<String, String> connectionProperties) {
final DebugConfiguration configuration = debugConfigurationsManager.createConfiguration(type.getId(),
customName,
"localhost",
8000,
connectionProperties);
fetchConfigurations();
fireConfigurationAdded(conf);
view.setSelectedConfiguration(conf);
}
private String getUniqueConfigurationName(DebugConfigurationType configurationType, String customName) {
final String configurationName;
if (customName == null || customName.isEmpty()) {
configurationName = "Remote " + configurationType.getDisplayName();
} else {
if (!configurationNames.contains(customName)) {
return customName;
}
configurationName = customName + " copy";
}
if (!configurationNames.contains(configurationName)) {
return configurationName;
}
for (int count = 1; count < 1000; count++) {
if (!configurationNames.contains(configurationName + "-" + count)) {
return configurationName + "-" + count;
}
}
return configurationName;
view.setSelectedConfiguration(configuration);
}
@Override
@ -231,11 +199,10 @@ public class EditDebugConfigurationsPresenter implements EditDebugConfigurations
final ConfirmCallback confirmCallback = new ConfirmCallback() {
@Override
public void accepted() {
debugConfigurationsManager.removeConfiguration(selectedConfiguration.getName());
debugConfigurationsManager.removeConfiguration(selectedConfiguration);
view.selectNextItem();
fetchConfigurations();
fireConfigurationRemoved(selectedConfiguration);
}
};
@ -283,7 +250,6 @@ public class EditDebugConfigurationsPresenter implements EditDebugConfigurations
updateConfiguration(editedConfiguration);
fetchConfigurations();
fireConfigurationUpdated(editedConfiguration);
handleConfigurationSelection(configuration);
}
};
@ -354,9 +320,7 @@ public class EditDebugConfigurationsPresenter implements EditDebugConfigurations
view.setCancelButtonState(false);
view.setSaveButtonState(false);
final List<DebugConfiguration> configurationsList = debugConfigurationsManager.readConfigurations();
configurationNames.clear();
final List<DebugConfiguration> configurationsList = debugConfigurationsManager.getConfigurations();
final Map<DebugConfigurationType, List<DebugConfiguration>> categories = new HashMap<>();
@ -365,7 +329,6 @@ public class EditDebugConfigurationsPresenter implements EditDebugConfigurations
for (DebugConfiguration configuration : configurationsList) {
if (type.getId().equals(configuration.getType().getId())) {
settingsCategory.add(configuration);
configurationNames.add(configuration.getName());
if (configuration.getName().equals(originName)) {
view.setSelectedConfiguration(configuration);
}
@ -394,39 +357,4 @@ public class EditDebugConfigurationsPresenter implements EditDebugConfigurations
}
return editedPage.isDirty() || !editedConfigurationOriginName.equals(view.getConfigurationName());
}
private void fireConfigurationAdded(DebugConfiguration configuration) {
for (ConfigurationChangedListener listener : configurationChangedListeners) {
listener.onConfigurationAdded(configuration);
}
}
private void fireConfigurationRemoved(DebugConfiguration configuration) {
for (ConfigurationChangedListener listener : configurationChangedListeners) {
listener.onConfigurationRemoved(configuration);
}
}
private void fireConfigurationUpdated(DebugConfiguration configuration) {
for (ConfigurationChangedListener listener : configurationChangedListeners) {
listener.onConfigurationsUpdated(configuration);
}
}
public void addConfigurationsChangedListener(ConfigurationChangedListener listener) {
configurationChangedListeners.add(listener);
}
public void removeConfigurationsChangedListener(ConfigurationChangedListener listener) {
configurationChangedListeners.remove(listener);
}
/** Listener that will be called when debug configuration changed. */
public interface ConfigurationChangedListener {
void onConfigurationAdded(DebugConfiguration configuration);
void onConfigurationRemoved(DebugConfiguration configuration);
void onConfigurationsUpdated(DebugConfiguration configuration);
}
}

View File

@ -39,7 +39,6 @@ import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.ide.CoreLocalizationConstant;
@ -64,7 +63,6 @@ import java.util.Map;
*
* @author Artem Zatsarynnyi
*/
@Singleton
public class EditDebugConfigurationsViewImpl extends Window implements EditDebugConfigurationsView {
private static final EditDebugConfigurationsViewImplUiBinder UI_BINDER = GWT.create(EditDebugConfigurationsViewImplUiBinder.class);

View File

@ -11,9 +11,15 @@
package org.eclipse.che.ide.ext.debugger.client.inject;
import com.google.gwt.inject.client.AbstractGinModule;
import com.google.gwt.inject.client.assistedinject.GinFactoryModuleBuilder;
import com.google.inject.Singleton;
import org.eclipse.che.ide.api.action.Action;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.eclipse.che.ide.api.extension.ExtensionGinModule;
import org.eclipse.che.ide.ext.debugger.client.configuration.DebugConfigurationAction;
import org.eclipse.che.ide.ext.debugger.client.configuration.DebugConfigurationActionFactory;
import org.eclipse.che.ide.ext.debugger.client.configuration.DebugConfigurationsManagerImpl;
import org.eclipse.che.ide.ext.debugger.client.configuration.EditDebugConfigurationsView;
import org.eclipse.che.ide.ext.debugger.client.configuration.EditDebugConfigurationsViewImpl;
import org.eclipse.che.ide.ext.debugger.client.debug.DebuggerToolbar;
@ -28,6 +34,8 @@ import org.eclipse.che.ide.util.storage.BrowserLocalStorageProviderImpl;
import org.eclipse.che.ide.util.storage.LocalStorageProvider;
/**
* GIN module for Debugger extension.
*
* @author Andrey Plotnikov
* @author Artem Zatsarynnyi
*/
@ -41,6 +49,10 @@ public class DebuggerGinModule extends AbstractGinModule {
bind(ChangeValueView.class).to(ChangeValueViewImpl.class).in(Singleton.class);
bind(EditDebugConfigurationsView.class).to(EditDebugConfigurationsViewImpl.class).in(Singleton.class);
bind(DebugConfigurationsManager.class).to(DebugConfigurationsManagerImpl.class).in(Singleton.class);
install(new GinFactoryModuleBuilder().implement(Action.class, DebugConfigurationAction.class)
.build(DebugConfigurationActionFactory.class));
bind(LocalStorageProvider.class).to(BrowserLocalStorageProviderImpl.class).in(Singleton.class);
bind(ToolbarPresenter.class).annotatedWith(DebuggerToolbar.class).to(ToolbarPresenter.class).in(Singleton.class);
}

View File

@ -10,9 +10,8 @@
#
##### Actions #####
debugConfigurationsActionTitle=Debug Configurations
editDebugConfigurationsActionTitle=Edit Debug Configurations...
selectConfigurationActionText=Select Command
selectConfigurationActionDescription=Select configuration to connect to the remote debugger
breakpoints = Breakpoints
debug = Debug
variables = Variables
@ -34,6 +33,7 @@ showHideDebuggerPanel=Show/Hide Debugger Panel
##### Descriptions #####
editDebugConfigurationsActionDescription = Edit debug configurations
debugConfigurationActionDescription=Mark configuration as current
resumeExecutionDescription = Resume
disconnectDebuggerDescription = End Debug Session
stepIntoDescription = Step Into

View File

@ -10,9 +10,12 @@
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.actions;
import com.google.common.base.Optional;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationType;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.eclipse.che.ide.debug.Debugger;
import org.eclipse.che.ide.debug.DebuggerManager;
import org.eclipse.che.ide.ext.debugger.client.DebuggerLocalizationConstant;
@ -42,15 +45,15 @@ import static org.mockito.Mockito.when;
public class DebugActionTest {
@Mock
private SelectDebugConfigurationComboBoxAction selectConfigurationAction;
private DebugConfigurationsManager debugConfigurationsManager;
@Mock
private DebuggerLocalizationConstant localizationConstant;
private DebuggerLocalizationConstant localizationConstant;
@Mock
private DebuggerResources javaRuntimeResources;
private DebuggerResources javaRuntimeResources;
@Mock
private DebuggerManager debuggerManager;
private DebuggerManager debuggerManager;
@Mock
private DialogFactory dialogFactory;
private DialogFactory dialogFactory;
@InjectMocks
private DebugAction action;
@ -72,7 +75,10 @@ public class DebugActionTest {
connectionProperties.put("prop1", "val1");
connectionProperties.put("prop2", "val2");
when(debugConfiguration.getConnectionProperties()).thenReturn(connectionProperties);
when(selectConfigurationAction.getSelectedConfiguration()).thenReturn(debugConfiguration);
Optional configurationOptional = mock(Optional.class);
when(configurationOptional.isPresent()).thenReturn(Boolean.TRUE);
when(configurationOptional.get()).thenReturn(debugConfiguration);
when(debugConfigurationsManager.getCurrentDebugConfiguration()).thenReturn(configurationOptional);
Debugger debugger = mock(Debugger.class);
when(debugger.attachDebugger(anyMap())).thenReturn(mock(Promise.class));

View File

@ -0,0 +1,79 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.configuration;
import com.google.common.base.Optional;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.eclipse.che.ide.api.action.ActionEvent;
import org.eclipse.che.ide.api.action.Presentation;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.eclipse.che.ide.ext.debugger.client.DebuggerLocalizationConstant;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* @author Artem Zatsarynnyi
*/
@RunWith(GwtMockitoTestRunner.class)
public class DebugConfigurationActionTest {
@Mock
private DebuggerLocalizationConstant localizationConstant;
@Mock
private DebugConfigurationsManager debugConfigurationsManager;
@Mock
private DebugConfiguration debugConfiguration;
@InjectMocks
private DebugConfigurationAction action;
@Test
public void verifyActionConstruction() {
verify(debugConfiguration).getName();
verify(localizationConstant).debugConfigurationActionDescription();
}
@Test
public void shouldSetTitleOnUpdate() {
String confName = "test_conf";
when(debugConfiguration.getName()).thenReturn(confName);
DebugConfiguration configuration = mock(DebugConfiguration.class);
Optional<DebugConfiguration> configurationOptional = mock(Optional.class);
when(configurationOptional.isPresent()).thenReturn(Boolean.TRUE);
when(configurationOptional.get()).thenReturn(configuration);
when(debugConfigurationsManager.getCurrentDebugConfiguration()).thenReturn(configurationOptional);
ActionEvent event = mock(ActionEvent.class);
Presentation presentation = mock(Presentation.class);
when(event.getPresentation()).thenReturn(presentation);
action.updateInPerspective(event);
verify(presentation).setText(eq(confName));
}
@Test
public void shouldSetCurrentConfigurationOnActionPerformed() {
action.actionPerformed(null);
verify(debugConfigurationsManager).setCurrentDebugConfiguration(eq(debugConfiguration));
}
}

View File

@ -0,0 +1,83 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.configuration;
import org.eclipse.che.ide.api.action.ActionManager;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* @author Artem Zatsarynnyi
*/
@RunWith(MockitoJUnitRunner.class)
public class DebugConfigurationsGroupTest {
@Mock
private ActionManager actionManager;
@Mock
private DebugConfigurationsManager debugConfigurationsManager;
@Mock
private DebugConfigurationActionFactory debugConfigurationActionFactory;
@Mock
private DebugConfiguration debugConfiguration;
@InjectMocks
private DebugConfigurationsGroup actionGroup;
@Before
public void setUp() {
List<DebugConfiguration> debugConfigurations = new ArrayList<>();
debugConfigurations.add(debugConfiguration);
when(debugConfigurationsManager.getConfigurations()).thenReturn(debugConfigurations);
}
@Test
public void verifyActionConstruction() {
verify(debugConfigurationsManager).addConfigurationsChangedListener(actionGroup);
verify(debugConfigurationsManager).getConfigurations();
}
@Test
public void shouldFillActionsOnConfigurationAdded() {
actionGroup.onConfigurationAdded(mock(DebugConfiguration.class));
verifyChildActionsFilled();
}
@Test
public void shouldFillActionsOnConfigurationRemoved() {
actionGroup.onConfigurationRemoved(mock(DebugConfiguration.class));
verifyChildActionsFilled();
}
private void verifyChildActionsFilled() {
verify(debugConfigurationsManager, times(2)).getConfigurations();
verify(debugConfigurationActionFactory).createAction(debugConfiguration);
assertEquals(1, actionGroup.getChildrenCount());
}
}

View File

@ -44,7 +44,7 @@ public interface DebugConfigurationDto {
Map<String, String> getConnectionProperties();
void setConnectionProperties(Map<String, String> attributes);
void setConnectionProperties(Map<String, String> connectionProperties);
DebugConfigurationDto withConnectionProperties(Map<String, String> attributes);
DebugConfigurationDto withConnectionProperties(Map<String, String> connectionProperties);
}

View File

@ -11,6 +11,6 @@
# JavaDebugConfigurationPage
view.javaDebugConfigurationPage.notice=The hostname or IP address where debugger process is running. If your debugger process is in your workspace, use the workspace agent URL and port number. This is displayed in the servers tab in the operations perspective.
view.javaDebugConfigurationPage.devHostCheckbox=Connect to process on dev machine
view.javaDebugConfigurationPage.devHostCheckbox=Connect to process on workspace machine
view.javaDebugConfigurationPage.hostLabel=Host
view.javaDebugConfigurationPage.portLabel=Port