]> source.dussan.org Git - sonarqube.git/blob
001576115b0cac65d8cc03103332867f434e17fd
[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.server.qualityprofile.ws;
21
22 import java.util.Arrays;
23 import java.util.Objects;
24 import javax.annotation.Nullable;
25 import org.sonar.api.resources.Language;
26 import org.sonar.api.resources.Languages;
27 import org.sonar.api.server.ws.Request;
28 import org.sonar.api.server.ws.WebService;
29 import org.sonar.core.util.stream.MoreCollectors;
30
31 import static com.google.common.base.Preconditions.checkState;
32 import static java.util.Objects.requireNonNull;
33 import static org.sonarqube.ws.client.qualityprofile.QualityProfileWsParameters.PARAM_LANGUAGE;
34 import static org.sonarqube.ws.client.qualityprofile.QualityProfileWsParameters.PARAM_QUALITY_PROFILE;
35
36 /**
37  * Reference to a Quality profile as defined by requests to web services api/qualityprofiles.
38  * The two exclusive options to reference a profile are:
39  * <ul>
40  * <li>by its id (to be deprecated)</li>
41  * <li>by the tuple {organizationKey, language, name}</li>
42  * </ul>
43  */
44 public class QProfileReference {
45
46   private enum Type {
47     KEY, NAME
48   }
49
50   private final Type type;
51   private final String key;
52   private final String language;
53   private final String name;
54
55   private QProfileReference(Type type, @Nullable String key, @Nullable String language, @Nullable String name) {
56     this.type = type;
57     if (type == Type.KEY) {
58       this.key = requireNonNull(key);
59       this.language = null;
60       this.name = null;
61     } else {
62       this.key = null;
63       this.language = requireNonNull(language);
64       this.name = requireNonNull(name);
65     }
66   }
67
68   /**
69    * @return {@code true} if key is defined and {@link #getKey()} can be called. If {@code false}, then
70    * the couple {language, name} is defined and the methods {@link #getLanguage()}/{@link #getName()}
71    * can be called.
72    */
73   public boolean hasKey() {
74     return type == Type.KEY;
75   }
76
77   /**
78    * @return non-null key
79    * @throws IllegalStateException if {@link #hasKey()} does not return {@code true}
80    */
81   public String getKey() {
82     checkState(key != null, "Key is not defined. Please call hasKey().");
83     return key;
84   }
85
86   /**
87    * @return non-null language
88    * @throws IllegalStateException if {@link #hasKey()} does not return {@code false}
89    */
90   public String getLanguage() {
91     checkState(type == Type.NAME, "Language is not defined. Please call hasKey().");
92     return language;
93   }
94
95   /**
96    * @return non-null name
97    * @throws IllegalStateException if {@link #hasKey()} does not return {@code false}
98    */
99   public String getName() {
100     checkState(type == Type.NAME, "Name is not defined. Please call hasKey().");
101     return name;
102   }
103
104   @Override
105   public boolean equals(Object o) {
106     if (this == o) {
107       return true;
108     }
109     if (o == null || getClass() != o.getClass()) {
110       return false;
111     }
112     QProfileReference that = (QProfileReference) o;
113     return Objects.equals(key, that.key) && Objects.equals(language, that.language) && Objects.equals(name, that.name);
114   }
115
116   @Override
117   public int hashCode() {
118     return Objects.hash(key, language, name);
119   }
120
121   public static QProfileReference fromName(Request request) {
122     String lang = request.mandatoryParam(PARAM_LANGUAGE);
123     String name = request.mandatoryParam(PARAM_QUALITY_PROFILE);
124     return fromName(lang, name);
125   }
126
127   public static QProfileReference fromKey(String key) {
128     return new QProfileReference(Type.KEY, key, null, null);
129   }
130
131   public static QProfileReference fromName(String lang, String name) {
132     return new QProfileReference(Type.NAME, null, requireNonNull(lang), requireNonNull(name));
133   }
134
135   public static void defineParams(WebService.NewAction action, Languages languages) {
136     action.createParam(PARAM_QUALITY_PROFILE)
137       .setDescription("Quality profile name.")
138       .setRequired(true)
139       .setExampleValue("Sonar way");
140
141     action.createParam(PARAM_LANGUAGE)
142       .setDescription("Quality profile language.")
143       .setRequired(true)
144       .setPossibleValues(Arrays.stream(languages.all()).map(Language::getKey).collect(MoreCollectors.toSet()));
145   }
146 }