[
https://issues.apache.org/jira/browse/CAMEL-24342?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Work on CAMEL-24342 started by Andrea Cosentino.
------------------------------------------------
> camel-google-storage: producer sets wrong blob metadata and NPEs on missing
> objects
> -----------------------------------------------------------------------------------
>
> Key: CAMEL-24342
> URL: https://issues.apache.org/jira/browse/CAMEL-24342
> Project: Camel
> Issue Type: Bug
> Components: camel-google-storage
> Reporter: Andrea Cosentino
> Assignee: Andrea Cosentino
> Priority: Major
>
> Several defects in the google-storage producer and consumer:
> 1. Copy/paste in {{processFile}} - the Content-Type variable is used for two
> other fields:
> {code:java}
> // GoogleCloudStorageProducer.java:137-148
> String ce = objectMetadata.remove("Content-Encoding");
> if (ce != null) { builder.setContentEncoding(ct); }
> ...
> String cc = objectMetadata.remove("Cache-Control");
> if (cc != null) { builder.setCacheControl(ct); }
> {code}
> Uploaded objects get Content-Encoding and Cache-Control set to the content
> type (or to null when no Content-Type header was supplied).
> 2. {{getObject}} does not null-check the blob:
> {code:java}
> // GoogleCloudStorageProducer.java:328-330
> Blob blob = storage.get(BlobId.of(bucketName, objectName));
> message.setBody(blob.getContent(Blob.BlobSourceOption.generationMatch()));
> {code}
> A missing object gives an NPE instead of a clear error.
> 3. The consumer has the same problem on the single-object path:
> {code:java}
> // GoogleCloudStorageConsumer.java:95-97
> Blob blob = getStorageClient().get(bucketName, fileName);
> exchanges = createExchanges(blob, fileName);
> {code}
> When the configured objectName does not exist the poll throws an NPE on every
> cycle. That path also never calls {{forceConsumerAsReady()}} (only the list
> path at :110 does), so the consumer health check never becomes ready when
> objectName is set.
> 4. Header/configuration precedence is inverted between the two lookups:
> {code:java}
> // determineObjectName:374-383 - configuration first
> String key = getConfiguration().getObjectName();
> if (ObjectHelper.isEmpty(key)) { key =
> exchange.getIn().getHeader(OBJECT_NAME, String.class); }
> // determineBucketName:385-394 - header first
> String bucketName = exchange.getMessage().getHeader(OVERRIDE_BUCKET_NAME,
> String.class);
> if (ObjectHelper.isEmpty(bucketName)) { bucketName =
> getConfiguration().getBucketName(); }
> {code}
> {{CamelGoogleCloudStorageObjectName}} is documented as "The object Name which
> will be used for the current operation" but is ignored whenever the endpoint
> configures objectName. Note this one is a behaviour change and may deserve an
> upgrade-guide note.
> Minor items in the same file: {{createDownloadLink}} (:234-241) has an
> unreachable else-branch because the header lookup already supplies a 300000L
> default, and the file uses a {{java.util.*}} wildcard import.
> Found during a source audit of the {{components/camel-google}} module family
> against main @ c3b01310be15.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)