]> source.dussan.org Git - sonarqube.git/blob
aa29c2a7d4beb7160cece2d904ae0b12f57a2d71
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2020 SonarSource SA
4  * mailto:info AT sonarsource DOT com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 package org.sonar.ce.task.projectanalysis.component;
21
22 import com.google.common.collect.ImmutableList;
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.Optional;
26 import javax.annotation.CheckForNull;
27 import javax.annotation.Nullable;
28
29 import static com.google.common.base.Preconditions.checkArgument;
30 import static com.google.common.base.Preconditions.checkState;
31 import static java.util.Arrays.asList;
32 import static java.util.Objects.requireNonNull;
33
34 /**
35  * Implementation of {@link Component} to unit test report components.
36  */
37 public class ReportComponent implements Component {
38
39   private static final FileAttributes DEFAULT_FILE_ATTRIBUTES = new FileAttributes(false, null, 1);
40
41   public static final Component DUMB_PROJECT = builder(Type.PROJECT, 1)
42     .setKey("PROJECT_KEY")
43     .setPublicKey("PUBLIC_PROJECT_KEY")
44     .setUuid("PROJECT_UUID")
45     .setName("Project Name")
46     .setProjectVersion("1.0-SNAPSHOT")
47     .build();
48
49   private final Type type;
50   private final Status status;
51   private final String name;
52   private final String shortName;
53   @CheckForNull
54   private final String description;
55   private final String key;
56   private final String publicKey;
57   private final String uuid;
58   private final ProjectAttributes projectAttributes;
59   private final ReportAttributes reportAttributes;
60   private final FileAttributes fileAttributes;
61   private final List<Component> children;
62
63   private ReportComponent(Builder builder) {
64     this.type = builder.type;
65     this.status = builder.status;
66     this.key = builder.key;
67     this.publicKey = builder.publicKey;
68     this.name = builder.name == null ? String.valueOf(builder.key) : builder.name;
69     this.shortName = builder.shortName == null ? this.name : builder.shortName;
70     this.description = builder.description;
71     this.uuid = builder.uuid;
72     this.projectAttributes = Optional.ofNullable(builder.projectVersion)
73       .map(v -> new ProjectAttributes(v, builder.buildString, builder.scmRevisionId))
74       .orElse(null);
75     this.reportAttributes = ReportAttributes.newBuilder(builder.ref)
76       .build();
77     this.fileAttributes = builder.fileAttributes == null ? DEFAULT_FILE_ATTRIBUTES : builder.fileAttributes;
78     this.children = ImmutableList.copyOf(builder.children);
79   }
80
81   @Override
82   public Type getType() {
83     return type;
84   }
85
86   @Override
87   public Status getStatus() {
88     return status;
89   }
90
91   @Override
92   public String getUuid() {
93     if (uuid == null) {
94       throw new UnsupportedOperationException(String.format("Component uuid of ref '%d' has not be fed yet", this.reportAttributes.getRef()));
95     }
96     return uuid;
97   }
98
99   @Override
100   public String getDbKey() {
101     if (key == null) {
102       throw new UnsupportedOperationException(String.format("Component key of ref '%d' has not be fed yet", this.reportAttributes.getRef()));
103     }
104     return key;
105   }
106
107   @Override
108   public String getKey() {
109     if (publicKey == null) {
110       throw new UnsupportedOperationException(String.format("Component key of ref '%d' has not be fed yet", this.reportAttributes.getRef()));
111     }
112     return publicKey;
113   }
114
115   @Override
116   public String getName() {
117     return this.name;
118   }
119
120   @Override
121   public String getShortName() {
122     return this.shortName;
123   }
124
125   @Override
126   @CheckForNull
127   public String getDescription() {
128     return this.description;
129   }
130
131   @Override
132   public List<Component> getChildren() {
133     return children;
134   }
135
136   @Override
137   public ProjectAttributes getProjectAttributes() {
138     checkState(this.type == Type.PROJECT);
139     return this.projectAttributes;
140   }
141
142   @Override
143   public ReportAttributes getReportAttributes() {
144     return this.reportAttributes;
145   }
146
147   @Override
148   public FileAttributes getFileAttributes() {
149     checkState(this.type == Type.FILE, "Only component of type FILE can have a FileAttributes object");
150     return this.fileAttributes;
151   }
152
153   @Override
154   public ProjectViewAttributes getProjectViewAttributes() {
155     throw new IllegalStateException("Only component of type PROJECT_VIEW can have a ProjectViewAttributes object");
156   }
157
158   @Override
159   public SubViewAttributes getSubViewAttributes() {
160     throw new IllegalStateException("Only component of type SUBVIEW have a SubViewAttributes object");
161   }
162
163   @Override
164   public ViewAttributes getViewAttributes() {
165     throw new IllegalStateException("Only component of type VIEW have a ViewAttributes object");
166   }
167
168   @Override
169   public boolean equals(@Nullable Object o) {
170     if (this == o) {
171       return true;
172     }
173     if (o == null || getClass() != o.getClass()) {
174       return false;
175     }
176     ReportComponent that = (ReportComponent) o;
177     return uuid.equals(that.uuid);
178   }
179
180   @Override
181   public int hashCode() {
182     return uuid.hashCode();
183   }
184
185   @Override
186   public String toString() {
187     return "ReportComponent{" +
188       "ref=" + this.reportAttributes.getRef() +
189       ", key='" + key + '\'' +
190       ", type=" + type +
191       '}';
192   }
193
194   public static Builder builder(Type type, int ref) {
195     String key = "key_" + ref;
196     return new Builder(type, ref).setKey(key).setPublicKey(key).setUuid("uuid_" + ref).setName("name_" + ref);
197   }
198
199   public static final class Builder {
200     private final Type type;
201     private final int ref;
202     private Status status;
203     private String uuid;
204     private String key;
205     private String publicKey;
206     private String name;
207     private String shortName;
208     private String projectVersion;
209     private String buildString;
210     private String scmRevisionId;
211     private String description;
212     private FileAttributes fileAttributes;
213     private final List<Component> children = new ArrayList<>();
214
215     private Builder(Type type, int ref) {
216       checkArgument(type.isReportType(), "Component type must be a report type");
217       this.type = type;
218       this.ref = ref;
219       if (type == Type.PROJECT) {
220         this.projectVersion = "toBeDefined";
221       }
222     }
223
224     public Builder setStatus(Status s) {
225       this.status = requireNonNull(s);
226       return this;
227     }
228
229     public Builder setUuid(String s) {
230       this.uuid = requireNonNull(s);
231       return this;
232     }
233
234     public Builder setName(@Nullable String s) {
235       this.name = s;
236       return this;
237     }
238
239     public Builder setShortName(@Nullable String s) {
240       this.shortName = s;
241       return this;
242     }
243
244     public Builder setKey(String s) {
245       this.key = requireNonNull(s);
246       return this;
247     }
248
249     public Builder setPublicKey(String publicKey) {
250       this.publicKey = requireNonNull(publicKey);
251       return this;
252     }
253
254     public Builder setProjectVersion(@Nullable String s) {
255       checkProjectVersion(s);
256       this.projectVersion = s;
257       return this;
258     }
259
260     public Builder setBuildString(@Nullable String buildString) {
261       checkBuildString(buildString);
262       this.buildString = buildString;
263       return this;
264     }
265
266     public Builder setScmRevisionId(@Nullable String scmRevisionId) {
267       this.scmRevisionId = scmRevisionId;
268       return this;
269     }
270
271     public Builder setFileAttributes(FileAttributes fileAttributes) {
272       checkState(type == Type.FILE, "Only Component of type File can have File attributes");
273       this.fileAttributes = fileAttributes;
274       return this;
275     }
276
277     public Builder setDescription(@Nullable String description) {
278       this.description = description;
279       return this;
280     }
281
282     public Builder addChildren(Component... c) {
283       for (Component component : c) {
284         checkArgument(component.getType().isReportType());
285       }
286       this.children.addAll(asList(c));
287       return this;
288     }
289
290     public ReportComponent build() {
291       checkProjectVersion(this.projectVersion);
292       checkBuildString(this.buildString);
293       return new ReportComponent(this);
294     }
295
296     private void checkProjectVersion(@Nullable String s) {
297       checkArgument(type != Type.PROJECT ^ s != null, "Project version must and can only be set on Project");
298     }
299
300     private void checkBuildString(@Nullable String s) {
301       checkArgument(type == Type.PROJECT || s == null, "BuildString can only be set on Project");
302     }
303   }
304 }