diff --git a/assembly/assembly-ide-war/pom.xml b/assembly/assembly-ide-war/pom.xml
index 464529a8d02..aa03387bb7a 100644
--- a/assembly/assembly-ide-war/pom.xml
+++ b/assembly/assembly-ide-war/pom.xml
@@ -180,6 +180,10 @@
org.eclipse.che.plugin
che-plugin-maven-shared
+
+ org.eclipse.che.plugin
+ che-plugin-nodejs-debugger-ide
+
org.eclipse.che.plugin
che-plugin-nodejs-lang-ide
diff --git a/assembly/assembly-ide-war/src/main/resources/org/eclipse/che/ide/IDE.gwt.xml b/assembly/assembly-ide-war/src/main/resources/org/eclipse/che/ide/IDE.gwt.xml
index 2677e9551c6..e951b39f2a0 100644
--- a/assembly/assembly-ide-war/src/main/resources/org/eclipse/che/ide/IDE.gwt.xml
+++ b/assembly/assembly-ide-war/src/main/resources/org/eclipse/che/ide/IDE.gwt.xml
@@ -44,6 +44,7 @@
+
diff --git a/assembly/assembly-wsagent-war/pom.xml b/assembly/assembly-wsagent-war/pom.xml
index 1344208bc11..b03d2844460 100644
--- a/assembly/assembly-wsagent-war/pom.xml
+++ b/assembly/assembly-wsagent-war/pom.xml
@@ -160,6 +160,10 @@
org.eclipse.che.plugin
che-plugin-maven-server
+
+ org.eclipse.che.plugin
+ che-plugin-nodejs-debugger-server
+
org.eclipse.che.plugin
che-plugin-nodejs-lang-server
diff --git a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/debug/DebuggerServiceClientImpl.java b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/debug/DebuggerServiceClientImpl.java
index 1db032ab6dc..7a46ac99507 100644
--- a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/debug/DebuggerServiceClientImpl.java
+++ b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/debug/DebuggerServiceClientImpl.java
@@ -96,7 +96,6 @@ public Promise start(String id, StartActionDto action) {
public Promise addBreakpoint(String id, BreakpointDto breakpointDto) {
final String requestUrl = getBaseUrl(id) + "/breakpoint";
return asyncRequestFactory.createPostRequest(requestUrl, breakpointDto)
- .loader(loaderFactory.newLoader())
.send();
}
@@ -104,7 +103,6 @@ public Promise addBreakpoint(String id, BreakpointDto breakpointDto) {
public Promise> getAllBreakpoints(String id) {
final String requestUrl = getBaseUrl(id) + "/breakpoint";
return asyncRequestFactory.createGetRequest(requestUrl)
- .loader(loaderFactory.newLoader())
.send(dtoUnmarshallerFactory.newListUnmarshaller(BreakpointDto.class));
}
@@ -148,7 +146,6 @@ public Promise getValue(String id, VariableDto variableDto) {
}
return asyncRequestFactory.createGetRequest(requestUrl + params)
- .loader(loaderFactory.newLoader())
.send(dtoUnmarshallerFactory.newUnmarshaller(SimpleValueDto.class));
}
@@ -156,7 +153,6 @@ public Promise getValue(String id, VariableDto variableDto) {
public Promise setValue(String id, VariableDto variableDto) {
final String requestUrl = getBaseUrl(id) + "/value";
return asyncRequestFactory.createPutRequest(requestUrl, variableDto)
- .loader(loaderFactory.newLoader())
.send();
}
@@ -195,7 +191,6 @@ private String getBaseUrl(String id) {
protected Promise performAction(String id, ActionDto actionDto) {
final String requestUrl = getBaseUrl(id);
return asyncRequestFactory.createPostRequest(requestUrl, actionDto)
- .loader(loaderFactory.newLoader())
.send();
}
}
diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/editor/EditorAgentImpl.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/editor/EditorAgentImpl.java
index 9c1abb6d619..04b0bb3c49c 100644
--- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/editor/EditorAgentImpl.java
+++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/editor/EditorAgentImpl.java
@@ -318,7 +318,7 @@ public List getOpenedEditorsBasedOn(EditorPartPresenter edi
@Override
public EditorPartPresenter getOpenedEditor(Path path) {
EditorPartStack editorPartStack = editorMultiPartStack.getPartStackByPart(activeEditor);
- return (EditorPartPresenter)editorPartStack.getPartByPath(path);
+ return editorPartStack == null ? null : (EditorPartPresenter)editorPartStack.getPartByPath(path);
}
/** {@inheritDoc} */
diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/impl/ResourceManager.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/impl/ResourceManager.java
index 9154b14661b..e8cd77ae4bc 100644
--- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/impl/ResourceManager.java
+++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/impl/ResourceManager.java
@@ -1131,7 +1131,9 @@ public Void apply(Optional resource) throws FunctionException {
protected Promise search(final Container container, String fileMask, String contentMask) {
QueryExpression queryExpression = new QueryExpression();
- queryExpression.setText(contentMask + '*');
+ if (!isNullOrEmpty(contentMask)) {
+ queryExpression.setText(contentMask + '*');
+ }
if (!isNullOrEmpty(fileMask)) {
queryExpression.setName(fileMask);
}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/pom.xml b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/pom.xml
new file mode 100644
index 00000000000..f8aa51f6650
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/pom.xml
@@ -0,0 +1,154 @@
+
+
+
+ 4.0.0
+
+ che-plugin-nodejs-debugger-parent
+ org.eclipse.che.plugin
+ 5.0.0-M5-SNAPSHOT
+
+ che-plugin-nodejs-debugger-ide
+ jar
+ Che Plugin :: NodeJs Debugger :: IDE
+
+
+ com.google.guava
+ guava
+
+
+ com.google.gwt
+ gwt-elemental
+
+
+ com.google.gwt.inject
+ gin
+
+
+ com.google.inject
+ guice
+
+
+ javax.validation
+ validation-api
+
+
+ org.eclipse.che.core
+ che-core-api-project
+
+
+ org.eclipse.che.core
+ che-core-api-workspace
+
+
+ org.eclipse.che.core
+ che-core-commons-annotations
+
+
+ org.eclipse.che.core
+ che-core-commons-gwt
+
+
+ org.eclipse.che.core
+ che-core-ide-api
+
+
+ org.eclipse.che.core
+ che-core-ide-app
+
+
+ org.eclipse.che.core
+ che-core-ide-ui
+
+
+ org.eclipse.che.plugin
+ che-plugin-debugger-ide
+
+
+ org.vectomatic
+ lib-gwt-svg
+
+
+ com.google.gwt
+ gwt-user
+ provided
+
+
+ com.google.gwt
+ gwt-dev
+ test
+
+
+ com.google.gwt.gwtmockito
+ gwtmockito
+ test
+
+
+ com.googlecode.gwt-test-utils
+ gwt-test-utils
+ test
+
+
+ junit
+ junit
+ test
+
+
+ org.hamcrest
+ hamcrest-core
+ test
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+
+
+
+ src/main/java
+
+
+ src/main/resources
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ analyze
+
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ com.mycila
+ license-maven-plugin
+
+
+ **/*.png
+
+
+
+
+
+
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebugger.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebugger.java
new file mode 100644
index 00000000000..77065fe4bed
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebugger.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide;
+
+import com.google.inject.Inject;
+import com.google.web.bindery.event.shared.EventBus;
+
+import org.eclipse.che.api.debug.shared.model.Location;
+import org.eclipse.che.ide.api.debug.BreakpointManager;
+import org.eclipse.che.ide.api.debug.DebuggerServiceClient;
+import org.eclipse.che.ide.api.resources.VirtualFile;
+import org.eclipse.che.ide.debug.DebuggerDescriptor;
+import org.eclipse.che.ide.debug.DebuggerManager;
+import org.eclipse.che.ide.dto.DtoFactory;
+import org.eclipse.che.ide.util.storage.LocalStorageProvider;
+import org.eclipse.che.ide.websocket.MessageBusProvider;
+import org.eclipse.che.plugin.debugger.ide.debug.AbstractDebugger;
+
+import javax.validation.constraints.NotNull;
+import java.util.Map;
+
+/**
+ * The NodeJs Debugger Client.
+ *
+ * @author Anatoliy Bazko
+ */
+public class NodeJsDebugger extends AbstractDebugger {
+
+ public static final String ID = "nodejsdbg";
+
+ @Inject
+ public NodeJsDebugger(DebuggerServiceClient service,
+ DtoFactory dtoFactory,
+ LocalStorageProvider localStorageProvider,
+ MessageBusProvider messageBusProvider,
+ EventBus eventBus,
+ NodeJsDebuggerFileHandler activeFileHandler,
+ DebuggerManager debuggerManager,
+ BreakpointManager breakpointManager) {
+
+ super(service,
+ dtoFactory,
+ localStorageProvider,
+ messageBusProvider,
+ eventBus,
+ activeFileHandler,
+ debuggerManager,
+ breakpointManager,
+ ID);
+ }
+
+ @Override
+ protected String fqnToPath(@NotNull Location location) {
+ return location.getResourcePath() == null ? location.getTarget() : location.getResourcePath();
+ }
+
+ @Override
+ protected String pathToFqn(VirtualFile file) {
+ return file.getLocation().toString();
+ }
+
+ @Override
+ protected DebuggerDescriptor toDescriptor(Map connectionProperties) {
+ StringBuilder sb = new StringBuilder();
+
+ for (String propName : connectionProperties.keySet()) {
+ try {
+ ConnectionProperties prop = ConnectionProperties.valueOf(propName.toUpperCase());
+ String connectionInfo = prop.getConnectionInfo(connectionProperties.get(propName));
+ if (!connectionInfo.isEmpty()) {
+ if (sb.length() > 0) {
+ sb.append(',');
+ }
+ sb.append(connectionInfo);
+ }
+ } catch (IllegalArgumentException ignored) {
+ // unrecognized connection property
+ }
+ }
+
+ return new DebuggerDescriptor("", "{ " + sb.toString() + " }");
+ }
+
+ public enum ConnectionProperties {
+ SCRIPT {
+ @Override
+ public String getConnectionInfo(String value) {
+ return value;
+ }
+ };
+
+ public abstract String getConnectionInfo(String value);
+ }
+}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerExtension.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerExtension.java
new file mode 100644
index 00000000000..38fb9d92e86
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerExtension.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import org.eclipse.che.ide.api.extension.Extension;
+import org.eclipse.che.ide.debug.DebuggerManager;
+
+/**
+ * Extension allows to debug NodeJs applications.
+ *
+ * @author Anatoliy Bazko
+ */
+@Singleton
+@Extension(title = "NodeJs Debugger", version = "5.0.0")
+public class NodeJsDebuggerExtension {
+
+ @Inject
+ public NodeJsDebuggerExtension(DebuggerManager debuggerManager, NodeJsDebugger nodeJsDebugger) {
+ debuggerManager.registeredDebugger(NodeJsDebugger.ID, nodeJsDebugger);
+ }
+}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerFileHandler.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerFileHandler.java
new file mode 100644
index 00000000000..c42aad489fc
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerFileHandler.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide;
+
+import com.google.common.base.Optional;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.inject.Inject;
+import com.google.web.bindery.event.shared.EventBus;
+
+import org.eclipse.che.api.debug.shared.model.Location;
+import org.eclipse.che.api.promises.client.Operation;
+import org.eclipse.che.api.promises.client.OperationException;
+import org.eclipse.che.api.promises.client.PromiseError;
+import org.eclipse.che.ide.api.app.AppContext;
+import org.eclipse.che.ide.api.editor.EditorAgent;
+import org.eclipse.che.ide.api.editor.EditorPartPresenter;
+import org.eclipse.che.ide.api.editor.document.Document;
+import org.eclipse.che.ide.api.editor.text.TextPosition;
+import org.eclipse.che.ide.api.editor.texteditor.TextEditor;
+import org.eclipse.che.ide.api.event.FileEvent;
+import org.eclipse.che.ide.api.resources.File;
+import org.eclipse.che.ide.api.resources.Project;
+import org.eclipse.che.ide.api.resources.Resource;
+import org.eclipse.che.ide.api.resources.VirtualFile;
+import org.eclipse.che.plugin.debugger.ide.debug.ActiveFileHandler;
+
+/**
+ * Responsible to open files in editor when debugger stopped at breakpoint.
+ *
+ * @author Anatoliy Bazko
+ */
+public class NodeJsDebuggerFileHandler implements ActiveFileHandler {
+
+ private final EditorAgent editorAgent;
+ private final EventBus eventBus;
+ private final AppContext appContext;
+
+ @Inject
+ public NodeJsDebuggerFileHandler(EditorAgent editorAgent,
+ EventBus eventBus,
+ AppContext appContext) {
+ this.editorAgent = editorAgent;
+ this.eventBus = eventBus;
+ this.appContext = appContext;
+ }
+
+ @Override
+ public void openFile(final Location location, final AsyncCallback callback) {
+ final Resource resource = appContext.getResource();
+ if (resource == null) {
+ callback.onFailure(new IllegalStateException("Resource is undefined"));
+ return;
+ }
+ final Optional project = resource.getRelatedProject();
+ if (!project.isPresent()) {
+ callback.onFailure(new IllegalStateException("Project is undefined"));
+ return;
+ }
+
+ findFileInProject(project.get(), location, callback);
+ }
+
+ private void findFileInProject(final Project project,
+ final Location location,
+ final AsyncCallback callback) {
+ project.getFile(location.getTarget()).then(new Operation>() {
+ @Override
+ public void apply(Optional file) throws OperationException {
+ if (file.isPresent()) {
+ openFileInEditorAndScrollToLine(file.get(), callback, location.getLineNumber());
+ callback.onSuccess(file.get());
+ } else {
+ findFileInWorkspace(location, callback);
+ }
+ }
+ }).catchError(new Operation() {
+ @Override
+ public void apply(PromiseError arg) throws OperationException {
+ callback.onFailure(new IllegalArgumentException("File not found." + arg.getMessage()));
+ }
+ });
+ }
+
+ private void findFileInWorkspace(final Location location,
+ final AsyncCallback callback) {
+ try {
+ appContext.getWorkspaceRoot().getFile(location.getTarget()).then(new Operation>() {
+ @Override
+ public void apply(Optional file) throws OperationException {
+ if (file.isPresent()) {
+ openFileInEditorAndScrollToLine(file.get(), callback, location.getLineNumber());
+ callback.onSuccess(file.get());
+ } else {
+ searchSource(location, callback);
+ }
+ }
+ }).catchError(new Operation() {
+ @Override
+ public void apply(PromiseError arg) throws OperationException {
+ callback.onFailure(new IllegalArgumentException("File not found." + arg.getMessage()));
+ }
+ });
+ } catch (IllegalStateException ignored) {
+ searchSource(location, callback);
+ }
+ }
+
+ private void searchSource(final Location location, final AsyncCallback callback) {
+ appContext.getWorkspaceRoot().search(location.getTarget(), "").then(new Operation() {
+ @Override
+ public void apply(Resource[] resources) throws OperationException {
+ if (resources.length == 0) {
+ callback.onFailure(new IllegalArgumentException("File not found."));
+ return;
+ }
+
+ appContext.getWorkspaceRoot().getFile(resources[0].getLocation()).then(new Operation>() {
+ @Override
+ public void apply(Optional file) throws OperationException {
+ if (file.isPresent()) {
+ openFileInEditorAndScrollToLine(file.get(), callback, location.getLineNumber());
+ callback.onSuccess(file.get());
+ } else {
+ callback.onFailure(new IllegalArgumentException("File not found."));
+ }
+ }
+ }).catchError(new Operation() {
+ @Override
+ public void apply(PromiseError arg) throws OperationException {
+ callback.onFailure(new IllegalArgumentException("File not found. " + arg.getMessage()));
+ }
+ });
+ }
+ }).catchError(new Operation() {
+ @Override
+ public void apply(PromiseError arg) throws OperationException {
+ callback.onFailure(new IllegalArgumentException("File not found. " + arg.getMessage()));
+ }
+ });
+ }
+
+ private void openFileInEditorAndScrollToLine(final VirtualFile virtualFile,
+ final AsyncCallback callback,
+ final int scrollToLine) {
+ editorAgent.openEditor(virtualFile, new EditorAgent.OpenEditorCallback() {
+ @Override
+ public void onEditorOpened(EditorPartPresenter editor) {
+ new Timer() {
+ @Override
+ public void run() {
+ scrollEditorToExecutionPoint((TextEditor)editorAgent.getActiveEditor(), scrollToLine);
+ callback.onSuccess(virtualFile);
+ }
+ }.schedule(300);
+ }
+
+ @Override
+ public void onEditorActivated(EditorPartPresenter editor) {
+ new Timer() {
+ @Override
+ public void run() {
+ scrollEditorToExecutionPoint((TextEditor)editorAgent.getActiveEditor(), scrollToLine);
+ callback.onSuccess(virtualFile);
+ }
+ }.schedule(300);
+ }
+
+ @Override
+ public void onInitializationFailed() {
+ callback.onFailure(null);
+ }
+ });
+
+ eventBus.fireEvent(FileEvent.createOpenFileEvent(virtualFile));
+ }
+
+ private void scrollEditorToExecutionPoint(TextEditor editor, int lineNumber) {
+ Document document = editor.getDocument();
+ if (document != null) {
+ TextPosition newPosition = new TextPosition(lineNumber, 0);
+ document.setCursorPosition(newPosition);
+ }
+ }
+}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerGinModule.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerGinModule.java
new file mode 100644
index 00000000000..aff1d402319
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerGinModule.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide;
+
+import com.google.gwt.inject.client.AbstractGinModule;
+import com.google.gwt.inject.client.multibindings.GinMultibinder;
+import com.google.inject.Singleton;
+
+import org.eclipse.che.ide.api.debug.DebugConfigurationType;
+import org.eclipse.che.ide.api.extension.ExtensionGinModule;
+import org.eclipse.che.plugin.nodejsdbg.ide.configuration.NodeJsDebuggerConfigurationPageView;
+import org.eclipse.che.plugin.nodejsdbg.ide.configuration.NodeJsDebuggerConfigurationPageViewImpl;
+import org.eclipse.che.plugin.nodejsdbg.ide.configuration.NodeJsDebuggerConfigurationType;
+
+/**
+ * @author Anatolii Bazko
+ */
+@ExtensionGinModule
+public class NodeJsDebuggerGinModule extends AbstractGinModule {
+ @Override
+ protected void configure() {
+ GinMultibinder.newSetBinder(binder(), DebugConfigurationType.class).addBinding().to(NodeJsDebuggerConfigurationType.class);
+ bind(NodeJsDebuggerConfigurationPageView.class).to(NodeJsDebuggerConfigurationPageViewImpl.class).in(Singleton.class);
+ }
+}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerLocalizationConstant.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerLocalizationConstant.java
new file mode 100644
index 00000000000..2602a012a51
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerLocalizationConstant.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide;
+
+import com.google.gwt.i18n.client.Messages;
+
+/**
+ * I18n constants for the Debugger extension.
+ *
+ * @author Anatolii Bazko
+ */
+public interface NodeJsDebuggerLocalizationConstant extends Messages {
+
+ @Key("view.nodeJsDebuggerConfigurationPage.hostLabel")
+ String nodeJsDebuggerConfigurationPageViewHostLabel();
+
+ @Key("view.nodeJsDebuggerConfigurationPage.portLabel")
+ String nodeJsDebuggerConfigurationPageViewPortLabel();
+
+ @Key("view.nodeJsDebuggerConfigurationPage.scriptLabel")
+ String nodeJsDebuggerConfigurationPageViewScriptLabel();
+
+ @Key("view.nodeJsDebuggerConfigurationPage.pidLabel")
+ String nodeJsDebuggerConfigurationPageViewPidLable();
+}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerResources.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerResources.java
new file mode 100644
index 00000000000..f4bb9f81a9c
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerResources.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide;
+
+import com.google.gwt.resources.client.ClientBundle;
+
+import org.vectomatic.dom.svg.ui.SVGResource;
+
+/**
+ * @author Anatolii Bazko
+ */
+public interface NodeJsDebuggerResources extends ClientBundle {
+
+ /** Returns the icon for NodeJs debugger configurations. */
+ @Source("configuration/nodejs-debugger-configuration-type.svg")
+ SVGResource nodeJsDebugConfigurationType();
+}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPagePresenter.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPagePresenter.java
new file mode 100644
index 00000000000..20e2a02c3a6
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPagePresenter.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide.configuration;
+
+import com.google.gwt.user.client.ui.AcceptsOneWidget;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import org.eclipse.che.ide.api.debug.DebugConfiguration;
+import org.eclipse.che.ide.api.debug.DebugConfigurationPage;
+import org.eclipse.che.ide.extension.machine.client.command.valueproviders.CurrentProjectPathProvider;
+
+import java.util.Map;
+
+import static org.eclipse.che.plugin.nodejsdbg.ide.NodeJsDebugger.ConnectionProperties.SCRIPT;
+
+/**
+ * Page allows to edit NodeJs debug configuration.
+ *
+ * @author Anatolii Bazko
+ */
+@Singleton
+public class NodeJsDebuggerConfigurationPagePresenter implements NodeJsDebuggerConfigurationPageView.ActionDelegate,
+ DebugConfigurationPage {
+
+ private static final String DEFAULT_SCRIPT_NAME = "app.js";
+
+ private final NodeJsDebuggerConfigurationPageView view;
+ private final CurrentProjectPathProvider currentProjectPathProvider;
+
+ private DebugConfiguration editedConfiguration;
+ private String originScriptPath;
+ private DirtyStateListener listener;
+
+ @Inject
+ public NodeJsDebuggerConfigurationPagePresenter(NodeJsDebuggerConfigurationPageView view,
+ CurrentProjectPathProvider currentProjectPathProvider) {
+ this.view = view;
+ this.currentProjectPathProvider = currentProjectPathProvider;
+
+ view.setDelegate(this);
+ }
+
+ @Override
+ public void resetFrom(DebugConfiguration configuration) {
+ editedConfiguration = configuration;
+ originScriptPath = getScriptPath(configuration);
+
+ if (originScriptPath == null) {
+ String defaultBinaryPath = getDefaultBinaryPath();
+ editedConfiguration.getConnectionProperties().put(SCRIPT.toString(), defaultBinaryPath);
+ originScriptPath = defaultBinaryPath;
+ }
+ }
+
+ private String getScriptPath(DebugConfiguration debugConfiguration) {
+ Map connectionProperties = debugConfiguration.getConnectionProperties();
+ return connectionProperties.get(SCRIPT.toString());
+ }
+
+ private String getDefaultBinaryPath() {
+ return currentProjectPathProvider.getKey() + "/" + DEFAULT_SCRIPT_NAME;
+ }
+
+ @Override
+ public void go(AcceptsOneWidget container) {
+ container.setWidget(view);
+ view.setScriptPath(getScriptPath(editedConfiguration));
+ }
+
+ @Override
+ public boolean isDirty() {
+ return !originScriptPath.equals(getScriptPath(editedConfiguration));
+ }
+
+ @Override
+ public void setDirtyStateListener(DirtyStateListener listener) {
+ this.listener = listener;
+ }
+
+ @Override
+ public void onScriptPathChanged() {
+ final Map connectionProperties = editedConfiguration.getConnectionProperties();
+ connectionProperties.put(SCRIPT.toString(), view.getScriptPath());
+
+ editedConfiguration.setConnectionProperties(connectionProperties);
+ listener.onDirtyStateChanged();
+ }
+}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPageView.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPageView.java
new file mode 100644
index 00000000000..4cd89cfce7a
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPageView.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide.configuration;
+
+import org.eclipse.che.ide.api.mvp.View;
+
+/**
+ * The view of {@link NodeJsDebuggerConfigurationPagePresenter}.
+ *
+ * @author Anatolii Bazko
+ */
+public interface NodeJsDebuggerConfigurationPageView extends View {
+
+ /** Returns path to the binary. */
+ String getScriptPath();
+
+ /** Sets path to the binary. */
+ void setScriptPath(String path);
+
+ /** Action handler for the view's controls. */
+ interface ActionDelegate {
+
+ /** Called when 'Binary Path' has been changed. */
+ void onScriptPathChanged();
+ }
+}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPageViewImpl.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPageViewImpl.java
new file mode 100644
index 00000000000..e92360e6b35
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPageViewImpl.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide.configuration;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.KeyUpEvent;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * The implementation of {@link NodeJsDebuggerConfigurationPageView}.
+ *
+ * @author Anatolii Bazko
+ */
+public class NodeJsDebuggerConfigurationPageViewImpl implements NodeJsDebuggerConfigurationPageView {
+
+ private static final NodeJsDebugConfigurationPageViewImplUiBinder UI_BINDER =
+ GWT.create(NodeJsDebugConfigurationPageViewImplUiBinder.class);
+
+ private final FlowPanel rootElement;
+
+ @UiField
+ TextBox scriptPath;
+
+ private ActionDelegate delegate;
+
+ public NodeJsDebuggerConfigurationPageViewImpl() {
+ rootElement = UI_BINDER.createAndBindUi(this);
+ }
+
+ @Override
+ public void setDelegate(ActionDelegate delegate) {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public Widget asWidget() {
+ return rootElement;
+ }
+
+ @Override
+ public String getScriptPath() {
+ return scriptPath.getValue();
+ }
+
+ @Override
+ public void setScriptPath(String path) {
+ this.scriptPath.setValue(path);
+ }
+
+ @UiHandler({"scriptPath"})
+ void onScriptPathKeyUp(KeyUpEvent event) {
+ delegate.onScriptPathChanged();
+ }
+
+ interface NodeJsDebugConfigurationPageViewImplUiBinder extends UiBinder {
+ }
+}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPageViewImpl.ui.xml b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPageViewImpl.ui.xml
new file mode 100644
index 00000000000..96e69e705f6
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPageViewImpl.ui.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationType.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationType.java
new file mode 100644
index 00000000000..14a12579f65
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationType.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide.configuration;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import org.eclipse.che.ide.api.debug.DebugConfiguration;
+import org.eclipse.che.ide.api.debug.DebugConfigurationPage;
+import org.eclipse.che.ide.api.debug.DebugConfigurationType;
+import org.eclipse.che.ide.api.icon.Icon;
+import org.eclipse.che.ide.api.icon.IconRegistry;
+import org.eclipse.che.plugin.nodejsdbg.ide.NodeJsDebugger;
+import org.eclipse.che.plugin.nodejsdbg.ide.NodeJsDebuggerResources;
+
+/**
+ * NodeJs debug configuration type.
+ *
+ * @author Anatolii Bazko
+ */
+@Singleton
+public class NodeJsDebuggerConfigurationType implements DebugConfigurationType {
+
+ public static final String DISPLAY_NAME = "NodeJs";
+
+ private final NodeJsDebuggerConfigurationPagePresenter page;
+
+ @Inject
+ public NodeJsDebuggerConfigurationType(NodeJsDebuggerConfigurationPagePresenter page,
+ IconRegistry iconRegistry,
+ NodeJsDebuggerResources resources) {
+ this.page = page;
+ iconRegistry.registerIcon(new Icon(NodeJsDebugger.ID + ".debug.configuration.type.icon", resources.nodeJsDebugConfigurationType()));
+ }
+
+ @Override
+ public String getId() {
+ return NodeJsDebugger.ID;
+ }
+
+ @Override
+ public String getDisplayName() {
+ return DISPLAY_NAME;
+ }
+
+ @Override
+ public DebugConfigurationPage extends DebugConfiguration> getConfigurationPage() {
+ return page;
+ }
+}
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/resources/org/eclipse/che/plugin/nodejsdbg/NodeJsDebugger.gwt.xml b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/resources/org/eclipse/che/plugin/nodejsdbg/NodeJsDebugger.gwt.xml
new file mode 100644
index 00000000000..8b761f90ffa
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/resources/org/eclipse/che/plugin/nodejsdbg/NodeJsDebugger.gwt.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/resources/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerLocalizationConstant.properties b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/resources/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerLocalizationConstant.properties
new file mode 100644
index 00000000000..c80fa2b8c6c
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/resources/org/eclipse/che/plugin/nodejsdbg/ide/NodeJsDebuggerLocalizationConstant.properties
@@ -0,0 +1,16 @@
+#
+# 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
+#
+
+# NodeJsDebuggerConfigurationPage
+view.nodeJsDebuggerConfigurationPage.hostLabel=Host
+view.nodeJsDebuggerConfigurationPage.portLabel=Port
+view.nodeJsDebuggerConfigurationPage.pidLabel=PID
+view.nodeJsDebuggerConfigurationPage.scriptLabel=Script
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/resources/org/eclipse/che/plugin/nodejsdbg/ide/configuration/nodejs-debugger-configuration-type.svg b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/resources/org/eclipse/che/plugin/nodejsdbg/ide/configuration/nodejs-debugger-configuration-type.svg
new file mode 100644
index 00000000000..41ad226705f
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/main/resources/org/eclipse/che/plugin/nodejsdbg/ide/configuration/nodejs-debugger-configuration-type.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/test/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPagePresenterTest.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/test/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPagePresenterTest.java
new file mode 100644
index 00000000000..7733ee64288
--- /dev/null
+++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-ide/src/test/java/org/eclipse/che/plugin/nodejsdbg/ide/configuration/NodeJsDebuggerConfigurationPagePresenterTest.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * 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.plugin.nodejsdbg.ide.configuration;
+
+import com.google.gwt.user.client.ui.AcceptsOneWidget;
+
+import org.eclipse.che.api.promises.client.Promise;
+import org.eclipse.che.ide.api.app.AppContext;
+import org.eclipse.che.ide.api.debug.DebugConfiguration;
+import org.eclipse.che.ide.api.debug.DebugConfigurationPage;
+import org.eclipse.che.ide.api.machine.MachineServiceClient;
+import org.eclipse.che.ide.api.machine.RecipeServiceClient;
+import org.eclipse.che.ide.extension.machine.client.command.valueproviders.CurrentProjectPathProvider;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Map;
+
+import static org.eclipse.che.plugin.nodejsdbg.ide.NodeJsDebugger.ConnectionProperties.SCRIPT;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/** @author Artem Zatsarynnyi */
+@RunWith(MockitoJUnitRunner.class)
+public class NodeJsDebuggerConfigurationPagePresenterTest {
+
+ private static final String HOST = "localhost";
+ private static final int PORT = 8000;
+
+ @Mock
+ private NodeJsDebuggerConfigurationPageView pageView;
+ @Mock
+ private DebugConfiguration configuration;
+ @Mock
+ private CurrentProjectPathProvider currentProjectPathProvider;
+ @Mock
+ private AppContext appContext;
+ @Mock
+ private RecipeServiceClient recipeServiceClient;
+ @Mock
+ private MachineServiceClient machineServiceClient;
+
+ @InjectMocks
+ private NodeJsDebuggerConfigurationPagePresenter pagePresenter;
+
+ @Before
+ public void setUp() {
+ when(configuration.getHost()).thenReturn(HOST);
+ when(configuration.getPort()).thenReturn(PORT);
+
+ pagePresenter.resetFrom(configuration);
+ }
+
+ @Test
+ public void testResetting() throws Exception {
+ verify(configuration, atLeastOnce()).getConnectionProperties();
+ verify(currentProjectPathProvider).getKey();
+ }
+
+ @Test
+ public void testGo() throws Exception {
+ AcceptsOneWidget container = Mockito.mock(AcceptsOneWidget.class);
+ when(machineServiceClient.getMachines(appContext.getWorkspaceId())).thenReturn(mock(Promise.class));
+
+ pagePresenter.go(container);
+
+ verify(container).setWidget(eq(pageView));
+ verify(configuration, atLeastOnce()).getConnectionProperties();
+ verify(pageView).setScriptPath(anyString());
+ }
+
+ @Test
+ public void testOnBinaryPathChanged() throws Exception {
+ String binPath = "/path";
+ when(pageView.getScriptPath()).thenReturn(binPath);
+
+ final DebugConfigurationPage.DirtyStateListener listener = mock(DebugConfigurationPage.DirtyStateListener.class);
+ pagePresenter.setDirtyStateListener(listener);
+
+ pagePresenter.onScriptPathChanged();
+
+ verify(pageView).getScriptPath();
+ ArgumentCaptor
+
+ org.eclipse.che.plugin
+ che-plugin-nodejs-debugger-ide
+ ${che.version}
+
+
+ org.eclipse.che.plugin
+ che-plugin-nodejs-debugger-server
+ ${che.version}
+
org.eclipse.che.plugin
che-plugin-nodejs-lang-ide