package net.techreadiness.service; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.jws.WebService; import net.techreadiness.annotation.CoreDataModificationStatus; import net.techreadiness.annotation.CoreDataModificationStatus.ModificationType; import net.techreadiness.persistence.AbstractAuditedBaseEntityWithExt; import net.techreadiness.persistence.dao.EntityDAO; import net.techreadiness.persistence.dao.EntityDAO.EntityTypeCode; import net.techreadiness.persistence.dao.EntityFieldDAO; import net.techreadiness.persistence.dao.ExtDAO; import net.techreadiness.persistence.dao.ScopeDAO; import net.techreadiness.persistence.dao.ScopeTypeDAO; import net.techreadiness.persistence.domain.ScopeDO; import net.techreadiness.persistence.domain.ScopeTypeDO; import net.techreadiness.service.common.ValidationError; import net.techreadiness.service.exception.FaultInfo; import net.techreadiness.service.exception.ValidationServiceException; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * This is a service class for handling scope map objects from a viewDef form or datagrid. * */ @WebService @Service public class ScopeMapServiceImpl extends BaseServiceWithValidationAndExt<ScopeDO, AbstractAuditedBaseEntityWithExt<ScopeDO>> implements ScopeMapService { @Inject ScopeDAO scopeDao; @Inject ScopeTypeDAO scopeTypeDao; @Inject @Qualifier("scopeExtDAOImpl") ExtDAO<ScopeDO, AbstractAuditedBaseEntityWithExt<ScopeDO>> scopeExtDao; @Inject EntityFieldDAO entityFieldDao; @Override @Transactional @CoreDataModificationStatus(modificationType = ModificationType.UPDATE, entityClass = ScopeDO.class) public void update(ServiceContext context, Map<String, String> map) { ScopeDO scopeDO = scopeDao.getById(Long.valueOf(map.get("scopeId"))); scopeDO.getExtAttributes().putAll(map); validate(scopeDO); copyExtFieldsToCore(context, scopeDO); storeExtFields(context, scopeDO, scopeExtDao, EntityTypeCode.SCOPE, scopeDO.getScopeId()); scopeDao.update(scopeDO); } @Override @Transactional(readOnly = true) public Map<String, String> getById(ServiceContext context, Long scopeId) { ScopeDO scopeDO = scopeDao.getById(scopeId); Map<String, String> scopeAsMap = scopeDO.getExtAttributes(); if (scopeAsMap == null) { scopeDO.setExtAttributes(scopeDO.getAsMap()); } else { scopeDO.getExtAttributes().putAll(scopeDO.getAsMap()); } return scopeAsMap; } @Override @Transactional @CoreDataModificationStatus(modificationType = ModificationType.UPDATE, entityClass = ScopeDO.class) public void persist(ServiceContext context, Map<String, String> map, Long scopeTypeId, Long parentScopeId) { ScopeDO scopeDO = new ScopeDO(); scopeDO.setExtAttributes(map); if (parentScopeId != null) { ScopeDO parentScope = scopeDao.getById(parentScopeId); scopeDO.setParentScope(parentScope); } ScopeTypeDO scopeTypeDO = scopeTypeDao.getById(scopeTypeId); scopeDO.setScopeType(scopeTypeDO); validate(scopeDO); copyExtFieldsToCore(context, scopeDO); scopeDao.persist(scopeDO); // store ext's after saving new scopeDO object, and now scopeDO has a ScopeId storeExtFields(context, scopeDO, scopeExtDao, EntityTypeCode.SCOPE, scopeDO.getScopeId()); } private void validate(ScopeDO scope) { if (scope.getScopeId() == null && scope.getParentScope() == null) {// new root scope return; } Long scopeToLookup; if (scope.getScopeId() == null) { scopeToLookup = scope.getParentScope().getScopeId(); } else { scopeToLookup = scope.getScopeId(); } List<ValidationError> errors = performValidation(scope.getExtAttributes(), scopeToLookup, EntityDAO.EntityTypeCode.SCOPE); if (errors == null || !errors.isEmpty()) { FaultInfo faultInfo = new FaultInfo(); faultInfo.setMessage("Scope failed validation."); faultInfo.setAttributeErrors(errors); throw new ValidationServiceException(faultInfo); } } }