/* * 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 java.util.ArrayList; import java.util.List; 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.BusinessObjectDefinitionTagDao; import org.finra.herd.dao.config.DaoSpringModuleConfig; import org.finra.herd.model.AlreadyExistsException; import org.finra.herd.model.ObjectNotFoundException; import org.finra.herd.model.annotation.PublishJmsMessages; import org.finra.herd.model.api.xml.BusinessObjectDefinitionKey; import org.finra.herd.model.api.xml.BusinessObjectDefinitionTag; import org.finra.herd.model.api.xml.BusinessObjectDefinitionTagCreateRequest; import org.finra.herd.model.api.xml.BusinessObjectDefinitionTagKey; import org.finra.herd.model.api.xml.BusinessObjectDefinitionTagKeys; import org.finra.herd.model.api.xml.TagKey; import org.finra.herd.model.jpa.BusinessObjectDefinitionEntity; import org.finra.herd.model.jpa.BusinessObjectDefinitionTagEntity; import org.finra.herd.model.jpa.TagEntity; import org.finra.herd.service.BusinessObjectDefinitionTagService; import org.finra.herd.service.helper.BusinessObjectDefinitionDaoHelper; import org.finra.herd.service.helper.BusinessObjectDefinitionHelper; import org.finra.herd.service.helper.SearchIndexUpdateHelper; import org.finra.herd.service.helper.TagDaoHelper; import org.finra.herd.service.helper.TagHelper; /** * The business object definition tag service implementation. */ @Service @Transactional(value = DaoSpringModuleConfig.HERD_TRANSACTION_MANAGER_BEAN_NAME) public class BusinessObjectDefinitionTagServiceImpl implements BusinessObjectDefinitionTagService { @Autowired private BusinessObjectDefinitionDaoHelper businessObjectDefinitionDaoHelper; @Autowired private BusinessObjectDefinitionHelper businessObjectDefinitionHelper; @Autowired private BusinessObjectDefinitionTagDao businessObjectDefinitionTagDao; @Autowired private SearchIndexUpdateHelper searchIndexUpdateHelper; @Autowired private TagDaoHelper tagDaoHelper; @Autowired private TagHelper tagHelper; @PublishJmsMessages @Override public BusinessObjectDefinitionTag createBusinessObjectDefinitionTag(BusinessObjectDefinitionTagCreateRequest request) { // Validate and trim the business object definition tag create request. validateBusinessObjectDefinitionTagCreateRequest(request); // Get the business object definition entity and ensure it exists. BusinessObjectDefinitionEntity businessObjectDefinitionEntity = businessObjectDefinitionDaoHelper.getBusinessObjectDefinitionEntity(request.getBusinessObjectDefinitionTagKey().getBusinessObjectDefinitionKey()); // Get the tag entity and ensure it exists. TagEntity tagEntity = tagDaoHelper.getTagEntity(request.getBusinessObjectDefinitionTagKey().getTagKey()); // Ensure a business object definition tag for the specified business object definition and tag doesn't already exist. if (businessObjectDefinitionTagDao.getBusinessObjectDefinitionTagByParentEntities(businessObjectDefinitionEntity, tagEntity) != null) { throw new AlreadyExistsException(String.format("Tag with tag type \"%s\" and code \"%s\" already exists for business object definition {%s}.", request.getBusinessObjectDefinitionTagKey().getTagKey().getTagTypeCode(), request.getBusinessObjectDefinitionTagKey().getTagKey().getTagCode(), businessObjectDefinitionHelper .businessObjectDefinitionKeyToString(request.getBusinessObjectDefinitionTagKey().getBusinessObjectDefinitionKey()))); } // Create and persist a business object definition tag entity. BusinessObjectDefinitionTagEntity businessObjectDefinitionTagEntity = createBusinessObjectDefinitionTagEntity(businessObjectDefinitionEntity, tagEntity); // 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 tag object from the persisted entity. return createBusinessObjectDefinitionTagFromEntity(businessObjectDefinitionTagEntity); } @PublishJmsMessages @Override public BusinessObjectDefinitionTag deleteBusinessObjectDefinitionTag(BusinessObjectDefinitionTagKey businessObjectDefinitionTagKey) { // Validate and trim the business object definition tag key. validateBusinessObjectDefinitionTagKey(businessObjectDefinitionTagKey); // Retrieve and ensure that a business object definition tag exists. BusinessObjectDefinitionTagEntity businessObjectDefinitionTagEntity = getBusinessObjectDefinitionTagEntity(businessObjectDefinitionTagKey); // Delete this business object format. businessObjectDefinitionTagDao.delete(businessObjectDefinitionTagEntity); // Notify the search index that a business object definition must be updated. searchIndexUpdateHelper.modifyBusinessObjectDefinitionInSearchIndex( businessObjectDefinitionDaoHelper.getBusinessObjectDefinitionEntity(businessObjectDefinitionTagKey.getBusinessObjectDefinitionKey()), SEARCH_INDEX_UPDATE_TYPE_UPDATE); // Create and return the business object definition tag object from the deleted entity. return createBusinessObjectDefinitionTagFromEntity(businessObjectDefinitionTagEntity); } @Override public BusinessObjectDefinitionTagKeys getBusinessObjectDefinitionTagsByBusinessObjectDefinition(BusinessObjectDefinitionKey businessObjectDefinitionKey) { // Validate the business object definition key. businessObjectDefinitionHelper.validateBusinessObjectDefinitionKey(businessObjectDefinitionKey); // Get the business object definition entity and ensure it exists. BusinessObjectDefinitionEntity businessObjectDefinitionEntity = businessObjectDefinitionDaoHelper.getBusinessObjectDefinitionEntity(businessObjectDefinitionKey); // Retrieve and return a list of business object definition tag keys. return new BusinessObjectDefinitionTagKeys( businessObjectDefinitionTagDao.getBusinessObjectDefinitionTagsByBusinessObjectDefinitionEntity(businessObjectDefinitionEntity)); } @Override public BusinessObjectDefinitionTagKeys getBusinessObjectDefinitionTagsByTag(TagKey tagKey) { // Validate the tag key. tagHelper.validateTagKey(tagKey); // Get the tag entity and ensure it exists. TagEntity tagEntity = tagDaoHelper.getTagEntity(tagKey); //Create a list of tag entities along with all its children tags down the hierarchy up to maximum allowed tag nesting level. List<TagEntity> tagEntities = new ArrayList<>(); tagEntities.add(tagEntity); tagEntities.addAll(tagDaoHelper.getTagChildrenEntities(tagEntity)); // Retrieve and return a list of business object definition tag keys. return new BusinessObjectDefinitionTagKeys(businessObjectDefinitionTagDao.getBusinessObjectDefinitionTagsByTagEntities(tagEntities)); } /** * Creates and persists a new business object definition tag entity from the business object definition and the tag entities. * * @param businessObjectDefinitionEntity the business object definition entity * @param tagEntity the tag entity * * @return the newly created business object definition tag entity */ private BusinessObjectDefinitionTagEntity createBusinessObjectDefinitionTagEntity(BusinessObjectDefinitionEntity businessObjectDefinitionEntity, TagEntity tagEntity) { BusinessObjectDefinitionTagEntity businessObjectDefinitionTagEntity = new BusinessObjectDefinitionTagEntity(); businessObjectDefinitionTagEntity.setBusinessObjectDefinition(businessObjectDefinitionEntity); businessObjectDefinitionTagEntity.setTag(tagEntity); return businessObjectDefinitionTagDao.saveAndRefresh(businessObjectDefinitionTagEntity); } /** * Creates a business object definition tag from the persisted entity. * * @param businessObjectDefinitionTagEntity the business object definition tag entity * * @return the business object definition tag */ private BusinessObjectDefinitionTag createBusinessObjectDefinitionTagFromEntity(BusinessObjectDefinitionTagEntity businessObjectDefinitionTagEntity) { return new BusinessObjectDefinitionTag(businessObjectDefinitionTagEntity.getId(), getBusinessObjectDefinitionTagKey(businessObjectDefinitionTagEntity)); } /** * Gets a business object definition tag entity on the key and makes sure that it exists. * * @param businessObjectDefinitionTagKey the business object definition tag key * * @return the business object definition tag entity */ private BusinessObjectDefinitionTagEntity getBusinessObjectDefinitionTagEntity(BusinessObjectDefinitionTagKey businessObjectDefinitionTagKey) { BusinessObjectDefinitionTagEntity businessObjectDefinitionTagEntity = businessObjectDefinitionTagDao.getBusinessObjectDefinitionTagByKey(businessObjectDefinitionTagKey); if (businessObjectDefinitionTagEntity == null) { throw new ObjectNotFoundException(String.format("Tag with tag type \"%s\" and code \"%s\" does not exist for business object definition {%s}.", businessObjectDefinitionTagKey.getTagKey().getTagTypeCode(), businessObjectDefinitionTagKey.getTagKey().getTagCode(), businessObjectDefinitionHelper.businessObjectDefinitionKeyToString(businessObjectDefinitionTagKey.getBusinessObjectDefinitionKey()))); } return businessObjectDefinitionTagEntity; } /** * Creates a business object definition tag key from the entity. * * @param businessObjectDefinitionTagEntity the business object definition entity * * @return the business object definition tag key */ private BusinessObjectDefinitionTagKey getBusinessObjectDefinitionTagKey(BusinessObjectDefinitionTagEntity businessObjectDefinitionTagEntity) { return new BusinessObjectDefinitionTagKey( new BusinessObjectDefinitionKey(businessObjectDefinitionTagEntity.getBusinessObjectDefinition().getNamespace().getCode(), businessObjectDefinitionTagEntity.getBusinessObjectDefinition().getName()), new TagKey(businessObjectDefinitionTagEntity.getTag().getTagType().getCode(), businessObjectDefinitionTagEntity.getTag().getTagCode())); } /** * Validates the business object definition tag create request. This method also trims the request parameters. * * @param request the business object definition tag create request */ private void validateBusinessObjectDefinitionTagCreateRequest(BusinessObjectDefinitionTagCreateRequest request) { Assert.notNull(request, "A business object definition tag create request must be specified."); validateBusinessObjectDefinitionTagKey(request.getBusinessObjectDefinitionTagKey()); } /** * Validates the business object definition tag key. This method also trims the key parameters. * * @param key the business object definition tag key */ private void validateBusinessObjectDefinitionTagKey(BusinessObjectDefinitionTagKey key) { Assert.notNull(key, "A business object definition tag key must be specified."); businessObjectDefinitionHelper.validateBusinessObjectDefinitionKey(key.getBusinessObjectDefinitionKey()); tagHelper.validateTagKey(key.getTagKey()); } }