/*******************************************************************************
* Copyright (c) 2012-2017 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.gwt.http.client.URL;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.api.debug.shared.dto.BreakpointDto;
import org.eclipse.che.api.debug.shared.dto.DebugSessionDto;
import org.eclipse.che.api.debug.shared.dto.LocationDto;
import org.eclipse.che.api.debug.shared.dto.SimpleValueDto;
import org.eclipse.che.api.debug.shared.dto.StackFrameDumpDto;
import org.eclipse.che.api.debug.shared.dto.VariableDto;
import org.eclipse.che.api.debug.shared.dto.action.ActionDto;
import org.eclipse.che.api.debug.shared.dto.action.ResumeActionDto;
import org.eclipse.che.api.debug.shared.dto.action.StartActionDto;
import org.eclipse.che.api.debug.shared.dto.action.StepIntoActionDto;
import org.eclipse.che.api.debug.shared.dto.action.StepOutActionDto;
import org.eclipse.che.api.debug.shared.dto.action.StepOverActionDto;
import org.eclipse.che.api.debug.shared.dto.action.SuspendActionDto;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.json.JsonHelper;
import org.eclipse.che.ide.rest.AsyncRequestFactory;
import org.eclipse.che.ide.rest.DtoUnmarshallerFactory;
import org.eclipse.che.ide.rest.StringUnmarshaller;
import org.eclipse.che.ide.ui.loaders.request.LoaderFactory;
import java.util.List;
import java.util.Map;
import static org.eclipse.che.ide.MimeType.APPLICATION_JSON;
import static org.eclipse.che.ide.rest.HTTPHeader.CONTENT_TYPE;
/**
* The implementation of {@link DebuggerServiceClient}.
*
* @author Anatoliy Bazko
*/
@Singleton
public class DebuggerServiceClientImpl implements DebuggerServiceClient {
private final LoaderFactory loaderFactory;
private final AsyncRequestFactory asyncRequestFactory;
private final DtoUnmarshallerFactory dtoUnmarshallerFactory;
private final AppContext appContext;
@Inject
protected DebuggerServiceClientImpl(AppContext appContext,
LoaderFactory loaderFactory,
AsyncRequestFactory asyncRequestFactory,
DtoUnmarshallerFactory dtoUnmarshallerFactory) {
this.loaderFactory = loaderFactory;
this.asyncRequestFactory = asyncRequestFactory;
this.dtoUnmarshallerFactory = dtoUnmarshallerFactory;
this.appContext = appContext;
}
@Override
public Promise<DebugSessionDto> connect(String debuggerType, Map<String, String> connectionProperties) {
final String requestUrl = getBaseUrl(null) + "?type=" + debuggerType;
return asyncRequestFactory.createPostRequest(requestUrl, null)
.header(CONTENT_TYPE, APPLICATION_JSON)
.data(JsonHelper.toJson(connectionProperties))
.send(dtoUnmarshallerFactory.newUnmarshaller(DebugSessionDto.class));
}
@Override
public Promise<Void> disconnect(String id) {
final String requestUrl = getBaseUrl(id);
return asyncRequestFactory.createDeleteRequest(requestUrl)
.loader(loaderFactory.newLoader())
.send();
}
@Override
public Promise<Void> suspend(String id, SuspendActionDto action) {
return performAction(id, action);
}
@Override
public Promise<DebugSessionDto> getSessionInfo(String id) {
final String requestUrl = getBaseUrl(id);
return asyncRequestFactory.createGetRequest(requestUrl)
.send(dtoUnmarshallerFactory.newUnmarshaller(DebugSessionDto.class));
}
@Override
public Promise<Void> start(String id, StartActionDto action) {
return performAction(id, action);
}
@Override
public Promise<Void> addBreakpoint(String id, BreakpointDto breakpointDto) {
final String requestUrl = getBaseUrl(id) + "/breakpoint";
return asyncRequestFactory.createPostRequest(requestUrl, breakpointDto)
.send();
}
@Override
public Promise<List<BreakpointDto>> getAllBreakpoints(String id) {
final String requestUrl = getBaseUrl(id) + "/breakpoint";
return asyncRequestFactory.createGetRequest(requestUrl)
.send(dtoUnmarshallerFactory.newListUnmarshaller(BreakpointDto.class));
}
@Override
public Promise<Void> deleteBreakpoint(String id, LocationDto locationDto) {
final String requestUrl = getBaseUrl(id) + "/breakpoint";
final String params = "?target=" + locationDto.getTarget() + "&line=" + locationDto.getLineNumber();
return asyncRequestFactory.createDeleteRequest(requestUrl + params).send();
}
@Override
public Promise<Void> deleteAllBreakpoints(String id) {
final String requestUrl = getBaseUrl(id) + "/breakpoint";
return asyncRequestFactory.createDeleteRequest(requestUrl).send();
}
@Override
public Promise<StackFrameDumpDto> getStackFrameDump(String id) {
final String requestUrl = getBaseUrl(id) + "/dump";
return asyncRequestFactory.createGetRequest(requestUrl)
.send(dtoUnmarshallerFactory.newUnmarshaller(StackFrameDumpDto.class));
}
@Override
public Promise<Void> resume(String id, ResumeActionDto action) {
return performAction(id, action);
}
@Override
public Promise<SimpleValueDto> getValue(String id, VariableDto variableDto) {
final String requestUrl = getBaseUrl(id) + "/value";
List<String> path = variableDto.getVariablePath().getPath();
StringBuilder params = new StringBuilder();
for (int i = 0; i < path.size(); i++) {
params.append(i == 0 ? "?" : "&");
params.append("path");
params.append(i);
params.append("=");
params.append(path.get(i));
}
return asyncRequestFactory.createGetRequest(requestUrl + params)
.send(dtoUnmarshallerFactory.newUnmarshaller(SimpleValueDto.class));
}
@Override
public Promise<Void> setValue(String id, VariableDto variableDto) {
final String requestUrl = getBaseUrl(id) + "/value";
return asyncRequestFactory.createPutRequest(requestUrl, variableDto)
.send();
}
@Override
public Promise<Void> stepInto(String id, StepIntoActionDto action) {
return performAction(id, action);
}
@Override
public Promise<Void> stepOver(String id, StepOverActionDto action) {
return performAction(id, action);
}
@Override
public Promise<Void> stepOut(String id, StepOutActionDto action) {
return performAction(id, action);
}
@Override
public Promise<String> evaluate(String id, String expression) {
String requestUrl = getBaseUrl(id) + "/evaluation";
String params = "?expression=" + URL.encodeQueryString(expression);
return asyncRequestFactory.createGetRequest(requestUrl + params)
.loader(loaderFactory.newLoader())
.send(new StringUnmarshaller());
}
private String getBaseUrl(String id) {
final String url = appContext.getDevMachine().getWsAgentBaseUrl() + "/debugger";
if (id != null) {
return url + "/" + id;
}
return url;
}
protected Promise<Void> performAction(String id, ActionDto actionDto) {
final String requestUrl = getBaseUrl(id);
return asyncRequestFactory.createPostRequest(requestUrl, actionDto)
.send();
}
}