Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2015,7 +2015,6 @@ void testDoDownloadDirectory_SkipsFolderMarkers() throws Exception {
}

@Test
@Disabled
void testDoDownloadDirectory_PathTraversalProtection() throws Exception {
// Given
String prefix = "test-prefix/";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

import com.salesforce.multicloudj.common.aws.AwsConstants;
import com.salesforce.multicloudj.common.exceptions.SubstrateSdkException;
import com.salesforce.multicloudj.pubsub.batcher.Batcher;
import com.salesforce.multicloudj.pubsub.client.GetAttributeResult;
import com.salesforce.multicloudj.pubsub.driver.AbstractSubscription;
import com.salesforce.multicloudj.pubsub.driver.AckID;
import com.salesforce.multicloudj.pubsub.driver.Message;
Expand Down Expand Up @@ -56,8 +56,11 @@ public boolean canNack() {
}

@Override
public Map<String, String> getAttributes() {
return null;
public GetAttributeResult getAttributes() {
return new GetAttributeResult.Builder()
.name("aws-subscription")
.topic("aws-topic")
.build();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.salesforce.multicloudj.pubsub.client;


/**
* Result object containing subscription attributes that are common across all Pub/Sub providers.
* This class provides a standardized way to access subscription configuration properties
* regardless of the underlying cloud provider (AWS, GCP, Aliyun, etc.).
*/
public class GetAttributeResult {

// Core Identification
private String name;
private String topic;

// Default constructor
public GetAttributeResult() {}

// Builder pattern for easy construction
public static class Builder {
private final GetAttributeResult result = new GetAttributeResult();

public Builder name(String name) {
result.name = name;
return this;
}

public Builder topic(String topic) {
result.topic = topic;
return this;
}

public GetAttributeResult build() {
return result;
}
}

// Getters
public String getName() { return name; }
public String getTopic() { return topic; }

// Setters
public void setName(String name) { this.name = name; }
public void setTopic(String topic) { this.topic = topic; }

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

import com.salesforce.multicloudj.common.exceptions.ExceptionHandler;
Expand Down Expand Up @@ -145,10 +144,10 @@ public boolean canNack() {
* This may include provider-specific configuration like delivery delay,
* message retention period, etc.
*
* @return A map of subscription attributes
* @return A GetAttributeResult containing subscription attributes
* @throws SubstrateSdkException If the operation fails
*/
public Map<String, String> getAttributes() {
public GetAttributeResult getAttributes() {
try {
return subscription.getAttributes();
} catch (Throwable t) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import java.util.Collections;
import java.util.Queue;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
Expand All @@ -21,6 +20,7 @@
import com.salesforce.multicloudj.common.exceptions.FailedPreconditionException;
import com.salesforce.multicloudj.common.exceptions.InvalidArgumentException;
import com.salesforce.multicloudj.common.exceptions.SubstrateSdkException;
import com.salesforce.multicloudj.pubsub.client.GetAttributeResult;
import com.salesforce.multicloudj.pubsub.batcher.Batcher;
import com.salesforce.multicloudj.sts.model.CredentialsOverrider;

Expand Down Expand Up @@ -410,7 +410,7 @@ public CompletableFuture<Void> sendNacks(List<AckID> ackIDs) {

public abstract boolean canNack();
public abstract boolean isRetryable(Throwable error);
public abstract Map<String, String> getAttributes();
public abstract GetAttributeResult getAttributes();

protected abstract void doSendAcks(List<AckID> ackIDs);
protected abstract void doSendNacks(List<AckID> ackIDs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.salesforce.multicloudj.pubsub.driver.AbstractTopic;
import com.salesforce.multicloudj.pubsub.driver.Message;
import com.salesforce.multicloudj.pubsub.driver.AckID;
import com.salesforce.multicloudj.pubsub.client.GetAttributeResult;
import com.salesforce.multicloudj.common.util.common.TestsUtil;
import com.salesforce.multicloudj.common.exceptions.InvalidArgumentException;

Expand Down Expand Up @@ -325,4 +326,25 @@ public void testDoubleAck() throws Exception {
subscription.sendAck(receivedMessages.get(0).getAckID());
}
}

@Test
public void testGetAttributes() throws Exception {
try (AbstractSubscription subscription = harness.createSubscriptionDriver()) {
GetAttributeResult attributes = subscription.getAttributes();

// Verify that attributes are returned
Assertions.assertNotNull(attributes, "Attributes should not be null");

// Verify essential attributes that should be present across all providers
Assertions.assertNotNull(attributes.getName(), "Name should not be null");
Assertions.assertFalse(attributes.getName().isEmpty(), "Name should not be empty");

Assertions.assertNotNull(attributes.getTopic(), "Topic should not be null");
Assertions.assertFalse(attributes.getTopic().isEmpty(), "Topic should not be empty");

// Verify that we have the essential attributes
Assertions.assertNotNull(attributes.getName(), "Should have name attribute");
Assertions.assertNotNull(attributes.getTopic(), "Should have topic attribute");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,14 @@ public void testCanNack() {
@Test
public void testGetAttributes() {
// Arrange
Map<String, String> expectedAttributes = Map.of("key", "value");
GetAttributeResult expectedAttributes = new GetAttributeResult.Builder()
.name("test-subscription")
.topic("test-topic")
.build();
when(mockSubscription.getAttributes()).thenReturn(expectedAttributes);

// Act
Map<String, String> result = subscriptionClient.getAttributes();
GetAttributeResult result = subscriptionClient.getAttributes();

// Assert
assertEquals(expectedAttributes, result);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.salesforce.multicloudj.common.exceptions.InvalidArgumentException;
import com.salesforce.multicloudj.common.exceptions.SubstrateSdkException;
import com.salesforce.multicloudj.pubsub.batcher.Batcher;
import com.salesforce.multicloudj.pubsub.client.GetAttributeResult;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;

Expand Down Expand Up @@ -133,7 +134,12 @@ protected Batcher.Options createAckBatcherOptions() {
public boolean canNack() { return false; }

@Override
public Map<String, String> getAttributes() { return Collections.emptyMap(); }
public GetAttributeResult getAttributes() {
return new GetAttributeResult.Builder()
.name("test-subscription")
.topic("test-topic")
.build();
}

@Override
public boolean isRetryable(Throwable error) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@
import com.google.pubsub.v1.PullResponse;
import com.google.pubsub.v1.ReceivedMessage;
import com.salesforce.multicloudj.common.exceptions.SubstrateSdkException;
import com.google.pubsub.v1.Subscription;
import com.salesforce.multicloudj.common.gcp.GcpConstants;
import com.salesforce.multicloudj.common.exceptions.InvalidArgumentException;
import com.salesforce.multicloudj.pubsub.client.GetAttributeResult;

import com.salesforce.multicloudj.common.gcp.GcpCredentialsProvider;
import com.salesforce.multicloudj.pubsub.batcher.Batcher;
Expand All @@ -36,6 +38,9 @@
import java.net.Proxy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
Expand Down Expand Up @@ -184,9 +189,17 @@ public boolean isRetryable(Throwable error) {
}

@Override
public Map<String, String> getAttributes() {
// TODO: Implement subscription attributes retrieval
return Collections.emptyMap();
public GetAttributeResult getAttributes() {
try {
Subscription sub = getOrCreateSubscriptionAdminClient().getSubscription(subscriptionName);

return new GetAttributeResult.Builder()
.name(sub.getName())
.topic(sub.getTopic())
.build();
} catch (ApiException e) {
throw new SubstrateSdkException("Failed to retrieve subscription attributes", e);
}
}

@Override
Expand Down
Loading
Loading