Skip to content

Commit 0a37e9f

Browse files
authored
Modify ArnResource to handle more variants of resources (#4317)
1 parent aa392a0 commit 0a37e9f

File tree

4 files changed

+49
-82
lines changed

4 files changed

+49
-82
lines changed

core/arns/src/main/java/software/amazon/awssdk/arns/ArnResource.java

+12-16
Original file line numberDiff line numberDiff line change
@@ -91,34 +91,30 @@ public static Builder builder() {
9191
* @return {@link ArnResource}
9292
*/
9393
public static ArnResource fromString(String resource) {
94-
Character splitter = StringUtils.findFirstOccurrence(resource, ':', '/');
94+
Character primarySplitter = StringUtils.findFirstOccurrence(resource, ':', '/');
9595

96-
if (splitter == null) {
97-
return ArnResource.builder().resource(resource).build();
96+
if (primarySplitter == null) {
97+
return builder().resource(resource).build();
9898
}
9999

100-
int resourceTypeColonIndex = resource.indexOf(splitter);
100+
int resourceTypeIndex = resource.indexOf(primarySplitter);
101+
ArnResource.Builder builder = builder().resourceType(resource.substring(0, resourceTypeIndex));
101102

102-
ArnResource.Builder builder = ArnResource.builder().resourceType(resource.substring(0, resourceTypeColonIndex));
103-
int resourceColonIndex = resource.indexOf(splitter, resourceTypeColonIndex);
104-
int qualifierColonIndex = resource.indexOf(splitter, resourceColonIndex + 1);
105-
if (qualifierColonIndex < 0) {
106-
builder.resource(resource.substring(resourceTypeColonIndex + 1));
103+
String remainingResource = resource.substring(resourceTypeIndex + 1);
104+
int qualifierColonIndex = remainingResource.lastIndexOf(':');
105+
if (qualifierColonIndex < 1) {
106+
builder.resource(remainingResource);
107107
} else {
108-
builder.resource(resource.substring(resourceTypeColonIndex + 1, qualifierColonIndex));
109-
builder.qualifier(resource.substring(qualifierColonIndex + 1));
108+
builder.resource(remainingResource.substring(0, qualifierColonIndex));
109+
builder.qualifier(remainingResource.substring(qualifierColonIndex + 1));
110110
}
111111

112112
return builder.build();
113113
}
114114

115115
@Override
116116
public String toString() {
117-
return this.resourceType
118-
+ ":"
119-
+ this.resource
120-
+ ":"
121-
+ this.qualifier;
117+
return String.join(":", this.resourceType, this.resource, this.qualifier);
122118
}
123119

124120
@Override

core/arns/src/test/java/software/amazon/awssdk/arns/ArnResourceTest.java

+35-1
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,16 @@
1515

1616
package software.amazon.awssdk.arns;
1717

18-
1918
import static org.assertj.core.api.Assertions.assertThat;
2019
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2120

21+
import java.util.Arrays;
22+
import java.util.List;
2223
import java.util.Optional;
2324
import org.junit.jupiter.api.Test;
25+
import org.junit.jupiter.params.ParameterizedTest;
26+
import org.junit.jupiter.params.provider.Arguments;
27+
import org.junit.jupiter.params.provider.MethodSource;
2428

2529
public class ArnResourceTest {
2630

@@ -64,4 +68,34 @@ public void hashCodeEquals_minimalProperties() {
6468
assertThat(arnResource.equals(anotherResource)).isTrue();
6569
assertThat(arnResource.hashCode()).isEqualTo(anotherResource.hashCode());
6670
}
71+
72+
@ParameterizedTest
73+
@MethodSource("resources")
74+
void arnResource_ParsesCorrectly(String resource, ArnResource expected) {
75+
ArnResource arnResource = ArnResource.fromString(resource);
76+
77+
assertThat(arnResource.resourceType()).isEqualTo(expected.resourceType());
78+
assertThat(arnResource.resource()).isEqualTo(expected.resource());
79+
assertThat(arnResource.qualifier()).isEqualTo(expected.qualifier());
80+
}
81+
82+
private static List<Arguments> resources() {
83+
return Arrays.asList(
84+
Arguments.of("myresource", ArnResource.builder().resource("myresource").build()),
85+
Arguments.of("alias/foo/bar", ArnResource.builder().resourceType("alias").resource("foo/bar").build()),
86+
Arguments.of("alias//", ArnResource.builder().resourceType("alias").resource("/").build()),
87+
Arguments.of("alias//a", ArnResource.builder().resourceType("alias").resource("/a").build()),
88+
Arguments.of("alias///a", ArnResource.builder().resourceType("alias").resource("//a").build()),
89+
Arguments.of("alias///a/b", ArnResource.builder().resourceType("alias").resource("//a/b").build()),
90+
Arguments.of("alias/foo", ArnResource.builder().resourceType("alias").resource("foo").build()),
91+
Arguments.of("alias/foo:quali", ArnResource.builder().resourceType("alias").resource("foo").qualifier("quali").build()),
92+
Arguments.of("alias/foo:bar:quali", ArnResource.builder().resourceType("alias").resource("foo:bar").qualifier("quali").build()),
93+
Arguments.of("alias:foo", ArnResource.builder().resourceType("alias").resource("foo").build()),
94+
Arguments.of("alias:foo.bar", ArnResource.builder().resourceType("alias").resource("foo.bar").build()),
95+
Arguments.of("alias:foo/bar", ArnResource.builder().resourceType("alias").resource("foo/bar").build()),
96+
Arguments.of("alias:foo/bar/baz", ArnResource.builder().resourceType("alias").resource("foo/bar/baz").build()),
97+
Arguments.of("alias:foo:quali", ArnResource.builder().resourceType("alias").resource("foo").qualifier("quali").build()),
98+
Arguments.of("alias:foo:bar:quali", ArnResource.builder().resourceType("alias").resource("foo:bar").qualifier("quali").build())
99+
);
100+
}
67101
}

core/arns/src/test/java/software/amazon/awssdk/arns/ArnTest.java

+1-64
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ public void arnWithBasicResource_ParsesCorrectly() {
3131
assertThat(arn.region()).hasValue("us-east-1");
3232
assertThat(arn.accountId()).hasValue("12345678910");
3333
assertThat(arn.resourceAsString()).isEqualTo("myresource");
34-
System.out.println(arn.resource());
3534
}
3635

3736
@Test
@@ -65,14 +64,6 @@ public void arnWithResourceTypeAndResource_ParsesCorrectly() {
6564
assertThat(arn.service()).isEqualTo("s3");
6665
assertThat(arn.region()).hasValue("us-east-1");
6766
assertThat(arn.resourceAsString()).isEqualTo("bucket:foobar");
68-
69-
verifyArnResource(arn.resource());
70-
}
71-
72-
private void verifyArnResource(ArnResource arnResource) {
73-
assertThat(arnResource.resource()).isEqualTo("foobar");
74-
assertThat(arnResource.resourceType()).isPresent();
75-
assertThat(arnResource.resourceType().get()).isEqualTo("bucket");
7667
}
7768

7869
@Test
@@ -83,12 +74,6 @@ public void arnWithResourceTypeAndResourceAndQualifier_ParsesCorrectly() {
8374
assertThat(arn.service()).isEqualTo("s3");
8475
assertThat(arn.region()).hasValue("us-east-1");
8576
assertThat(arn.resourceAsString()).isEqualTo("bucket:foobar:1");
86-
87-
88-
ArnResource arnResource = arn.resource();
89-
verifyArnResource(arnResource);
90-
assertThat(arnResource.qualifier()).isPresent();
91-
assertThat(arnResource.qualifier().get()).isEqualTo("1");
9277
}
9378

9479
@Test
@@ -99,20 +84,7 @@ public void arnWithResourceTypeAndResource_SlashSplitter_ParsesCorrectly() {
9984
assertThat(arn.service()).isEqualTo("s3");
10085
assertThat(arn.region()).hasValue("us-east-1");
10186
assertThat(arn.resourceAsString()).isEqualTo("bucket/foobar");
102-
verifyArnResource(arn.resource());
103-
}
104-
105-
@Test
106-
public void arnWithResourceTypeAndResourceAndQualifier_SlashSplitter_ParsesCorrectly() {
107-
String arnString = "arn:aws:s3:us-east-1:12345678910:bucket/foobar/1";
108-
Arn arn = Arn.fromString(arnString);
109-
assertThat(arn.partition()).isEqualTo("aws");
110-
assertThat(arn.service()).isEqualTo("s3");
111-
assertThat(arn.region()).hasValue("us-east-1");
112-
assertThat(arn.resourceAsString()).isEqualTo("bucket/foobar/1");
113-
verifyArnResource(arn.resource());
114-
assertThat(arn.resource().qualifier().get()).isEqualTo("1");
115-
}
87+
}
11688

11789
@Test
11890
public void oneArnEqualsEquivalentArn() {
@@ -138,30 +110,6 @@ public void arnFromBuilder_ParsesCorrectly() {
138110
assertThat(arn.region()).hasValue("us-east-1");
139111
assertThat(arn.accountId()).hasValue("123456789012");
140112
assertThat(arn.resourceAsString()).isEqualTo("bucket:foobar:1");
141-
verifyArnResource(arn.resource());
142-
assertThat(arn.resource().qualifier()).isPresent();
143-
assertThat(arn.resource().qualifier().get()).isEqualTo("1");
144-
}
145-
146-
@Test
147-
public void arnResourceWithColonAndSlash_ParsesOnFirstSplitter() {
148-
String resourceWithColonAndSlash = "object:foobar/myobjectname:1";
149-
Arn arn = Arn.builder()
150-
.partition("aws")
151-
.service("s3")
152-
.region("us-east-1")
153-
.accountId("123456789012")
154-
.resource(resourceWithColonAndSlash)
155-
.build();
156-
assertThat(arn.partition()).isEqualTo("aws");
157-
assertThat(arn.service()).isEqualTo("s3");
158-
assertThat(arn.region()).hasValue("us-east-1");
159-
assertThat(arn.accountId()).hasValue("123456789012");
160-
assertThat(arn.resourceAsString()).isEqualTo(resourceWithColonAndSlash);
161-
162-
assertThat(arn.resource().resource()).isEqualTo("foobar/myobjectname");
163-
assertThat(arn.resource().qualifier()).hasValue("1");
164-
assertThat(arn.resource().resourceType()).hasValue("object");
165113
}
166114

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

189-
@Test
190-
public void arnResourceContainingDots_ParsesCorrectly() {
191-
String arnString = "arn:aws:s3:us-east-1:12345678910:myresource:foobar.1";
192-
Arn arn = Arn.fromString(arnString);
193-
assertThat(arn.partition()).isEqualTo("aws");
194-
assertThat(arn.service()).isEqualTo("s3");
195-
assertThat(arn.region()).hasValue("us-east-1");
196-
assertThat(arn.accountId()).hasValue("12345678910");
197-
assertThat(arn.resourceAsString()).isEqualTo("myresource:foobar.1");
198-
}
199-
200137
@Test
201138
public void toBuilder() {
202139
Arn oneArn = Arn.builder()

services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/resource/S3ArnUtilsTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public void parseOutpostArn_malformedArnNullSubresource_shouldThrowException() {
122122
@Test
123123
public void parseOutpostArn_malformedArnEmptyOutpostId_shouldThrowException() {
124124
exception.expect(IllegalArgumentException.class);
125-
exception.expectMessage("resource must not be blank or empty");
125+
exception.expectMessage("Invalid format for S3 outpost ARN, missing outpostId");
126126

127127
S3ArnUtils.parseOutpostArn(Arn.builder()
128128
.partition("aws")

0 commit comments

Comments
 (0)