]> source.dussan.org Git - sonarqube.git/blob
3535f8e277d09290d5916002d05b0280cabee684
[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.formula.counter;
21
22 import java.util.Arrays;
23 import java.util.Optional;
24 import javax.annotation.Nullable;
25 import org.sonar.server.computation.task.projectanalysis.formula.Counter;
26 import org.sonar.server.computation.task.projectanalysis.measure.MeasureVariations;
27 import org.sonar.server.computation.task.projectanalysis.period.Period;
28 import org.sonar.server.computation.task.projectanalysis.period.PeriodsHolder;
29 import org.sonar.server.computation.task.projectanalysis.qualitymodel.RatingGrid.Rating;
30
31 import static org.sonar.server.computation.task.projectanalysis.period.PeriodsHolder.MAX_NUMBER_OF_PERIODS;
32
33 /**
34  * Convenience class wrapping a rating.
35  * It also allows to compute the value of a MeasureVariation as a rating, and add a check to know if it is has ever been set.
36  * <p>
37  * Basically, this class will be used in a {@link Counter} implementation as an array property which can be easily
38  * created using method {@link #newArray()}.
39  * </p>
40  */
41 public class RatingVariationValue {
42   private boolean set = false;
43   private Rating value = Rating.A;
44
45   /**
46    * @return the current RatingVariationValue so that chained calls on a specific RatingVariationValue instance can be done
47    */
48   public RatingVariationValue increment(Rating rating) {
49     if (value.compareTo(rating) > 0) {
50       value = rating;
51     }
52     this.set = true;
53     return this;
54   }
55
56   /**
57    * @return the current RatingVariationValue so that chained calls on a specific RatingVariationValue instance can be done
58    */
59   public RatingVariationValue increment(@Nullable RatingVariationValue value) {
60     if (value != null && value.isSet()) {
61       increment(value.value);
62     }
63     return this;
64   }
65
66   public boolean isSet() {
67     return set;
68   }
69
70   public Rating getValue() {
71     return value;
72   }
73
74   /**
75    * Creates a new Array of {@link RatingVariationValue} of size {@link PeriodsHolder#MAX_NUMBER_OF_PERIODS},
76    * initialized with newly creates {@link RatingVariationValue} instances.
77    */
78   public static Array newArray() {
79     return new Array();
80   }
81
82   public static class Array {
83     private final RatingVariationValue[] values;
84
85     public Array() {
86       this.values = new RatingVariationValue[MAX_NUMBER_OF_PERIODS];
87       for (int i = 0; i < MAX_NUMBER_OF_PERIODS; i++) {
88         this.values[i] = new RatingVariationValue();
89       }
90     }
91
92     public RatingVariationValue get(Period period) {
93       return values[period.getIndex() - 1];
94     }
95
96     /**
97     * @return the current Array, so that chained calls on a specific Array instance can be done
98     */
99     public Array increment(Period period, Rating value) {
100       this.values[period.getIndex() - 1].increment(value);
101       return this;
102     }
103
104     /**
105     * @return the current Array, so that chained calls on a specific Array instance can be done
106     */
107     public Array incrementAll(Array source) {
108       for (int i = 0; i < this.values.length; i++) {
109         if (source.values[i].isSet()) {
110           this.values[i].increment(source.values[i]);
111         }
112       }
113       return this;
114     }
115
116     /**
117     * Creates a new MeasureVariations from the current array.
118     */
119     public Optional<MeasureVariations> toMeasureVariations() {
120       if (!isAnySet()) {
121         return Optional.empty();
122       }
123       Double[] variations = new Double[values.length];
124       for (int i = 0; i < values.length; i++) {
125         if (values[i].isSet()) {
126           variations[i] = (double) values[i].getValue().getIndex();
127         }
128       }
129       return Optional.of(new MeasureVariations(variations));
130     }
131
132     private boolean isAnySet() {
133       return Arrays.stream(values).anyMatch(RatingVariationValue::isSet);
134     }
135   }
136 }