Skip to content

Commit 1139795

Browse files
committed
Updated to Java 21 and some dependencies, fixed pom, updated documentation
1 parent d114950 commit 1139795

18 files changed

+184
-16036
lines changed

backend/pom.xml

+37-22
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,16 @@
11
<?xml version="1.0"?>
22
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
33
<modelVersion>4.0.0</modelVersion>
4-
<groupId>org.example</groupId>
4+
<parent>
5+
<groupId>org.example</groupId>
6+
<artifactId>application</artifactId>
7+
<version>1.0.0-SNAPSHOT</version>
8+
</parent>
59
<artifactId>app</artifactId>
610
<description>quarkus-demo-app-backend</description>
7-
<version>1.0.0-SNAPSHOT</version>
811
<!--
912
https://code.quarkus.io/?g=org.example&a=demo&e=resteasy-reactive-jsonb&e=spring-data-jpa&e=flyway&e=jdbc-postgresql&e=smallrye-jwt
1013
-->
11-
<properties>
12-
<compiler-plugin.version>3.8.1</compiler-plugin.version>
13-
<maven.compiler.release>11</maven.compiler.release>
14-
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15-
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
16-
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
17-
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
18-
<quarkus.platform.version>2.12.2.Final</quarkus.platform.version>
19-
20-
<!-- Run integration tests by default -->
21-
<skipITs>false</skipITs>
22-
<surefire-plugin.version>3.0.0-M7</surefire-plugin.version>
23-
<mapstruct.version>1.4.2.Final</mapstruct.version>
24-
<querydsl.version>4.3.1</querydsl.version>
25-
</properties>
2614
<dependencyManagement>
2715
<dependencies>
2816
<dependency>
@@ -39,6 +27,10 @@
3927
<groupId>io.quarkus</groupId>
4028
<artifactId>quarkus-resteasy-reactive-jsonb</artifactId>
4129
</dependency>
30+
<dependency>
31+
<groupId>io.quarkus</groupId>
32+
<artifactId>quarkus-rest-client-reactive-jsonb</artifactId>
33+
</dependency>
4234
<dependency>
4335
<groupId>io.quarkus</groupId>
4436
<artifactId>quarkus-flyway</artifactId>
@@ -77,7 +69,7 @@
7769
</dependency>
7870
<dependency>
7971
<groupId>io.quarkus</groupId>
80-
<artifactId>quarkus-rest-client-reactive-jackson</artifactId>
72+
<artifactId>quarkus-smallrye-fault-tolerance</artifactId>
8173
</dependency>
8274
<dependency>
8375
<groupId>io.quarkus</groupId>
@@ -98,12 +90,14 @@
9890
<groupId>com.querydsl</groupId>
9991
<artifactId>querydsl-jpa</artifactId>
10092
<version>${querydsl.version}</version>
93+
<classifier>jakarta</classifier>
10194
</dependency>
10295
<dependency>
10396
<groupId>com.querydsl</groupId>
10497
<artifactId>querydsl-apt</artifactId>
10598
<scope>provided</scope>
10699
<version>${querydsl.version}</version>
100+
<classifier>jakarta</classifier>
107101
</dependency>
108102

