class BusinessObjectDataInvalidateUnregisteredHelper {

    public BusinessObjectDataInvalidateUnregisteredResponse invalidateUnregisteredBusinessObjectData(
        BusinessObjectDataInvalidateUnregisteredRequest businessObjectDataInvalidateUnregisteredRequest)
    {
        // Validate request
        validateRequest(businessObjectDataInvalidateUnregisteredRequest);

        // Trim
        trimRequest(businessObjectDataInvalidateUnregisteredRequest);

        // Validate format exists
        // Get format
        BusinessObjectFormatEntity businessObjectFormatEntity = getBusinessObjectFormatEntity(businessObjectDataInvalidateUnregisteredRequest);

        // Validate storage exists
        // Get storage by name
        String storageName = businessObjectDataInvalidateUnregisteredRequest.getStorageName();
        StorageEntity storageEntity = storageDaoHelper.getStorageEntity(storageName);

        // Validate that storage platform is S3
        if (!StoragePlatformEntity.S3.equals(storageEntity.getStoragePlatform().getName()))
        {
            throw new IllegalArgumentException("The specified storage '" + storageName + "' is not an S3 storage platform.");
        }

        // Get data with latest version
        BusinessObjectDataEntity latestBusinessObjectDataEntity = getLatestBusinessObjectDataEntity(businessObjectDataInvalidateUnregisteredRequest);
        Integer latestBusinessObjectDataVersion = getBusinessObjectDataVersion(latestBusinessObjectDataEntity);

        // List data which are not registered, but exists in S3
        List<BusinessObjectDataKey> unregisteredBusinessObjectDataKeys =
            getUnregisteredBusinessObjectDataKeys(businessObjectDataInvalidateUnregisteredRequest, storageEntity, businessObjectFormatEntity,
                latestBusinessObjectDataVersion);

        // Register the unregistered data as INVALID
        List<BusinessObjectDataEntity> registeredBusinessObjectDataEntities =
            registerInvalidBusinessObjectDatas(latestBusinessObjectDataEntity, businessObjectFormatEntity, unregisteredBusinessObjectDataKeys, storageEntity);

        // Fire notifications
        processBusinessObjectDataStatusChangeNotificationEvents(registeredBusinessObjectDataEntities);

        // Create and return response
        return getBusinessObjectDataInvalidateUnregisteredResponse(businessObjectDataInvalidateUnregisteredRequest, registeredBusinessObjectDataEntities);
    }

}