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.api.batch.sensor.issue.internal;
021    
022    import com.google.common.base.Preconditions;
023    import org.sonar.api.batch.fs.InputDir;
024    import org.sonar.api.batch.fs.InputFile;
025    import org.sonar.api.batch.fs.InputPath;
026    import org.sonar.api.batch.sensor.issue.IssueBuilder;
027    import org.sonar.api.rule.RuleKey;
028    import org.sonar.api.rule.Severity;
029    
030    import javax.annotation.Nullable;
031    
032    public class DefaultIssueBuilder implements IssueBuilder {
033    
034      private static final String INPUT_DIR_SHOULD_BE_NON_NULL = "InputDir should be non null";
035      private static final String INPUT_FILE_SHOULD_BE_NON_NULL = "InputFile should be non null";
036      private static final String ON_FILE_OR_ON_DIR_ALREADY_CALLED = "onFile or onDir already called";
037      private static final String ON_PROJECT_ALREADY_CALLED = "onProject already called";
038      String key;
039      boolean onProject = false;
040      InputPath path;
041      RuleKey ruleKey;
042      String message;
043      Integer line;
044      Double effortToFix;
045      String severity;
046    
047      @Override
048      public DefaultIssueBuilder ruleKey(RuleKey ruleKey) {
049        this.ruleKey = ruleKey;
050        return this;
051      }
052    
053      @Override
054      public DefaultIssueBuilder onFile(InputFile file) {
055        Preconditions.checkState(!this.onProject, ON_PROJECT_ALREADY_CALLED);
056        Preconditions.checkState(this.path == null, ON_FILE_OR_ON_DIR_ALREADY_CALLED);
057        Preconditions.checkNotNull(file, INPUT_FILE_SHOULD_BE_NON_NULL);
058        this.path = file;
059        return this;
060      }
061    
062      @Override
063      public DefaultIssueBuilder onDir(InputDir dir) {
064        Preconditions.checkState(!this.onProject, ON_PROJECT_ALREADY_CALLED);
065        Preconditions.checkState(this.path == null, ON_FILE_OR_ON_DIR_ALREADY_CALLED);
066        Preconditions.checkNotNull(dir, INPUT_DIR_SHOULD_BE_NON_NULL);
067        this.path = dir;
068        return this;
069      }
070    
071      @Override
072      public DefaultIssueBuilder onProject() {
073        Preconditions.checkState(!this.onProject, ON_PROJECT_ALREADY_CALLED);
074        Preconditions.checkState(this.path == null, ON_FILE_OR_ON_DIR_ALREADY_CALLED);
075        this.onProject = true;
076        return this;
077      }
078    
079      @Override
080      public DefaultIssueBuilder atLine(int line) {
081        Preconditions.checkState(this.path != null && this.path instanceof InputFile, "atLine should be called after onFile");
082        this.line = line;
083        return this;
084      }
085    
086      @Override
087      public DefaultIssueBuilder effortToFix(@Nullable Double effortToFix) {
088        this.effortToFix = effortToFix;
089        return this;
090      }
091    
092      @Override
093      public DefaultIssueBuilder message(String message) {
094        this.message = message;
095        return this;
096      }
097    
098      @Override
099      public IssueBuilder severity(@Nullable String severity) {
100        Preconditions.checkState(severity == null || Severity.ALL.contains(severity), "Invalid severity: " + severity);
101        this.severity = severity;
102        return this;
103      }
104    
105      /**
106       * For testing only.
107       */
108      public DefaultIssueBuilder withKey(String key) {
109        this.key = key;
110        return this;
111      }
112    
113      @Override
114      public DefaultIssue build() {
115        DefaultIssue result = new DefaultIssue(this);
116        reset();
117        return result;
118      }
119    
120      private void reset() {
121        key = null;
122        onProject = false;
123        path = null;
124        ruleKey = null;
125        message = null;
126        line = null;
127        effortToFix = null;
128        severity = null;
129      }
130    
131    }