001    /*
002     * SonarQube, open source software quality management tool.
003     * Copyright (C) 2008-2013 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    import java.util.List;
029    import java.util.Map;
030    
031    /**
032     * Do not instantiate this class, but use {@link org.sonar.wsclient.SonarClient#issueClient()}.
033     */
034    public class DefaultIssueClient implements IssueClient {
035    
036      private static final String SEARCH_URL = "/api/issues/search";
037    
038      private final HttpRequestFactory requestFactory;
039      private final IssueJsonParser parser;
040    
041      public DefaultIssueClient(HttpRequestFactory requestFactory) {
042        this.requestFactory = requestFactory;
043        this.parser = new IssueJsonParser();
044      }
045    
046      public Issues find(IssueQuery query) {
047        String json = requestFactory.get(SEARCH_URL, query.urlParams());
048        return parser.parseIssues(json);
049      }
050    
051      @Override
052      public Issue create(NewIssue newIssue) {
053        String json = requestFactory.post("/api/issues/create", newIssue.urlParams());
054        return jsonToIssue(json);
055      }
056    
057      @Override
058      public Issue setSeverity(String issueKey, String severity) {
059        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "severity", severity);
060        String json = requestFactory.post("/api/issues/set_severity", params);
061        return jsonToIssue(json);
062      }
063    
064      @Override
065      public Issue assign(String issueKey, @Nullable String assignee) {
066        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "assignee", assignee);
067        String json = requestFactory.post("/api/issues/assign", params);
068        return jsonToIssue(json);
069      }
070    
071      @Override
072      public Issue plan(String issueKey, @Nullable String actionPlanKey) {
073        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "plan", actionPlanKey);
074        String json = requestFactory.post("/api/issues/plan", params);
075        return jsonToIssue(json);
076      }
077    
078      @Override
079      public IssueComment addComment(String issueKey, String markdownText) {
080        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "text", markdownText);
081        String json = requestFactory.post("/api/issues/add_comment", params);
082        Map rootJson = (Map) JSONValue.parse(json);
083        return new DefaultIssueComment((Map) rootJson.get("comment"));
084      }
085    
086      @Override
087      public List<String> transitions(String issueKey) {
088        Map<String, Object> queryParams = EncodingUtils.toMap("issue", issueKey);
089        String json = requestFactory.get("/api/issues/transitions", queryParams);
090        return parser.parseTransitions(json);
091      }
092    
093      @Override
094      public Issue doTransition(String issueKey, String transition) {
095        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "transition", transition);
096        String json = requestFactory.post("/api/issues/do_transition", params);
097        return jsonToIssue(json);
098      }
099    
100      @Override
101      public List<String> actions(String issueKey) {
102        Map<String, Object> queryParams = EncodingUtils.toMap("issue", issueKey);
103        String json = requestFactory.get("/api/issues/actions", queryParams);
104        return parser.parseActions(json);
105      }
106    
107      @Override
108      public Issue doAction(String issueKey, String action) {
109        Map<String, Object> params = EncodingUtils.toMap("issue", issueKey, "actionKey", action);
110        String json = requestFactory.post("/api/issues/do_action", params);
111        return jsonToIssue(json);
112      }
113    
114      private Issue jsonToIssue(String json) {
115        Map jsonRoot = (Map) JSONValue.parse(json);
116        return new DefaultIssue((Map) jsonRoot.get("issue"));
117      }
118    
119    }