/* * Copyright 2015 herd contributors * * 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. */ package org.finra.herd.service.impl; import static org.finra.herd.model.dto.SearchIndexUpdateDto.SEARCH_INDEX_UPDATE_TYPE_UPDATE; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.finra.herd.dao.BusinessObjectDefinitionDao; import org.finra.herd.dao.BusinessObjectDefinitionSubjectMatterExpertDao; import org.finra.herd.dao.config.DaoSpringModuleConfig; import org.finra.herd.model.AlreadyExistsException; import org.finra.herd.model.annotation.PublishJmsMessages; import org.finra.herd.model.api.xml.BusinessObjectDefinitionKey; import org.finra.herd.model.api.xml.BusinessObjectDefinitionSubjectMatterExpert; import org.finra.herd.model.api.xml.BusinessObjectDefinitionSubjectMatterExpertCreateRequest; import org.finra.herd.model.api.xml.BusinessObjectDefinitionSubjectMatterExpertKey; import org.finra.herd.model.api.xml.BusinessObjectDefinitionSubjectMatterExpertKeys; import org.finra.herd.model.jpa.BusinessObjectDefinitionEntity; import org.finra.herd.model.jpa.BusinessObjectDefinitionSubjectMatterExpertEntity; import org.finra.herd.service.BusinessObjectDefinitionSubjectMatterExpertService; import org.finra.herd.service.helper.AlternateKeyHelper; import org.finra.herd.service.helper.BusinessObjectDefinitionDaoHelper; import org.finra.herd.service.helper.BusinessObjectDefinitionHelper; import org.finra.herd.service.helper.BusinessObjectDefinitionSubjectMatterExpertDaoHelper; import org.finra.herd.service.helper.SearchIndexUpdateHelper; /** * The business object definition subject matter expert service implementation. */ @Service @Transactional(value = DaoSpringModuleConfig.HERD_TRANSACTION_MANAGER_BEAN_NAME) public class BusinessObjectDefinitionSubjectMatterExpertServiceImpl implements BusinessObjectDefinitionSubjectMatterExpertService { @Autowired private AlternateKeyHelper alternateKeyHelper; @Autowired private BusinessObjectDefinitionDao businessObjectDefinitionDao; @Autowired private BusinessObjectDefinitionDaoHelper businessObjectDefinitionDaoHelper; @Autowired private BusinessObjectDefinitionHelper businessObjectDefinitionHelper; @Autowired private BusinessObjectDefinitionSubjectMatterExpertDao businessObjectDefinitionSubjectMatterExpertDao; @Autowired private BusinessObjectDefinitionSubjectMatterExpertDaoHelper businessObjectDefinitionSubjectMatterExpertDaoHelper; @Autowired private SearchIndexUpdateHelper searchIndexUpdateHelper; @PublishJmsMessages @Override public BusinessObjectDefinitionSubjectMatterExpert createBusinessObjectDefinitionSubjectMatterExpert( BusinessObjectDefinitionSubjectMatterExpertCreateRequest request) { // Validate and trim the business object definition subject matter expert create request. validateBusinessObjectDefinitionSubjectMatterExpertCreateRequest(request); // Get the business object definition key. BusinessObjectDefinitionKey businessObjectDefinitionKey = new BusinessObjectDefinitionKey(request.getBusinessObjectDefinitionSubjectMatterExpertKey().getNamespace(), request.getBusinessObjectDefinitionSubjectMatterExpertKey().getBusinessObjectDefinitionName()); // Get the business object definition and ensure it exists. BusinessObjectDefinitionEntity businessObjectDefinitionEntity = businessObjectDefinitionDaoHelper.getBusinessObjectDefinitionEntity(businessObjectDefinitionKey); // Ensure a business object definition subject matter expert with the specified name doesn't already exist for the business object definition. if (businessObjectDefinitionSubjectMatterExpertDao.getBusinessObjectDefinitionSubjectMatterExpert(businessObjectDefinitionEntity, request.getBusinessObjectDefinitionSubjectMatterExpertKey().getUserId()) != null) { throw new AlreadyExistsException(String.format("Unable to create business object definition subject matter expert with user id \"%s\" " + "because it already exists for the business object definition {%s}.", request.getBusinessObjectDefinitionSubjectMatterExpertKey().getUserId(), businessObjectDefinitionHelper.businessObjectDefinitionKeyToString(businessObjectDefinitionKey))); } // Create a business object definition subject matter expert entity from the request information. BusinessObjectDefinitionSubjectMatterExpertEntity businessObjectDefinitionSubjectMatterExpertEntity = createBusinessObjectDefinitionSubjectMatterExpertEntity(businessObjectDefinitionEntity, request); // Persist the new entity. businessObjectDefinitionSubjectMatterExpertEntity = businessObjectDefinitionSubjectMatterExpertDao.saveAndRefresh(businessObjectDefinitionSubjectMatterExpertEntity); // Notify the search index that a business object definition must be updated. searchIndexUpdateHelper.modifyBusinessObjectDefinitionInSearchIndex(businessObjectDefinitionEntity, SEARCH_INDEX_UPDATE_TYPE_UPDATE); // Create and return the business object definition subject matter expert object from the persisted entity. return createBusinessObjectDefinitionSubjectMatterExpertFromEntity(businessObjectDefinitionSubjectMatterExpertEntity); } @Override public BusinessObjectDefinitionSubjectMatterExpert deleteBusinessObjectDefinitionSubjectMatterExpert(BusinessObjectDefinitionSubjectMatterExpertKey key) { // Validate and trim the business object definition subject matter expert key. validateBusinessObjectDefinitionSubjectMatterExpertKey(key); // Retrieve and ensure that a business object definition subject matter expert exists. BusinessObjectDefinitionSubjectMatterExpertEntity businessObjectDefinitionSubjectMatterExpertEntity = businessObjectDefinitionSubjectMatterExpertDaoHelper.getBusinessObjectDefinitionSubjectMatterExpertEntity(key); // Delete the business object definition subject matter expert. BusinessObjectDefinitionEntity businessObjectDefinitionEntity = businessObjectDefinitionSubjectMatterExpertEntity.getBusinessObjectDefinition(); businessObjectDefinitionEntity.getSubjectMatterExperts().remove(businessObjectDefinitionSubjectMatterExpertEntity); businessObjectDefinitionDao.saveAndRefresh(businessObjectDefinitionEntity); // Notify the search index that a business object definition must be updated. searchIndexUpdateHelper.modifyBusinessObjectDefinitionInSearchIndex(businessObjectDefinitionEntity, SEARCH_INDEX_UPDATE_TYPE_UPDATE); // Create and return the business object definition subject matter expert object from the deleted entity. return createBusinessObjectDefinitionSubjectMatterExpertFromEntity(businessObjectDefinitionSubjectMatterExpertEntity); } @Override public BusinessObjectDefinitionSubjectMatterExpertKeys getBusinessObjectDefinitionSubjectMatterExpertsByBusinessObjectDefinition( BusinessObjectDefinitionKey businessObjectDefinitionKey) { // Validate and trim the business object definition key. businessObjectDefinitionHelper.validateBusinessObjectDefinitionKey(businessObjectDefinitionKey); // Retrieve the business object definition and ensure it exists. BusinessObjectDefinitionEntity businessObjectDefinitionEntity = businessObjectDefinitionDaoHelper.getBusinessObjectDefinitionEntity(businessObjectDefinitionKey); // Create and populate a list of business object definition subject matter expert keys. BusinessObjectDefinitionSubjectMatterExpertKeys businessObjectDefinitionSubjectMatterExpertKeys = new BusinessObjectDefinitionSubjectMatterExpertKeys(); for (BusinessObjectDefinitionSubjectMatterExpertEntity businessObjectDefinitionSubjectMatterExpertEntity : businessObjectDefinitionEntity .getSubjectMatterExperts()) { businessObjectDefinitionSubjectMatterExpertKeys.getBusinessObjectDefinitionSubjectMatterExpertKeys() .add(getBusinessObjectDefinitionSubjectMatterExpertKey(businessObjectDefinitionSubjectMatterExpertEntity)); } return businessObjectDefinitionSubjectMatterExpertKeys; } /** * Creates and persists a new business object definition subject matter expert entity from the business object definition entity and the request * information. * * @param businessObjectDefinitionEntity the business object definition entity * @param request the business object definition subject matter expert create request * * @return the newly created business object definition subject matter expert entity */ private BusinessObjectDefinitionSubjectMatterExpertEntity createBusinessObjectDefinitionSubjectMatterExpertEntity( BusinessObjectDefinitionEntity businessObjectDefinitionEntity, BusinessObjectDefinitionSubjectMatterExpertCreateRequest request) { BusinessObjectDefinitionSubjectMatterExpertEntity businessObjectDefinitionSubjectMatterExpertEntity = new BusinessObjectDefinitionSubjectMatterExpertEntity(); businessObjectDefinitionSubjectMatterExpertEntity.setBusinessObjectDefinition(businessObjectDefinitionEntity); businessObjectDefinitionSubjectMatterExpertEntity.setUserId(request.getBusinessObjectDefinitionSubjectMatterExpertKey().getUserId()); return businessObjectDefinitionSubjectMatterExpertDao.saveAndRefresh(businessObjectDefinitionSubjectMatterExpertEntity); } /** * Creates a business object definition subject matter expert from the persisted entity. * * @param businessObjectDefinitionSubjectMatterExpertEntity the business object definition subject matter expert entity * * @return the business object definition subject matter expert */ private BusinessObjectDefinitionSubjectMatterExpert createBusinessObjectDefinitionSubjectMatterExpertFromEntity( BusinessObjectDefinitionSubjectMatterExpertEntity businessObjectDefinitionSubjectMatterExpertEntity) { return new BusinessObjectDefinitionSubjectMatterExpert(businessObjectDefinitionSubjectMatterExpertEntity.getId(), getBusinessObjectDefinitionSubjectMatterExpertKey(businessObjectDefinitionSubjectMatterExpertEntity)); } /** * Creates a business object definition subject matter expert key from the entity. * * @param businessObjectDefinitionSubjectMatterExpertEntity the business object definition subject matter expert entity * * @return the business object definition subject matter expert key */ private BusinessObjectDefinitionSubjectMatterExpertKey getBusinessObjectDefinitionSubjectMatterExpertKey( BusinessObjectDefinitionSubjectMatterExpertEntity businessObjectDefinitionSubjectMatterExpertEntity) { return new BusinessObjectDefinitionSubjectMatterExpertKey( businessObjectDefinitionSubjectMatterExpertEntity.getBusinessObjectDefinition().getNamespace().getCode(), businessObjectDefinitionSubjectMatterExpertEntity.getBusinessObjectDefinition().getName(), businessObjectDefinitionSubjectMatterExpertEntity.getUserId()); } /** * Validates the business object definition subject matter expert create request. This method also trims the request parameters. * * @param request the business object definition subject matter expert create request */ private void validateBusinessObjectDefinitionSubjectMatterExpertCreateRequest(BusinessObjectDefinitionSubjectMatterExpertCreateRequest request) { Assert.notNull(request, "A business object definition subject matter expert create request must be specified."); validateBusinessObjectDefinitionSubjectMatterExpertKey(request.getBusinessObjectDefinitionSubjectMatterExpertKey()); } /** * Validates the business object definition subject matter expert key. This method also trims the key parameters. * * @param key the business object definition subject matter expert key */ private void validateBusinessObjectDefinitionSubjectMatterExpertKey(BusinessObjectDefinitionSubjectMatterExpertKey key) { Assert.notNull(key, "A business object definition subject matter expert key must be specified."); key.setNamespace(alternateKeyHelper.validateStringParameter("namespace", key.getNamespace())); key.setBusinessObjectDefinitionName( alternateKeyHelper.validateStringParameter("business object definition name", key.getBusinessObjectDefinitionName())); key.setUserId(alternateKeyHelper.validateStringParameter("user id", key.getUserId())); } }