109103
<!-- Test -->
@@ -125,19 +119,30 @@
125119
<dependency>
126120
<groupId>net.javacrumbs.json-unit</groupId>
127121
<artifactId>json-unit</artifactId>
128-
<version>2.36.0</version>
122+
<version>${json-unit-assertj.version}</version>
129123
<scope>test</scope>
130124
</dependency>
131125
<dependency>
132126
<groupId>net.javacrumbs.json-unit</groupId>
133127
<artifactId>json-unit-assertj</artifactId>
134-
<version>2.36.0</version>
128+
<version>${json-unit-assertj.version}</version>
135129
<scope>test</scope>
136130
</dependency>
137131
<dependency>
138132
<groupId>org.assertj</groupId>
139133
<artifactId>assertj-core</artifactId>
140-
<version>3.23.1</version>
134+
<version>${assertj-core.version}</version>
135+
<scope>test</scope>
136+
</dependency>
137+
<dependency>
138+
<groupId>io.quarkus</groupId>
139+
<artifactId>quarkus-rest-client-reactive-jackson</artifactId>
140+
<scope>test</scope>
141+
</dependency>
142+
<dependency>
143+
<groupId>org.wiremock</groupId>
144+
<artifactId>wiremock</artifactId>
145+
<version>${wiremock.version}</version>
141146
<scope>test</scope>
142147
</dependency>
143148
</dependencies>
@@ -161,7 +166,7 @@
161166
<plugin>
162167
<groupId>com.mysema.maven</groupId>
163168
<artifactId>apt-maven-plugin</artifactId>
164-
<version>1.1.3</version>
169+
<version>${apt-maven-plugin.version}</version>
165170
<executions>
166171
<execution>
167172
<phase>generate-sources</phase>
@@ -182,6 +187,14 @@
182187
<compilerArgs>
183188
<arg>-parameters</arg>
184189
</compilerArgs>
190+
<annotationProcessorPaths>
191+
<path>
192+
<groupId>org.mapstruct</groupId>
193+
<artifactId>mapstruct-processor</artifactId>
194+
<version>${mapstruct.version}</version>
195+
</path>
196+
</annotationProcessorPaths>
197+
<release>${java.version}</release>
185198
</configuration>
186199
</plugin>
187200
<plugin>
@@ -190,6 +203,7 @@
190203
<configuration>
191204
<systemPropertyVariables>
192205
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
206+
<!--suppress UnresolvedMavenProperty -->
193207
<maven.home>${maven.home}</maven.home>
194208
</systemPropertyVariables>
195209
</configuration>
@@ -207,6 +221,7 @@
207221
<systemPropertyVariables>
208222
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
209223
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
224+
<!--suppress UnresolvedMavenProperty -->
210225
<maven.home>${maven.home}</maven.home>
211226
</systemPropertyVariables>
212227
</configuration>

backend/src/main/java/org/example/app/general/dataaccess/ApplicationPersistenceEntity.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package org.example.app.general.dataaccess;
22

3-
import javax.persistence.GeneratedValue;
4-
import javax.persistence.Id;
5-
import javax.persistence.MappedSuperclass;
6-
import javax.persistence.Version;
7-
3+
import jakarta.persistence.GeneratedValue;
4+
import jakarta.persistence.GenerationType;
5+
import jakarta.persistence.Id;
6+
import jakarta.persistence.MappedSuperclass;
7+
import jakarta.persistence.SequenceGenerator;
8+
import jakarta.persistence.Version;
89
import org.example.app.general.common.ApplicationEntity;
910

