Repository navigation
Expand file tree
/
Copy pathpom.xml
More file actions
224 lines (210 loc) · 13 KB
/
Copy pathpom.xml
File metadata and controls
224 lines (210 loc) · 13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>eu.happycoders</groupId>
<artifactId>java-streams-examples</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<java.version>25</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Dependency versions -->
<junit.jupiter.version>6.1.3</junit.jupiter.version>
<assertj.version>3.27.7</assertj.version>
<mockito.version>5.24.0</mockito.version>
<!-- Plugin versions -->
<surefire-plugin.version>3.6.0</surefire-plugin.version>
<spotless.version>3.10.3</spotless.version>
<google-java-format.version>1.36.1</google-java-format.version>
<jacoco.version>0.8.15</jacoco.version>
<!-- SonarQube Cloud setup -->
<sonar.projectKey>SvenWoltmann_java-streams-examples</sonar.projectKey>
<sonar.organization>svenwoltmann</sonar.organization>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<sonar.coverage.jacoco.xmlReportPaths>${project.reporting.outputDirectory}/jacoco-ut/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
<!-- The classes are the runnable listings of the article; there is nothing to unit-test in them. -->
<sonar.coverage.exclusions>**/*.java</sonar.coverage.exclusions>
<sonar.issue.ignore.multicriteria>e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21,e22</sonar.issue.ignore.multicriteria>
<!-- The examples print their results; System.out is the program's output, not logging. -->
<sonar.issue.ignore.multicriteria.e1.ruleKey>java:S106</sonar.issue.ignore.multicriteria.e1.ruleKey>
<sonar.issue.ignore.multicriteria.e1.resourceKey>**/*.java</sonar.issue.ignore.multicriteria.e1.resourceKey>
<!-- peek() is the subject of the peek() and lazy-evaluation chapters; the article shows what it prints. -->
<sonar.issue.ignore.multicriteria.e2.ruleKey>java:S3864</sonar.issue.ignore.multicriteria.e2.ruleKey>
<sonar.issue.ignore.multicriteria.e2.resourceKey>**/*.java</sonar.issue.ignore.multicriteria.e2.resourceKey>
<!-- Ch5Terminal adds to the unmodifiable list on purpose: the UnsupportedOperationException is the point of the listing. -->
<sonar.issue.ignore.multicriteria.e3.ruleKey>javabugs:S6322</sonar.issue.ignore.multicriteria.e3.ruleKey>
<sonar.issue.ignore.multicriteria.e3.resourceKey>**/Ch5Terminal.java</sonar.issue.ignore.multicriteria.e3.resourceKey>
<!-- Ch6Lazy and Ch8Mistakes reuse a consumed stream on purpose: the IllegalStateException is the point of the listing. -->
<sonar.issue.ignore.multicriteria.e4.ruleKey>javabugs:S3959</sonar.issue.ignore.multicriteria.e4.ruleKey>
<sonar.issue.ignore.multicriteria.e4.resourceKey>**/Ch*.java</sonar.issue.ignore.multicriteria.e4.resourceKey>
<!-- Ch2Lambdas shows the anonymous class and the plain lambda first; the next section of the article converts them into a lambda and a method reference. -->
<sonar.issue.ignore.multicriteria.e5.ruleKey>java:S1604</sonar.issue.ignore.multicriteria.e5.ruleKey>
<sonar.issue.ignore.multicriteria.e5.resourceKey>**/Ch2Lambdas.java</sonar.issue.ignore.multicriteria.e5.resourceKey>
<sonar.issue.ignore.multicriteria.e6.ruleKey>java:S9357</sonar.issue.ignore.multicriteria.e6.ruleKey>
<sonar.issue.ignore.multicriteria.e6.resourceKey>**/Ch2Lambdas.java</sonar.issue.ignore.multicriteria.e6.resourceKey>
<sonar.issue.ignore.multicriteria.e7.ruleKey>java:S1612</sonar.issue.ignore.multicriteria.e7.ruleKey>
<sonar.issue.ignore.multicriteria.e7.resourceKey>**/Ch2Lambdas.java</sonar.issue.ignore.multicriteria.e7.resourceKey>
<!-- The chapters of the lambda article below. Each of these rules describes what one of its
listings deliberately shows; the article names the same thing as the lesson. -->
<!-- Ch3TargetType discards the result of trim() in a block body: that is what makes the lambda
a Consumer and picks the Consumer overload - the subject of the "overloaded methods" section. -->
<sonar.issue.ignore.multicriteria.e8.ruleKey>java:S2201</sonar.issue.ignore.multicriteria.e8.ruleKey>
<sonar.issue.ignore.multicriteria.e8.resourceKey>**/lambdas/Ch3TargetType.java</sonar.issue.ignore.multicriteria.e8.resourceKey>
<!-- Ch1AnonymousVsLambda is the before/after of the article's first diagram: the anonymous class
stands next to the lambda it becomes. -->
<sonar.issue.ignore.multicriteria.e9.ruleKey>java:S1604</sonar.issue.ignore.multicriteria.e9.ruleKey>
<sonar.issue.ignore.multicriteria.e9.resourceKey>**/lambdas/Ch1AnonymousVsLambda.java</sonar.issue.ignore.multicriteria.e9.resourceKey>
<sonar.issue.ignore.multicriteria.e10.ruleKey>java:S9357</sonar.issue.ignore.multicriteria.e10.ruleKey>
<sonar.issue.ignore.multicriteria.e10.resourceKey>**/lambdas/Ch1AnonymousVsLambda.java</sonar.issue.ignore.multicriteria.e10.resourceKey>
<!-- The method-reference chapter shows book -> book.title() next to Book::title; one of the two
has to be the lambda Sonar wants replaced. -->
<sonar.issue.ignore.multicriteria.e11.ruleKey>java:S1612</sonar.issue.ignore.multicriteria.e11.ruleKey>
<sonar.issue.ignore.multicriteria.e11.resourceKey>**/lambdas/*.java</sonar.issue.ignore.multicriteria.e11.resourceKey>
<!-- Function, Predicate, and Consumer are the interfaces the article explains; UnaryOperator and
the other specialisations belong to the functional-interfaces article. -->
<sonar.issue.ignore.multicriteria.e12.ruleKey>java:S4276</sonar.issue.ignore.multicriteria.e12.ruleKey>
<sonar.issue.ignore.multicriteria.e12.resourceKey>**/lambdas/*.java</sonar.issue.ignore.multicriteria.e12.resourceKey>
<!-- Code the article shows as "does not compile" stays as a comment next to the working form,
so readers see both. -->
<sonar.issue.ignore.multicriteria.e13.ruleKey>java:S125</sonar.issue.ignore.multicriteria.e13.ruleKey>
<sonar.issue.ignore.multicriteria.e13.resourceKey>**/lambdas/*.java</sonar.issue.ignore.multicriteria.e13.resourceKey>
<!-- LambdaDemo and LambdaTrace keep main(String[] args): the javap output and the stack trace in
the article show that signature. -->
<sonar.issue.ignore.multicriteria.e14.ruleKey>java:S1172</sonar.issue.ignore.multicriteria.e14.ruleKey>
<sonar.issue.ignore.multicriteria.e14.resourceKey>**/lambdas/Lambda*.java</sonar.issue.ignore.multicriteria.e14.resourceKey>
<!-- Ch4VariableAccess counts with stream().forEach() on purpose: the article explains the
race condition of the counter with the parallel stream this pipeline can become. -->
<sonar.issue.ignore.multicriteria.e15.ruleKey>java:S3706</sonar.issue.ignore.multicriteria.e15.ruleKey>
<sonar.issue.ignore.multicriteria.e15.resourceKey>**/lambdas/Ch4VariableAccess.java</sonar.issue.ignore.multicriteria.e15.resourceKey>
<!-- The chapters of the Optional article below. -->
<!-- The listings spell out the book titles, as the article shows them; a constant would put a
name between the reader and the title. -->
<sonar.issue.ignore.multicriteria.e16.ruleKey>java:S1192</sonar.issue.ignore.multicriteria.e16.ruleKey>
<sonar.issue.ignore.multicriteria.e16.resourceKey>**/optional/*.java</sonar.issue.ignore.multicriteria.e16.resourceKey>
<!-- Ch8ValueBased compares Optionals with == and wraps two strings created with new String():
what == returns for them, with and without Valhalla, is the point of the value-based-class
section. -->
<sonar.issue.ignore.multicriteria.e17.ruleKey>java:S8696</sonar.issue.ignore.multicriteria.e17.ruleKey>
<sonar.issue.ignore.multicriteria.e17.resourceKey>**/optional/Ch8ValueBased.java</sonar.issue.ignore.multicriteria.e17.resourceKey>
<sonar.issue.ignore.multicriteria.e18.ruleKey>java:S2129</sonar.issue.ignore.multicriteria.e18.ruleKey>
<sonar.issue.ignore.multicriteria.e18.resourceKey>**/optional/Ch8ValueBased.java</sonar.issue.ignore.multicriteria.e18.resourceKey>
<!-- Ch9Mistakes shows the mistakes of the article's last chapter: an Optional method that
returns null, the NullPointerException it causes, and the plain if next to the Optional
that only replaces it. -->
<sonar.issue.ignore.multicriteria.e19.ruleKey>java:S2789</sonar.issue.ignore.multicriteria.e19.ruleKey>
<sonar.issue.ignore.multicriteria.e19.resourceKey>**/optional/Ch9Mistakes.java</sonar.issue.ignore.multicriteria.e19.resourceKey>
<sonar.issue.ignore.multicriteria.e20.ruleKey>javabugs:S2259</sonar.issue.ignore.multicriteria.e20.ruleKey>
<sonar.issue.ignore.multicriteria.e20.resourceKey>**/optional/Ch9Mistakes.java</sonar.issue.ignore.multicriteria.e20.resourceKey>
<sonar.issue.ignore.multicriteria.e21.ruleKey>java:S2589</sonar.issue.ignore.multicriteria.e21.ruleKey>
<sonar.issue.ignore.multicriteria.e21.resourceKey>**/optional/Ch9Mistakes.java</sonar.issue.ignore.multicriteria.e21.resourceKey>
<!-- The chapters of the parallel streams article below. -->
<!-- Ch5Rules fills an ArrayList from a parallel forEach() on purpose: the lost elements and the
ArrayIndexOutOfBoundsException are the point of the "no shared mutable state" rule. -->
<sonar.issue.ignore.multicriteria.e22.ruleKey>java:S3706</sonar.issue.ignore.multicriteria.e22.ruleKey>
<sonar.issue.ignore.multicriteria.e22.resourceKey>**/parallel/Ch5Rules.java</sonar.issue.ignore.multicriteria.e22.resourceKey>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.16.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!-- Unit test runner -->
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<configuration>
<argLine>${surefireArgLine}</argLine>
</configuration>
</plugin>
<!-- Spotless plugin to verify code style -->
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<version>${spotless.version}</version>
<configuration>
<java>
<googleJavaFormat>
<version>${google-java-format.version}</version>
<style>GOOGLE</style>
</googleJavaFormat>
<lineEndings>UNIX</lineEndings>
</java>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<!-- Use this profile to measure the code coverage with JaCoCo -->
<profile>
<id>test-coverage</id>
<build>
<plugins>
<!-- Measure code coverage with JaCoCo -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<executions>
<execution>
<id>pre-unit-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
<outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>