Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modify ArnResource to handle more variants of resources #4317

Merged
merged 2 commits into from
Aug 21, 2023
Merged
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 @@ -91,34 +91,30 @@ public static Builder builder() {
* @return {@link ArnResource}
*/
public static ArnResource fromString(String resource) {
Character splitter = StringUtils.findFirstOccurrence(resource, ':', '/');
Character primarySplitter = StringUtils.findFirstOccurrence(resource, ':', '/');

if (splitter == null) {
return ArnResource.builder().resource(resource).build();
if (primarySplitter == null) {
return builder().resource(resource).build();
}

int resourceTypeColonIndex = resource.indexOf(splitter);
int resourceTypeIndex = resource.indexOf(primarySplitter);
ArnResource.Builder builder = builder().resourceType(resource.substring(0, resourceTypeIndex));

ArnResource.Builder builder = ArnResource.builder().resourceType(resource.substring(0, resourceTypeColonIndex));
int resourceColonIndex = resource.indexOf(splitter, resourceTypeColonIndex);
int qualifierColonIndex = resource.indexOf(splitter, resourceColonIndex + 1);
if (qualifierColonIndex < 0) {
builder.resource(resource.substring(resourceTypeColonIndex + 1));
String remainingResource = resource.substring(resourceTypeIndex + 1);
int qualifierColonIndex = remainingResource.lastIndexOf(':');
if (qualifierColonIndex < 1) {
builder.resource(remainingResource);
} else {
builder.resource(resource.substring(resourceTypeColonIndex + 1, qualifierColonIndex));
builder.qualifier(resource.substring(qualifierColonIndex + 1));
builder.resource(remainingResource.substring(0, qualifierColonIndex));
builder.qualifier(remainingResource.substring(qualifierColonIndex + 1));
}

return builder.build();
}

@Override
public String toString() {
return this.resourceType
+ ":"
+ this.resource
+ ":"
+ this.qualifier;
return String.join(":", this.resourceType, this.resource, this.qualifier);
zoewangg marked this conversation as resolved.
Show resolved Hide resolved
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@

package software.amazon.awssdk.arns;


import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

public class ArnResourceTest {

Expand Down Expand Up @@ -64,4 +68,34 @@ public void hashCodeEquals_minimalProperties() {
assertThat(arnResource.equals(anotherResource)).isTrue();
assertThat(arnResource.hashCode()).isEqualTo(anotherResource.hashCode());
}

@ParameterizedTest
@MethodSource("resources")
void arnResource_ParsesCorrectly(String resource, ArnResource expected) {
ArnResource arnResource = ArnResource.fromString(resource);

assertThat(arnResource.resourceType()).isEqualTo(expected.resourceType());
assertThat(arnResource.resource()).isEqualTo(expected.resource());
assertThat(arnResource.qualifier()).isEqualTo(expected.qualifier());
}

private static List<Arguments> resources() {
return Arrays.asList(
Arguments.of("myresource", ArnResource.builder().resource("myresource").build()),
Arguments.of("alias/foo/bar", ArnResource.builder().resourceType("alias").resource("foo/bar").build()),
Arguments.of("alias//", ArnResource.builder().resourceType("alias").resource("/").build()),
Arguments.of("alias//a", ArnResource.builder().resourceType("alias").resource("/a").build()),
Arguments.of("alias///a", ArnResource.builder().resourceType("alias").resource("//a").build()),
Arguments.of("alias///a/b", ArnResource.builder().resourceType("alias").resource("//a/b").build()),
Arguments.of("alias/foo", ArnResource.builder().resourceType("alias").resource("foo").build()),
Arguments.of("alias/foo:quali", ArnResource.builder().resourceType("alias").resource("foo").qualifier("quali").build()),
Arguments.of("alias/foo:bar:quali", ArnResource.builder().resourceType("alias").resource("foo:bar").qualifier("quali").build()),
Arguments.of("alias:foo", ArnResource.builder().resourceType("alias").resource("foo").build()),
Arguments.of("alias:foo.bar", ArnResource.builder().resourceType("alias").resource("foo.bar").build()),
Arguments.of("alias:foo/bar", ArnResource.builder().resourceType("alias").resource("foo/bar").build()),
Arguments.of("alias:foo/bar/baz", ArnResource.builder().resourceType("alias").resource("foo/bar/baz").build()),
Arguments.of("alias:foo:quali", ArnResource.builder().resourceType("alias").resource("foo").qualifier("quali").build()),
Arguments.of("alias:foo:bar:quali", ArnResource.builder().resourceType("alias").resource("foo:bar").qualifier("quali").build())
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ public void arnWithBasicResource_ParsesCorrectly() {
assertThat(arn.region()).hasValue("us-east-1");
assertThat(arn.accountId()).hasValue("12345678910");
assertThat(arn.resourceAsString()).isEqualTo("myresource");
System.out.println(arn.resource());
}

@Test
Expand Down Expand Up @@ -65,14 +64,6 @@ public void arnWithResourceTypeAndResource_ParsesCorrectly() {
assertThat(arn.service()).isEqualTo("s3");
assertThat(arn.region()).hasValue("us-east-1");
assertThat(arn.resourceAsString()).isEqualTo("bucket:foobar");

verifyArnResource(arn.resource());
}

private void verifyArnResource(ArnResource arnResource) {
assertThat(arnResource.resource()).isEqualTo("foobar");
assertThat(arnResource.resourceType()).isPresent();
assertThat(arnResource.resourceType().get()).isEqualTo("bucket");
}

@Test
Expand All @@ -83,12 +74,6 @@ public void arnWithResourceTypeAndResourceAndQualifier_ParsesCorrectly() {
assertThat(arn.service()).isEqualTo("s3");
assertThat(arn.region()).hasValue("us-east-1");
assertThat(arn.resourceAsString()).isEqualTo("bucket:foobar:1");


ArnResource arnResource = arn.resource();
verifyArnResource(arnResource);
assertThat(arnResource.qualifier()).isPresent();
assertThat(arnResource.qualifier().get()).isEqualTo("1");
}

@Test
Expand All @@ -99,20 +84,7 @@ public void arnWithResourceTypeAndResource_SlashSplitter_ParsesCorrectly() {
assertThat(arn.service()).isEqualTo("s3");
assertThat(arn.region()).hasValue("us-east-1");
assertThat(arn.resourceAsString()).isEqualTo("bucket/foobar");
verifyArnResource(arn.resource());
}

@Test
public void arnWithResourceTypeAndResourceAndQualifier_SlashSplitter_ParsesCorrectly() {
String arnString = "arn:aws:s3:us-east-1:12345678910:bucket/foobar/1";
Arn arn = Arn.fromString(arnString);
assertThat(arn.partition()).isEqualTo("aws");
assertThat(arn.service()).isEqualTo("s3");
assertThat(arn.region()).hasValue("us-east-1");
assertThat(arn.resourceAsString()).isEqualTo("bucket/foobar/1");
verifyArnResource(arn.resource());
assertThat(arn.resource().qualifier().get()).isEqualTo("1");
}
}

@Test
public void oneArnEqualsEquivalentArn() {
Expand All @@ -138,30 +110,6 @@ public void arnFromBuilder_ParsesCorrectly() {
assertThat(arn.region()).hasValue("us-east-1");
assertThat(arn.accountId()).hasValue("123456789012");
assertThat(arn.resourceAsString()).isEqualTo("bucket:foobar:1");
verifyArnResource(arn.resource());
assertThat(arn.resource().qualifier()).isPresent();
assertThat(arn.resource().qualifier().get()).isEqualTo("1");
}

@Test
public void arnResourceWithColonAndSlash_ParsesOnFirstSplitter() {
String resourceWithColonAndSlash = "object:foobar/myobjectname:1";
Arn arn = Arn.builder()
.partition("aws")
.service("s3")
.region("us-east-1")
.accountId("123456789012")
.resource(resourceWithColonAndSlash)
.build();
assertThat(arn.partition()).isEqualTo("aws");
assertThat(arn.service()).isEqualTo("s3");
assertThat(arn.region()).hasValue("us-east-1");
assertThat(arn.accountId()).hasValue("123456789012");
assertThat(arn.resourceAsString()).isEqualTo(resourceWithColonAndSlash);

assertThat(arn.resource().resource()).isEqualTo("foobar/myobjectname");
assertThat(arn.resource().qualifier()).hasValue("1");
assertThat(arn.resource().resourceType()).hasValue("object");
}

@Test
Expand All @@ -186,17 +134,6 @@ public void arnWithoutAccountId_ParsesCorrectly() {
assertThat(arn.resourceAsString()).isEqualTo("myresource");
}

@Test
public void arnResourceContainingDots_ParsesCorrectly() {
String arnString = "arn:aws:s3:us-east-1:12345678910:myresource:foobar.1";
Arn arn = Arn.fromString(arnString);
assertThat(arn.partition()).isEqualTo("aws");
assertThat(arn.service()).isEqualTo("s3");
assertThat(arn.region()).hasValue("us-east-1");
assertThat(arn.accountId()).hasValue("12345678910");
assertThat(arn.resourceAsString()).isEqualTo("myresource:foobar.1");
}

@Test
public void toBuilder() {
Arn oneArn = Arn.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ public void parseOutpostArn_malformedArnNullSubresource_shouldThrowException() {
@Test
public void parseOutpostArn_malformedArnEmptyOutpostId_shouldThrowException() {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("resource must not be blank or empty");
exception.expectMessage("Invalid format for S3 outpost ARN, missing outpostId");

S3ArnUtils.parseOutpostArn(Arn.builder()
.partition("aws")
Expand Down
Loading