TransactionPostgresManager.java

1
package io.github.marcopaglio.booking.transaction.manager.postgres;
2
3
import io.github.marcopaglio.booking.exception.TransactionException;
4
import io.github.marcopaglio.booking.repository.factory.ClientRepositoryFactory;
5
import io.github.marcopaglio.booking.repository.factory.ReservationRepositoryFactory;
6
import io.github.marcopaglio.booking.repository.postgres.ClientPostgresRepository;
7
import io.github.marcopaglio.booking.repository.postgres.ReservationPostgresRepository;
8
import io.github.marcopaglio.booking.transaction.code.ClientReservationTransactionCode;
9
import io.github.marcopaglio.booking.transaction.code.ClientTransactionCode;
10
import io.github.marcopaglio.booking.transaction.code.ReservationTransactionCode;
11
import io.github.marcopaglio.booking.transaction.handler.factory.TransactionHandlerFactory;
12
import io.github.marcopaglio.booking.transaction.handler.postgres.TransactionPostgresHandler;
13
import io.github.marcopaglio.booking.transaction.manager.TransactionManager;
14
import jakarta.persistence.EntityManagerFactory;
15
import jakarta.persistence.RollbackException;
16
17
/**
18
 * An implementation of {@code TransactionManager} for managing code executed
19
 * on PostgreSQL within transactions.
20
 */
21
public class TransactionPostgresManager extends TransactionManager {
22
	/**
23
	 * Specifies that the reason the transaction fails is a commitment failure.
24
	 */
25
	private static final String COMMIT_FAILURE = "a commitment failure";
26
27
	/**
28
	 * Used for executing code on {@code ClientRepository} and/or {@code ReservationRepository}
29
	 * into transactions.
30
	 * Particularly, it allows to create entity manager, transactions and repositories.
31
	 */
32
	private EntityManagerFactory emf;
33
34
	/**
35
	 * Constructs a manager for applying code that uses entity repositories 
36
	 * using PostgreSQL transactions.
37
	 * 
38
	 * @param emf							the entity manager factory used to interact
39
	 * 										with the persistence provider.
40
	 * @param transactionHandlerFactory		the factory to create {@code EntityManager} instances.
41
	 * @param clientRepositoryFactory		the factory to create
42
	 * 										{@code ClientPostgresRepository} instances.
43
	 * @param reservationRepositoryFactory	the factory to create
44
	 * 										{@code ReservationPostgresRepository} instances.
45
	 */
46
	public TransactionPostgresManager(EntityManagerFactory emf,
47
			TransactionHandlerFactory transactionHandlerFactory,
48
			ClientRepositoryFactory clientRepositoryFactory,
49
			ReservationRepositoryFactory reservationRepositoryFactory) {
50
		super(transactionHandlerFactory, clientRepositoryFactory, reservationRepositoryFactory);
51
		this.emf = emf;
52
	}
53
54
	/**
55
	 * Prepares to execution of code that involves the {@code ClientRepository}'s method(s)
56
	 * on PostgreSQL in a single transaction.
57
	 * 
58
	 * @param <R>					the returned type of executed code.
59
	 * @param code					the code to execute.
60
	 * @return						something depending on execution code.
61
	 * @throws TransactionException	if the execution or the commitment of the transaction fails.
62
	 */
63
	@Override
64
	public <R> R doInTransaction(ClientTransactionCode<R> code) throws TransactionException {
65
		TransactionPostgresHandler sessionHandler =
66
				transactionHandlerFactory.createTransactionHandler(emf);
67
		ClientPostgresRepository clientRepository = clientRepositoryFactory
68
				.createClientRepository(sessionHandler.getHandler());
69
		try {
70 1 1. doInTransaction : replaced return value with null for io/github/marcopaglio/booking/transaction/manager/postgres/TransactionPostgresManager::doInTransaction → KILLED
			return executeInTransaction(code, sessionHandler, clientRepository);
71
		} catch(RollbackException e) {
72
			LOGGER.warn(e.getMessage());
73
			throw new TransactionException(
74
					transactionFailureMsg(COMMIT_FAILURE), e.getCause());
75
		}
76
	}
77
78
	/**
79
	 * Prepares to execution of code that involves the {@code ReservationRepository}'s method(s)
80
	 * on PostgreSQL in a single transaction.
81
	 * 
82
	 * @param <R>					the returned type of executed code.
83
	 * @param code					the code to execute.
84
	 * @return						something depending on execution code.
85
	 * @throws TransactionException	if the execution or the commitment of the transaction fails.
86
	 */
87
	@Override
88
	public <R> R doInTransaction(ReservationTransactionCode<R> code) throws TransactionException {
89
		TransactionPostgresHandler sessionHandler =
90
				transactionHandlerFactory.createTransactionHandler(emf);
91
		ReservationPostgresRepository reservationRepository = reservationRepositoryFactory
92
				.createReservationRepository(sessionHandler.getHandler());
93
		try {
94 1 1. doInTransaction : replaced return value with null for io/github/marcopaglio/booking/transaction/manager/postgres/TransactionPostgresManager::doInTransaction → KILLED
			return executeInTransaction(code, sessionHandler, reservationRepository);
95
		} catch(RollbackException e) {
96
			LOGGER.warn(e.getMessage());
97
			throw new TransactionException(
98
					transactionFailureMsg(COMMIT_FAILURE), e.getCause());
99
		}
100
	}
101
102
	/**
103
	 * Prepares to execution of code that involves both {@code ClientRepository}'s and
104
	 * {@code ReservationRepository}'s methods on PostgreSQL in a single transaction.
105
	 * 
106
	 * @param <R>					the returned type of executed code.
107
	 * @param code					the code to execute.
108
	 * @return						something depending on execution code.
109
	 * @throws TransactionException	if the execution or the commitment of the transaction fails.
110
	 */
111
	@Override
112
	public <R> R doInTransaction(ClientReservationTransactionCode<R> code) throws TransactionException {
113
		TransactionPostgresHandler sessionHandler =
114
				transactionHandlerFactory.createTransactionHandler(emf);
115
		ClientPostgresRepository clientRepository = clientRepositoryFactory
116
				.createClientRepository(sessionHandler.getHandler());
117
		ReservationPostgresRepository reservationRepository = reservationRepositoryFactory
118
				.createReservationRepository(sessionHandler.getHandler());
119
		try {
120 1 1. doInTransaction : replaced return value with null for io/github/marcopaglio/booking/transaction/manager/postgres/TransactionPostgresManager::doInTransaction → KILLED
			return executeInTransaction(code, sessionHandler, clientRepository, reservationRepository);
121
		} catch(RollbackException e) {
122
			LOGGER.warn(e.getMessage());
123
			throw new TransactionException(
124
					transactionFailureMsg(COMMIT_FAILURE), e.getCause());
125
		}
126
	}
127
}

