PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/src/main/java/com/atlassian/jira/plugins/bitbucket/rest/RootResource.java

https://bitbucket.org/atlassian/jira-bitbucket-connector/
Java | 217 lines | 195 code | 21 blank | 1 comment | 17 complexity | c6e33596f1c1fe4ca0a8892bf78f5b3a MD5 | raw file
  1. package com.atlassian.jira.plugins.bitbucket.rest;
  2. import java.net.URI;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.ws.rs.DELETE;
  6. import javax.ws.rs.FormParam;
  7. import javax.ws.rs.GET;
  8. import javax.ws.rs.POST;
  9. import javax.ws.rs.Path;
  10. import javax.ws.rs.PathParam;
  11. import javax.ws.rs.Produces;
  12. import javax.ws.rs.QueryParam;
  13. import javax.ws.rs.core.Context;
  14. import javax.ws.rs.core.MediaType;
  15. import javax.ws.rs.core.Response;
  16. import javax.ws.rs.core.UriBuilder;
  17. import javax.ws.rs.core.UriInfo;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20. import org.springframework.beans.factory.annotation.Qualifier;
  21. import com.atlassian.jira.plugins.bitbucket.Synchronizer;
  22. import com.atlassian.jira.plugins.bitbucket.api.Changeset;
  23. import com.atlassian.jira.plugins.bitbucket.api.Progress;
  24. import com.atlassian.jira.plugins.bitbucket.api.SourceControlException;
  25. import com.atlassian.jira.plugins.bitbucket.api.SourceControlRepository;
  26. import com.atlassian.jira.plugins.bitbucket.spi.RepositoryManager;
  27. import com.atlassian.jira.plugins.bitbucket.spi.UrlInfo;
  28. import com.atlassian.jira.project.Project;
  29. import com.atlassian.jira.project.ProjectManager;
  30. import com.atlassian.jira.security.JiraAuthenticationContext;
  31. import com.atlassian.jira.security.PermissionManager;
  32. import com.atlassian.jira.security.Permissions;
  33. import com.atlassian.plugins.rest.common.security.AnonymousAllowed;
  34. import com.google.common.base.Function;
  35. import com.google.common.collect.Lists;
  36. @Path("/")
  37. public class RootResource
  38. {
  39. @Context
  40. UriInfo uriInfo;
  41. private final Logger log = LoggerFactory.getLogger(RootResource.class);
  42. private final PermissionManager permissionManager;
  43. private final ProjectManager projectManager;
  44. private final JiraAuthenticationContext jiraAuthenticationContext;
  45. private final RepositoryManager globalRepositoryManager;
  46. private final Synchronizer synchronizer;
  47. private final Function<SourceControlRepository, Repository> TO_REST_REPOSITORY = new Function<SourceControlRepository, Repository>()
  48. {
  49. @Override
  50. public Repository apply(SourceControlRepository from)
  51. {
  52. Repository repo = new Repository(from.getId(), from.getRepositoryType(), from.getProjectKey(), from.getRepositoryUri().getRepositoryUrl(),
  53. from.getUsername(), null, from.getAdminUsername(), null, null); // don't include password or accessToken
  54. Progress progress = synchronizer.getProgress(from);
  55. if (progress != null)
  56. repo.setStatus(new SyncProgress(progress.isFinished(), progress.getChangesetCount(), progress
  57. .getJiraCount(), progress.getError()));
  58. return repo;
  59. }
  60. };
  61. public RootResource(@Qualifier("globalRepositoryManager") RepositoryManager globalRepositoryManager,
  62. PermissionManager permissionManager, ProjectManager projectManager,
  63. JiraAuthenticationContext jiraAuthenticationContext, Synchronizer synchronizer)
  64. {
  65. this.globalRepositoryManager = globalRepositoryManager;
  66. this.permissionManager = permissionManager;
  67. this.projectManager = projectManager;
  68. this.jiraAuthenticationContext = jiraAuthenticationContext;
  69. this.synchronizer = synchronizer;
  70. }
  71. private boolean canAdmin(String projectKey)
  72. {
  73. Project project = projectManager.getProjectObjByKey(projectKey);
  74. return project != null
  75. && (permissionManager.hasPermission(Permissions.PROJECT_ADMIN, project,
  76. jiraAuthenticationContext.getLoggedInUser()) || permissionManager.hasPermission(
  77. Permissions.ADMINISTER, jiraAuthenticationContext.getLoggedInUser()));
  78. }
  79. @GET
  80. @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
  81. @Path("/repositories/")
  82. public Response getAllRepositories()
  83. {
  84. List<Repository> list = Lists.newArrayList();
  85. List<Project> projects = projectManager.getProjectObjects();
  86. for (Project project : projects)
  87. {
  88. if (canAdmin(project.getKey()))
  89. {
  90. List<SourceControlRepository> repositories = globalRepositoryManager.getRepositories(project.getKey());
  91. list.addAll(Lists.transform(repositories, TO_REST_REPOSITORY));
  92. }
  93. }
  94. return Response.ok(new RepositoryList(list)).build();
  95. }
  96. @GET
  97. @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
  98. @Path("/repository/{id}")
  99. public Response getRepository(@PathParam("id") int id)
  100. {
  101. SourceControlRepository repository = globalRepositoryManager.getRepository(id);
  102. if (repository != null && canAdmin(repository.getProjectKey()))
  103. return Response.ok(TO_REST_REPOSITORY.apply(repository)).build();
  104. else
  105. return Response.status(Response.Status.FORBIDDEN).build();
  106. }
  107. @GET
  108. @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
  109. @Path("/repositories/{projectKey}")
  110. public Response getRepositories(@PathParam("projectKey") String projectKey)
  111. {
  112. if (canAdmin(projectKey))
  113. {
  114. List<Repository> list = new ArrayList<Repository>();
  115. List<SourceControlRepository> repositories = globalRepositoryManager.getRepositories(projectKey);
  116. list.addAll(Lists.transform(repositories, TO_REST_REPOSITORY));
  117. return Response.ok(new RepositoryList(list)).build();
  118. } else
  119. return Response.status(Response.Status.FORBIDDEN).build();
  120. }
  121. @AnonymousAllowed
  122. @POST
  123. @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
  124. @Path("/repository/{id}/sync")
  125. public Response startRepositorySync(@PathParam("id") int id, @FormParam("payload") String payload)
  126. {
  127. log.debug("Rest request to sync repository [{}] with payload [{}]", id, payload);
  128. SourceControlRepository repository = globalRepositoryManager.getRepository(id);
  129. if (payload == null)
  130. {
  131. synchronizer.synchronize(repository);
  132. } else
  133. {
  134. List<Changeset> changesets = globalRepositoryManager.parsePayload(repository, payload);
  135. synchronizer.synchronize(repository, changesets);
  136. }
  137. // redirect to Repository resource - that will contain sync message/status
  138. UriBuilder ub = uriInfo.getBaseUriBuilder();
  139. URI uri = ub.path("/repository/{id}").build(id);
  140. return Response.seeOther(uri).build();
  141. }
  142. @POST
  143. @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
  144. @Path("/repository")
  145. public Response addRepository(Repository repository)
  146. {
  147. if (canAdmin(repository.getProjectKey()))
  148. {
  149. String url = repository.getUrl();
  150. String repositoryType = repository.getRepositoryType();
  151. String projectKey = repository.getProjectKey();
  152. String username = repository.getUsername();
  153. String password = repository.getPassword();
  154. String adminUsername = repository.getUsername();
  155. String adminPassword = repository.getPassword();
  156. String accessToken = repository.getAccessToken();
  157. SourceControlRepository repo;
  158. try
  159. {
  160. repo = globalRepositoryManager.addRepository(repositoryType, projectKey, url, username, password,
  161. adminUsername, adminPassword, accessToken);
  162. } catch (SourceControlException e)
  163. {
  164. return Response.serverError().entity(e).build();
  165. }
  166. return Response.ok(TO_REST_REPOSITORY.apply(repo)).build();
  167. } else
  168. return Response.status(Response.Status.FORBIDDEN).build();
  169. }
  170. @DELETE
  171. @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
  172. @Path("/repository/{id}")
  173. public Response removeRepository(@PathParam("id") int id)
  174. {
  175. SourceControlRepository repository = globalRepositoryManager.getRepository(id);
  176. if (canAdmin(repository.getProjectKey()))
  177. {
  178. SourceControlRepository repo = globalRepositoryManager.getRepository(id);
  179. globalRepositoryManager.removeRepository(id);
  180. globalRepositoryManager.removePostcommitHook(repo);
  181. return Response.ok().build();
  182. } else
  183. return Response.status(Response.Status.FORBIDDEN).build();
  184. }
  185. @GET
  186. @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
  187. @Path("/urlinfo")
  188. public Response urlInfo(@QueryParam("repositoryUrl") String repositoryUrl)
  189. {
  190. UrlInfo urlInfo = globalRepositoryManager.getUrlInfo(repositoryUrl);
  191. if (urlInfo!=null)
  192. return Response.ok(urlInfo).build();
  193. else
  194. return Response.status(Response.Status.NOT_FOUND).build();
  195. }
  196. }