org.finra.herd.service.helper.StorageUnitHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.finra.herd.service.helper.StorageUnitHelper.java

Source

/*
* 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.helper;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import org.finra.herd.core.HerdDateUtils;
import org.finra.herd.model.api.xml.Attribute;
import org.finra.herd.model.api.xml.BusinessObjectDataKey;
import org.finra.herd.model.api.xml.BusinessObjectDataStorageUnitKey;
import org.finra.herd.model.api.xml.Storage;
import org.finra.herd.model.api.xml.StorageDirectory;
import org.finra.herd.model.api.xml.StorageFile;
import org.finra.herd.model.api.xml.StorageUnit;
import org.finra.herd.model.api.xml.StorageUnitStatusChangeEvent;
import org.finra.herd.model.dto.StorageUnitAvailabilityDto;
import org.finra.herd.model.jpa.BusinessObjectDataEntity;
import org.finra.herd.model.jpa.StorageAttributeEntity;
import org.finra.herd.model.jpa.StorageEntity;
import org.finra.herd.model.jpa.StorageFileEntity;
import org.finra.herd.model.jpa.StorageUnitEntity;
import org.finra.herd.model.jpa.StorageUnitStatusHistoryEntity;

/**
 * A helper class for storage unit related code.
 */
@Component
public class StorageUnitHelper {
    @Autowired
    private AlternateKeyHelper alternateKeyHelper;

    @Autowired
    private BusinessObjectDataHelper businessObjectDataHelper;

    @Autowired
    private StorageFileHelper storageFileHelper;

    /**
     * Creates a business object data storage unit key from business object data key and storage name.
     *
     * @param businessObjectDataKey the business object data key
     * @param storageName the storage name
     *
     * @return the storage unit key
     */
    public BusinessObjectDataStorageUnitKey createBusinessObjectDataStorageUnitKey(
            BusinessObjectDataKey businessObjectDataKey, String storageName) {
        return new BusinessObjectDataStorageUnitKey(businessObjectDataKey.getNamespace(),
                businessObjectDataKey.getBusinessObjectDefinitionName(),
                businessObjectDataKey.getBusinessObjectFormatUsage(),
                businessObjectDataKey.getBusinessObjectFormatFileType(),
                businessObjectDataKey.getBusinessObjectFormatVersion(), businessObjectDataKey.getPartitionValue(),
                businessObjectDataKey.getSubPartitionValues(), businessObjectDataKey.getBusinessObjectDataVersion(),
                storageName);
    }

    /**
     * Creates a storage unit key from a business object data key and a storage name.
     *
     * @param businessObjectDataKey the business object data key
     * @param storageName the storage name
     *
     * @return the storage unit key
     */
    public BusinessObjectDataStorageUnitKey createStorageUnitKey(BusinessObjectDataKey businessObjectDataKey,
            String storageName) {
        return new BusinessObjectDataStorageUnitKey(businessObjectDataKey.getNamespace(),
                businessObjectDataKey.getBusinessObjectDefinitionName(),
                businessObjectDataKey.getBusinessObjectFormatUsage(),
                businessObjectDataKey.getBusinessObjectFormatFileType(),
                businessObjectDataKey.getBusinessObjectFormatVersion(), businessObjectDataKey.getPartitionValue(),
                businessObjectDataKey.getSubPartitionValues(), businessObjectDataKey.getBusinessObjectDataVersion(),
                storageName);
    }

    /**
     * Creates a storage unit key from a storage unit entity.
     *
     * @param storageUnitEntity the storage unit entity
     *
     * @return the storage unit key
     */
    public BusinessObjectDataStorageUnitKey createStorageUnitKeyFromEntity(StorageUnitEntity storageUnitEntity) {
        // Get the business object data entity.
        BusinessObjectDataEntity businessObjectDataEntity = storageUnitEntity.getBusinessObjectData();

        // Create and initialize the storage unit key.
        BusinessObjectDataStorageUnitKey storageUnitKey = new BusinessObjectDataStorageUnitKey();
        storageUnitKey.setNamespace(businessObjectDataEntity.getBusinessObjectFormat().getBusinessObjectDefinition()
                .getNamespace().getCode());
        storageUnitKey.setBusinessObjectDefinitionName(
                businessObjectDataEntity.getBusinessObjectFormat().getBusinessObjectDefinition().getName());
        storageUnitKey.setBusinessObjectFormatUsage(businessObjectDataEntity.getBusinessObjectFormat().getUsage());
        storageUnitKey.setBusinessObjectFormatFileType(
                businessObjectDataEntity.getBusinessObjectFormat().getFileType().getCode());
        storageUnitKey.setBusinessObjectFormatVersion(
                businessObjectDataEntity.getBusinessObjectFormat().getBusinessObjectFormatVersion());
        storageUnitKey.setPartitionValue(businessObjectDataEntity.getPartitionValue());
        storageUnitKey
                .setSubPartitionValues(businessObjectDataHelper.getSubPartitionValues(businessObjectDataEntity));
        storageUnitKey.setBusinessObjectDataVersion(businessObjectDataEntity.getVersion());
        storageUnitKey.setStorageName(storageUnitEntity.getStorage().getName());

        return storageUnitKey;
    }

