package fr.openwide.core.jpa.more.business.parameter.dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.interceptor.DefaultTransactionAttribute; import org.springframework.transaction.interceptor.TransactionAttribute; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionTemplate; import fr.openwide.core.jpa.business.generic.dao.GenericEntityDaoImpl; import fr.openwide.core.jpa.exception.SecurityServiceException; import fr.openwide.core.jpa.exception.ServiceException; import fr.openwide.core.jpa.more.business.parameter.model.Parameter; import fr.openwide.core.spring.property.dao.IMutablePropertyDao; @SuppressWarnings("deprecation") public class ParameterDaoImpl extends GenericEntityDaoImpl<Long, Parameter> implements IParameterDao, IMutablePropertyDao { private TransactionTemplate readOnlyTransactionTemplate; private TransactionTemplate writeTransactionTemplate; @Override public Parameter getByName(String name) { return super.getByNaturalId(name); } @Override public String getInTransaction(final String key) { return readOnlyTransactionTemplate.execute(new TransactionCallback<String>() { @Override public String doInTransaction(TransactionStatus status) { return get(key); } }); } @Override public void setInTransaction(final String key, final String value) throws ServiceException, SecurityServiceException { writeTransactionTemplate.execute( new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { try { set(key, value); } catch (RuntimeException | ServiceException | SecurityServiceException e) { throw new IllegalStateException(String.format("Error while updating property '%1s'.", key), e); } } } ); } @Override public void cleanInTransaction() { writeTransactionTemplate.execute( new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { clean(); } } ); } @Autowired public void setPlatformTransactionManager(PlatformTransactionManager transactionManager) { DefaultTransactionAttribute readOnlyTransactionAttribute = new DefaultTransactionAttribute(TransactionAttribute.PROPAGATION_REQUIRED); readOnlyTransactionAttribute.setReadOnly(true); readOnlyTransactionTemplate = new TransactionTemplate(transactionManager, readOnlyTransactionAttribute); DefaultTransactionAttribute writeTransactionAttribute = new DefaultTransactionAttribute(TransactionAttribute.PROPAGATION_REQUIRED); writeTransactionAttribute.setReadOnly(false); writeTransactionTemplate = new TransactionTemplate(transactionManager, writeTransactionAttribute); } private String get(String key) { Parameter parameter = getByName(key); if (parameter == null) { return null; } return parameter.getStringValue(); } private void set(String key, String value) throws ServiceException, SecurityServiceException { Parameter parameter = getByName(key); if (parameter != null) { parameter.setStringValue(value); update(parameter); } else { save(new Parameter(key, value)); } } private void clean() { for (Parameter parameter : list()) { delete(parameter); } } }