Class GoogleCloudStorageProvider

java.lang.Object
com.broadleafcommerce.asset.storage.provider.service.GoogleCloudStorageProvider
All Implemented Interfaces:
StorageProvider

public class GoogleCloudStorageProvider extends Object implements StorageProvider
The default implementation of the StorageProvider for the Google Cloud storage.
Author:
Dima Myroniuk (dmyroniuk)
  • Field Details

  • Constructor Details

    • GoogleCloudStorageProvider

      public GoogleCloudStorageProvider(InternalAssetProperties internalAssetProperties, com.google.cloud.storage.Storage storage, jakarta.activation.FileTypeMap mimeFileTypeMap, com.broadleafcommerce.common.extension.TypeFactory typeFactory)
  • Method Details

    • isWhitelistedMimeType

      public boolean isWhitelistedMimeType(@NonNull @NonNull String mimeType)
      Description copied from interface: StorageProvider
      Determines whether the given MIME type string is supported by this provider. Files with MIME types not supported, cannot be stored using this provider. The whitelist can be configured using a system property of the form broadleaf.asset.internal.storageProvider.mimeTypeWhitelist.

      If the whitelist is empty, then all types are considered whitelisted.

      Specified by:
      isWhitelistedMimeType in interface StorageProvider
      Parameters:
      mimeType - the mime type to check against the provider's whitelist
      Returns:
      whether the given MIME type string is supported by this provider.
      See Also:
    • readStreamableResourceWithMetadata

      public Optional<ResourceWithMetadata> readStreamableResourceWithMetadata(@NonNull @NonNull String path)
      Description copied from interface: StorageProvider
      Retrieves the resource in the configured storage provider at the given path string if it exists.
      Specified by:
      readStreamableResourceWithMetadata in interface StorageProvider
      Parameters:
      path - fully qualified path to the resource's location in the storage provider
      Returns:
      Either the resource wrapped in an Optional if it exists or else Optional.empty().
    • getResourceWithMetadata

      protected ResourceWithMetadata getResourceWithMetadata(@NonNull @NonNull com.google.cloud.storage.Blob blob)
    • readStreamableResourcesWithMetadata

      public Iterable<ResourceWithMetadata> readStreamableResourcesWithMetadata(@NonNull @NonNull Iterable<String> paths)
      Description copied from interface: StorageProvider
      Retrieves the resources in the configured storage provider at the given path strings if they exist.
      Specified by:
      readStreamableResourcesWithMetadata in interface StorageProvider
      Parameters:
      paths - fully qualified path to the resources' locations in the storage provider
      Returns:
      Iterable of resources that were found
    • addResourceFromStream

      public String addResourceFromStream(@NonNull @NonNull InputStream resource, @NonNull @NonNull String fileName)
      Description copied from interface: StorageProvider
      Adds a new resource to the configured storage provider using the provided InputStream and filename. Then, it returns the fully qualified path of the newly stored resource.
      Specified by:
      addResourceFromStream in interface StorageProvider
      Parameters:
      resource - resource to add to the configured storage provider
      fileName - the name of the resource, potentially including path segments.
      Returns:
      the fully qualified path to the added resource
    • deleteMappingRecords

      protected void deleteMappingRecords(Collection<String> originalLocations)
    • createNewMappingRecords

      protected Map<String,StorageLocationMapping> createNewMappingRecords(Map<String,String> actualResourcePathsByOriginalLocation)
      Establishes new StorageLocationMapping records in StorageLocationMappingService for the given values.
      Parameters:
      actualResourcePathsByOriginalLocation - a map from original location values to the actual resource paths for them
      Returns:
      the created StorageLocationMapping records mapped by the original location
    • createNewMappingRecord

      @Nullable protected StorageLocationMapping createNewMappingRecord(String url, String actualResourcePath)
      Similar to createNewMappingRecords(Map), but only for one record.
      Parameters:
      url - the URL the caller provided to this storage provider to associate with some binary data. This is the value callers will give to the storage provider to store/read/delete the resource. This is expected to already be globally unique.
      actualResourcePath - the actual storage location/path which this provider is using to actually store the data for the url
      Returns:
      the created StorageLocationMapping if successful, null otherwise
    • buildStorageLocationMapping

      protected StorageLocationMapping buildStorageLocationMapping(String url, String actualResourcePath)
    • addResourcesFromStreams

      public BulkAddResourcesResponse addResourcesFromStreams(@NonNull @NonNull Map<String,InputStream> fileNamesToResources)
      Description copied from interface: StorageProvider

      Adds new resources to the configured storage provider using the provided Map of InputStreams and filenames. Then, it returns a BulkAddResourcesResponse containing the information about which files succeeded and which files failed.

      Specified by:
      addResourcesFromStreams in interface StorageProvider
      Parameters:
      fileNamesToResources - a map of filenames to resources that should be copied to the storage provider. The filenames can include path segments.
      Returns:
      a BulkAddResourcesResponse containing the details of which files did and didn't succeed
    • addResourcesFromFiles

      public BulkAddResourcesResponse addResourcesFromFiles(@NonNull @NonNull Map<String,File> fileNamesToResources)
      Description copied from interface: StorageProvider
      Adds new resources to the configured storage provider using the provided Map of Files and filenames. Then, it returns a BulkAddResourcesResponse containing the information about which files succeeded and which files failed.
      Specified by:
      addResourcesFromFiles in interface StorageProvider
      Parameters:
      fileNamesToResources - a map of filenames to resources that should be copied to the storage provider. The filenames can include path segments.
      Returns:
      a BulkAddResourcesResponse containing the details of which files did and didn't succeed
    • deleteResource

      public void deleteResource(@NonNull @NonNull String path)
      Description copied from interface: StorageProvider
      Deletes the resource in the configured storage provider at the given path string if it exists.
      Specified by:
      deleteResource in interface StorageProvider
      Parameters:
      path - fully qualified path to the resource's location in the storage provider
    • deleteResources

      public void deleteResources(@NonNull @NonNull Iterable<String> paths)
      Description copied from interface: StorageProvider
      Deletes the resources in the configured storage provider at the given path strings if they exist. This method will attempt to remove all the resources it can successfully before throwing a BulkStorageException containing all the failures and their causes.
      Specified by:
      deleteResources in interface StorageProvider
      Parameters:
      paths - fully qualified paths to the resources' locations in the storage provider
    • getBlobId

      @Deprecated(since="2.0.3", forRemoval=true) protected com.google.cloud.storage.BlobId getBlobId(String fileName)
      Deprecated, for removal: This API element is subject to removal in a future version.
      since 2.0.3, not used by the framework anymore. Use generateActualStorageLocations(Collection) or resolveExistingActualStorageLocations(Collection) instead.
      Parameters:
      fileName - the given path to return the blob ID for
      Returns:
      the BlobId that can be used for the given path
    • toBlobId

      protected com.google.cloud.storage.BlobId toBlobId(String gcsObjectName)
      Parameters:
      gcsObjectName - the BlobId.getName() to use
      Returns:
      the BlobId for the given name in the InternalAssetProperties.StorageProvider.GoogleCloudStorage.getBucketName()
    • getGCSProperties

    • prependBucketPathPrefix

      protected String prependBucketPathPrefix(String resourcePath)
    • validateAndCleanFilePath

      protected String validateAndCleanFilePath(String fileName)
    • resolveExistingActualStorageLocations

      protected Map<String,com.google.cloud.storage.BlobId> resolveExistingActualStorageLocations(Collection<String> urls)
      Used during resource read/delete operations to figure out what the actual storage locations are for some given URLs.
      Parameters:
      urls - the URLs the caller provided to this storage provider to associate with some binary data. This is the value callers will give to the storage provider to store/read/delete the resources. These are expected to already be globally unique.
      Returns:
      a map from the originally provided URL to the actual storage location for it
      Since:
      2.0.3
      See Also:
    • findActualStorageLocationsFromMappings

      protected Map<String,String> findActualStorageLocationsFromMappings(Collection<String> urls)
      Queries against StorageLocationMappingService to find the actual storage locations from the mapping records, if available in the system.
      Parameters:
      urls - the URLs the caller provided to this storage provider to associate with some binary data. This is the value callers will give to the storage provider to store/read/delete the resources. These are expected to already be globally unique.
      Returns:
      a map from each provided URL to the found actual storage location. If a URL did not have a mapping found, it will be omitted in the map.
      Since:
      2.0.3
    • getStorageLocationMappingProviderType

      protected String getStorageLocationMappingProviderType()
      Returns:
      the value used for StorageLocationMapping.getStorageProviderType()
    • doWithoutPolicyValidation

      protected <R> R doWithoutPolicyValidation(Supplier<R> returningWork)
      Executes the given returningWork with security policy validations disabled.
      Type Parameters:
      R - the return type of the work
      Parameters:
      returningWork - the work to execute
      Returns:
      the result of executing the work
    • resolveExistingActualStorageLocation

      protected com.google.cloud.storage.BlobId resolveExistingActualStorageLocation(String url)
      Similar to resolveExistingActualStorageLocations(Collection), but only for one URL.
      Parameters:
      url - the URL the caller provided to this storage provider to associate with some binary data. This is the value callers will give to the storage provider to store/read/delete the resource. This is expected to already be globally unique.
      Returns:
      the actual storage location/path which this provider is using to actually store the data for the url
      Since:
      2.0.3
      See Also:
    • getHashedResourcePath

      protected String getHashedResourcePath(String url)
    • generateActualStorageLocations

      protected Map<String,String> generateActualStorageLocations(Collection<String> urls)

      Used during a 'resource add' operation to determine where new assets should actually be stored.

      Note - as of 2.0.3, all new resources will be stored in paths determined by this method.

      Parameters:
      urls - the URLs the caller provided to this storage provider to associate with some binary data. This is the value callers will give to the storage provider to store/read/delete the resources. These are expected to already be globally unique.
      Returns:
      a map from each provided URL to a new unique location/path which this provider will use to actually store data for that URL. The mappings in this result should be stored via StorageLocationMappingService.
      Since:
      2.0.3
      See Also:
    • generateActualStorageLocation

      protected String generateActualStorageLocation(String url)
      Similar to generateActualStorageLocations(Collection), but only for one URL.
      Parameters:
      url - the URL the caller provided to this storage provider to associate with some binary data. This is the value callers will give to the storage provider to store/read/delete the resource. This is expected to already be globally unique.
      Returns:
      a new unique location/path which this provider will use to actually store data for the provided URL. The mapping from the input URL to this result should be stored via StorageLocationMappingService.
      Since:
      2.0.3
      See Also:
    • generateGloballyUniqueFilename

      protected String generateGloballyUniqueFilename(String url)
      Parameters:
      url - the URL the caller provided to this storage provider to associate with some binary data. This is the value callers will give to the storage provider to store/read/delete the resource. This is expected to already be globally unique.
      Returns:
      a globally unique filename this provider should use when actually storing the data. Uniqueness is very important, as it ensures even similarly named assets will have their own unique path.
    • getFileExtensionWithDot

      @Nullable protected String getFileExtensionWithDot(String url)
    • getMaxGeneratedDirectoryDepth

      protected int getMaxGeneratedDirectoryDepth()
    • assertPathNotNull

      protected void assertPathNotNull(String path)
    • assertAllPathsNotNull

      protected void assertAllPathsNotNull(Iterable<String> paths)
    • getInternalAssetProperties

      protected InternalAssetProperties getInternalAssetProperties()
    • getStorage

      protected com.google.cloud.storage.Storage getStorage()
    • getMimeFileTypeMap

      protected jakarta.activation.FileTypeMap getMimeFileTypeMap()
    • getTypeFactory

      protected com.broadleafcommerce.common.extension.TypeFactory getTypeFactory()
    • setStorageLocationMappingSvc

      @Autowired public void setStorageLocationMappingSvc(StorageLocationMappingService<StorageLocationMapping> storageLocationMappingSvc)
    • getStorageLocationMappingSvc

      protected StorageLocationMappingService<StorageLocationMapping> getStorageLocationMappingSvc()