    /**
     * Creates a list of storage units from the list of storage unit entities.
     *
     * @param storageUnitEntities the storage unit entities.
     * @param includeStorageUnitStatusHistory specifies to include storage unit status history for each storage unit in the response
     *
     * @return the list of storage units.
     */
    public List<StorageUnit> createStorageUnitsFromEntities(Collection<StorageUnitEntity> storageUnitEntities,
            Boolean includeStorageUnitStatusHistory) {
        List<StorageUnit> storageUnits = new ArrayList<>();

        for (StorageUnitEntity storageUnitEntity : storageUnitEntities) {
            StorageUnit storageUnit = new StorageUnit();
            storageUnits.add(storageUnit);

            Storage storage = new Storage();
            storageUnit.setStorage(storage);

            StorageEntity storageEntity = storageUnitEntity.getStorage();
            storage.setName(storageEntity.getName());
            storage.setStoragePlatformName(storageEntity.getStoragePlatform().getName());

            // Add the storage attributes.
            if (!CollectionUtils.isEmpty(storageEntity.getAttributes())) {
                List<Attribute> storageAttributes = new ArrayList<>();
                storage.setAttributes(storageAttributes);
                for (StorageAttributeEntity storageAttributeEntity : storageEntity.getAttributes()) {
                    Attribute attribute = new Attribute();
                    storageAttributes.add(attribute);
                    attribute.setName(storageAttributeEntity.getName());
                    attribute.setValue(storageAttributeEntity.getValue());
                }
            }

            // Add the storage directory.
            if (storageUnitEntity.getDirectoryPath() != null) {
                StorageDirectory storageDirectory = new StorageDirectory();
                storageUnit.setStorageDirectory(storageDirectory);
                storageDirectory.setDirectoryPath(storageUnitEntity.getDirectoryPath());
            }

            // Add the storage files.
            if (!storageUnitEntity.getStorageFiles().isEmpty()) {
                List<StorageFile> storageFiles = new ArrayList<>();
                storageUnit.setStorageFiles(storageFiles);

                for (StorageFileEntity storageFileEntity : storageUnitEntity.getStorageFiles()) {
                    storageFiles.add(storageFileHelper.createStorageFileFromEntity(storageFileEntity));
                }
            }

            // Set the storage unit status.
            storageUnit.setStorageUnitStatus(storageUnitEntity.getStatus().getCode());

            // If specified, add storage unit status history.
            if (BooleanUtils.isTrue(includeStorageUnitStatusHistory)) {
                List<StorageUnitStatusChangeEvent> storageUnitStatusChangeEvents = new ArrayList<>();
                storageUnit.setStorageUnitStatusHistory(storageUnitStatusChangeEvents);
                for (StorageUnitStatusHistoryEntity storageUnitStatusHistoryEntity : storageUnitEntity
                        .getHistoricalStatuses()) {
                    storageUnitStatusChangeEvents.add(
                            new StorageUnitStatusChangeEvent(storageUnitStatusHistoryEntity.getStatus().getCode(),
                                    HerdDateUtils.getXMLGregorianCalendarValue(
                                            storageUnitStatusHistoryEntity.getCreatedOn()),
                                    storageUnitStatusHistoryEntity.getCreatedBy()));
                }
            }

            // Set the number of failed attempts to execute a storage policy transition.
            storageUnit.setStoragePolicyTransitionFailedAttempts(
                    storageUnitEntity.getStoragePolicyTransitionFailedAttempts());

            if (storageUnitEntity.getRestoreExpirationOn() != null) {
                storageUnit.setRestoreExpirationOn(
                        HerdDateUtils.getXMLGregorianCalendarValue(storageUnitEntity.getRestoreExpirationOn()));
            }
        }

        return storageUnits;
    }

