]> source.dussan.org Git - sonarqube.git/blob
8339fa1e5a28808b89826dc951aec9d30241b5f6
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2016 SonarSource SA
4  * mailto:contact 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.server.computation.task.projectanalysis.component;
21
22 import com.google.common.annotations.VisibleForTesting;
23 import com.google.common.collect.ImmutableList;
24 import java.util.ArrayList;
25 import java.util.List;
26 import javax.annotation.CheckForNull;
27 import javax.annotation.Nullable;
28 import javax.annotation.concurrent.Immutable;
29 import org.sonar.scanner.protocol.output.ScannerReport;
30 import org.sonar.scanner.protocol.output.ScannerReport.Component.ComponentType;
31
32 import static com.google.common.base.Preconditions.checkArgument;
33 import static com.google.common.base.Preconditions.checkNotNull;
34 import static com.google.common.base.Preconditions.checkState;
35 import static java.util.Arrays.asList;
36 import static org.apache.commons.lang.StringUtils.trimToNull;
37
38 @Immutable
39 public class ComponentImpl implements Component {
40   private final Type type;
41   private final String name;
42   private final String key;
43   private final String uuid;
44
45   @CheckForNull
46   private final String description;
47   private final List<Component> children;
48   @CheckForNull
49   private final ReportAttributes reportAttributes;
50   @CheckForNull
51   private final FileAttributes fileAttributes;
52
53   private ComponentImpl(Builder builder) {
54     this.type = builder.type;
55     this.key = builder.key;
56     this.name = builder.name == null ? String.valueOf(builder.key) : builder.name;
57     this.description = builder.description;
58     this.uuid = builder.uuid;
59     this.reportAttributes = builder.reportAttributes;
60     this.fileAttributes = builder.fileAttributes;
61     this.children = ImmutableList.copyOf(builder.children);
62   }
63
64   @Override
65   public Type getType() {
66     return type;
67   }
68
69   @Override
70   public String getUuid() {
71     return uuid;
72   }
73
74   @Override
75   public String getKey() {
76     return key;
77   }
78
79   @Override
80   public String getName() {
81     return this.name;
82   }
83
84   @Override
85   @CheckForNull
86   public String getDescription() {
87     return this.description;
88   }
89
90   @Override
91   public List<Component> getChildren() {
92     return children;
93   }
94
95   @Override
96   public ReportAttributes getReportAttributes() {
97     return this.reportAttributes;
98   }
99
100   @Override
101   public FileAttributes getFileAttributes() {
102     checkState(this.type == Type.FILE, "Only component of type FILE have a FileAttributes object");
103     return this.fileAttributes;
104   }
105
106   @Override
107   public ProjectViewAttributes getProjectViewAttributes() {
108     throw new IllegalStateException("Only component of type PROJECT_VIEW have a FileAttributes object");
109   }
110
111   public static Builder builder(ScannerReport.Component component) {
112     return new Builder(component);
113   }
114
115   public static final class Builder {
116
117     private final Type type;
118     private final ReportAttributes reportAttributes;
119     private String uuid;
120     private String key;
121     private String name;
122     private String description;
123     private FileAttributes fileAttributes;
124     private final List<Component> children = new ArrayList<>();
125
126     private Builder(ScannerReport.Component component) {
127       checkNotNull(component);
128       this.type = convertType(component.getType());
129       this.name = component.getName();
130       this.description = trimToNull(component.getDescription());
131       this.reportAttributes = createBatchAttributes(component);
132       this.fileAttributes = createFileAttributes(component);
133     }
134
135     public Builder setUuid(String s) {
136       this.uuid = checkNotNull(s);
137       return this;
138     }
139
140     public Builder setKey(String s) {
141       this.key = checkNotNull(s);
142       return this;
143     }
144
145     public Builder addChildren(Component... c) {
146       for (Component component : c) {
147         checkArgument(component.getType().isReportType());
148       }
149       this.children.addAll(asList(c));
150       return this;
151     }
152
153     public ComponentImpl build() {
154       checkNotNull(key);
155       checkNotNull(uuid);
156       return new ComponentImpl(this);
157     }
158
159     private static ReportAttributes createBatchAttributes(ScannerReport.Component component) {
160       return ReportAttributes.newBuilder(component.getRef())
161         .setVersion(trimToNull(component.getVersion()))
162         .setPath(trimToNull(component.getPath()))
163         .build();
164     }
165
166     @CheckForNull
167     private static FileAttributes createFileAttributes(ScannerReport.Component component) {
168       if (component.getType() != ComponentType.FILE) {
169         return null;
170       }
171
172       return new FileAttributes(
173         component.getIsTest(),
174         trimToNull(component.getLanguage()));
175     }
176
177     @VisibleForTesting
178     static Type convertType(ComponentType type) {
179       switch (type) {
180         case PROJECT:
181           return Type.PROJECT;
182         case MODULE:
183           return Type.MODULE;
184         case DIRECTORY:
185           return Type.DIRECTORY;
186         case FILE:
187           return Type.FILE;
188         default:
189           throw new IllegalArgumentException("Unsupported ComponentType value " + type);
190       }
191     }
192   }
193
194   @Override
195   public String toString() {
196     return "ComponentImpl{" +
197       "key='" + key + '\'' +
198       ", type=" + type +
199       ", uuid='" + uuid + '\'' +
200       ", name='" + name + '\'' +
201       ", description='" + description + '\'' +
202       ", fileAttributes=" + fileAttributes +
203       ", reportAttributes=" + reportAttributes +
204       '}';
205   }
206
207   @Override
208   public boolean equals(@Nullable Object o) {
209     if (this == o) {
210       return true;
211     }
212     if (o == null || getClass() != o.getClass()) {
213       return false;
214     }
215     ComponentImpl component = (ComponentImpl) o;
216     return uuid.equals(component.uuid);
217   }
218
219   @Override
220   public int hashCode() {
221     return uuid.hashCode();
222   }
223 }