Skip to content

Commit 03315fe

Browse files
ICKostiantyn.IvanovICKostiantyn.Ivanov
authored andcommitted
BAEL-8891 - Introduction to ActiveJ
1 parent 853a309 commit 03315fe

File tree

9 files changed

+330
-0
lines changed

9 files changed

+330
-0
lines changed

libraries-5/pom.xml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,32 @@
5252
</dependencyManagement>
5353

5454
<dependencies>
55+
<dependency>
56+
<groupId>io.activej</groupId>
57+
<artifactId>activej-http</artifactId>
58+
<version>${activej.version}</version>
59+
</dependency>
60+
<dependency>
61+
<groupId>com.fasterxml.jackson.core</groupId>
62+
<artifactId>jackson-databind</artifactId>
63+
<version>${jackson-databind.version}</version>
64+
</dependency>
65+
<dependency>
66+
<groupId>io.activej</groupId>
67+
<artifactId>activej-inject</artifactId>
68+
<version>${activej.version}</version>
69+
</dependency>
70+
<dependency>
71+
<groupId>io.activej</groupId>
72+
<artifactId>activej-promise</artifactId>
73+
<version>${activej.version}</version>
74+
</dependency>
75+
<dependency>
76+
<groupId>io.activej</groupId>
77+
<artifactId>activej-test</artifactId>
78+
<version>${activej.version}</version>
79+
<scope>test</scope>
80+
</dependency>
5581
<dependency>
5682
<groupId>com.alicp.jetcache</groupId>
5783
<artifactId>jetcache-core</artifactId>
@@ -189,6 +215,8 @@
189215
<armeria.version>1.29.2</armeria.version>
190216
<yauaa.version>7.28.1</yauaa.version>
191217
<yavi.version>0.14.1</yavi.version>
218+
<activej.version>6.0-rc2</activej.version>
219+
<jackson-databind.version>2.17.0</jackson-databind.version>
192220
<sootup.version>1.3.0</sootup.version>
193221
<resilience4j.version>2.1.0</resilience4j.version>
194222
<jline.version>3.28.0</jline.version>
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.baeldung.activej.config;
2+
3+
import com.baeldung.activej.controller.PersonController;
4+
import com.baeldung.activej.repository.PersonRepository;
5+
import com.baeldung.activej.service.PersonService;
6+
import io.activej.inject.annotation.Provides;
7+
import io.activej.inject.module.AbstractModule;
8+
9+
import javax.sql.DataSource;
10+
import java.io.PrintWriter;
11+
import java.sql.Connection;
12+
import java.sql.SQLException;
13+
import java.sql.SQLFeatureNotSupportedException;
14+
import java.util.logging.Logger;
15+
16+
public class PersonModule extends AbstractModule {
17+
18+
@Provides
19+
PersonController personController(PersonService personService) {
20+
return new PersonController(personService);
21+
}
22+
23+
@Provides
24+
PersonService personService(PersonRepository personRepository) {
25+
return new PersonService(personRepository);
26+
}
27+
28+
@Provides
29+
PersonRepository personRepository(DataSource dataSource) {
30+
return new PersonRepository(dataSource);
31+
}
32+
33+
@Provides
34+
DataSource dataSource() {
35+
return new DataSource() {
36+
@Override
37+
public Connection getConnection() throws SQLException {
38+
return null;
39+
}
40+
41+
@Override
42+
public Connection getConnection(String username, String password) throws SQLException {
43+
return null;
44+
}
45+
46+
@Override
47+
public PrintWriter getLogWriter() throws SQLException {
48+
return null;
49+
}
50+
51+
@Override
52+
public void setLogWriter(PrintWriter out) throws SQLException {
53+
54+
}
55+
56+
@Override
57+
public void setLoginTimeout(int seconds) throws SQLException {
58+
59+
}
60+
61+
@Override
62+
public int getLoginTimeout() throws SQLException {
63+
return 0;
64+
}
65+
66+
@Override
67+
public <T> T unwrap(Class<T> iface) throws SQLException {
68+
return null;
69+
}
70+
71+
@Override
72+
public boolean isWrapperFor(Class<?> iface) throws SQLException {
73+
return false;
74+
}
75+
76+
@Override
77+
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
78+
return null;
79+
}
80+
};
81+
}
82+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.baeldung.activej.controller;
2+
3+
import com.baeldung.activej.service.PersonService;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import io.activej.http.AsyncServlet;
6+
import io.activej.http.HttpRequest;
7+
import io.activej.http.HttpResponse;
8+
import io.activej.promise.Promise;
9+
10+
public class PersonController implements AsyncServlet {
11+
private final PersonService personService;
12+
private final ObjectMapper objectMapper;
13+
14+
public PersonController(PersonService personService) {
15+
this.personService = personService;
16+
this.objectMapper = new ObjectMapper();
17+
}
18+
19+
@Override
20+
public Promise<HttpResponse> serve(HttpRequest httpRequest) {
21+
return personService.findAndVerifyPerson(httpRequest.getQueryParameter("name"))
22+
.map((p) -> HttpResponse.ok200().withJson(objectMapper.writeValueAsString(p)).build())
23+
.mapException(e -> e);
24+
}
25+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.baeldung.activej.model;
2+
3+
public record Person(String name, String description) {
4+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.baeldung.activej.model;
2+
3+
public record VerifiedPerson(String name, String description,
4+
String notes, String result) {
5+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.baeldung.activej.repository;
2+
3+
import com.baeldung.activej.model.Person;
4+
import io.activej.promise.Promise;
5+
import io.activej.promise.Promises;
6+
7+
import javax.sql.DataSource;
8+
import java.time.Duration;
9+
10+
public class PersonRepository {
11+
private final DataSource dataSource;
12+
13+
public PersonRepository(DataSource dataSource) {
14+
this.dataSource = dataSource;
15+
}
16+
17+
public DataSource getDataSource() {
18+
return dataSource;
19+
}
20+
21+
public Promise<Person> findPerson(String name) {
22+
return Promises
23+
.delay(Duration.ofMillis(100), new Person(name, name + " description"));
24+
}
25+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.baeldung.activej.service;
2+
3+
import com.baeldung.activej.model.VerifiedPerson;
4+
import com.baeldung.activej.repository.PersonRepository;
5+
import io.activej.promise.Promise;
6+
7+
public class PersonService {
8+
private final PersonRepository personRepository;
9+
10+
public PersonService(PersonRepository personRepository) {
11+
this.personRepository = personRepository;
12+
}
13+
14+
public PersonRepository getPersonRepository() {
15+
return personRepository;
16+
}
17+
18+
public Promise<VerifiedPerson> findAndVerifyPerson(String name) {
19+
return personRepository.findPerson(name)
20+
.combine(findPersonNotes(name),
21+
(person, notes) -> new VerifiedPerson(person.name(), person.description(), notes, null))
22+
.map(person -> verify(person));
23+
}
24+
25+
private VerifiedPerson verify(VerifiedPerson person) {
26+
if(person.description().startsWith("Good")) {
27+
return new VerifiedPerson(person.name(), person.description(),
28+
person.notes(), "SUCCESS");
29+
}
30+
31+
return new VerifiedPerson(person.name(), person.description(),
32+
person.notes(), "FAIL");
33+
}
34+
35+
private Promise<String> findPersonNotes(String name) {
36+
return Promise.of(name + " notes");
37+
}
38+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.baeldung.activej;
2+
3+
import com.baeldung.activej.config.PersonModule;
4+
import com.baeldung.activej.controller.PersonController;
5+
import com.baeldung.activej.model.VerifiedPerson;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import io.activej.dns.DnsClient;
8+
import io.activej.eventloop.Eventloop;
9+
import io.activej.http.*;
10+
import io.activej.inject.Injector;
11+
import org.junit.jupiter.api.AfterAll;
12+
import org.junit.jupiter.api.BeforeAll;
13+
import org.junit.jupiter.api.Test;
14+
15+
import java.net.InetAddress;
16+
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
19+
public class ActiveJIntegrationTest {
20+
21+
private static final ObjectMapper objectMapper = new ObjectMapper();
22+
private static HttpServer server;
23+
private static HttpClient client;
24+
private static int port;
25+
private static Eventloop eventloop;
26+
27+
@BeforeAll
28+
static void setUp() throws Exception {
29+
eventloop = Eventloop.create();
30+
31+
PersonModule personModule = new PersonModule();
32+
PersonController personController = Injector.of(personModule).getInstance(PersonController.class);
33+
34+
RoutingServlet servlet = RoutingServlet.builder(eventloop)
35+
.with(HttpMethod.GET,"/person", personController)
36+
.build();
37+
38+
server = HttpServer.builder(eventloop, servlet)
39+
.withListenPort(8080)
40+
.build();
41+
42+
server.listen();
43+
44+
port = server.getListenAddresses().get(0).getPort();
45+
46+
InetAddress dnsServerAddress = InetAddress.getByName("8.8.8.8");
47+
DnsClient dnsClient = DnsClient.builder(eventloop, dnsServerAddress).build();
48+
client = HttpClient.builder(eventloop, dnsClient).build();
49+
}
50+
51+
@AfterAll
52+
static void tearDown() {
53+
if (server != null) {
54+
server.close();
55+
}
56+
}
57+
58+
@Test
59+
void givenHttpServer_whenCallPersonEndpoint_thenExpectedVerificationResultShouldPresentInResponse() {
60+
HttpRequest request = HttpRequest.get("http://localhost:" + port + "/person?name=my-name").build();
61+
62+
client.request(request)
63+
.whenResult(response -> {
64+
assertEquals(response.getCode(), 200);
65+
66+
response.loadBody()
67+
.whenResult(body -> {
68+
try {
69+
VerifiedPerson responseData = objectMapper.readValue(body.getArray(),
70+
VerifiedPerson.class);
71+
assertEquals(responseData.result(), "FAIL");
72+
eventloop.breakEventloop();
73+
} catch (Exception e) {
74+
throw new RuntimeException(e);
75+
}
76+
});
77+
});
78+
79+
eventloop.run();
80+
}
81+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.baeldung.activej;
2+
3+
import com.baeldung.activej.config.PersonModule;
4+
import com.baeldung.activej.repository.PersonRepository;
5+
import com.baeldung.activej.service.PersonService;
6+
import io.activej.eventloop.Eventloop;
7+
import io.activej.inject.Injector;
8+
import org.junit.jupiter.api.Test;
9+
10+
import javax.sql.DataSource;
11+
12+
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
import static org.junit.jupiter.api.Assertions.assertNotNull;
14+
15+
public class ActiveJTest {
16+
17+
@Test
18+
void givenPersonModule_whenGetTheServiceBean_thenAllTheDependenciesShouldBePresent() {
19+
PersonModule personModule = new PersonModule();
20+
21+
PersonService personService = Injector.of(personModule).getInstance(PersonService.class);
22+
assertNotNull(personService);
23+
PersonRepository personRepository = personService.getPersonRepository();
24+
assertNotNull(personRepository);
25+
DataSource dataSource = personRepository.getDataSource();
26+
assertNotNull(dataSource);
27+
}
28+
29+
@Test
30+
void givenEventloop_whenCallFindAndVerifyPerson_thenExpectedVerificationResultShouldBePresent() {
31+
PersonModule personModule = new PersonModule();
32+
33+
PersonService personService = Injector.of(personModule).getInstance(PersonService.class);
34+
35+
Eventloop eventloop = Eventloop.create();
36+
37+
personService.findAndVerifyPerson("Good person")
38+
.whenResult(verifiedPerson -> assertEquals("SUCCESS", verifiedPerson.result()));
39+
40+
eventloop.run();
41+
}
42+
}

0 commit comments

Comments
 (0)