From b2c2619dc44ffca1538814b26e1580f266ef808c Mon Sep 17 00:00:00 2001 From: jomu Date: Fri, 16 Nov 2018 12:43:20 +0100 Subject: [PATCH] added multi persistence unit support --- .../web/PersistenceContextFactory.java | 22 +++++----- .../main/resources/META-INF/persistence.xml | 2 +- .../account/control/AccountControl.java | 27 +++++------- .../boundary/ApplicationService.java | 2 + .../control/ApplicationPermissionControl.java | 14 +++--- .../control/ApplicationRoleControl.java | 6 ++- .../config/boundary/ConfigService.java | 2 + .../boundary/ConfigurationProducer.java | 1 - .../mail/boundary/MailTemplateService.java | 2 + .../shared/account/util/AccountPU.java | 26 +++++++++++ .../util/TransactionJoinInterceptor.java | 44 +++++++++++++++++++ .../main/resources/META-INF/persistence.xml | 11 ++--- 12 files changed, 118 insertions(+), 41 deletions(-) create mode 100644 account/src/main/java/de/muehlencord/shared/account/util/AccountPU.java create mode 100644 account/src/main/java/de/muehlencord/shared/account/util/TransactionJoinInterceptor.java diff --git a/account-ui/src/main/java/de/muehlencord/shared/account/web/PersistenceContextFactory.java b/account-ui/src/main/java/de/muehlencord/shared/account/web/PersistenceContextFactory.java index a4852f2..37f1890 100644 --- a/account-ui/src/main/java/de/muehlencord/shared/account/web/PersistenceContextFactory.java +++ b/account-ui/src/main/java/de/muehlencord/shared/account/web/PersistenceContextFactory.java @@ -1,5 +1,6 @@ package de.muehlencord.shared.account.web; +import de.muehlencord.shared.account.util.AccountPU; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.RequestScoped; import javax.enterprise.inject.Disposes; @@ -17,26 +18,27 @@ import org.slf4j.LoggerFactory; */ @ApplicationScoped public class PersistenceContextFactory { - + private static final Logger LOGGER = LoggerFactory.getLogger(PersistenceContextFactory.class); - - @PersistenceUnit + + @PersistenceUnit (unitName = "accountPu") EntityManagerFactory emf; - + @Produces + @AccountPU @RequestScoped public EntityManager getEntityManager() { if (LOGGER.isTraceEnabled()) { - LOGGER.trace("getting entityManager"); - } + LOGGER.trace("getting entityManager for accountPu"); + } return emf.createEntityManager(SynchronizationType.UNSYNCHRONIZED); } - - public void closeEntityManager (@Disposes EntityManager em) { + + public void closeEntityManager(@Disposes EntityManager em) { if (LOGGER.isTraceEnabled()) { LOGGER.trace("closing entityManager"); - } + } em.close(); } - + } diff --git a/account-ui/src/main/resources/META-INF/persistence.xml b/account-ui/src/main/resources/META-INF/persistence.xml index 8bd0565..63351bc 100644 --- a/account-ui/src/main/resources/META-INF/persistence.xml +++ b/account-ui/src/main/resources/META-INF/persistence.xml @@ -1,6 +1,6 @@ - + java:/jboss/accountDs de.muehlencord.shared.account.business.account.entity.AccountEntity de.muehlencord.shared.account.business.account.entity.AccountHistoryEntity diff --git a/account/src/main/java/de/muehlencord/shared/account/business/account/control/AccountControl.java b/account/src/main/java/de/muehlencord/shared/account/business/account/control/AccountControl.java index c5fe028..d683305 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/account/control/AccountControl.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/account/control/AccountControl.java @@ -2,13 +2,13 @@ package de.muehlencord.shared.account.business.account.control; import de.muehlencord.shared.account.business.account.entity.AccountException; import de.muehlencord.shared.account.business.account.entity.AccountStatus; -import de.muehlencord.shared.account.business.config.boundary.ConfigService; import de.muehlencord.shared.account.business.mail.entity.MailException; import de.muehlencord.shared.account.business.mail.boundary.MailService; import de.muehlencord.shared.account.business.account.entity.AccountEntity; import de.muehlencord.shared.account.business.account.entity.AccountLoginEntity; import de.muehlencord.shared.account.business.account.entity.ApplicationRoleEntity; import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; +import de.muehlencord.shared.account.util.AccountPU; import de.muehlencord.shared.account.util.SecurityUtil; import de.muehlencord.shared.util.DateUtil; import java.io.Serializable; @@ -38,9 +38,6 @@ public class AccountControl implements Serializable { private static final Logger LOGGER = LoggerFactory.getLogger(AccountControl.class.getName()); private static final long serialVersionUID = 3424816272598108101L; - @EJB - private ConfigService configService; - @EJB private MailService mailService; @@ -48,6 +45,7 @@ public class AccountControl implements Serializable { private ApplicationEntity application; @Inject + @AccountPU EntityManager em; /** @@ -276,25 +274,22 @@ public class AccountControl implements Serializable { login.setLastUpdatedBy(byUser); } - login.setLastLogin(now); - login.setFailureCount(0); + login.setLastLogin(now); + login.setFailureCount(0); return updateLogin(login); } - - + public AccountLoginEntity updateLogin(AccountLoginEntity login) { - return em.merge (login); + return em.merge(login); } - - public void updateLogin (AccountEntity account) { + + public void updateLogin(AccountEntity account) { if (account.getAccountLogin() == null) { // TODO connect to IPRS - how can an account ask for an updated login if the user cannot login } else { - updateSuccessFullLogin (account.getAccountLogin(), account.getUsername()); + updateSuccessFullLogin(account.getAccountLogin(), account.getUsername()); } } - - public void addLoginError(AccountEntity account) { // TODO reimplement @@ -338,8 +333,8 @@ public class AccountControl implements Serializable { return login; } - - public String getHashedPassword (String password) { + + public String getHashedPassword(String password) { String hashedPassword = SecurityUtil.createPassword(password); return hashedPassword; } diff --git a/account/src/main/java/de/muehlencord/shared/account/business/application/boundary/ApplicationService.java b/account/src/main/java/de/muehlencord/shared/account/business/application/boundary/ApplicationService.java index acb20ed..2445810 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/application/boundary/ApplicationService.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/application/boundary/ApplicationService.java @@ -1,6 +1,7 @@ package de.muehlencord.shared.account.business.application.boundary; import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; +import de.muehlencord.shared.account.util.AccountPU; import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -24,6 +25,7 @@ public class ApplicationService implements Serializable { private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationService.class); @Inject + @AccountPU EntityManager em; public ApplicationEntity findById(UUID id) { diff --git a/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationPermissionControl.java b/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationPermissionControl.java index c2d12c7..ab50c4d 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationPermissionControl.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationPermissionControl.java @@ -3,12 +3,13 @@ package de.muehlencord.shared.account.business.application.control; import de.muehlencord.shared.account.business.account.entity.AccountException; import de.muehlencord.shared.account.business.account.entity.ApplicationPermissionEntity; import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; +import de.muehlencord.shared.account.util.AccountPU; import java.io.Serializable; import javax.ejb.Stateless; import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; import java.util.List; import java.util.ArrayList; +import javax.inject.Inject; import javax.persistence.OptimisticLockException; import javax.persistence.Query; import javax.transaction.Transactional; @@ -21,10 +22,11 @@ import javax.transaction.Transactional; public class ApplicationPermissionControl implements Serializable { private static final long serialVersionUID = -3761100587901739481L; - - @PersistenceContext + + @Inject + @AccountPU EntityManager em; - + public List getApplicationPermissions(ApplicationEntity app) { Query query = em.createNamedQuery("ApplicationPermissionEntity.findAll"); query.setParameter("application", app); @@ -49,7 +51,7 @@ public class ApplicationPermissionControl implements Serializable { } @Transactional - public void create(ApplicationEntity application,String name, String description) { + public void create(ApplicationEntity application, String name, String description) { ApplicationPermissionEntity permission = new ApplicationPermissionEntity(application, name, description); em.persist(permission); } @@ -87,7 +89,7 @@ public class ApplicationPermissionControl implements Serializable { private ApplicationPermissionEntity findByName(ApplicationEntity application, String name) { Query query = em.createNamedQuery("ApplicationPermissionEntity.findByPermissionName"); - query.setParameter("application", application); + query.setParameter("application", application); query.setParameter("permissionName", name); List permissions = query.getResultList(); if ((permissions == null) || (permissions.isEmpty())) { diff --git a/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationRoleControl.java b/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationRoleControl.java index 6bbbb79..6068b6f 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationRoleControl.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/application/control/ApplicationRoleControl.java @@ -9,14 +9,15 @@ import de.muehlencord.shared.account.business.account.entity.AccountException; import de.muehlencord.shared.account.business.account.entity.ApplicationPermissionEntity; import de.muehlencord.shared.account.business.account.entity.ApplicationRoleEntity; import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; +import de.muehlencord.shared.account.util.AccountPU; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.ejb.EJB; import javax.ejb.Stateless; +import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.OptimisticLockException; -import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.transaction.Transactional; import org.slf4j.Logger; @@ -35,7 +36,8 @@ public class ApplicationRoleControl implements Serializable { @EJB ApplicationPermissionControl applicationPermissionControl; - @PersistenceContext + @Inject + @AccountPU EntityManager em; public List getAllRoles(ApplicationEntity app) { diff --git a/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigService.java b/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigService.java index 4ae98fb..399c9f7 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigService.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigService.java @@ -6,6 +6,7 @@ import de.muehlencord.shared.account.business.application.entity.ApplicationEnti import de.muehlencord.shared.account.business.config.entity.ConfigEntity; import de.muehlencord.shared.account.business.config.entity.ConfigEntityPK; import de.muehlencord.shared.account.business.config.entity.ConfigException; +import de.muehlencord.shared.account.util.AccountPU; import java.io.Serializable; import java.util.List; import java.util.Optional; @@ -33,6 +34,7 @@ public class ConfigService implements Serializable { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigService.class); @Inject + @AccountPU EntityManager em; @Inject diff --git a/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigurationProducer.java b/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigurationProducer.java index c0e1535..49dffb5 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigurationProducer.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigurationProducer.java @@ -5,7 +5,6 @@ */ package de.muehlencord.shared.account.business.config.boundary; -import de.muehlencord.shared.account.business.config.boundary.ConfigService; import de.muehlencord.shared.account.business.accountconfig.entity.AccountConfigurationKey; import de.muehlencord.shared.account.business.accountconfig.entity.AccountConfigurationValue; import de.muehlencord.shared.account.business.config.entity.ConfigException; diff --git a/account/src/main/java/de/muehlencord/shared/account/business/mail/boundary/MailTemplateService.java b/account/src/main/java/de/muehlencord/shared/account/business/mail/boundary/MailTemplateService.java index 742352d..49b6002 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/mail/boundary/MailTemplateService.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/mail/boundary/MailTemplateService.java @@ -3,6 +3,7 @@ package de.muehlencord.shared.account.business.mail.boundary; import de.muehlencord.shared.account.business.mail.entity.MailDatamodel; import de.muehlencord.shared.account.business.mail.entity.MailTemplateException; import de.muehlencord.shared.account.business.mail.entity.MailTemplateEntity; +import de.muehlencord.shared.account.util.AccountPU; import freemarker.cache.StringTemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template; @@ -29,6 +30,7 @@ public class MailTemplateService implements Serializable { private static final Logger LOGGER = LoggerFactory.getLogger(MailTemplateService.class.getName()); @Inject + @AccountPU EntityManager em; public String getStringFromTemplate(String templateName, MailDatamodel dataModel) throws MailTemplateException { diff --git a/account/src/main/java/de/muehlencord/shared/account/util/AccountPU.java b/account/src/main/java/de/muehlencord/shared/account/util/AccountPU.java new file mode 100644 index 0000000..e298731 --- /dev/null +++ b/account/src/main/java/de/muehlencord/shared/account/util/AccountPU.java @@ -0,0 +1,26 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package de.muehlencord.shared.account.util; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; +import javax.inject.Qualifier; + +/** + * + * @author Joern Muehlencord + */ +@Qualifier +@Retention(RUNTIME) +@Target({METHOD, FIELD, PARAMETER, TYPE}) +public @interface AccountPU { + +} diff --git a/account/src/main/java/de/muehlencord/shared/account/util/TransactionJoinInterceptor.java b/account/src/main/java/de/muehlencord/shared/account/util/TransactionJoinInterceptor.java new file mode 100644 index 0000000..ddd376b --- /dev/null +++ b/account/src/main/java/de/muehlencord/shared/account/util/TransactionJoinInterceptor.java @@ -0,0 +1,44 @@ +package de.muehlencord.shared.account.util; + +import javax.annotation.Priority; +import javax.inject.Inject; +import javax.interceptor.AroundInvoke; +import javax.interceptor.Interceptor; +import javax.interceptor.InvocationContext; +import javax.persistence.EntityManager; +import javax.transaction.Transactional; +import static javax.transaction.Transactional.TxType.REQUIRED; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * + * @author Joern Muehlencord + */ +@Transactional(value = REQUIRED) +@Interceptor +@Priority(value=TransactionJoinInterceptor.PRIORITY) +public class TransactionJoinInterceptor { + + private static final Logger LOGGER = LoggerFactory.getLogger(TransactionJoinInterceptor.class); + + // attach behind the interceptor of the container + public static final int PRIORITY = Interceptor.Priority.PLATFORM_BEFORE+250; + + @Inject + @AccountPU + private EntityManager em; + + + @AroundInvoke + public Object joinTransaction(InvocationContext context) throws Exception { + if (em.isJoinedToTransaction()) { + LOGGER.trace("transaction already joined"); + } else { + LOGGER.trace("joining transaction"); + em.joinTransaction(); + } + return context.proceed(); + } +} diff --git a/account/src/main/resources/META-INF/persistence.xml b/account/src/main/resources/META-INF/persistence.xml index ce46e97..bb4c0e6 100644 --- a/account/src/main/resources/META-INF/persistence.xml +++ b/account/src/main/resources/META-INF/persistence.xml @@ -1,13 +1,14 @@ - + org.eclipse.persistence.jpa.PersistenceProvider false + ENABLE_SELECTIVE - - - - + + + +