]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3755 improve documentation
authorSimon Brandhof <simon.brandhof@gmail.com>
Wed, 5 Jun 2013 16:37:00 +0000 (18:37 +0200)
committerSimon Brandhof <simon.brandhof@gmail.com>
Wed, 5 Jun 2013 16:37:30 +0000 (18:37 +0200)
14 files changed:
sonar-core/src/main/java/org/sonar/core/issue/DefaultIssueQueryResult.java
sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueQueryResultTest.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueQueryResult.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/RubyIssueService.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/action/Action.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/action/Actions.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/condition/HasIssuePropertyCondition.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/internal/DefaultIssue.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/internal/DefaultIssueComment.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/internal/FieldDiffs.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/internal/IssueChangeContext.java
sonar-plugin-api/src/test/java/org/sonar/api/issue/internal/DefaultIssueTest.java
sonar-server/src/test/java/org/sonar/server/issue/ActionServiceTest.java

index 2e6a8245dc1463040ecd4a49e738de6b6bd1493a..ca92f7e8d29b7fed618deaf26fbfcc8429a3be2d 100644 (file)
@@ -107,7 +107,7 @@ public class DefaultIssueQueryResult implements IssueQueryResult {
     if (issues != null && !issues.isEmpty()) {
       return issues.get(0);
     }
-    throw new IllegalArgumentException("No issue");
+    throw new IllegalStateException("No issue");
   }
 
   @Override
