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     */
020    package org.sonar.wsclient.issue.internal;
021    
022    import org.json.simple.JSONValue;
023    import org.sonar.wsclient.internal.EncodingUtils;
024    import org.sonar.wsclient.internal.HttpRequestFactory;
025    import org.sonar.wsclient.issue.*;
026    
027    import javax.annotation.Nullable;
028    
029    import java.util.List;
030    import java.util.Map;
031    
032    /**
033     * Do not instantiate this class, but use {@link org.sonar.wsclient.SonarClient#issueClient()}.
034     */
035    public 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      @Override
049      public Issues find(IssueQuery query) {
050        String json = requestFactory.get(SEARCH_URL, query.urlParams());
051        return parser.parseIssues(json);
052      }
053    
054      @Override
055      public Issue create(NewIssue newIssue) {
056        String json = requestFactory.post("/api/issues/create", newIssue.urlParams());
057        return jsonToIssue(json);
058      }
059    
060      @Override
061      public Issue setSeverity(String issueKey, String severity) {
062        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "severity", severity);
063        String json = requestFactory.post("/api/issues/set_severity", params);
064        return jsonToIssue(json);
065      }
066    
067      @Override
068      public Issue assign(String issueKey, @Nullable String assignee) {
069        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "assignee", assignee);
070        String json = requestFactory.post(ASSIGN_URL, params);
071        return jsonToIssue(json);
072      }
073    
074      @Override
075      public Issue assignToMe(String issueKey) {
076        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "me", "true");
077        String json = requestFactory.post(ASSIGN_URL, params);
078        return jsonToIssue(json);
079      }
080    
081      @Override
082      public Issue plan(String issueKey, @Nullable String actionPlanKey) {
083        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "plan", actionPlanKey);
084        String json = requestFactory.post("/api/issues/plan", params);
085        return jsonToIssue(json);
086      }
087    
088      @Override
089      public IssueComment addComment(String issueKey, String markdownText) {
090        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "text", markdownText);
091        String json = requestFactory.post("/api/issues/add_comment", params);
092        Map rootJson = (Map) JSONValue.parse(json);
093        return new DefaultIssueComment((Map) rootJson.get("comment"));
094      }
095    
096      @Override
097      public List<String> transitions(String issueKey) {
098        Map<String, Object> queryParams = EncodingUtils.toMap("issue", issueKey);
099        String json = requestFactory.get("/api/issues/transitions", queryParams);
100        return parser.parseTransitions(json);
101      }
102    
103      @Override
104      public Issue doTransition(String issueKey, String transition) {
105        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "transition", transition);
106        String json = requestFactory.post("/api/issues/do_transition", params);
107        return jsonToIssue(json);
108      }
109    
110      @Override
111      public List<String> actions(String issueKey) {
112        Map<String, Object> queryParams = EncodingUtils.toMap("issue", issueKey);
113        String json = requestFactory.get("/api/issues/actions", queryParams);
114        return parser.parseActions(json);
115      }
116    
117      @Override
118      public Issue doAction(String issueKey, String action) {
119        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "actionKey", action);
120        String json = requestFactory.post("/api/issues/do_action", params);
121        return jsonToIssue(json);
122      }
123    
124      @Override
125      public BulkChange bulkChange(BulkChangeQuery query) {
126        String json = requestFactory.post("/api/issues/bulk_change", query.urlParams());
127        return parser.parseBulkChange(json);
128      }
129    
130      @Override
131      public List<IssueChange> changes(String issueKey) {
132        Map<String, Object> queryParams = EncodingUtils.toMap("issue", issueKey);
133        String json = requestFactory.post("/api/issues/changelog", queryParams);
134        return parser.parseChangelog(json);
135      }
136    
137      private Issue jsonToIssue(String json) {
138        Map jsonRoot = (Map) JSONValue.parse(json);
139        return new DefaultIssue((Map) jsonRoot.get("issue"));
140      }
141    
142    }