/*******************************************************************************
* 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.api.project.server;
import org.eclipse.che.api.core.ApiException;
import org.eclipse.che.api.core.ServerException;
import org.eclipse.che.api.core.model.project.ProjectConfig;
import org.eclipse.che.api.core.rest.HttpJsonRequestFactory;
import org.eclipse.che.api.workspace.server.WorkspaceService;
import org.eclipse.che.api.workspace.shared.dto.WorkspaceDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import javax.ws.rs.core.UriBuilder;
import java.io.IOException;
import java.util.List;
import static org.eclipse.che.api.project.server.DtoConverter.asDto;
/**
* For caching and proxy-ing Workspace Configuration.
*
* @author gazarenkov
*/
@Singleton
public class WorkspaceHolder extends WorkspaceProjectsSyncer {
private static final Logger LOG = LoggerFactory.getLogger(WorkspaceHolder.class);
private String apiEndpoint;
private String workspaceId;
private final String userToken;
private HttpJsonRequestFactory httpJsonRequestFactory;
@Inject
public WorkspaceHolder(@Named("che.api") String apiEndpoint,
HttpJsonRequestFactory httpJsonRequestFactory) throws ServerException {
this.apiEndpoint = apiEndpoint;
this.httpJsonRequestFactory = httpJsonRequestFactory;
this.workspaceId = System.getenv("CHE_WORKSPACE_ID");
this.userToken = System.getenv("USER_TOKEN");
LOG.info("Workspace ID: " + workspaceId);
LOG.info("API Endpoint: " + apiEndpoint);
LOG.info("User Token : " + (userToken != null));
// check connection
try {
workspaceDto();
} catch (ServerException e) {
LOG.error(e.getLocalizedMessage());
System.exit(1);
}
}
@Override
public List<? extends ProjectConfig> getProjects() throws ServerException {
return workspaceDto().getConfig().getProjects();
}
@Override
public String getWorkspaceId() {
return workspaceId;
}
/**
* Add project on WS-master side.
*
* @param project
* project to add
* @throws ServerException
*/
protected void addProject(ProjectConfig project) throws ServerException {
final UriBuilder builder = UriBuilder.fromUri(apiEndpoint).path(WorkspaceService.class)
.path(WorkspaceService.class, "addProject");
if(userToken != null)
builder.queryParam("token", userToken);
final String href = builder.build(workspaceId).toString();
try {
httpJsonRequestFactory.fromUrl(href).usePostMethod().setBody(asDto(project)).request();
} catch (IOException | ApiException e) {
throw new ServerException(e.getMessage());
}
}
/**
* Updates project on WS-master side.
*
* @param project
* project to update
* @throws ServerException
*/
protected void updateProject(ProjectConfig project) throws ServerException {
final UriBuilder builder = UriBuilder.fromUri(apiEndpoint).path(WorkspaceService.class)
.path(WorkspaceService.class, "updateProject");
if(userToken != null)
builder.queryParam("token", userToken);
final String href = builder.build(new String[]{workspaceId, project.getPath()}, false).toString();
try {
httpJsonRequestFactory.fromUrl(href).usePutMethod().setBody(asDto(project)).request();
} catch (IOException | ApiException e) {
throw new ServerException(e.getMessage());
}
}
protected void removeProject(ProjectConfig project) throws ServerException {
final UriBuilder builder = UriBuilder.fromUri(apiEndpoint).path(WorkspaceService.class)
.path(WorkspaceService.class, "deleteProject");
if(userToken != null)
builder.queryParam("token", userToken);
final String href = builder.build(new String[]{workspaceId, project.getPath()}, false).toString();
try {
httpJsonRequestFactory.fromUrl(href).useDeleteMethod().request();
} catch (IOException | ApiException e) {
throw new ServerException(e.getMessage());
}
}
/**
* @return WorkspaceDto
* @throws ServerException
*/
private WorkspaceDto workspaceDto() throws ServerException {
final UriBuilder builder = UriBuilder.fromUri(apiEndpoint).path(WorkspaceService.class)
.path(WorkspaceService.class, "getByKey");
if(userToken != null)
builder.queryParam("token", userToken);
final String href = builder.build(workspaceId).toString();
try {
return httpJsonRequestFactory.fromUrl(href).useGetMethod().request().asDto(WorkspaceDto.class);
} catch (IOException | ApiException e) {
throw new ServerException(e);
}
}
}