1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.restapi;
20
21 import java.io.IOException;
22
23 import org.apache.logging.log4j.LogManager;
24 import org.apache.logging.log4j.Logger;
25 import org.mycore.common.MCRSession;
26 import org.mycore.common.MCRSessionMgr;
27 import org.mycore.common.MCRTransactionHelper;
28
29 import jakarta.annotation.Priority;
30 import jakarta.ws.rs.InternalServerErrorException;
31 import jakarta.ws.rs.Priorities;
32 import jakarta.ws.rs.container.ContainerRequestContext;
33 import jakarta.ws.rs.container.ContainerRequestFilter;
34
35 @Priority(Priorities.USER)
36 public class MCRTransactionFilter implements ContainerRequestFilter {
37
38 public static final String PROP_REQUIRE_TRANSACTION = "mcr:jpaTrans";
39
40 public static final Logger LOGGER = LogManager.getLogger();
41
42 @Override
43 public void filter(ContainerRequestContext requestContext) throws IOException {
44 if (MCRSessionMgr.isLocked()) {
45 return;
46 }
47 MCRSession mcrSession = MCRSessionMgr.getCurrentSession();
48 if (MCRTransactionHelper.isTransactionActive()) {
49 LOGGER.debug("Filter scoped JPA transaction is active.");
50 if (MCRTransactionHelper.transactionRequiresRollback()) {
51 try {
52 MCRTransactionHelper.rollbackTransaction();
53 } finally {
54 throw new InternalServerErrorException("Transaction rollback was required.");
55 }
56 }
57 MCRTransactionHelper.commitTransaction();
58 }
59 if (Boolean.TRUE.equals(requestContext.getProperty(PROP_REQUIRE_TRANSACTION))) {
60 LOGGER.debug("Starting user JPA transaction.");
61 MCRTransactionHelper.beginTransaction();
62 }
63 }
64 }