Mutations

70

1.1
Location : doInTransaction
Killed by : io.github.marcopaglio.booking.transaction.manager.postgres.TransactionPostgresManagerTest.[engine:junit-jupiter]/[class:io.github.marcopaglio.booking.transaction.manager.postgres.TransactionPostgresManagerTest]/[nested-class:ClientTransactionCodeTest]/[method:testDoInTransactionWhenCallsAMethodShouldApplyAndReturn()]
replaced return value with null for io/github/marcopaglio/booking/transaction/manager/postgres/TransactionPostgresManager::doInTransaction → KILLED

94

1.1
Location : doInTransaction
Killed by : io.github.marcopaglio.booking.transaction.manager.postgres.TransactionPostgresManagerTest.[engine:junit-jupiter]/[class:io.github.marcopaglio.booking.transaction.manager.postgres.TransactionPostgresManagerTest]/[nested-class:ReservationTransactionCodeTest]/[method:testDoInTransactionWhenCallsAMethodShouldApplyAndReturn()]
replaced return value with null for io/github/marcopaglio/booking/transaction/manager/postgres/TransactionPostgresManager::doInTransaction → KILLED

120

1.1
Location : doInTransaction
Killed by : io.github.marcopaglio.booking.transaction.manager.postgres.TransactionPostgresManagerTest.[engine:junit-jupiter]/[class:io.github.marcopaglio.booking.transaction.manager.postgres.TransactionPostgresManagerTest]/[nested-class:ClientReservationTransactionCodeTest]/[method:testDoInTransactionWhenCodeCallsMethodsShouldApplyAndReturn()]
replaced return value with null for io/github/marcopaglio/booking/transaction/manager/postgres/TransactionPostgresManager::doInTransaction → KILLED

Active mutators

Tests examined


Report generated by PIT 1.15.6