    /**
     * Excludes storage unit availability DTOs from the list with business object data status matching to the specified value.
     *
     * @param storageUnitAvailabilityDtos the list of storage unit availability DTOs
     * @param excludedBusinessObjectDataStatus the business object data status to be excluded
     *
     * @return the updated list of storage unit availability DTOs
     */
    public List<StorageUnitAvailabilityDto> excludeBusinessObjectDataStatus(
            List<StorageUnitAvailabilityDto> storageUnitAvailabilityDtos, String excludedBusinessObjectDataStatus) {
        List<StorageUnitAvailabilityDto> result = new ArrayList<>();

        for (StorageUnitAvailabilityDto storageUnitAvailabilityDto : storageUnitAvailabilityDtos) {
            if (!storageUnitAvailabilityDto.getBusinessObjectDataStatus()
                    .equalsIgnoreCase(excludedBusinessObjectDataStatus)) {
                result.add(storageUnitAvailabilityDto);
            }
        }

        return result;
    }

    /**
     * Excludes storage unit availability DTOs from the list with primary and sub-partition values matching one of the excluded partitions.
     *
     * @param storageUnitAvailabilityDtos the list of storage unit availability DTOs
     * @param excludedPartitions list of excluded partitions, where each partition consists of primary and optional sub-partition values
     *
     * @return the updated list of storage unit availability DTOs
     */
    public List<StorageUnitAvailabilityDto> excludePartitions(
            List<StorageUnitAvailabilityDto> storageUnitAvailabilityDtos, List<List<String>> excludedPartitions) {
        List<StorageUnitAvailabilityDto> result = new ArrayList<>();

        for (StorageUnitAvailabilityDto storageUnitAvailabilityDto : storageUnitAvailabilityDtos) {
            if (!excludedPartitions.contains(businessObjectDataHelper
                    .getPrimaryAndSubPartitionValues(storageUnitAvailabilityDto.getBusinessObjectDataKey()))) {
                result.add(storageUnitAvailabilityDto);
            }
        }

        return result;
    }

    /**
     * Gets a business object data key from a storage unit key.
     *
     * @param businessObjectDataStorageUnitKey the storage unit key
     *
     * @return the business object data key
     */
    public BusinessObjectDataKey getBusinessObjectDataKey(
            BusinessObjectDataStorageUnitKey businessObjectDataStorageUnitKey) {
        return new BusinessObjectDataKey(businessObjectDataStorageUnitKey.getNamespace(),
                businessObjectDataStorageUnitKey.getBusinessObjectDefinitionName(),
                businessObjectDataStorageUnitKey.getBusinessObjectFormatUsage(),
                businessObjectDataStorageUnitKey.getBusinessObjectFormatFileType(),
                businessObjectDataStorageUnitKey.getBusinessObjectFormatVersion(),
                businessObjectDataStorageUnitKey.getPartitionValue(),
                businessObjectDataStorageUnitKey.getSubPartitionValues(),
                businessObjectDataStorageUnitKey.getBusinessObjectDataVersion());
    }

    /**
     * Creates a list of storage unit ids from a list of storage unit availability DTOs.
     *
     * @param storageUnitAvailabilityDtos the list of storage unit availability DTOs
     *
     * @return the list of storage unit ids
     */
    public List<Integer> getStorageUnitIds(List<StorageUnitAvailabilityDto> storageUnitAvailabilityDtos) {
        List<Integer> storageUnitIds = new ArrayList<>(storageUnitAvailabilityDtos.size());

        for (StorageUnitAvailabilityDto storageUnitAvailabilityDto : storageUnitAvailabilityDtos) {
            storageUnitIds.add(storageUnitAvailabilityDto.getStorageUnitId());
        }

        return storageUnitIds;
    }

    /**
     * Validates the business object data storage unit key. This method also trims the request parameters.
     *
     * @param key the business object data storage unit create request
     */
    public void validateBusinessObjectDataStorageUnitKey(BusinessObjectDataStorageUnitKey key) {
        Assert.notNull(key, "A business object data storage unit key must be specified.");
        key.setNamespace(alternateKeyHelper.validateStringParameter("namespace", key.getNamespace()));
        key.setBusinessObjectDefinitionName(alternateKeyHelper
                .validateStringParameter("business object definition name", key.getBusinessObjectDefinitionName()));
        key.setBusinessObjectFormatUsage(alternateKeyHelper.validateStringParameter("business object format usage",
                key.getBusinessObjectFormatUsage()));
        key.setBusinessObjectFormatFileType(alternateKeyHelper.validateStringParameter(
                "business object format file type", key.getBusinessObjectFormatFileType()));
        Assert.notNull(key.getBusinessObjectFormatVersion(), "A business object format version must be specified.");
        key.setPartitionValue(
                alternateKeyHelper.validateStringParameter("partition value", key.getPartitionValue()));
        businessObjectDataHelper.validateSubPartitionValues(key.getSubPartitionValues());
        Assert.notNull(key.getBusinessObjectDataVersion(), "A business object data version must be specified.");
        key.setStorageName(alternateKeyHelper.validateStringParameter("storage name", key.getStorageName()));
    }
}