1011
/**
@@ -14,7 +15,8 @@
1415
public abstract class ApplicationPersistenceEntity implements ApplicationEntity {
1516

1617
@Id
17-
@GeneratedValue
18+
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hibernate_sequence")
19+
@SequenceGenerator(name = "hibernate_sequence", sequenceName = "hibernate_sequence", allocationSize = 1, initialValue = 1000000)
1820
private Long id;
1921

2022
@Version

backend/src/main/java/org/example/app/general/dataaccess/ApplicationQueryFragment.java

+35-54
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package org.example.app.general.dataaccess;
22

3-
import java.util.ArrayList;
4-
import java.util.Collections;
5-
import java.util.List;
6-
import java.util.Locale;
7-
8-
import javax.inject.Inject;
9-
import javax.persistence.EntityManager;
10-
3+
import com.querydsl.core.FilteredClause;
4+
import com.querydsl.core.support.QueryBase;
5+
import com.querydsl.core.types.OrderSpecifier;
6+
import com.querydsl.core.types.dsl.BooleanExpression;
7+
import com.querydsl.core.types.dsl.ComparableExpressionBase;
8+
import com.querydsl.core.types.dsl.Expressions;
9+
import com.querydsl.core.types.dsl.SimpleExpression;
10+
import com.querydsl.core.types.dsl.StringExpression;
11+
import com.querydsl.jpa.impl.JPAQuery;
12+
import jakarta.inject.Inject;
13+
import jakarta.persistence.EntityManager;
1114
import org.example.app.general.common.search.LikePatternSyntax;
1215
import org.example.app.general.common.search.SearchCriteria;
1316
import org.example.app.general.common.search.SortOrderBy;
@@ -20,16 +23,11 @@
2023
import org.springframework.data.domain.PageImpl;
2124
import org.springframework.data.domain.Pageable;
2225

23-
import com.google.common.base.Function;
24-
import com.querydsl.core.FilteredClause;
25-
import com.querydsl.core.support.QueryBase;
26-
import com.querydsl.core.types.OrderSpecifier;
27-
import com.querydsl.core.types.dsl.BooleanExpression;
28-
import com.querydsl.core.types.dsl.ComparableExpressionBase;
29-
import com.querydsl.core.types.dsl.Expressions;
30-
import com.querydsl.core.types.dsl.SimpleExpression;
31-
import com.querydsl.core.types.dsl.StringExpression;
32-
import com.querydsl.jpa.impl.JPAQuery;
26+
import java.util.ArrayList;
27+
import java.util.Collections;
28+
import java.util.List;
29+
import java.util.Locale;
30+
import java.util.function.Function;
3331

3432
/**
3533
* Abstract base class for query fragment of spring-data repository.
@@ -107,52 +105,37 @@ protected BooleanExpression newStringClause(StringExpression expression, String
107105
}
108106
String v = value;
109107
if (v == null) {
110-
switch (operator) {
111-
case LIKE:
112-
case EQ:
113-
return expression.isNull();
114-
case NE:
115-
return expression.isNotNull();
116-
default:
117-
throw new IllegalArgumentException("Operator " + operator + " does not accept null!");
118-
}
108+
return switch (operator) {
109+
case LIKE, EQ -> expression.isNull();
110+
case NE -> expression.isNotNull();
111+
default -> throw new IllegalArgumentException("Operator " + operator + " does not accept null!");
112+
};
119113
} else if (v.isEmpty()) {
120114
switch (operator) {
121-
case LIKE:
122-
case EQ:
115+
case LIKE, EQ:
123116
return expression.isEmpty();
124-
case NOT_LIKE:
125-
case NE:
117+
case NOT_LIKE, NE:
126118
return expression.isNotEmpty();
127119
default:
128-
// continue;
120+
// continue
129121
}
130122
}
131123
StringExpression exp = expression;
132124
if (ignoreCase) {
133125
v = v.toUpperCase(Locale.US);
134126
exp = exp.upper();
135127
}
136-
switch (operator) {
137-
case LIKE:
138-
return newLikeClause(exp, v, syntax, false, matchSubstring, false);
139-
case NOT_LIKE:
140-
return newLikeClause(exp, v, syntax, false, matchSubstring, true);
141-
case EQ:
142-
return exp.eq(v);
143-
case NE:
144-
return exp.ne(v);
145-
case LT:
146-
return exp.lt(v);
147-
case LE:
148-
return exp.loe(v);
149-
case GT:
150-
return exp.gt(v);
151-
case GE:
152-
return exp.goe(v);
153-
default:
154-
throw new IllegalStateException("" + operator);
155-
}
128+
return switch (operator) {
129+
case LIKE -> newLikeClause(exp, v, syntax, false, matchSubstring, false);
130+
case NOT_LIKE -> newLikeClause(exp, v, syntax, false, matchSubstring, true);
131+
case EQ -> exp.eq(v);
132+
case NE -> exp.ne(v);
133+
case LT -> exp.lt(v);
134+
case LE -> exp.loe(v);
135+
case GT -> exp.gt(v);
136+
case GE -> exp.goe(v);
137+
default -> throw new IllegalStateException("" + operator);
138+
};
156139
}
157140

158141
/**
@@ -398,13 +381,11 @@ protected <E> Page<E> findPaginated(SearchCriteria criteria, JPAQuery<E> query)
398381
offset = pageable.getOffset();
399382
query.offset(offset);
400383
query.limit(pageable.getPageSize());
401-
// applySort(query, pageable.getSort());
402384
}
403385
List<E> hits = query.fetch();
404386
if (total == -1) {
405387
total = offset + hits.size();
406388
}
407389
return new PageImpl<>(hits, pageable, total);
408390
}
409-
410391
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Default configuration for this application
22
# Values will apply for all environments unless overridden by environment (in $PWD/config/application.properties)
3-
# Do not put any environment specific settings here.
3+
# or prefixed with %dev. or %test.
44

55
quarkus.datasource.db-kind = postgresql
66
quarkus.datasource.username = quarkus
@@ -9,17 +9,31 @@ quarkus.datasource.password = quarkus
99
quarkus.flyway.create-schemas=true
1010
quarkus.flyway.migrate-at-start=true
1111

12-
%dev.quarkus.http.cors=true
13-
%dev.quarkus.http.cors.origins=http://localhost:3000,http://localhost:8080
14-
%dev.quarkus.http.cors.headers=accept, authorization, content-type, x-requested-with
15-
%dev.quarkus.http.cors.methods=GET, POST, OPTIONS
12+
quarkus.http.cors=true
13+
quarkus.http.cors.origins=http://localhost:3000,http://localhost:8080
14+
quarkus.http.cors.headers=accept, authorization, content-type, x-requested-with
15+
quarkus.http.cors.methods=GET, POST, OPTIONS
1616

1717
%dev.quarkus.devservices.enabled=true
1818
%dev.quarkus.hibernate-orm.log.sql=true
1919
%dev.quarkus.hibernate-orm.validate-in-dev-mode=true
2020
%dev.quarkus.flyway.schemas=quarkus
2121

22-
quarkus.jackson.serialization-inclusion=NON_NULL
22+
quarkus.rest-client.bored-api.url=https://www.boredapi.com/api/
23+
%test.quarkus.rest-client.logging.scope=request-response
24+
%dev.quarkus.rest-client.logging.scope=request-response
25+
quarkus.log.category."org.jboss.resteasy.reactive.client.logging".level=DEBUG
2326

24-
%test.quarkus.devservices.enabled=true
25-
%test.quarkus.flyway.schemas=public
27+
# OpenAPI
28+
quarkus.smallrye-openapi.info-title=Task API
29+
%dev.quarkus.smallrye-openapi.info-title=Task API (development)
30+
%test.quarkus.smallrye-openapi.info-title=Task API (test)
31+
quarkus.smallrye-openapi.info-version=1.0.0
32+
quarkus.smallrye-openapi.info-description=A service to manage tasks
33+
quarkus.smallrye-openapi.info-contact-email=[email protected]
34+
quarkus.smallrye-openapi.info-contact-name=Task API Support
35+
quarkus.smallrye-openapi.info-contact-url=http://exampleurl.com/contact
36+
quarkus.smallrye-openapi.operation-id-strategy=method
37+
38+
# Generate OpenAPI spec at build-time (can be grabbed and published in schema repository by CI process)
39+
quarkus.smallrye-openapi.store-schema-directory=target/openapi

documentation/access-control.asciidoc

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
:toc: macro
22
toc::[]
33

4-
= Access-Control
4+
== Access-Control
55

66
Now, we will create the authorization for our application.
77
We will learn how to create permission and groups as well as how to apply permisions to business logic.
88

9-
== Authentication
9+
=== Authentication
1010

1111
The authentication will happen via IAM where we use keycloak.
1212
To integrate this into our application all we need to do is adding these dependencies to our `backend/pom.xml`:
@@ -23,12 +23,12 @@ To integrate this into our application all we need to do is adding these depende
2323
</dependency>
2424
----
2525

26-
== Authorization
26+
=== Authorization
2727

2828
We have already prepared the class `ApplicationAccessControlConfig` for you containing the available permissions of our application.
2929
Next we extend our use-cases with authorization so they can only be executed by users with the required permission.
3030

31-
=== Use-Cases
31+
==== Use-Cases
3232

3333
All we need to do is to annotate all our public use-case methods with `@RolesAllowed` specifying the according permission as in the following example:
3434

@@ -45,7 +45,7 @@ public class UcDeleteTaskItem {
4545
// ...
4646
----
4747

48-
=== Test
48+
==== Test
4949

5050
Now, we want to test our authorization via JUnit.
5151
All we need to do is add the following annotation to our use-case test methods as in the following example:
@@ -61,7 +61,7 @@ public void testDeleteTaskItem() {
6161

6262
If have not yet created tests for use-cases, create them now.
6363

64-
=== Links
64+
==== Links
6565

6666
* https://github.com/devonfw/devon4j/blob/develop/documentation/guide-access-control.asciidoc#access-control[devon4j: Access-Control]
6767
* https://github.com/devonfw/devon4j/blob/develop/documentation/guide-security.asciidoc#security[devon4j: Security]

0 commit comments

Comments
 (0)