001/*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * SonarQube is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * SonarQube is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
019 */
020package org.sonar.wsclient.issue.internal;
021
022import org.json.simple.JSONValue;
023import org.sonar.wsclient.internal.EncodingUtils;
024import org.sonar.wsclient.internal.HttpRequestFactory;
025import org.sonar.wsclient.issue.*;
026
027import javax.annotation.Nullable;
028
029import java.util.List;
030import java.util.Map;
031
032/**
033 * Do not instantiate this class, but use {@link org.sonar.wsclient.SonarClient#issueClient()}.
034 */
035public class DefaultIssueClient implements IssueClient {
036
037  private static final String SEARCH_URL = "/api/issues/search";
038  private static final String ASSIGN_URL = "/api/issues/assign";
039
040  private final HttpRequestFactory requestFactory;
041  private final IssueJsonParser parser;
042
043  public DefaultIssueClient(HttpRequestFactory requestFactory) {
044    this.requestFactory = requestFactory;
045    this.parser = new IssueJsonParser();
046  }
047
048  public Issues find(IssueQuery query) {
049    String json = requestFactory.get(SEARCH_URL, query.urlParams());
050    return parser.parseIssues(json);
051  }
052
053  @Override
054  public Issue create(NewIssue newIssue) {
055    String json = requestFactory.post("/api/issues/create", newIssue.urlParams());
056    return jsonToIssue(json);
057  }
058
059  @Override
060  public Issue setSeverity(String issueKey, String severity) {
061    Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "severity", severity);
062    String json = requestFactory.post("/api/issues/set_severity", params);
063    return jsonToIssue(json);
064  }
065
066  @Override
067  public Issue assign(String issueKey, @Nullable String assignee) {
068    Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "assignee", assignee);
069    String json = requestFactory.post(ASSIGN_URL, params);
070    return jsonToIssue(json);
071  }
072
073  @Override
074  public Issue assignToMe(String issueKey) {
075    Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "me", "true");
076    String json = requestFactory.post(ASSIGN_URL, params);
077    return jsonToIssue(json);
078  }
079
080  @Override
081  public Issue plan(String issueKey, @Nullable String actionPlanKey) {
082    Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "plan", actionPlanKey);
083    String json = requestFactory.post("/api/issues/plan", params);
084    return jsonToIssue(json);
085  }
086
087  @Override
088  public IssueComment addComment(String issueKey, String markdownText) {
089    Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "text", markdownText);
090    String json = requestFactory.post("/api/issues/add_comment", params);
091    Map rootJson = (Map) JSONValue.parse(json);
092    return new DefaultIssueComment((Map) rootJson.get("comment"));
093  }
094
095  @Override
096  public List<String> transitions(String issueKey) {
097    Map<String, Object> queryParams = EncodingUtils.toMap("issue", issueKey);
098    String json = requestFactory.get("/api/issues/transitions", queryParams);
099    return parser.parseTransitions(json);
100  }
101
102  @Override
103  public Issue doTransition(String issueKey, String transition) {
104    Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "transition", transition);
105    String json = requestFactory.post("/api/issues/do_transition", params);
106    return jsonToIssue(json);
107  }
108
109  @Override
110  public List<String> actions(String issueKey) {
111    Map<String, Object> queryParams = EncodingUtils.toMap("issue", issueKey);
112    String json = requestFactory.get("/api/issues/actions", queryParams);
113    return parser.parseActions(json);
114  }
115
116  @Override
117  public Issue doAction(String issueKey, String action) {
118    Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "actionKey", action);
119    String json = requestFactory.post("/api/issues/do_action", params);
120    return jsonToIssue(json);
121  }
122
123  @Override
124  public BulkChange bulkChange(BulkChangeQuery query) {
125    String json = requestFactory.post("/api/issues/bulk_change", query.urlParams());
126    return parser.parseBulkChange(json);
127  }
128
129  @Override
130  public List<IssueChange> changes(String issueKey) {
131    Map<String, Object> queryParams = EncodingUtils.toMap("issue", issueKey);
132    String json = requestFactory.post("/api/issues/changelog", queryParams);
133    return parser.parseChangelog(json);
134  }
135
136  private Issue jsonToIssue(String json) {
137    Map jsonRoot = (Map) JSONValue.parse(json);
138    return new DefaultIssue((Map) jsonRoot.get("issue"));
139  }
140
141}