index 7f442ea19a7c31073122ffb314845fa0a5f11501..9148e9ccf85eae5350b3a783df9f1bddf7fa1008 100644 (file)
@@ -31,8 +31,8 @@ import static org.fest.assertions.Assertions.assertThat;
 
 public class DefaultIssueQueryResultTest {
 
-  @Test(expected = IllegalArgumentException.class)
-  public void should_first_throw_exception_if_no_issue() {
+  @Test(expected = IllegalStateException.class)
+  public void first_should_throw_exception_if_no_issues() {
     DefaultIssueQueryResult result = new DefaultIssueQueryResult(Collections.<Issue>emptyList());
     result.first();
   }
index 982ed14ff94944ffee860d3c9a18dab09c099b7f..77d92abed4f6434c8df4079e02ee89ac26588a77 100644 (file)
@@ -83,6 +83,9 @@ public interface Issue extends Serializable {
   @CheckForNull
   String message();
 
+  /**
+   * Optional line number. If set, then it's greater than or equal 1.
+   */
   @CheckForNull
   Integer line();
 
@@ -99,17 +102,26 @@ public interface Issue extends Serializable {
   @CheckForNull
   Double effortToFix();
 
+  /**
+   * See constant values in {@link Issue}.
+   */
   String status();
 
   /**
-   * The type of resolution, or null if the issue is not resolved.
+   * The type of resolution, or null if the issue is not resolved. See constant values in {@link Issue}.
    */
   @CheckForNull
   String resolution();
 
+  /**
+   * Login of the user who reported this issue. Null if the issue is reported by a rule engine.
+   */
   @CheckForNull
   String reporter();
 
+  /**
+   * Login of the user who is assigned to this issue. Null if the issue is not assigned.
+   */
   @CheckForNull
   String assignee();
 
@@ -117,6 +129,9 @@ public interface Issue extends Serializable {
 
   Date updateDate();
 
+  /**
+   * Date when status was set to {@link Issue#STATUS_CLOSED}, else null.
+   */
   @CheckForNull
   Date closeDate();
 
@@ -125,6 +140,10 @@ public interface Issue extends Serializable {
 
   Map<String, String> attributes();
 
+  /**
+   * Login of the SCM account that introduced this issue. Requires the
+   * <a href="http://www.sonarsource.com/products/plugins/developer-tools/developer-cockpit/">Developer Cockpit Plugin</a> to be installed.
+   */
   @CheckForNull
   String authorLogin();
 
index 4caa572140ae01e47f3fe12f1b43bfbd9c9bb4b5..6dedb9e5ab7baa5bc1556ea3bc16687e1a861e13 100644 (file)
@@ -33,14 +33,20 @@ import java.util.List;
  * @since 3.6
  */
 public interface IssueQueryResult {
+  /**
+   * Non-null paginated list of issues.
+   */
   List<Issue> issues();
 
   /**
-   * Return first issue in the list.
-   * It will throws IllegalArgumentException if no issue found.
+   * Returns the first issue in the list.
+   * @throws IllegalStateException if the list is empty.
    */
   Issue first();
 
+  /**
+   * Returns the rule associated to the given issue.
+   */
   Rule rule(Issue issue);
 
   /**
@@ -62,22 +68,33 @@ public interface IssueQueryResult {
    */
   Collection<Component> projects();
 
-
   @CheckForNull
   ActionPlan actionPlan(Issue issue);
 
+  /**
+   * The action plans involved in the paginated {@link #issues()}.
+   */
   Collection<ActionPlan> actionPlans();
 
   /**
-   * The users involved in the paginated {@link #issues()}, for example people who added a comment, created an issue
+   * The users involved in the paginated {@link #issues()}, for example people who added a comment, reported an issue
    * or are assigned to issues.
    */
   Collection<User> users();
 
+  /**
+   * Returns the user with the given login. Users that are not returned by {@link #users()} are ignored.
+   */
   @CheckForNull
   User user(String login);
 
+  /**
+   * Non-null data about paging of issues
+   */
   Paging paging();
 
+  /**
+   * True if too many issues have been found. In this case results are truncated.
+   */
   boolean maxResultsReached();
 }
index 7956b5e17f0b015877a0212e2a4a2579fcabb8da..440105e57870e17ad46ffd1072b2767ec42509c4 100644 (file)
@@ -36,17 +36,17 @@ public interface RubyIssueService extends ServerComponent {
   /**
    * Search for an issue by its key.
    * <p/>
-   * Ruby example: {@code Api.issues.find('ABCDE-12345')}
+   * Ruby example: <code>result = Api.issues.find('ABCDE-12345')</code>
    */
   IssueQueryResult find(String issueKey);
 
   /**
    * Search for issues.
    * <p/>
-   * Ruby example: {@code Api.issues.find({'statuses' => ['OPEN', 'RESOLVED'], 'assignees' => 'john,carla')}.
+   * Ruby example: <code>Api.issues.find({'statuses' => ['OPEN', 'RESOLVED'], 'assignees' => 'john,carla')}</code>
    * <p/>
-   * <b>Keys of parameters must be Ruby strings but not symbols</b>. Multi-value parameters can be arrays ({@code ['OPEN', 'RESOLVED']}) or
-   * comma-separated list of strings ({@code 'OPEN,RESOLVED'}).
+   * <b>Keys of parameters must be Ruby strings but not symbols</b>. Multi-value parameters can be arrays (<code>['OPEN', 'RESOLVED']</code>) or
+   * comma-separated list of strings (<code>'OPEN,RESOLVED'</code>).
    * <p/>
    * Optional parameters are:
    * <ul>
index a797d20106c76db554af4b0e45e0ca8609ff2a3c..3f1c50fc3b0f9f45ef646fe4e3b23b885c7673b0 100644 (file)
@@ -29,18 +29,20 @@ import java.util.List;
 
 import static com.google.common.collect.Lists.newArrayList;
 
+/**
+ * @since 3.6
+ */
 public class Action {
 
   private final String key;
   private final List<Condition> conditions;
   private final List<Function> functions;
 
-  public Action(String key) {
+  Action(String key) {
+    Preconditions.checkArgument(!Strings.isNullOrEmpty(key), "Action key must be set");
     this.key = key;
     this.conditions = newArrayList();
     this.functions = newArrayList();
-
-    Preconditions.checkArgument(!Strings.isNullOrEmpty(key), "Action key must be set");
   }
 
   public String key() {
index ae6ccb0e2cbe208baf65cf01e0b17d0e63607283..585224148167e9d6b121f22acf1cb59795285fe7 100644 (file)
@@ -25,6 +25,9 @@ import java.util.List;
 
 import static com.google.common.collect.Lists.newArrayList;
 
+/**
+ * @since 3.6
+ */
 public class Actions implements ServerExtension {
 
   private final List<Action> actions;
index d6386e9ed8b7ea917948a2ecb5efcbeee84f1c2a..cb99f21d8e3f72716a24c2668213b9f4b9d02e2e 100644 (file)
  */
 package org.sonar.api.issue.condition;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import org.sonar.api.issue.Issue;
 
 /**
- * @since 3.1
+ * @since 3.6
  */
-@Beta
 public final class HasIssuePropertyCondition implements Condition {
 
   private final String propertyKey;
index 5ba60e544d1a8bd0a46487404df59a8aea284954..0a4ba0394e804a11e42057ea047b23e842458663 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.api.issue.internal;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -35,7 +36,6 @@ import org.sonar.api.rule.Severity;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
-
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.Date;
@@ -43,6 +43,8 @@ import java.util.List;
 import java.util.Map;
 
 /**
+ * PLUGINS MUST NOT BE USED THIS CLASS, EXCEPT FOR UNIT TESTING.
+ *
  * @since 3.6
  */
 public class DefaultIssue implements Issue {
@@ -275,9 +277,9 @@ public class DefaultIssue implements Issue {
   /**
    * True when one of the following conditions is true :
    * <ul>
-   *   <li>the related component has been deleted or renamed</li>
-   *   <li>the rule has been deleted (eg. on plugin uninstall)</li>
-   *   <li>the rule has been disabled in the Quality profile</li>
+   * <li>the related component has been deleted or renamed</li>
+   * <li>the rule has been deleted (eg. on plugin uninstall)</li>
+   * <li>the rule has been disabled in the Quality profile</li>
    * </ul>
    */
   public boolean isEndOfLife() {
@@ -384,7 +386,10 @@ public class DefaultIssue implements Issue {
 
   @SuppressWarnings("unchcked")
   public List<IssueComment> comments() {
-    return Objects.firstNonNull(comments, Collections.<IssueComment>emptyList());
+    if (comments == null) {
+      return Collections.emptyList();
+    }
+    return ImmutableList.copyOf(comments);
   }
 
   @CheckForNull
index 318b6c7117e5da4b87ca20f7050d0633f1c476d2..2418943cc3d7c5308c87e886fecbdedd6839810d 100644 (file)
@@ -29,6 +29,8 @@ import java.util.Date;
 import java.util.UUID;
 
 /**
+ * PLUGINS MUST NOT BE USED THIS CLASS, EXCEPT FOR UNIT TESTING.
+ *
  * @since 3.6
  */
 public class DefaultIssueComment implements Serializable, IssueComment {
index b0d44ee6bf94daa38bb1328959704667c38ecd08..9d954cbd77a9be572ea8a0ecc5d548080dfca0d4 100644 (file)
@@ -30,6 +30,8 @@ import java.util.Date;
 import java.util.Map;
 
 /**
+ * PLUGINS MUST NOT BE USED THIS CLASS, EXCEPT FOR UNIT TESTING.
+ *
  * @since 3.6
  */
 public class FieldDiffs implements Serializable {
index 1e462235a962e1a5b25cbb2de923d6d5c9f52464..e8a0b6cef3afcd89c94d59faa00d757030e747f0 100644 (file)
@@ -26,13 +26,15 @@ import java.io.Serializable;
 import java.util.Date;
 
 /**
+ * PLUGINS MUST NOT BE USED THIS CLASS, EXCEPT FOR UNIT TESTING.
+ *
  * @since 3.6
  */
 public class IssueChangeContext implements Serializable {
 
-  private String login;
-  private Date date;
-  private boolean scan;
+  private final String login;
+  private final Date date;
+  private final boolean scan;
 
   private IssueChangeContext(@Nullable String login, Date date, boolean scan) {
     this.login = login;
index 247e60d41d2c4fc3416ac9b4beb3349c9d25f263..b50e7f32594d0d904390925474ce15ec600e0af2 100644 (file)
@@ -22,6 +22,9 @@ package org.sonar.api.issue.internal;
 import com.google.common.collect.ImmutableMap;
 import org.apache.commons.lang.StringUtils;
 import org.junit.Test;
+import org.sonar.api.issue.IssueComment;
+
+import java.util.List;
 
 import static org.fest.assertions.Assertions.assertThat;
 import static org.fest.assertions.Fail.fail;
@@ -112,4 +115,21 @@ public class DefaultIssueTest {
     assertThat(a1).isNotEqualTo(b);
     assertThat(a1.hashCode()).isEqualTo(a1.hashCode());
   }
+
+  @Test
+  public void comments_should_not_be_modifiable() throws Exception {
+    DefaultIssue issue = new DefaultIssue().setKey("AAA");
+
+    List<IssueComment> comments = issue.comments();
+    assertThat(comments).isEmpty();
+
+    try {
+      comments.add(new DefaultIssueComment());
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // ok
+    } catch (Exception e) {
+      fail("Unexpected exception: " + e);
+    }
+  }
 }
index 38838e178331d3abae2fedb7499cce1b641e81df..1e4831301adec0a0f172ba020cd7969e950d0e3d 100644 (file)
@@ -49,13 +49,13 @@ import static org.mockito.Mockito.*;
 
 public class ActionServiceTest {
 
-  private DefaultIssueFinder finder;
-  private IssueStorage issueStorage;
-  private IssueUpdater updater;
-  private PropertiesDao propertiesDao;
-  private Settings settings;
-  private Actions actions;
-  private ActionService actionService;
+  DefaultIssueFinder finder;
+  IssueStorage issueStorage;
+  IssueUpdater updater;
+  PropertiesDao propertiesDao;
+  Settings settings;
+  Actions actions;
+  ActionService actionService;
 
   @Before
   public void before() {
@@ -124,7 +124,7 @@ public class ActionServiceTest {
       actionService.execute("ABCD", "link-to-jira", mock(UserSession.class));
       fail();
     } catch (Exception e) {
-      assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("No issue");
+      assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("No issue");
     }
     verifyZeroInteractions(function);
   }
@@ -187,7 +187,7 @@ public class ActionServiceTest {
       actionService.listAvailableActions("ABCD");
       fail();
     } catch (Exception e) {
-      assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("No issue");
+      assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("No issue");
     }
   }