Skip to content

Commit

Permalink
Modify ArnResource to handle more variants of resources (#4317)
Browse files Browse the repository at this point in the history
  • Loading branch information
cenedhryn committed Aug 21, 2023
1 parent aa392a0 commit 0a37e9f
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 82 deletions.
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);
}

@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())
);
}
}
65 changes: 1 addition & 64 deletions core/arns/src/test/java/software/amazon/awssdk/arns/ArnTest.java
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

0 comments on commit 0a37e9f

Please sign in to comment.