/* * 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.dao; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.finra.herd.model.api.xml.Attribute; import org.finra.herd.model.api.xml.BusinessObjectDefinitionKey; import org.finra.herd.model.api.xml.BusinessObjectFormatKey; import org.finra.herd.model.api.xml.SchemaColumn; import org.finra.herd.model.jpa.BusinessObjectDataAttributeDefinitionEntity; import org.finra.herd.model.jpa.BusinessObjectDefinitionEntity; import org.finra.herd.model.jpa.BusinessObjectFormatAttributeEntity; import org.finra.herd.model.jpa.BusinessObjectFormatEntity; import org.finra.herd.model.jpa.FileTypeEntity; import org.finra.herd.model.jpa.PartitionKeyGroupEntity; import org.finra.herd.model.jpa.SchemaColumnEntity; @Component public class BusinessObjectFormatDaoTestHelper { @Autowired private BusinessObjectDefinitionDao businessObjectDefinitionDao; @Autowired private BusinessObjectDefinitionDaoTestHelper businessObjectDefinitionDaoTestHelper; @Autowired private BusinessObjectFormatDao businessObjectFormatDao; @Autowired private FileTypeDao fileTypeDao; @Autowired private FileTypeDaoTestHelper fileTypeDaoTestHelper; @Autowired private PartitionKeyGroupDao partitionKeyGroupDao; @Autowired private PartitionKeyGroupDaoTestHelper partitionKeyGroupDaoTestHelper; /** * Creates and persists a new business object data attribute definition entity. * * @param namespaceCode the namespace code * @param businessObjectDefinitionName the business object definition name * @param businessObjectFormatUsage the business object format usage * @param businessObjectFormatFileType the business object format file type * @param businessObjectFormatVersion the business object format version * @param businessObjectDataAttributeName the business object data attribute name * * @return the newly created business object data attribute definition entity. */ public BusinessObjectDataAttributeDefinitionEntity createBusinessObjectDataAttributeDefinitionEntity(String namespaceCode, String businessObjectDefinitionName, String businessObjectFormatUsage, String businessObjectFormatFileType, Integer businessObjectFormatVersion, String businessObjectDataAttributeName) { // Create a business object format entity if it does not exist. BusinessObjectFormatEntity businessObjectFormatEntity = businessObjectFormatDao.getBusinessObjectFormatByAltKey( new BusinessObjectFormatKey(namespaceCode, businessObjectDefinitionName, businessObjectFormatUsage, businessObjectFormatFileType, businessObjectFormatVersion)); if (businessObjectFormatEntity == null) { businessObjectFormatEntity = createBusinessObjectFormatEntity(namespaceCode, businessObjectDefinitionName, businessObjectFormatUsage, businessObjectFormatFileType, businessObjectFormatVersion, AbstractDaoTest.FORMAT_DESCRIPTION, true, AbstractDaoTest.PARTITION_KEY); } return createBusinessObjectDataAttributeDefinitionEntity(businessObjectFormatEntity, businessObjectDataAttributeName, AbstractDaoTest.NO_PUBLISH_ATTRIBUTE); } /** * Creates and persists a new business object data attribute definition entity. * * @param businessObjectFormatEntity the business object format entity * @param businessObjectDataAttributeName the business object data attribute name * @param publishBusinessObjectDataAttribute specifies if this business object data attribute should be published in notification messages * * @return the newly created business object data attribute definition entity. */ public BusinessObjectDataAttributeDefinitionEntity createBusinessObjectDataAttributeDefinitionEntity(BusinessObjectFormatEntity businessObjectFormatEntity, String businessObjectDataAttributeName, boolean publishBusinessObjectDataAttribute) { // Create a new business object data attribute definition entity. BusinessObjectDataAttributeDefinitionEntity businessObjectDataAttributeDefinitionEntity = new BusinessObjectDataAttributeDefinitionEntity(); businessObjectDataAttributeDefinitionEntity.setBusinessObjectFormat(businessObjectFormatEntity); businessObjectDataAttributeDefinitionEntity.setName(businessObjectDataAttributeName); businessObjectDataAttributeDefinitionEntity.setPublish(publishBusinessObjectDataAttribute); // Update the parent entity. businessObjectFormatEntity.getAttributeDefinitions().add(businessObjectDataAttributeDefinitionEntity); businessObjectFormatDao.saveAndRefresh(businessObjectFormatEntity); return businessObjectDataAttributeDefinitionEntity; } /** * Creates and persists a new business object format entity. * * @return the newly created business object format entity. */ public BusinessObjectFormatEntity createBusinessObjectFormatEntity(String namespaceCode, String businessObjectDefinitionName, String businessObjectFormatUsage, String fileType, Integer businessObjectFormatVersion, String businessObjectFormatDescription, Boolean businessObjectFormatLatestVersion, String businessObjectFormatPartitionKey, String partitionKeyGroupName) { return createBusinessObjectFormatEntity(namespaceCode, businessObjectDefinitionName, businessObjectFormatUsage, fileType, businessObjectFormatVersion, businessObjectFormatDescription, businessObjectFormatLatestVersion, businessObjectFormatPartitionKey, partitionKeyGroupName, AbstractDaoTest.NO_ATTRIBUTES); } /** * Creates and persists a new business object format entity. * * @return the newly created business object format entity. */ public BusinessObjectFormatEntity createBusinessObjectFormatEntity(String namespaceCode, String businessObjectDefinitionName, String businessObjectFormatUsage, String fileType, Integer businessObjectFormatVersion, String businessObjectFormatDescription, Boolean businessObjectFormatLatestVersion, String businessObjectFormatPartitionKey, String partitionKeyGroupName, List<Attribute> attributes) { return createBusinessObjectFormatEntity(namespaceCode, businessObjectDefinitionName, businessObjectFormatUsage, fileType, businessObjectFormatVersion, businessObjectFormatDescription, businessObjectFormatLatestVersion, businessObjectFormatPartitionKey, partitionKeyGroupName, attributes, null, null, null, null, null); } /** * Creates and persists a new business object format entity. * * @return the newly created business object format entity. */ public BusinessObjectFormatEntity createBusinessObjectFormatEntity(String namespaceCode, String businessObjectDefinitionName, String businessObjectFormatUsage, String fileType, Integer businessObjectFormatVersion, String businessObjectFormatDescription, Boolean businessObjectFormatLatestVersion, String businessObjectFormatPartitionKey, String partitionKeyGroupName, List<Attribute> attributes, String schemaDelimiterCharacter, String schemaEscapeCharacter, String schemaNullValue, List<SchemaColumn> schemaColumns, List<SchemaColumn> partitionColumns) { // Create a business object definition entity if it does not exist. BusinessObjectDefinitionEntity businessObjectDefinitionEntity = businessObjectDefinitionDao.getBusinessObjectDefinitionByKey(new BusinessObjectDefinitionKey(namespaceCode, businessObjectDefinitionName)); if (businessObjectDefinitionEntity == null) { businessObjectDefinitionEntity = businessObjectDefinitionDaoTestHelper .createBusinessObjectDefinitionEntity(namespaceCode, businessObjectDefinitionName, AbstractDaoTest.DATA_PROVIDER_NAME, null); } // Create a business object format file type entity if it does not exist. FileTypeEntity fileTypeEntity = fileTypeDao.getFileTypeByCode(fileType); if (fileTypeEntity == null) { fileTypeEntity = fileTypeDaoTestHelper.createFileTypeEntity(fileType, null); } // If partition key group was specified, check if we need to create an entity for it first. PartitionKeyGroupEntity partitionKeyGroupEntity = null; if (StringUtils.isNotBlank(partitionKeyGroupName)) { partitionKeyGroupEntity = partitionKeyGroupDao.getPartitionKeyGroupByName(partitionKeyGroupName); if (partitionKeyGroupEntity == null) { partitionKeyGroupEntity = partitionKeyGroupDaoTestHelper.createPartitionKeyGroupEntity(partitionKeyGroupName); } } return createBusinessObjectFormatEntity(businessObjectDefinitionEntity, businessObjectFormatUsage, fileTypeEntity, businessObjectFormatVersion, businessObjectFormatDescription, businessObjectFormatLatestVersion, businessObjectFormatPartitionKey, partitionKeyGroupEntity, attributes, schemaDelimiterCharacter, schemaEscapeCharacter, schemaNullValue, schemaColumns, partitionColumns); } /** * Creates and persists a new business object format entity. * * @return the newly created business object format entity. */ public BusinessObjectFormatEntity createBusinessObjectFormatEntity(BusinessObjectDefinitionEntity businessObjectDefinitionEntity, String businessObjectFormatUsage, FileTypeEntity fileTypeEntity, Integer businessObjectFormatVersion, String businessObjectFormatDescription, Boolean businessObjectFormatLatestVersion, String businessObjectFormatPartitionKey, PartitionKeyGroupEntity partitionKeyGroupEntity, List<Attribute> attributes, String schemaDelimiterCharacter, String schemaEscapeCharacter, String schemaNullValue, List<SchemaColumn> schemaColumns, List<SchemaColumn> partitionColumns) { BusinessObjectFormatEntity businessObjectFormatEntity = new BusinessObjectFormatEntity(); businessObjectFormatEntity.setBusinessObjectDefinition(businessObjectDefinitionEntity); businessObjectFormatEntity.setDescription(businessObjectFormatDescription); businessObjectFormatEntity.setFileType(fileTypeEntity); businessObjectFormatEntity.setBusinessObjectFormatVersion(businessObjectFormatVersion); businessObjectFormatEntity.setLatestVersion(businessObjectFormatLatestVersion); businessObjectFormatEntity.setUsage(businessObjectFormatUsage); businessObjectFormatEntity.setPartitionKey(businessObjectFormatPartitionKey); businessObjectFormatEntity.setPartitionKeyGroup(partitionKeyGroupEntity); // Create the attributes if they are specified. if (!CollectionUtils.isEmpty(attributes)) { List<BusinessObjectFormatAttributeEntity> attributeEntities = new ArrayList<>(); businessObjectFormatEntity.setAttributes(attributeEntities); for (Attribute attribute : attributes) { BusinessObjectFormatAttributeEntity attributeEntity = new BusinessObjectFormatAttributeEntity(); attributeEntities.add(attributeEntity); attributeEntity.setBusinessObjectFormat(businessObjectFormatEntity); attributeEntity.setName(attribute.getName()); attributeEntity.setValue(attribute.getValue()); } } if (schemaColumns != null && !schemaColumns.isEmpty()) { businessObjectFormatEntity.setDelimiter(schemaDelimiterCharacter); businessObjectFormatEntity.setEscapeCharacter(schemaEscapeCharacter); businessObjectFormatEntity.setNullValue(schemaNullValue); List<SchemaColumnEntity> schemaColumnEntities = new ArrayList<>(); businessObjectFormatEntity.setSchemaColumns(schemaColumnEntities); int columnPosition = 1; for (SchemaColumn schemaColumn : schemaColumns) { SchemaColumnEntity schemaColumnEntity = new SchemaColumnEntity(); schemaColumnEntities.add(schemaColumnEntity); schemaColumnEntity.setBusinessObjectFormat(businessObjectFormatEntity); schemaColumnEntity.setPosition(columnPosition); schemaColumnEntity.setPartitionLevel(null); schemaColumnEntity.setName(schemaColumn.getName()); schemaColumnEntity.setType(schemaColumn.getType()); schemaColumnEntity.setSize(schemaColumn.getSize()); schemaColumnEntity.setDescription(schemaColumn.getDescription()); schemaColumnEntity.setRequired(schemaColumn.isRequired()); schemaColumnEntity.setDefaultValue(schemaColumn.getDefaultValue()); columnPosition++; } if (partitionColumns != null && !partitionColumns.isEmpty()) { int partitionLevel = 1; for (SchemaColumn schemaColumn : partitionColumns) { // Check if this partition column belongs to the list of regular schema columns. int schemaColumnIndex = schemaColumns.indexOf(schemaColumn); if (schemaColumnIndex >= 0) { // Retrieve the relative column entity and set its partition level. schemaColumnEntities.get(schemaColumnIndex).setPartitionLevel(partitionLevel); } else { // Add this partition column as a new schema column entity. SchemaColumnEntity schemaColumnEntity = new SchemaColumnEntity(); schemaColumnEntities.add(schemaColumnEntity); schemaColumnEntity.setBusinessObjectFormat(businessObjectFormatEntity); schemaColumnEntity.setPosition(null); schemaColumnEntity.setPartitionLevel(partitionLevel); schemaColumnEntity.setName(schemaColumn.getName()); schemaColumnEntity.setType(schemaColumn.getType()); schemaColumnEntity.setSize(schemaColumn.getSize()); schemaColumnEntity.setDescription(schemaColumn.getDescription()); schemaColumnEntity.setRequired(schemaColumn.isRequired()); schemaColumnEntity.setDefaultValue(schemaColumn.getDefaultValue()); } partitionLevel++; } } } return businessObjectFormatDao.saveAndRefresh(businessObjectFormatEntity); } /** * Creates and persists a new business object format entity. * * @return the newly created business object format entity. */ public BusinessObjectFormatEntity createBusinessObjectFormatEntity(boolean includeAttributeDefinition) { BusinessObjectFormatEntity businessObjectFormatEntity = new BusinessObjectFormatEntity(); businessObjectFormatEntity.setBusinessObjectDefinition(businessObjectDefinitionDaoTestHelper.createBusinessObjectDefinition()); businessObjectFormatEntity.setDescription("test"); businessObjectFormatEntity.setFileType(fileTypeDaoTestHelper.createFileTypeEntity()); businessObjectFormatEntity.setBusinessObjectFormatVersion(0); businessObjectFormatEntity.setLatestVersion(true); businessObjectFormatEntity.setUsage("PRC"); businessObjectFormatEntity.setPartitionKey("testPartitionKey"); if (includeAttributeDefinition) { List<BusinessObjectDataAttributeDefinitionEntity> attributeDefinitionEntities = new ArrayList<>(); businessObjectFormatEntity.setAttributeDefinitions(attributeDefinitionEntities); BusinessObjectDataAttributeDefinitionEntity attributeDefinitionEntity = new BusinessObjectDataAttributeDefinitionEntity(); attributeDefinitionEntities.add(attributeDefinitionEntity); attributeDefinitionEntity.setBusinessObjectFormat(businessObjectFormatEntity); attributeDefinitionEntity.setName(AbstractDaoTest.ATTRIBUTE_NAME_1_MIXED_CASE); } return businessObjectFormatDao.saveAndRefresh(businessObjectFormatEntity); } /** * Creates and persists a new business object format entity. * * @return the newly created business object format entity. */ public BusinessObjectFormatEntity createBusinessObjectFormatEntity(BusinessObjectFormatKey businessObjectFormatKey, String businessObjectFormatDescription, Boolean businessObjectFormatLatestVersion, String businessObjectFormatPartitionKey) { return createBusinessObjectFormatEntity(businessObjectFormatKey.getNamespace(), businessObjectFormatKey.getBusinessObjectDefinitionName(), businessObjectFormatKey.getBusinessObjectFormatUsage(), businessObjectFormatKey.getBusinessObjectFormatFileType(), businessObjectFormatKey.getBusinessObjectFormatVersion(), businessObjectFormatDescription, businessObjectFormatLatestVersion, businessObjectFormatPartitionKey); } /** * Creates and persists a new business object format entity. * * @return the newly created business object format entity. */ public BusinessObjectFormatEntity createBusinessObjectFormatEntity(String namespaceCode, String businessObjectDefinitionName, String businessObjectFormatUsage, String fileType, Integer businessObjectFormatVersion, String businessObjectFormatDescription, Boolean businessObjectFormatLatestVersion, String businessObjectFormatPartitionKey) { return createBusinessObjectFormatEntity(namespaceCode, businessObjectDefinitionName, businessObjectFormatUsage, fileType, businessObjectFormatVersion, businessObjectFormatDescription, businessObjectFormatLatestVersion, businessObjectFormatPartitionKey, null); } /** * Returns a list of test business object format keys expected to be returned by getBusinessObjectFormatKeys() method. * * @return the list of expected business object format keys */ public List<BusinessObjectFormatKey> getExpectedBusinessObjectFormatKeys() { List<BusinessObjectFormatKey> keys = new ArrayList<>(); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.INITIAL_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.SECOND_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE_2, AbstractDaoTest.INITIAL_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE_2, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.INITIAL_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE_2, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.SECOND_FORMAT_VERSION)); return keys; } /** * Returns a list of test business object format keys expected to be returned by getBusinessObjectFormatKeys() method with the * latestBusinessObjectFormatVersion flag set to "true". * * @return the list of expected business object format keys */ public List<BusinessObjectFormatKey> getExpectedBusinessObjectFormatLatestVersionKeys() { List<BusinessObjectFormatKey> keys = new ArrayList<>(); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.SECOND_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE_2, AbstractDaoTest.INITIAL_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE_2, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.SECOND_FORMAT_VERSION)); return keys; } /** * Returns a list of test business object format keys. * * @return the list of test business object format keys */ public List<BusinessObjectFormatKey> getTestBusinessObjectFormatKeys() { List<BusinessObjectFormatKey> keys = new ArrayList<>(); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.INITIAL_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE_2, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.INITIAL_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE_2, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.SECOND_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE_2, AbstractDaoTest.INITIAL_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.SECOND_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE, AbstractDaoTest.BDEF_NAME_2, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.INITIAL_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE_2, AbstractDaoTest.BDEF_NAME, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.INITIAL_FORMAT_VERSION)); keys.add(new BusinessObjectFormatKey(AbstractDaoTest.NAMESPACE_2, AbstractDaoTest.BDEF_NAME_2, AbstractDaoTest.FORMAT_USAGE_CODE, AbstractDaoTest.FORMAT_FILE_TYPE_CODE, AbstractDaoTest.INITIAL_FORMAT_VERSION)); return keys; } }