/*******************************************************************************
* 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.workspace;
import com.google.gwt.http.client.URL;
import com.google.inject.Inject;
import org.eclipse.che.api.machine.shared.dto.CommandDto;
import org.eclipse.che.api.machine.shared.dto.MachineConfigDto;
import org.eclipse.che.api.machine.shared.dto.SnapshotDto;
import org.eclipse.che.api.promises.client.Function;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.workspace.shared.dto.EnvironmentDto;
import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;
import org.eclipse.che.api.workspace.shared.dto.WorkspaceConfigDto;
import org.eclipse.che.api.workspace.shared.dto.WorkspaceDto;
import org.eclipse.che.api.workspace.shared.dto.WsAgentHealthStateDto;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.workspace.WorkspaceServiceClient;
import org.eclipse.che.ide.rest.AsyncRequestFactory;
import org.eclipse.che.ide.rest.DtoUnmarshallerFactory;
import org.eclipse.che.ide.rest.StringMapUnmarshaller;
import org.eclipse.che.ide.ui.loaders.request.LoaderFactory;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.stream.Collectors;
import java.util.Map;
import static com.google.gwt.http.client.RequestBuilder.PUT;
import static java.util.stream.Collectors.toList;
import static org.eclipse.che.ide.MimeType.APPLICATION_JSON;
import static org.eclipse.che.ide.rest.HTTPHeader.ACCEPT;
import static org.eclipse.che.ide.rest.HTTPHeader.CONTENT_TYPE;
/**
* Implementation for {@link WorkspaceServiceClient}.
*
* @author Artem Zatsarynnyi
* @author Dmitry Shnurenko
* @author Alexander Garagatyi
* @author Yevhenii Voevodin
* @author Igor Vinokur
*/
public class WorkspaceServiceClientImpl implements WorkspaceServiceClient {
private final DtoUnmarshallerFactory dtoUnmarshallerFactory;
private final AsyncRequestFactory asyncRequestFactory;
private final LoaderFactory loaderFactory;
private final String baseHttpUrl;
@Inject
private WorkspaceServiceClientImpl(AppContext appContext,
DtoUnmarshallerFactory dtoUnmarshallerFactory,
AsyncRequestFactory asyncRequestFactory,
LoaderFactory loaderFactory) {
this.dtoUnmarshallerFactory = dtoUnmarshallerFactory;
this.asyncRequestFactory = asyncRequestFactory;
this.loaderFactory = loaderFactory;
this.baseHttpUrl = appContext.getMasterEndpoint() + "/workspace";
}
@Override
public Promise<WorkspaceDto> create(final WorkspaceConfigDto newWorkspace, final String accountId) {
String url = baseHttpUrl;
if (accountId != null) {
url += "?account=" + accountId;
}
return asyncRequestFactory.createPostRequest(url, newWorkspace)
.header(ACCEPT, APPLICATION_JSON)
.header(CONTENT_TYPE, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Creating workspace..."))
.send(dtoUnmarshallerFactory.newUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<WorkspaceDto> getWorkspace(final String key) {
final String url = baseHttpUrl + '/' + key;
return asyncRequestFactory.createGetRequest(url)
.header(ACCEPT, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Getting info about workspace..."))
.send(dtoUnmarshallerFactory.newUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<WorkspaceDto> getWorkspace(@NotNull final String namespace, @NotNull final String workspaceName) {
final String url = baseHttpUrl + '/' + namespace + "/" + workspaceName;
return asyncRequestFactory.createGetRequest(url)
.header(ACCEPT, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Getting info about workspace..."))
.send(dtoUnmarshallerFactory.newUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<List<WorkspaceDto>> getWorkspaces(final int skip, final int limit) {
return fetchWorkspaces().then((Function<List<WorkspaceDto>, List<WorkspaceDto>>)workspaceDtoList ->
workspaceDtoList.stream().collect(toList()));
}
private Promise<List<WorkspaceDto>> fetchWorkspaces() {
return asyncRequestFactory.createGetRequest(baseHttpUrl)
.header(ACCEPT, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Getting info about workspaces..."))
.send(dtoUnmarshallerFactory.newListUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<WorkspaceDto> update(String wsId, WorkspaceDto workspaceDto) {
final String url = baseHttpUrl + '/' + wsId;
return asyncRequestFactory.createPutRequest(url, workspaceDto)
.send(dtoUnmarshallerFactory.newUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<Void> delete(String wsId) {
final String url = baseHttpUrl + '/' + wsId;
return asyncRequestFactory.createDeleteRequest(url)
.send();
}
@Override
public Promise<WorkspaceDto> startFromConfig(final WorkspaceConfigDto cfg, final boolean isTemporary, final String accountId) {
return asyncRequestFactory.createPostRequest(baseHttpUrl + "/runtime", cfg)
.header(ACCEPT, APPLICATION_JSON)
.header(CONTENT_TYPE, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Creating machine from recipe..."))
.send(dtoUnmarshallerFactory.newUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<WorkspaceDto> startById(@NotNull final String id, final String envName, final Boolean restore) {
String url = baseHttpUrl + "/" + id + "/runtime";
if (restore != null) {
url += "?restore=" + restore;
}
if (envName != null) {
url += (url.contains("?") ? '&' : '?') + "environment=" + envName;
}
return asyncRequestFactory.createPostRequest(url, null)
.header(ACCEPT, APPLICATION_JSON)
.header(CONTENT_TYPE, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Starting workspace..."))
.send(dtoUnmarshallerFactory.newUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<Void> stop(String wsId) {
final String url = baseHttpUrl + "/" + wsId + "/runtime";
return asyncRequestFactory.createDeleteRequest(url)
.loader(loaderFactory.newLoader("Stopping workspace..."))
.send();
}
@Override
public Promise<Void> stop(String wsId, boolean createSnapshot) {
final String url = baseHttpUrl + "/" + wsId + "/runtime?create-snapshot=" + createSnapshot;
return asyncRequestFactory.createDeleteRequest(url)
.loader(loaderFactory.newLoader("Stopping workspace..."))
.send();
}
@Override
public Promise<List<CommandDto>> getCommands(String wsId) {
return getWorkspace(wsId).then((Function<WorkspaceDto, List<CommandDto>>)workspaceDto -> workspaceDto.getConfig().getCommands());
}
@Override
public Promise<WorkspaceDto> addCommand(final String wsId, final CommandDto newCommand) {
final String url = baseHttpUrl + '/' + wsId + "/command";
return asyncRequestFactory.createPostRequest(url, newCommand)
.header(ACCEPT, APPLICATION_JSON)
.header(CONTENT_TYPE, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Adding command..."))
.send(dtoUnmarshallerFactory.newUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<WorkspaceDto> updateCommand(final String wsId, final String commandName, final CommandDto commandUpdate) {
final String url = baseHttpUrl + '/' + wsId + "/command/" + URL.encodePathSegment(commandName);
return asyncRequestFactory.createRequest(PUT, url, commandUpdate, false)
.header(ACCEPT, APPLICATION_JSON)
.header(CONTENT_TYPE, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Updating command..."))
.send(dtoUnmarshallerFactory.newUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<WorkspaceDto> deleteCommand(final String wsId, final String commandName) {
final String url = baseHttpUrl + '/' + wsId + "/command/" + URL.encodePathSegment(commandName);
return asyncRequestFactory.createDeleteRequest(url)
.header(ACCEPT, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Deleting command..."))
.send(dtoUnmarshallerFactory.newUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<WorkspaceDto> addEnvironment(String wsId, String envName, EnvironmentDto newEnv) {
return asyncRequestFactory.createPostRequest(baseHttpUrl + '/' + wsId + "/environment?name=" + envName, newEnv)
.header(ACCEPT, APPLICATION_JSON)
.header(CONTENT_TYPE, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Adding environment..."))
.send(dtoUnmarshallerFactory.newUnmarshaller(WorkspaceDto.class));
}
@Override
public Promise<WorkspaceDto> updateEnvironment(String wsId, String envName, EnvironmentDto environmentUpdate) {
return null;
}
@Override
public Promise<WorkspaceDto> deleteEnvironment(String wsId, String envName) {
return null;
}
@Override
public Promise<WorkspaceDto> addProject(String wsId, ProjectConfigDto newProject) {
return null;
}
@Override
public Promise<WorkspaceDto> updateProject(String wsId, String path, ProjectConfigDto newEnv) {
return null;
}
@Override
public Promise<WorkspaceDto> deleteProject(String wsId, String projectName) {
return null;
}
@Override
public Promise<Void> createMachine(final String wsId, final MachineConfigDto machineConfig) {
String url = baseHttpUrl + '/' + wsId + "/machine";
return asyncRequestFactory.createPostRequest(url, machineConfig)
.header(ACCEPT, APPLICATION_JSON)
.header(CONTENT_TYPE, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Creating machine..."))
.send();
}
@Override
public Promise<List<SnapshotDto>> getSnapshot(final String workspaceId) {
final String url = baseHttpUrl + '/' + workspaceId + "/snapshot";
return asyncRequestFactory.createGetRequest(url)
.header(ACCEPT, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Getting workspace's snapshot"))
.send(dtoUnmarshallerFactory.newListUnmarshaller(SnapshotDto.class));
}
@Override
public Promise<Void> createSnapshot(final String workspaceId) {
final String url = baseHttpUrl + '/' + workspaceId + "/snapshot";
return asyncRequestFactory.createPostRequest(url, null)
.header(ACCEPT, APPLICATION_JSON)
.loader(loaderFactory.newLoader("Creating workspace's snapshot"))
.send();
}
@Override
public Promise<WsAgentHealthStateDto> getWsAgentState(String workspaceId) {
return asyncRequestFactory.createGetRequest(baseHttpUrl + '/' + workspaceId + "/check")
.header(ACCEPT, APPLICATION_JSON)
.send(dtoUnmarshallerFactory.newUnmarshaller(WsAgentHealthStateDto.class));
}
@Override
public Promise<Map<String, String>> getSettings() {
return asyncRequestFactory.createGetRequest(baseHttpUrl + "/settings") //
.header(ACCEPT, APPLICATION_JSON) //
.header(CONTENT_TYPE, APPLICATION_JSON) //
.send(new StringMapUnmarshaller());
}
}