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 }