/*******************************************************************************
* 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.plugin.svn.server.rest;
import org.eclipse.che.api.core.ApiException;
import org.eclipse.che.api.core.ServerException;
import org.eclipse.che.api.core.rest.Service;
import org.eclipse.che.api.project.server.ProjectRegistry;
import org.eclipse.che.api.project.server.RegisteredProject;
import org.eclipse.che.api.workspace.shared.dto.SourceStorageDto;
import org.eclipse.che.dto.server.DtoFactory;
import org.eclipse.che.plugin.svn.server.SubversionApi;
import org.eclipse.che.plugin.svn.server.SubversionException;
import org.eclipse.che.plugin.svn.shared.AddRequest;
import org.eclipse.che.plugin.svn.shared.CLIOutputResponse;
import org.eclipse.che.plugin.svn.shared.CLIOutputResponseList;
import org.eclipse.che.plugin.svn.shared.CLIOutputWithRevisionResponse;
import org.eclipse.che.plugin.svn.shared.CleanupRequest;
import org.eclipse.che.plugin.svn.shared.CommitRequest;
import org.eclipse.che.plugin.svn.shared.CopyRequest;
import org.eclipse.che.plugin.svn.shared.GetRevisionsRequest;
import org.eclipse.che.plugin.svn.shared.GetRevisionsResponse;
import org.eclipse.che.plugin.svn.shared.InfoRequest;
import org.eclipse.che.plugin.svn.shared.InfoResponse;
import org.eclipse.che.plugin.svn.shared.ListRequest;
import org.eclipse.che.plugin.svn.shared.ListResponse;
import org.eclipse.che.plugin.svn.shared.LockRequest;
import org.eclipse.che.plugin.svn.shared.MergeRequest;
import org.eclipse.che.plugin.svn.shared.MoveRequest;
import org.eclipse.che.plugin.svn.shared.PropertyDeleteRequest;
import org.eclipse.che.plugin.svn.shared.PropertyGetRequest;
import org.eclipse.che.plugin.svn.shared.PropertyListRequest;
import org.eclipse.che.plugin.svn.shared.PropertySetRequest;
import org.eclipse.che.plugin.svn.shared.RemoveRequest;
import org.eclipse.che.plugin.svn.shared.ResolveRequest;
import org.eclipse.che.plugin.svn.shared.RevertRequest;
import org.eclipse.che.plugin.svn.shared.ShowDiffRequest;
import org.eclipse.che.plugin.svn.shared.ShowLogRequest;
import org.eclipse.che.plugin.svn.shared.StatusRequest;
import org.eclipse.che.plugin.svn.shared.SwitchRequest;
import org.eclipse.che.plugin.svn.shared.UpdateRequest;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
/**
* REST API endpoints for this extension.
*/
@Path("svn")
public class SubversionService extends Service {
@Inject
private ProjectRegistry projectRegistry;
@Inject
private SubversionApi subversionApi;
/**
* Add the selected paths to version control.
*
* @param request
* the add request
* @return the add response
* @throws IOException
* if there is a problem executing the command
* @throws SubversionException
* if there is a Subversion issue
*/
@Path("add")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse add(final AddRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.add(request);
}
/**
* Remove the selected paths to version control.
*
* @param request
* the remove request
* @return the remove response
* @throws IOException
* if there is a problem executing the command
* @throws SubversionException
* if there is a Subversion issue
*/
@Path("remove")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse remove(final RemoveRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.remove(request);
}
/**
* Revert the selected paths.
*
* @param request
* the revert request
* @return the revert response
* @throws IOException
* if there is a problem executing the command
* @throws SubversionException
* if there is a Subversion issue
*/
@Path("revert")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse revert(final RevertRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.revert(request);
}
/**
* Copy provided path.
*
* @param request
* the copy request
* @return the copy response
* @throws ServerException
* if there is a Subversion issue
* @throws IOException
* if there is a problem executing the command
*/
@Path("copy")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse copy(final CopyRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.copy(request);
}
/**
* Retrieve the status of the paths in the request or the working copy as a whole.
*
* @param request
* the status request
* @return the status response
* @throws IOException
* if there is a problem executing the command
* @throws SubversionException
* if there is a Subversion issue
*/
@Path("status")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse update(final StatusRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.status(request);
}
/**
* Retrieve information about subversion resource.
*
* @param request
* @return
* @throws ServerException
* @throws IOException
*/
@Path("info")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public InfoResponse info(final InfoRequest request) throws ApiException, IOException {
request.withProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.info(request);
}
/**
* Merge specified URL with target.
*
* @param request request
* @return merge response
* @throws ServerException
* @throws IOException
*/
@Path("merge")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse merge(final MergeRequest request) throws ApiException, IOException {
request.withProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.merge(request);
}
/**
* Update the working copy.
*
* @param request
* the update request
* @return the update response
* @throws IOException
* if there is a problem executing the command
* @throws SubversionException
* if there is a Subversion issue
*/
@Path("update")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputWithRevisionResponse update(final UpdateRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.update(request);
}
/**
* Update the working copy to a different URL within the same repository.
*
* @param request
* the switch request
* @return the switch response
* @throws ApiException
* if there is a Subversion issue
*/
@Path("switch")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputWithRevisionResponse doSwitch(final SwitchRequest request) throws ApiException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return subversionApi.doSwitch(request);
}
/**
* Show log.
*
* @param request
* the show log request
* @return the show log response
* @throws IOException
* if there is a problem executing the command
* @throws SubversionException
* if there is a Subversion issue
*/
@Path("showlog")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse showLog(final ShowLogRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.showLog(request);
}
/**
* Show diff.
*
* @param request
* the show diff request
* @return the show diff response
* @throws IOException
* if there is a problem executing the command
* @throws SubversionException
* if there is a Subversion issue
*/
@Path("showdiff")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse showDiff(final ShowDiffRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.showDiff(request);
}
/**
* Lists remote directory.
*
* @param request
* the list request
* @return children of the requested target path
* @throws ApiException
* if there is a Subversion issue
*/
@Path("list")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public ListResponse list(final ListRequest request) throws ApiException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return subversionApi.list(request);
}
/**
* Returns list of the branches of the project.
*
* @param request
* the list request
* @throws ApiException
* if there is a Subversion issue
*/
@Path("branches")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public ListResponse listBranches(final ListRequest request) throws ApiException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.listBranches(request);
}
/**
* Returns list of the tags of the project.
*
* @param request
* the list request
* @throws ApiException
* if there is a Subversion issue
*/
@Path("tags")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public ListResponse listTags(final ListRequest request) throws ApiException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return subversionApi.listTags(request);
}
/**
* Resolve conflicts.
*
* @param request
* the resolve conflicts request
* @return the resolve conflicts response
* @throws IOException
* if there is a problem executing the command
* @throws SubversionException
* if there is a Subversion issue
*/
@Path("resolve")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponseList resolve(final ResolveRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return subversionApi.resolve(request);
}
/**
* Commits the specified changes.
*
* @param request
* the commit request
* @return the commit response
* @throws ServerException
* @throws IOException
*/
@Path("commit")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputWithRevisionResponse commit(final CommitRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.commit(request);
}
/**
* Cleans up the working copy.
*
* @param request
* the cleanup request
* @return the response
* @throws ServerException
* @throws IOException
*/
@Path("cleanup")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse cleanup(final CleanupRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.cleanup(request);
}
@Path("lock")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse lock(final LockRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.lockUnlock(request, true);
}
@Path("unlock")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse unlock(final LockRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.lockUnlock(request, false);
}
@Path("export/{projectPath:.*}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response exportPath(final @PathParam("projectPath") String projectPath,
final @DefaultValue(".") @QueryParam("path") String path,
final @QueryParam("revision") String revision) throws ApiException, IOException {
return this.subversionApi.exportPath(getAbsoluteProjectPath(projectPath), path, revision);
}
@Path("revisions")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public GetRevisionsResponse getRevisions(final GetRevisionsRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.getRevisions(request);
}
/**
* Move provided path.
*
* @param request
* the copy request
* @return the copy response
* @throws ServerException
* if there is a Subversion issue
* @throws IOException
* if there is a problem executing the command
*/
@Path("move")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse move(final MoveRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.move(request);
}
/**
* Set property to specified path or target.
*
* @param request
* the property setting request
* @return the property setting response
* @throws ServerException
* if there is a Subversion issue
* @throws IOException
* if there is a problem executing the command
*/
@Path("propset")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse propset(final PropertySetRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.propset(request);
}
/**
* Delete property from specified path or target.
*
* @param request
* the property delete request
* @return the property delete response
* @throws ServerException
* if there is a Subversion issue
* @throws IOException
* if there is a problem executing the command
*/
@Path("propdel")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse propdel(final PropertyDeleteRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.propdel(request);
}
/**
* Get property for specified path or target.
*
* @param request
* the property setting request
* @return the property setting response
* @throws ServerException
* if there is a Subversion issue
* @throws IOException
* if there is a problem executing the command
*/
@Path("propget")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse propget(final PropertyGetRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.propget(request);
}
/**
* Get property for specified path or target.
*
* @param request
* the property setting request
* @return the property setting response
* @throws ServerException
* if there is a Subversion issue
* @throws IOException
* if there is a problem executing the command
*/
@Path("proplist")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public CLIOutputResponse proplist(final PropertyListRequest request) throws ApiException, IOException {
request.setProjectPath(getAbsoluteProjectPath(request.getProjectPath()));
return this.subversionApi.proplist(request);
}
@Path("import-source-descriptor")
@Produces(MediaType.APPLICATION_JSON)
@GET
public SourceStorageDto importDescriptor(@Context UriInfo uriInfo, @QueryParam("projectPath") String projectPath)
throws ApiException, IOException {
final RegisteredProject project = projectRegistry.getProject(projectPath);
if (project.getBaseFolder().getChildFolder(".svn") != null) {
return DtoFactory.getInstance().createDto(SourceStorageDto.class)
.withType("subversion")
.withLocation(subversionApi.getRepositoryUrl(getAbsoluteProjectPath(projectPath)));
} else {
throw new ServerException("Not subversion repository");
}
}
private String getAbsoluteProjectPath(String wsRelatedProjectPath) {
final RegisteredProject project = projectRegistry.getProject(wsRelatedProjectPath);
return project.getBaseFolder().getVirtualFile().toIoFile().getAbsolutePath();
}
}