package net.techreadiness.service; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.inject.Inject; import javax.jws.WebService; import net.techreadiness.annotation.CoreDataModificationStatus; import net.techreadiness.annotation.CoreDataModificationStatus.ModificationType; import net.techreadiness.persistence.dao.ContactDAO; import net.techreadiness.persistence.dao.ContactTypeDAO; import net.techreadiness.persistence.dao.EntityDAO.EntityTypeCode; import net.techreadiness.persistence.dao.OrgDAO; import net.techreadiness.persistence.domain.ContactDO; import net.techreadiness.persistence.domain.ContactTypeDO; import net.techreadiness.persistence.domain.OrgDO; import net.techreadiness.service.common.ValidationError; import net.techreadiness.service.exception.FaultInfo; import net.techreadiness.service.exception.ServiceException; import net.techreadiness.service.exception.ValidationServiceException; import net.techreadiness.service.object.Contact; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @WebService @Service @Transactional public class ContactServiceImpl extends BaseServiceWithValidationImpl implements ContactService { @Inject private ContactDAO contactDAO; @Inject private ContactTypeDAO contactTypeDao; @Inject private OrgDAO orgDao; @Override @CoreDataModificationStatus(modificationType = ModificationType.UPDATE, entityClass = ContactDO.class) public Contact add(ServiceContext context, Contact contact) { ContactDO contactDO = contactDAO.getByOrgAndContactType(contact.getOrg().getOrgId(), contact.getContactTypeCode()); if (contactDO != null) { throw new ServiceException("Contact of that type already exists."); } ContactDO newContact = new ContactDO(); copyMapFieldsToEntity(context, newContact, contact.getAsMap()); ContactTypeDO contactTypeDO = contactTypeDao.getContactType(context.getScopeId(), contact.getContactTypeCode()); OrgDO org = orgDao.getById(contact.getOrg().getOrgId()); newContact.setContactType(contactTypeDO); newContact.setOrg(org); doValidation(context, newContact); return getMappingService().map(contactDAO.create(newContact)); } @Override @CoreDataModificationStatus(modificationType = ModificationType.UPDATE, entityClass = ContactDO.class) public Contact update(ServiceContext context, Long contactId, Map<String, String> attributes, Long contactTypeId) { ContactDO contactDO = contactDAO.getById(contactId); if (allUserEnteredAttributesAreBlank(attributes)) { contactDAO.delete(contactDO); return null; } copyMapFieldsToEntity(context, contactDO, attributes); ContactTypeDO contactType = contactTypeDao.getById(contactTypeId); contactDO.setContactType(contactType); doValidation(context, contactDO); return getMappingService().map(contactDAO.update(contactDO)); } private void doValidation(ServiceContext context, ContactDO contactDO) throws ValidationServiceException, ServiceException { List<ValidationError> list = performValidation(contactDO.getAsMap(), context.getScopeId(), EntityTypeCode.CONTACT); if (list != null && list.size() > 0) { FaultInfo faultInfo = new FaultInfo(); faultInfo.setMessage("Contact failed validation."); faultInfo.setAttributeErrors(list); throw new ValidationServiceException(faultInfo); } } @Override @Transactional(readOnly = true) public void validate(ServiceContext context, Contact contact) throws ValidationServiceException, ServiceException { doValidation(context, getMappingService().map(contact)); } @Override @CoreDataModificationStatus(modificationType = ModificationType.UPDATE, entityClass = ContactDO.class) public Contact create(ServiceContext context, Map<String, String> attributes, Long contactTypeId, Long orgId) throws ValidationServiceException, ServiceException { ContactDO contactDO = new ContactDO(); if (allUserEnteredAttributesAreBlank(attributes)) { return null; } copyMapFieldsToEntity(context, contactDO, attributes); ContactTypeDO contactType = contactTypeDao.getById(contactTypeId); contactDO.setContactType(contactType); OrgDO org = orgDao.getById(orgId); contactDO.setOrg(org); doValidation(context, contactDO); return getMappingService().map(contactDAO.create(contactDO)); } private static boolean allUserEnteredAttributesAreBlank(Map<String, String> attributes) { Iterator<Entry<String, String>> iterator = attributes.entrySet().iterator(); while (iterator.hasNext()) { Entry<String, String> entry = iterator.next(); String key = entry.getKey(); String value = entry.getValue(); // ignore orgId, contactTypeId and contactTypeName, they are not set by user if (!(key.equalsIgnoreCase("orgId") || key.equalsIgnoreCase("contactTypeId") || key.equalsIgnoreCase("contactId") || key.equalsIgnoreCase("contactTypeName"))) { if (!value.isEmpty()) { return false; } } } return true; } @Override @CoreDataModificationStatus(modificationType = ModificationType.DELETE, entityClass = ContactDO.class) public void deleteContactsForOrg(ServiceContext context, Long orgId) { for (ContactDO contact : contactDAO.findByOrg(orgId)) { contactDAO.delete(contact); } } }