@@ -16,6 +16,7 @@

package org.broadleafcommerce.openadmin.server.security.service;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.broadleafcommerce.common.email.service.EmailService;
@@ -34,11 +35,13 @@
import org.broadleafcommerce.openadmin.server.security.domain.ForgotPasswordSecurityToken;
import org.broadleafcommerce.openadmin.server.security.domain.ForgotPasswordSecurityTokenImpl;
import org.broadleafcommerce.openadmin.server.security.service.type.PermissionType;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
@@ -76,51 +79,68 @@ public class AdminSecurityServiceImpl implements AdminSecurityService {
@Resource(name="blEmailService")
protected EmailService emailService;

// Variables to set via external configuration.
protected int tokenExpiredMinutes = 30;
@Resource(name="blSendAdminResetPasswordEmail")
protected EmailInfo resetPasswordEmailInfo;

@Resource(name="blSendAdminUsernameEmailInfo")
protected EmailInfo sendUsernameEmailInfo;

// Variables to set via external configuration.
@Value("${tokenExpiredMinutes}")
protected int tokenExpiredMinutes = 30;

@Value("${resetPasswordURL}")
protected String resetPasswordURL;

@Transactional("blTransactionManager")
public void deleteAdminPermission(AdminPermission permission) {
adminPermissionDao.deleteAdminPermission(permission);
}

@Transactional("blTransactionManager")
public void deleteAdminRole(AdminRole role) {
adminRoleDao.deleteAdminRole(role);
}

@Transactional("blTransactionManager")
public void deleteAdminUser(AdminUser user) {
adminUserDao.deleteAdminUser(user);
}

@Transactional(value="blTransactionManager", readOnly = true)
public AdminPermission readAdminPermissionById(Long id) {
return adminPermissionDao.readAdminPermissionById(id);
}

@Transactional(value="blTransactionManager", readOnly = true)
public AdminRole readAdminRoleById(Long id) {
return adminRoleDao.readAdminRoleById(id);
}

@Transactional(value="blTransactionManager", readOnly = true)
public AdminUser readAdminUserById(Long id) {
return adminUserDao.readAdminUserById(id);
}

@Transactional("blTransactionManager")
public AdminPermission saveAdminPermission(AdminPermission permission) {
return adminPermissionDao.saveAdminPermission(permission);
}

@Transactional("blTransactionManager")
public AdminRole saveAdminRole(AdminRole role) {
return adminRoleDao.saveAdminRole(role);
}

@Transactional("blTransactionManager")
public AdminUser saveAdminUser(AdminUser user) {
if (user.getUnencodedPassword() != null) {
user.setPassword(passwordEncoder.encodePassword(user.getUnencodedPassword(), null));
}
return adminUserDao.saveAdminUser(user);
}

@Transactional("blTransactionManager")
public AdminUser changePassword(PasswordChange passwordChange) {
AdminUser user = readAdminUserByUserName(passwordChange.getUsername());
user.setUnencodedPassword(passwordChange.getNewPassword());
@@ -132,30 +152,37 @@ public AdminUser changePassword(PasswordChange passwordChange) {
return user;
}

@Transactional("blTransactionManager")
public boolean isUserQualifiedForOperationOnCeilingEntity(AdminUser adminUser, PermissionType permissionType, String ceilingEntityFullyQualifiedName) {
return adminPermissionDao.isUserQualifiedForOperationOnCeilingEntity(adminUser, permissionType, ceilingEntityFullyQualifiedName);
}

@Transactional("blTransactionManager")
public boolean doesOperationExistForCeilingEntity(PermissionType permissionType, String ceilingEntityFullyQualifiedName) {
return adminPermissionDao.doesOperationExistForCeilingEntity(permissionType, ceilingEntityFullyQualifiedName);
}

@Transactional(value="blTransactionManager", readOnly = true)
public AdminUser readAdminUserByUserName(String userName) {
return adminUserDao.readAdminUserByUserName(userName);
}

@Transactional(value="blTransactionManager", readOnly = true)
public List<AdminUser> readAllAdminUsers() {
return adminUserDao.readAllAdminUsers();
}

@Transactional(value="blTransactionManager", readOnly = true)
public List<AdminRole> readAllAdminRoles() {
return adminRoleDao.readAllAdminRoles();
}

@Transactional(value="blTransactionManager", readOnly = true)
public List<AdminPermission> readAllAdminPermissions() {
return adminPermissionDao.readAllAdminPermissions();
}

@Transactional("blTransactionManager")
public GenericResponse sendForgotUsernameNotification(String emailAddress) {
GenericResponse response = new GenericResponse();
List<AdminUser> users = null;
@@ -184,6 +211,7 @@ public GenericResponse sendForgotUsernameNotification(String emailAddress) {
return response;
}

@Transactional("blTransactionManager")
public GenericResponse sendResetPasswordNotification(String username) {
GenericResponse response = new GenericResponse();
AdminUser user = null;
@@ -207,7 +235,7 @@ public GenericResponse sendResetPasswordNotification(String username) {
HashMap<String, Object> vars = new HashMap<String, Object>();
vars.put("token", token);
String resetPasswordUrl = getResetPasswordURL();
if (resetPasswordUrl != null) {
if (!StringUtils.isEmpty(resetPasswordUrl)) {
if (resetPasswordUrl.contains("?")) {
resetPasswordUrl=resetPasswordUrl+"&token="+token;
} else {
@@ -220,34 +248,9 @@ public GenericResponse sendResetPasswordNotification(String username) {
}
return response;
}

private void checkUser(AdminUser user, GenericResponse response) {
if (user == null) {
response.addErrorCode("invalidUser");
} else if (user.getEmail() == null || "".equals(user.getEmail())) {
response.addErrorCode("emailNotFound");
} else if (user.getActiveStatusFlag() == null || ! user.getActiveStatusFlag()) {
response.addErrorCode("inactiveUser");
}
}

private void checkPassword(String password, String confirmPassword, GenericResponse response) {
if (password == null || confirmPassword == null || "".equals(password) || "".equals(confirmPassword)) {
response.addErrorCode("invalidPassword");
} else if (! password.equals(confirmPassword)) {
response.addErrorCode("passwordMismatch");
}
}

private boolean isTokenExpired(ForgotPasswordSecurityToken fpst) {
Date now = SystemTime.asDate();
long currentTimeInMillis = now.getTime();
long tokenSaveTimeInMillis = fpst.getCreateDate().getTime();
long minutesSinceSave = (currentTimeInMillis - tokenSaveTimeInMillis)/60000;
return minutesSinceSave > tokenExpiredMinutes;
}

public GenericResponse resetPasswordUsingToken(String username, String token, String password, String confirmPassword) {
@Transactional("blTransactionManager")
public GenericResponse resetPasswordUsingToken(String username, String token, String password, String confirmPassword) {
GenericResponse response = new GenericResponse();
AdminUser user = null;
if (username != null) {
@@ -258,7 +261,7 @@ public GenericResponse resetPasswordUsingToken(String username, String token, St
if (token == null || "".equals(token)) {
response.addErrorCode("invalidToken");
}

ForgotPasswordSecurityToken fpst = null;
if (! response.getHasErrors()) {
token = token.toLowerCase();
@@ -271,16 +274,42 @@ public GenericResponse resetPasswordUsingToken(String username, String token, St
response.addErrorCode("tokenExpired");
}
}

if (! response.getHasErrors()) {
user.setUnencodedPassword(password);
user.setUnencodedPassword(password);
saveAdminUser(user);
fpst.setTokenUsedFlag(true);
forgotPasswordSecurityTokenDao.saveToken(fpst);
}

return response;
}

protected void checkUser(AdminUser user, GenericResponse response) {
if (user == null) {
response.addErrorCode("invalidUser");
} else if (user.getEmail() == null || "".equals(user.getEmail())) {
response.addErrorCode("emailNotFound");
} else if (user.getActiveStatusFlag() == null || ! user.getActiveStatusFlag()) {
response.addErrorCode("inactiveUser");
}
}

protected void checkPassword(String password, String confirmPassword, GenericResponse response) {
if (password == null || confirmPassword == null || "".equals(password) || "".equals(confirmPassword)) {
response.addErrorCode("invalidPassword");
} else if (! password.equals(confirmPassword)) {
response.addErrorCode("passwordMismatch");
}
}

protected boolean isTokenExpired(ForgotPasswordSecurityToken fpst) {
Date now = SystemTime.asDate();
long currentTimeInMillis = now.getTime();
long tokenSaveTimeInMillis = fpst.getCreateDate().getTime();
long minutesSinceSave = (currentTimeInMillis - tokenSaveTimeInMillis)/60000;
return minutesSinceSave > tokenExpiredMinutes;
}

public int getTokenExpiredMinutes() {
return tokenExpiredMinutes;
@@ -16,8 +16,6 @@

package org.broadleafcommerce.openadmin.server.service;

import javax.annotation.Resource;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -35,6 +33,9 @@
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
* @author jfischer
@@ -57,6 +58,7 @@ public void setApplicationContext(ApplicationContext applicationContext)
this.applicationContext = applicationContext;
}

@Transactional("blTransactionManager")
public DynamicResultSet inspect(PersistencePackage persistencePackage) throws ServiceException {
exploitProtectionService.compareToken(persistencePackage.getCsrfToken());

@@ -85,6 +87,7 @@ public DynamicResultSet inspect(PersistencePackage persistencePackage) throws Se
}
}

@Transactional("blTransactionManager")
public DynamicResultSet fetch(PersistencePackage persistencePackage, CriteriaTransferObject cto) throws ServiceException {
exploitProtectionService.compareToken(persistencePackage.getCsrfToken());

@@ -141,6 +144,7 @@ protected void cleanEntity(Entity entity) throws ServiceException {
}
}

@Transactional("blTransactionManager")
public Entity add(PersistencePackage persistencePackage) throws ServiceException {
exploitProtectionService.compareToken(persistencePackage.getCsrfToken());

@@ -168,6 +172,7 @@ public Entity add(PersistencePackage persistencePackage) throws ServiceException
}
}

@Transactional("blTransactionManager")
public Entity update(PersistencePackage persistencePackage) throws ServiceException {
exploitProtectionService.compareToken(persistencePackage.getCsrfToken());

@@ -195,6 +200,7 @@ public Entity update(PersistencePackage persistencePackage) throws ServiceExcept
}
}

@Transactional("blTransactionManager")
public void remove(PersistencePackage persistencePackage) throws ServiceException {
exploitProtectionService.compareToken(persistencePackage.getCsrfToken());

@@ -52,17 +52,13 @@ public interface PersistenceManager {

public abstract void remove(PersistencePackage persistencePackage) throws ServiceException;

public abstract SandBoxService getSandBoxService();

public abstract void setSandBoxService(SandBoxService sandBoxService);

public abstract DynamicEntityDao getDynamicEntityDao();

public abstract void setDynamicEntityDao(DynamicEntityDao dynamicEntityDao);

public abstract Map<TargetModeType, String> getTargetEntityManagers();
public abstract Map<String, String> getTargetEntityManagers();

public abstract void setTargetEntityManagers(Map<TargetModeType, String> targetEntityManagers);
public abstract void setTargetEntityManagers(Map<String, String> targetEntityManagers);

public abstract TargetModeType getTargetMode();

@@ -40,9 +40,14 @@
import org.broadleafcommerce.openadmin.server.service.persistence.module.PersistenceModule;
import org.broadleafcommerce.openadmin.server.service.persistence.module.RecordHelper;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
@@ -53,29 +58,42 @@
import java.util.List;
import java.util.Map;

@Component("blPersistenceManager")
@Scope("prototype")
public class PersistenceManagerImpl implements InspectHelper, PersistenceManager, ApplicationContextAware {

private static final Log LOG = LogFactory.getLog(PersistenceManagerImpl.class);

protected SandBoxService sandBoxService;
@Resource(name="blDynamicEntityDao")
protected DynamicEntityDao dynamicEntityDao;

@Resource(name="blCustomPersistenceHandlers")
protected List<CustomPersistenceHandler> customPersistenceHandlers = new ArrayList<CustomPersistenceHandler>();

@Resource(name="blCustomPersistenceHandlerFilters")
protected List<CustomPersistenceHandlerFilter> customPersistenceHandlerFilters = new ArrayList<CustomPersistenceHandlerFilter>();
protected PersistenceModule[] modules;
protected Map<TargetModeType, String> targetEntityManagers = new HashMap<TargetModeType, String>();
protected TargetModeType targetMode;
private ApplicationContext applicationContext;

@Resource(name="blTargetEntityManagers")
protected Map<String, String> targetEntityManagers = new HashMap<String, String>();

@Resource(name="blAdminSecurityRemoteService")
protected AdminSecurityServiceRemote adminRemoteSecurityService;

public PersistenceManagerImpl(PersistenceModule[] modules) {
this.modules = modules;
for (PersistenceModule module : modules) {
module.setPersistenceManager(this);
}
}
@Resource(name="blPersistenceModules")
protected PersistenceModule[] modules;

protected TargetModeType targetMode;
private ApplicationContext applicationContext;

@PostConstruct
public void postConstruct() {
for (PersistenceModule module : modules) {
module.setPersistenceManager(this);
}
}

public void close() throws Exception {
Object temp = applicationContext.getBean("&" + targetEntityManagers.get(targetMode));
Object temp = applicationContext.getBean("&" + targetEntityManagers.get(targetMode.getType()));
if (temp instanceof SandBoxEntityManagerPoolFactoryBean) {
((SandBoxEntityManagerPoolFactoryBean) temp).returnObject(dynamicEntityDao.getStandardEntityManager());
}
@@ -86,53 +104,22 @@ public void setApplicationContext(ApplicationContext applicationContext) throws
this.applicationContext = applicationContext;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #getAllPolymorphicEntitiesFromCeiling(java.lang.Class)
*/
@Override
public Class<?>[] getAllPolymorphicEntitiesFromCeiling(Class<?> ceilingClass) {
return dynamicEntityDao.getAllPolymorphicEntitiesFromCeiling(ceilingClass);
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #getPolymorphicEntities(java.lang.String)
*/
@Override
public Class<?>[] getPolymorphicEntities(String ceilingEntityFullyQualifiedClassname) throws ClassNotFoundException {
Class<?>[] entities = getAllPolymorphicEntitiesFromCeiling(Class.forName(ceilingEntityFullyQualifiedClassname));
return entities;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #getSimpleMergedProperties(java.lang.String,
* org.broadleafcommerce.openadmin.client.dto.PersistencePerspective,
* org.broadleafcommerce.openadmin.server.dao.DynamicEntityDao,
* java.lang.Class)
*/
@Override
public Map<String, FieldMetadata> getSimpleMergedProperties(String entityName, PersistencePerspective persistencePerspective) throws ClassNotFoundException, SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {
return dynamicEntityDao.getSimpleMergedProperties(entityName, persistencePerspective);
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #getMergedClassMetadata(java.lang.Class, java.util.Map)
*/
@Override
public ClassMetadata getMergedClassMetadata(final Class<?>[] entities, Map<MergedPropertyType, Map<String, FieldMetadata>> mergedProperties) throws ClassNotFoundException, IllegalArgumentException {
ClassMetadata classMetadata = new ClassMetadata();
@@ -188,15 +175,6 @@ public int compare(Property o1, Property o2) {
return classMetadata;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #inspect(java.lang.String,
* org.broadleafcommerce.openadmin.client.dto.PersistencePerspective,
* java.lang.String[], java.util.Map)
*/
@Override
public DynamicResultSet inspect(PersistencePackage persistencePackage) throws ServiceException, ClassNotFoundException {
// check to see if there is a custom handler registered
@@ -224,16 +202,6 @@ public DynamicResultSet inspect(PersistencePackage persistencePackage) throws Se
return results;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #fetch(java.lang.String,
* com.anasoft.os.daofusion.cto.client.CriteriaTransferObject,
* org.broadleafcommerce.openadmin.client.dto.PersistencePerspective,
* java.lang.String[])
*/
@Override
public DynamicResultSet fetch(PersistencePackage persistencePackage, CriteriaTransferObject cto) throws ServiceException {
//check to see if there is a custom handler registered
@@ -251,15 +219,6 @@ public DynamicResultSet fetch(PersistencePackage persistencePackage, CriteriaTra
return myModule.fetch(persistencePackage, cto);
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #add(java.lang.String, org.broadleafcommerce.openadmin.client.dto.Entity,
* org.broadleafcommerce.openadmin.client.dto.PersistencePerspective,
* java.lang.String[])
*/
@Override
public Entity add(PersistencePackage persistencePackage) throws ServiceException {
//check to see if there is a custom handler registered
@@ -277,16 +236,6 @@ public Entity add(PersistencePackage persistencePackage) throws ServiceException
return myModule.add(persistencePackage);
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #update(org.broadleafcommerce.openadmin.client.dto.Entity,
* org.broadleafcommerce.openadmin.client.dto.PersistencePerspective,
* org.broadleafcommerce.openadmin.client.dto.SandBoxInfo,
* java.lang.String[])
*/
@Override
public Entity update(PersistencePackage persistencePackage) throws ServiceException {
//check to see if there is a custom handler registered
@@ -375,102 +324,34 @@ public PersistenceModule getCompatibleModule(OperationType operationType) {
return myModule;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #getSandBoxService()
*/
@Override
public SandBoxService getSandBoxService() {
return sandBoxService;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #setSandBoxService(org.broadleafcommerce.openadmin.server.service.
* SandBoxService)
*/
@Override
public void setSandBoxService(SandBoxService sandBoxService) {
this.sandBoxService = sandBoxService;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #getDynamicEntityDao()
*/
@Override
public DynamicEntityDao getDynamicEntityDao() {
return dynamicEntityDao;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #setDynamicEntityDao(org.broadleafcommerce.openadmin.server.dao.
* DynamicEntityDao)
*/
@Override
public void setDynamicEntityDao(DynamicEntityDao dynamicEntityDao) {
this.dynamicEntityDao = dynamicEntityDao;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #getTargetEntityManagers()
*/
@Override
public Map<TargetModeType, String> getTargetEntityManagers() {
public Map<String, String> getTargetEntityManagers() {
return targetEntityManagers;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #setTargetEntityManagers(java.util.Map)
*/
@Override
public void setTargetEntityManagers(Map<TargetModeType, String> targetEntityManagers) {
public void setTargetEntityManagers(Map<String, String> targetEntityManagers) {
this.targetEntityManagers = targetEntityManagers;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #getTargetMode()
*/
@Override
public TargetModeType getTargetMode() {
return targetMode;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #setTargetMode(java.lang.String)
*/
@Override
public void setTargetMode(TargetModeType targetMode) {
String targetManagerRef = targetEntityManagers.get(targetMode);
String targetManagerRef = targetEntityManagers.get(targetMode.getType());
EntityManager targetManager = (EntityManager) applicationContext.getBean(targetManagerRef);
if (targetManager == null) {
throw new RuntimeException("Unable to find a target entity manager registered with the key: " + targetMode + ". Did you add an entity manager with this key to the targetEntityManagers property?");
@@ -479,13 +360,6 @@ public void setTargetMode(TargetModeType targetMode) {
this.targetMode = targetMode;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #getCustomPersistenceHandlers()
*/
@Override
public List<CustomPersistenceHandler> getCustomPersistenceHandlers() {
List<CustomPersistenceHandler> cloned = new ArrayList<CustomPersistenceHandler>();
@@ -504,13 +378,6 @@ public List<CustomPersistenceHandler> getCustomPersistenceHandlers() {
return cloned;
}

/*
* (non-Javadoc)
*
* @see
* org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManager
* #setCustomPersistenceHandlers(java.util.List)
*/
@Override
public void setCustomPersistenceHandlers(List<CustomPersistenceHandler> customPersistenceHandlers) {
this.customPersistenceHandlers = customPersistenceHandlers;
@@ -531,4 +398,12 @@ public List<CustomPersistenceHandlerFilter> getCustomPersistenceHandlerFilters()
public void setCustomPersistenceHandlerFilters(List<CustomPersistenceHandlerFilter> customPersistenceHandlerFilters) {
this.customPersistenceHandlerFilters = customPersistenceHandlerFilters;
}

public PersistenceModule[] getModules() {
return modules;
}

public void setModules(PersistenceModule[] modules) {
this.modules = modules;
}
}
@@ -31,6 +31,7 @@
import org.broadleafcommerce.openadmin.server.security.domain.AdminUser;
import org.broadleafcommerce.openadmin.server.security.service.AdminSecurityService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
@@ -42,6 +43,7 @@ public class SandBoxServiceImpl implements SandBoxService {

private static final Log LOG = LogFactory.getLog(SandBoxServiceImpl.class);

@Resource(name="blSandboxItemListeners")
protected List<SandBoxItemListener> sandboxItemListeners = new ArrayList<SandBoxItemListener>();

@Resource
@@ -54,11 +56,13 @@ public class SandBoxServiceImpl implements SandBoxService {
protected AdminSecurityService adminSecurityService;

@Override
@Transactional(value="blTransactionManager", readOnly = true)
public SandBox retrieveSandboxById(Long sandboxId) {
return sandBoxDao.retrieve(sandboxId);
}

@Override
@Transactional("blTransactionManager")
public SandBox retrieveUserSandBox(Site site, AdminUser adminUser) {
SandBox userSandbox;
if (adminUser.getOverrideSandBox() != null) {
@@ -74,11 +78,13 @@ public SandBox retrieveUserSandBox(Site site, AdminUser adminUser) {
}

@Override
@Transactional("blTransactionManager")
public void promoteAllSandBoxItems(SandBox fromSandBox, String comment) {
promoteSelectedItems(fromSandBox, comment, new ArrayList<SandBoxItem>(sandBoxItemDao.retrieveSandBoxItemsForSandbox(fromSandBox)));
}

@Override
@Transactional("blTransactionManager")
public void promoteSelectedItems(SandBox fromSandBox, String comment, List<SandBoxItem> sandBoxItems) {
SandBox destinationSandBox = determineNextSandBox(fromSandBox);
SandBoxAction action = createSandBoxAction(SandBoxActionType.PROMOTE, comment);
@@ -106,6 +112,7 @@ public void promoteSelectedItems(SandBox fromSandBox, String comment, List<SandB
}

@Override
@Transactional("blTransactionManager")
public void revertAllSandBoxItems(SandBox originalSandBox, SandBox sandBox) {
List<SandBoxItem> items = new ArrayList<SandBoxItem>();
List<SandBoxItem> sandBoxItems = sandBoxItemDao.retrieveSandBoxItemsForSandbox(sandBox);
@@ -118,6 +125,7 @@ public void revertAllSandBoxItems(SandBox originalSandBox, SandBox sandBox) {
}

@Override
@Transactional("blTransactionManager")
public void revertSelectedSandBoxItems(SandBox fromSandBox, List<SandBoxItem> sandBoxItems) {
for (SandBoxItem item : sandBoxItems) {
if (item.getArchivedFlag()) {
@@ -140,6 +148,7 @@ public void revertSelectedSandBoxItems(SandBox fromSandBox, List<SandBoxItem> sa
}

@Override
@Transactional("blTransactionManager")
public void rejectAllSandBoxItems(SandBox originalSandBox, SandBox sandBox, String comment) {
List<SandBoxItem> items = new ArrayList<SandBoxItem>();
List<SandBoxItem> currentItems = sandBoxItemDao.retrieveSandBoxItemsForSandbox(sandBox);
@@ -152,6 +161,7 @@ public void rejectAllSandBoxItems(SandBox originalSandBox, SandBox sandBox, Stri
}

@Override
@Transactional("blTransactionManager")
public void rejectSelectedSandBoxItems(SandBox fromSandBox, String comment, List<SandBoxItem> sandBoxItems) {
for (SandBoxItem item : sandBoxItems) {
if (item.getOriginalSandBoxId() == null) {
@@ -225,6 +235,7 @@ protected SandBox determineNextSandBox(SandBox sandBox) {
throw new IllegalArgumentException("Unable to determine next sandbox for " + sandBox);
}

@Transactional("blTransactionManager")
public SandBox retrieveApprovalSandBox(SandBox sandBox) {
final String APPROVAL_SANDBOX_NAME = "Approval";
SandBox approvalSandbox = retrieveSandBox(sandBox.getSite(), APPROVAL_SANDBOX_NAME, SandBoxType.APPROVAL);
@@ -237,10 +248,12 @@ public SandBox retrieveApprovalSandBox(SandBox sandBox) {
return approvalSandbox;
}

@Transactional("blTransactionManager")
public synchronized SandBox createSandBox(Site site, String sandBoxName, SandBoxType sandBoxType) {
return sandBoxDao.createSandBox(site, sandBoxName, sandBoxType);
}

@Transactional("blTransactionManager")
public SandBox retrieveSandBox(Site site, String sandBoxName, SandBoxType sandBoxType) {
return sandBoxDao.retrieveNamedSandBox(site, sandBoxType, sandBoxName);
}
@@ -16,31 +16,6 @@

package org.broadleafcommerce.openadmin.server.service.persistence.module;

import javax.persistence.Embedded;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactoryConfigurationError;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.StringTokenizer;

import com.anasoft.os.daofusion.criteria.AssociationPath;
import com.anasoft.os.daofusion.criteria.AssociationPathElement;
import com.anasoft.os.daofusion.criteria.PersistentEntityCriteria;
@@ -72,11 +47,40 @@
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.w3c.dom.DOMException;

import javax.persistence.Embedded;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactoryConfigurationError;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.StringTokenizer;

/**
* @author jfischer
*/
@Component("blBasicPersistenceModule")
@Scope("prototype")
public class BasicPersistenceModule implements PersistenceModule, RecordHelper, ApplicationContextAware {

private static final Log LOG = LogFactory.getLog(BasicPersistenceModule.class);
@@ -16,12 +16,6 @@

package org.broadleafcommerce.openadmin.server.service.persistence.module;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.anasoft.os.daofusion.criteria.AssociationPath;
import com.anasoft.os.daofusion.criteria.PersistentEntityCriteria;
import com.anasoft.os.daofusion.cto.client.CriteriaTransferObject;
@@ -43,13 +37,23 @@
import org.broadleafcommerce.openadmin.client.dto.Property;
import org.broadleafcommerce.openadmin.client.service.ServiceException;
import org.broadleafcommerce.openadmin.server.cto.BaseCtoConverter;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
*
* @author jfischer
*
*/
@Component("blJoinStructurePersistenceModule")
@Scope("prototype")
public class JoinStructurePersistenceModule extends BasicPersistenceModule {

private static final Log LOG = LogFactory.getLog(JoinStructurePersistenceModule.class);
@@ -16,17 +16,6 @@

package org.broadleafcommerce.openadmin.server.service.persistence.module;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.anasoft.os.daofusion.criteria.PersistentEntityCriteria;
import com.anasoft.os.daofusion.cto.client.CriteriaTransferObject;
import org.apache.commons.lang.StringUtils;
@@ -48,12 +37,27 @@
import org.broadleafcommerce.openadmin.client.service.ServiceException;
import org.broadleafcommerce.openadmin.server.cto.BaseCtoConverter;
import org.hibernate.mapping.PersistentClass;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
*
* @author jfischer
*
*/
@Component("blMapStructurePersistenceModule")
@Scope("prototype")
public class MapStructurePersistenceModule extends BasicPersistenceModule {

private static final Log LOG = LogFactory.getLog(MapStructurePersistenceModule.class);

This file was deleted.

@@ -15,7 +15,7 @@
<class>org.broadleafcommerce.openadmin.server.domain.SandBoxActionImpl</class>
<exclude-unlisted-classes/>
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.transaction.flush_before_completion" value="false"/>
<property name="hibernate.connection.autocommit" value="false"/>
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory"/>
@@ -10,69 +10,23 @@
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

<aop:config>
<aop:pointcut id="blAdminSecurityServiceSaveOperation" expression="execution(* org.broadleafcommerce.openadmin.server.security.service.AdminSecurityService.save*(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blAdminSecurityServiceSaveOperation"/>
</aop:config>

<aop:config>
<aop:pointcut id="blAdminSecurityServiceDeleteOperation" expression="execution(* org.broadleafcommerce.openadmin.server.security.service.AdminSecurityService.delete*(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blAdminSecurityServiceDeleteOperation"/>
</aop:config>

<aop:config>
<aop:pointcut id="blAdminSecurityServiceSendOperation" expression="execution(* org.broadleafcommerce.openadmin.server.security.service.AdminSecurityService.send*(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blAdminSecurityServiceSendOperation"/>
</aop:config>

<aop:config>
<aop:pointcut id="blAdminSecurityServiceResetOperation" expression="execution(* org.broadleafcommerce.openadmin.server.security.service.AdminSecurityService.reset*(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blAdminSecurityServiceResetOperation"/>
</aop:config>

<aop:config>
<aop:pointcut id="blRemoteServiceInspectOperation" expression="execution(* org.broadleafcommerce.openadmin.server.service.DynamicEntityRemoteService.inspect(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blRemoteServiceInspectOperation"/>
</aop:config>

<aop:config>
<aop:pointcut id="blRemoteServiceFetchOperation" expression="execution(* org.broadleafcommerce.openadmin.server.service.DynamicEntityRemoteService.fetch(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blRemoteServiceFetchOperation"/>
</aop:config>

<aop:config>
<aop:pointcut id="blRemoteServiceAddOperation" expression="execution(* org.broadleafcommerce.openadmin.server.service.DynamicEntityRemoteService.add(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blRemoteServiceAddOperation"/>
</aop:config>

<aop:config>
<aop:pointcut id="blRemoteServiceUpdateOperation" expression="execution(* org.broadleafcommerce.openadmin.server.service.DynamicEntityRemoteService.update(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blRemoteServiceUpdateOperation"/>
</aop:config>

<aop:config>
<aop:pointcut id="blRemoteServiceRemoveOperation" expression="execution(* org.broadleafcommerce.openadmin.server.service.DynamicEntityRemoteService.remove(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blRemoteServiceRemoveOperation"/>
</aop:config>

<aop:config>
<aop:pointcut id="blSandBoxServiceRetrieveUserOperation" expression="execution(* org.broadleafcommerce.openadmin.server.service.persistence.SandBoxServiceImpl.retrieveUserSandBox(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blSandBoxServiceRetrieveUserOperation"/>
</aop:config>

<aop:config>
<aop:pointcut id="blSandBoxServiceRetrieveApprovalOperation" expression="execution(* org.broadleafcommerce.openadmin.server.service.persistence.SandBoxServiceImpl.retrieveApprovalSandBox(..))"/>
<aop:advisor advice-ref="blTxAdvice" pointcut-ref="blSandBoxServiceRetrieveApprovalOperation"/>
</aop:config>

<!--<aop:config>
<aop:pointcut id="blSandBoxServiceSaveOperation" expression="execution(* saveEntitySandBoxItemsandBoxItems(..))"/>
<aop:advisor advice-ref="blTxAdviceSandBox" pointcut-ref="blSandBoxServiceSaveOperation"/>
</aop:config>-->

<bean id="blBasicPersistenceModule" class="org.broadleafcommerce.openadmin.server.service.persistence.module.BasicPersistenceModule" scope="prototype"/>
<bean id="blJoinStructurePersistenceModule" class="org.broadleafcommerce.openadmin.server.service.persistence.module.JoinStructurePersistenceModule" scope="prototype"/>
<bean id="blMapStructurePersistenceModule" class="org.broadleafcommerce.openadmin.server.service.persistence.module.MapStructurePersistenceModule" scope="prototype"/>
<bean id="blConfiguration" class="org.broadleafcommerce.common.config.RuntimeEnvironmentPropertiesConfigurer">
<property name="propertyLocations">
<set>
<value>classpath:config/bc/admin/</value>
</set>
</property>
<property name="environments">
<set>
<value>production</value>
<value>staging</value>
<value>integration</value>
<value>development</value>
</set>
</property>
<property name="defaultEnvironment" value="development"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>

<bean id="blPersistenceModules" class="org.springframework.beans.factory.config.ListFactoryBean" scope="prototype">
<property name="sourceList">
@@ -83,16 +37,6 @@
</list>
</property>
</bean>

<bean id="blBaseCtoConverter" class="org.broadleafcommerce.openadmin.server.cto.BaseCtoConverterImpl" scope="prototype"/>

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="org.broadleafcommerce.openadmin.server.util.TargetModeTypeConverter" />
</list>
</property>
</bean>

<bean id="blTargetEntityManagers" class="org.springframework.beans.factory.config.MapFactoryBean" scope="prototype">
<property name="sourceMap">
@@ -113,57 +57,34 @@
</property>
</bean>

<bean id="blPersistenceManager" class="org.broadleafcommerce.openadmin.server.service.persistence.PersistenceManagerImpl" scope="prototype">
<constructor-arg ref="blPersistenceModules"/>
<property name="customPersistenceHandlers" ref="blCustomPersistenceHandlers"/>
<property name="customPersistenceHandlerFilters" ref="blCustomPersistenceHandlerFilters"/>
<property name="targetEntityManagers" ref="blTargetEntityManagers"/>
<property name="dynamicEntityDao" ref="blDynamicEntityDao"/>
<property name="adminRemoteSecurityService" ref="blAdminSecurityRemoteService"/>
</bean>

<bean id="blCustomPersistenceHandlerFilters" class="org.springframework.beans.factory.config.ListFactoryBean" scope="prototype">
<property name="sourceList">
<list>
</list>
</property>
</bean>

<bean id="blDynamicEntityDao" class="org.broadleafcommerce.openadmin.server.dao.DynamicEntityDaoImpl" scope="prototype">
<property name="ejb3ConfigurationDao" ref="blEJB3ConfigurationDao"/>
<property name="entityConfiguration" ref="blEntityConfiguration"/>
<property name="fieldMetadataOverrides" ref="blMetadataOverrides"/>
</bean>

<bean id="blSessionFactory" factory-bean="entityManagerFactory" factory-method="getSessionFactory" />

<bean id="blEJB3ConfigurationDao" class="org.broadleafcommerce.openadmin.server.dao.EJB3ConfigurationDaoImpl">
<property name="persistenceUnitInfo">
<bean factory-bean="entityManagerFactory" factory-method="getPersistenceUnitInfo" />
</property>
</bean>

<bean id="prodEntityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="entityManagerInterface" value="org.hibernate.ejb.HibernateEntityManager"/>
</bean>

<bean id="blSendAdminUsernameEmailInfo" class="org.broadleafcommerce.common.email.service.info.EmailInfo">
<property name="fromAddress" value="noreply@mysite.com"/>
<property name="emailTemplate" value="org/broadleafcommerce/openadmin/server/email/template/adminSendUsername.vm"/>
<property name="subject" value="[Broadleaf Admin] Username requested"/>
<property name="fromAddress" value="${adminUserNameEmail.fromAddress}"/>
<property name="emailTemplate" value="${adminUserNameEmail.emailTemplate}"/>
<property name="subject" value="${adminUserNameEmail.subject}"/>
</bean>

<bean id="blSendAdminResetPasswordEmail" class="org.broadleafcommerce.common.email.service.info.EmailInfo">
<property name="fromAddress" value="noreply@mysite.com"/>
<property name="emailTemplate" value="org/broadleafcommerce/openadmin/server/email/template/adminResetPassword.vm"/>
<property name="subject" value="[Broadleaf Admin] Reset password requested"/>
<property name="fromAddress" value="${adminResetPassword.fromAddress}"/>
<property name="emailTemplate" value="${adminResetPassword.emailTemplate}"/>
<property name="subject" value="${adminResetPassword.subject}"/>
</bean>

<bean id="blAdminSecurityService" class="org.broadleafcommerce.openadmin.server.security.service.AdminSecurityServiceImpl">
<property name="sendUsernameEmailInfo" ref="blSendAdminUsernameEmailInfo"/>
<property name="resetPasswordEmailInfo" ref="blSendAdminResetPasswordEmail"/>
<property name="tokenExpiredMinutes" value="30"/>
<bean id="blEJB3ConfigurationDao" class="org.broadleafcommerce.openadmin.server.dao.EJB3ConfigurationDaoImpl">
<property name="persistenceUnitInfo">
<bean factory-bean="entityManagerFactory" factory-method="getPersistenceUnitInfo" />
</property>
</bean>

<!--<bean id="sandBoxEntityManagerPool" class="org.broadleafcommerce.openadmin.server.service.persistence.entitymanager.pool.SandBoxEntityManagerPoolFactoryBean">
@@ -0,0 +1,21 @@
#
# Copyright 2008-2009 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
adminUserNameEmail.fromAddress=noreply@mysite.com
adminUserNameEmail.emailTemplate=org/broadleafcommerce/openadmin/server/email/template/adminSendUsername.vm
adminUserNameEmail.subject=[Broadleaf Admin] Username requested
adminResetPassword.fromAddress=noreply@mysite.com
adminResetPassword.emailTemplate=org/broadleafcommerce/openadmin/server/email/template/adminResetPassword.vm
adminResetPassword.subject=[Broadleaf Admin] Reset password requested
@@ -0,0 +1,18 @@
#
# Copyright 2008-2009 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

tokenExpiredMinutes=30
resetPasswordURL=
@@ -0,0 +1,17 @@
#
# Copyright 2008-2009 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
tokenExpiredMinutes=30
resetPasswordURL=
@@ -0,0 +1,17 @@
#
# Copyright 2008-2009 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
tokenExpiredMinutes=30
resetPasswordURL=
@@ -0,0 +1,17 @@
#
# Copyright 2008-2009 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
tokenExpiredMinutes=30
resetPasswordURL=
@@ -62,5 +62,4 @@
*/
String ceilingDisplayEntity() default "";

WorkflowEnabledEnum workflowEnabled() default WorkflowEnabledEnum.NOT_SPECIFIED;
}

This file was deleted.

@@ -76,16 +76,22 @@ priority.11.1=1
xpath.11.1=/beans/bean[@id='blStaticMapNamedOperationComponent']/property[@name='namedOperations']/map/entry
handler.12=org.broadleafcommerce.common.extensibility.context.merge.handlers.NodeReplaceInsert
priority.12=12
xpath.12=/beans/*
xpath.12=/beans/bean[@id='blConfiguration']/*
handler.12.1=org.broadleafcommerce.common.extensibility.context.merge.handlers.InsertItems
priority.12.1=1
xpath.12.1=/beans/bean[@id='blConfiguration']/property[@name='propertyLocations']/set/value
handler.13=org.broadleafcommerce.common.extensibility.context.merge.handlers.NodeReplaceInsert
priority.13=13
xpath.13=/ehcache/*
handler.13.1=org.broadleafcommerce.common.extensibility.context.merge.handlers.LiberalNodeReplaceInsert
priority.13.1=1
xpath.13.1=/ehcache/cacheManagerEventListenerFactory
handler.13.2=org.broadleafcommerce.common.extensibility.context.merge.handlers.NodeReplace
priority.13.2=2
xpath.13.2=/ehcache/diskStore
handler.13.3=org.broadleafcommerce.common.extensibility.context.merge.handlers.NodeReplace
priority.13.3=3
xpath.13.3=/ehcache/defaultCache
xpath.13=/beans/*
handler.14=org.broadleafcommerce.common.extensibility.context.merge.handlers.NodeReplaceInsert
priority.14=14
xpath.14=/ehcache/*
handler.14.1=org.broadleafcommerce.common.extensibility.context.merge.handlers.LiberalNodeReplaceInsert
priority.14.1=1
xpath.14.1=/ehcache/cacheManagerEventListenerFactory
handler.14.2=org.broadleafcommerce.common.extensibility.context.merge.handlers.NodeReplace
priority.14.2=2
xpath.14.2=/ehcache/diskStore
handler.14.3=org.broadleafcommerce.common.extensibility.context.merge.handlers.NodeReplace
priority.14.3=3
xpath.14.3=/ehcache/defaultCache
@@ -44,7 +44,6 @@ public class RecordOfferUsageActivity extends BaseActivity {
@Resource(name="blOfferAuditDao")
private OfferAuditDao offerAuditDao;

@Transactional(propagation = Propagation.REQUIRED)
public ProcessContext execute(ProcessContext context) throws Exception {
Set<Long> appliedOfferIds = new HashSet<Long>();
CheckoutSeed seed = ((CheckoutContext) context).getSeedData();
@@ -26,8 +26,6 @@
import org.broadleafcommerce.core.order.domain.OrderItem;
import org.broadleafcommerce.core.workflow.BaseActivity;
import org.broadleafcommerce.core.workflow.ProcessContext;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.HashMap;
@@ -43,7 +41,6 @@ public class VerifyCustomerMaxOfferUsesActivity extends BaseActivity {
@Resource(name="blOfferAuditDao")
private OfferAuditDao offerAuditDao;

@Transactional(propagation = Propagation.REQUIRED)
public ProcessContext execute(ProcessContext context) throws Exception {
Map<Long,Long> offerIdToAllowedUsesMap = new HashMap<Long,Long>();
CheckoutSeed seed = ((CheckoutContext) context).getSeedData();
@@ -85,6 +85,8 @@
</property>
</bean>

<tx:annotation-driven/>

<bean id="blTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>