Skip to content

Commit 661e2ed

Browse files
committed
Initializing statement during builder initialization
1 parent e26db61 commit 661e2ed

File tree

3 files changed

+42
-37
lines changed

3 files changed

+42
-37
lines changed

iam/iam-client/src/main/java/com/salesforce/multicloudj/iam/model/PolicyDocument.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public static class Builder {
8181
private Statement.Builder currentStatementBuilder;
8282

8383
private Builder() {
84+
this.currentStatementBuilder = Statement.builder();
8485
}
8586

8687
/**
@@ -113,7 +114,6 @@ public Builder statement(String sid) {
113114
* @return this Builder instance
114115
*/
115116
public Builder effect(String effect) {
116-
validateCurrentStatement();
117117
this.currentStatementBuilder.effect(effect);
118118
return this;
119119
}
@@ -125,7 +125,6 @@ public Builder effect(String effect) {
125125
* @return this Builder instance
126126
*/
127127
public Builder addPrincipal(String principal) {
128-
validateCurrentStatement();
129128
this.currentStatementBuilder.addPrincipal(principal);
130129
return this;
131130
}
@@ -137,7 +136,6 @@ public Builder addPrincipal(String principal) {
137136
* @return this Builder instance
138137
*/
139138
public Builder addPrincipals(List<String> principals) {
140-
validateCurrentStatement();
141139
this.currentStatementBuilder.addPrincipals(principals);
142140
return this;
143141
}
@@ -149,7 +147,6 @@ public Builder addPrincipals(List<String> principals) {
149147
* @return this Builder instance
150148
*/
151149
public Builder addAction(String action) {
152-
validateCurrentStatement();
153150
this.currentStatementBuilder.addAction(action);
154151
return this;
155152
}
@@ -161,7 +158,6 @@ public Builder addAction(String action) {
161158
* @return this Builder instance
162159
*/
163160
public Builder addActions(List<String> actions) {
164-
validateCurrentStatement();
165161
this.currentStatementBuilder.addActions(actions);
166162
return this;
167163
}
@@ -173,7 +169,6 @@ public Builder addActions(List<String> actions) {
173169
* @return this Builder instance
174170
*/
175171
public Builder addResource(String resource) {
176-
validateCurrentStatement();
177172
this.currentStatementBuilder.addResource(resource);
178173
return this;
179174
}
@@ -185,7 +180,6 @@ public Builder addResource(String resource) {
185180
* @return this Builder instance
186181
*/
187182
public Builder addResources(List<String> resources) {
188-
validateCurrentStatement();
189183
this.currentStatementBuilder.addResources(resources);
190184
return this;
191185
}
@@ -199,7 +193,6 @@ public Builder addResources(List<String> resources) {
199193
* @return this Builder instance
200194
*/
201195
public Builder addCondition(String operator, String key, Object value) {
202-
validateCurrentStatement();
203196
this.currentStatementBuilder.addCondition(operator, key, value);
204197
return this;
205198
}
@@ -245,16 +238,16 @@ public PolicyDocument build() {
245238
return new PolicyDocument(this);
246239
}
247240

248-
private void validateCurrentStatement() {
249-
if (currentStatementBuilder == null) {
250-
throw new InvalidArgumentException("No statement is currently being built. Call statement(sid) first.");
251-
}
252-
}
253241

254242
private void finalizeCurrentStatement() {
255243
if (currentStatementBuilder != null) {
256-
statements.add(currentStatementBuilder.build());
257-
currentStatementBuilder = null;
244+
// Only finalize statements that have the minimum required content
245+
if (currentStatementBuilder.hasMinimumContent()) {
246+
Statement statement = currentStatementBuilder.build();
247+
statements.add(statement);
248+
}
249+
// Always reinitialize for the next statement
250+
currentStatementBuilder = Statement.builder();
258251
}
259252
}
260253
}

iam/iam-client/src/main/java/com/salesforce/multicloudj/iam/model/Statement.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,15 @@ public Builder addCondition(String operator, String key, Object value) {
222222
return this;
223223
}
224224

225+
/**
226+
* Checks if the statement has the minimum required content to be built.
227+
*
228+
* @return true if the statement has both effect and at least one action
229+
*/
230+
public boolean hasMinimumContent() {
231+
return effect != null && !effect.trim().isEmpty() && !actions.isEmpty();
232+
}
233+
225234
/**
226235
* Builds and returns a Statement instance.
227236
*

iam/iam-client/src/test/java/com/salesforce/multicloudj/iam/model/PolicyDocumentTest.java

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -204,31 +204,34 @@ public void testBuilderMethodsWithMultipleValues() {
204204
}
205205

206206
@Test
207-
public void testBuilderStateValidation() {
208-
// Test that trying to use statement methods without calling statement() throws exception
209-
assertThrows(InvalidArgumentException.class, () ->
210-
PolicyDocument.builder().addAction("storage:GetObject").build());
211-
212-
assertThrows(InvalidArgumentException.class, () ->
213-
PolicyDocument.builder().effect("Allow").build());
214-
215-
assertThrows(InvalidArgumentException.class, () ->
216-
PolicyDocument.builder().addResource("storage://test-bucket/*").build());
217-
218-
assertThrows(InvalidArgumentException.class, () ->
219-
PolicyDocument.builder().addPrincipal("principal1").build());
220-
221-
assertThrows(InvalidArgumentException.class, () ->
222-
PolicyDocument.builder().addCondition("StringEquals", "key", "value").build());
207+
public void testBuilderAutoInitialization() {
208+
// Test that statement methods work without calling statement() first due to auto-initialization
209+
PolicyDocument policy1 = PolicyDocument.builder()
210+
.version("2024-01-01")
211+
.addAction("storage:GetObject")
212+
.effect("Allow")
213+
.addResource("storage://test-bucket/*")
214+
.build();
223215

224-
assertThrows(InvalidArgumentException.class, () ->
225-
PolicyDocument.builder().addActions(Arrays.asList("storage:GetObject")).build());
216+
assertEquals(1, policy1.getStatements().size());
217+
assertEquals("Allow", policy1.getStatements().get(0).getEffect());
226218

227-
assertThrows(InvalidArgumentException.class, () ->
228-
PolicyDocument.builder().addResources(Arrays.asList("storage://test-bucket/*")).build());
219+
PolicyDocument policy2 = PolicyDocument.builder()
220+
.version("2024-01-01")
221+
.addPrincipal("principal1")
222+
.addCondition("StringEquals", "key", "value")
223+
.addActions(Arrays.asList("storage:GetObject"))
224+
.addResources(Arrays.asList("storage://test-bucket/*"))
225+
.addPrincipals(Arrays.asList("principal2"))
226+
.effect("Allow")
227+
.build();
229228

230-
assertThrows(InvalidArgumentException.class, () ->
231-
PolicyDocument.builder().addPrincipals(Arrays.asList("principal1")).build());
229+
assertEquals(1, policy2.getStatements().size());
230+
Statement statement = policy2.getStatements().get(0);
231+
assertEquals("Allow", statement.getEffect());
232+
assertEquals(1, statement.getActions().size());
233+
assertEquals(1, statement.getResources().size());
234+
assertEquals(2, statement.getPrincipals().size());
232235
}
233236

234237
@Test

0 commit comments

Comments
 (0)