Skip to content

Commit f6c1df1

Browse files
bdemersclaude
andcommitted
Move getExtensionList() into BaseRepository as constructor parameter
Extension classes are now passed to the BaseRepository constructor as varargs, removing the need for each subclass to override getExtensionList(). Repositories with no extensions simply omit the parameter (defaults to empty list). Also migrates scim-server and spring-boot test InMemory services from raw Repository to BaseRepository, removing duplicate patch() and getResourceClass() implementations. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 11ea545 commit f6c1df1

18 files changed

Lines changed: 67 additions & 191 deletions

File tree

scim-core/src/main/java/org/apache/directory/scim/core/repository/BaseRepository.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.directory.scim.spec.exception.ResourceException;
2323
import org.apache.directory.scim.spec.exception.ResourceNotFoundException;
2424
import org.apache.directory.scim.spec.patch.PatchOperation;
25+
import org.apache.directory.scim.spec.resources.ScimExtension;
2526
import org.apache.directory.scim.spec.resources.ScimResource;
2627

2728
import java.util.List;
@@ -34,6 +35,7 @@
3435
* {@link #find}, and {@link #delete}. The following are provided automatically:</p>
3536
* <ul>
3637
* <li>{@link #getResourceClass()} — returns the class passed to the constructor</li>
38+
* <li>{@link #getExtensionList()} — returns the extension classes passed to the constructor</li>
3739
* <li>{@link #patch(String, List, ScimRequestContext)} — fetches the current resource
3840
* via {@link #get}, applies patch operations via {@link PatchHandler}, and persists
3941
* via {@link #update}</li>
@@ -46,7 +48,7 @@
4648
* public class MyUserRepository extends BaseRepository&lt;ScimUser&gt; {
4749
* &#64;Inject
4850
* public MyUserRepository(PatchHandler patchHandler) {
49-
* super(ScimUser.class, patchHandler);
51+
* super(ScimUser.class, patchHandler, MyExtension.class);
5052
* }
5153
* // implement create, update, get, find, delete
5254
* }
@@ -58,16 +60,21 @@ public abstract class BaseRepository<T extends ScimResource> implements Reposito
5860

5961
private final Class<T> resourceClass;
6062
private final PatchHandler patchHandler;
63+
private final List<Class<? extends ScimExtension>> extensionList;
6164

6265
/**
6366
* Creates a new base repository.
6467
*
6568
* @param resourceClass the SCIM resource class this repository manages
6669
* @param patchHandler the handler used to apply SCIM PATCH operations
70+
* @param extensions SCIM extension classes supported by this repository (may be empty)
6771
*/
68-
protected BaseRepository(Class<T> resourceClass, PatchHandler patchHandler) {
72+
@SafeVarargs
73+
protected BaseRepository(Class<T> resourceClass, PatchHandler patchHandler,
74+
Class<? extends ScimExtension>... extensions) {
6975
this.resourceClass = resourceClass;
7076
this.patchHandler = patchHandler;
77+
this.extensionList = extensions != null ? List.of(extensions) : List.of();
7178
}
7279

7380
/**
@@ -77,13 +84,19 @@ protected BaseRepository(Class<T> resourceClass, PatchHandler patchHandler) {
7784
protected BaseRepository() {
7885
this.resourceClass = null;
7986
this.patchHandler = null;
87+
this.extensionList = List.of();
8088
}
8189

8290
@Override
8391
public Class<T> getResourceClass() {
8492
return resourceClass;
8593
}
8694

95+
@Override
96+
public List<Class<? extends ScimExtension>> getExtensionList() {
97+
return extensionList;
98+
}
99+
87100
/**
88101
* Default PATCH implementation: fetches the current resource, applies the patch
89102
* operations, and persists the result via {@link #update}.

scim-core/src/test/java/org/apache/directory/scim/core/repository/BaseRepositoryTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.apache.directory.scim.spec.filter.Filter;
2525
import org.apache.directory.scim.spec.filter.FilterResponse;
2626
import org.apache.directory.scim.spec.patch.PatchOperation;
27+
import org.apache.directory.scim.spec.resources.ScimExtension;
2728
import org.apache.directory.scim.spec.resources.ScimUser;
2829
import org.junit.jupiter.api.Test;
2930
import org.mockito.Mockito;
@@ -48,6 +49,11 @@ static class TestRepository extends BaseRepository<ScimUser> {
4849
super(ScimUser.class, patchHandler);
4950
}
5051

52+
@SafeVarargs
53+
TestRepository(PatchHandler patchHandler, Class<? extends ScimExtension>... extensions) {
54+
super(ScimUser.class, patchHandler, extensions);
55+
}
56+
5157
/** No-arg constructor to verify CDI proxy path. */
5258
TestRepository() {
5359
super();
@@ -237,4 +243,32 @@ void patch_patchHandlerThrowsException_propagates() throws ResourceException {
237243
.isInstanceOf(RuntimeException.class)
238244
.hasMessage("patch failed");
239245
}
246+
247+
@Test
248+
void getExtensionList_defaultsToEmptyList() {
249+
PatchHandler patchHandler = Mockito.mock(PatchHandler.class);
250+
TestRepository repository = new TestRepository(patchHandler);
251+
252+
assertThat(repository.getExtensionList()).isEmpty();
253+
}
254+
255+
@Test
256+
void getExtensionList_returnsProvidedExtensions() {
257+
PatchHandler patchHandler = Mockito.mock(PatchHandler.class);
258+
TestRepository repository = new TestRepository(patchHandler, ExtensionA.class, ExtensionB.class);
259+
260+
assertThat(repository.getExtensionList())
261+
.containsExactly(ExtensionA.class, ExtensionB.class);
262+
}
263+
264+
@Test
265+
void getExtensionList_noArgConstructor_returnsEmptyList() {
266+
TestRepository repository = new TestRepository();
267+
268+
assertThat(repository.getExtensionList()).isEmpty();
269+
}
270+
271+
/** Stub extension types for testing. */
272+
static abstract class ExtensionA implements ScimExtension {}
273+
static abstract class ExtensionB implements ScimExtension {}
240274
}

scim-server-examples/scim-server-jersey-4/src/main/java/org/apache/directory/scim/example/jersey4/service/InMemoryGroupService.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,8 @@
3636
import org.apache.directory.scim.spec.filter.FilterExpressions;
3737
import org.apache.directory.scim.spec.filter.FilterResponse;
3838
import org.apache.directory.scim.spec.filter.PageRequest;
39-
import org.apache.directory.scim.spec.resources.ScimExtension;
4039
import org.apache.directory.scim.spec.resources.ScimGroup;
4140

42-
import java.util.Collections;
4341
import java.util.List;
4442
import java.util.Map;
4543
import java.util.UUID;
@@ -123,9 +121,4 @@ public FilterResponse<ScimGroup> find(Filter filter, ScimRequestContext requestC
123121
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
124122
}
125123

126-
@Override
127-
public List<Class<? extends ScimExtension>> getExtensionList() {
128-
return Collections.emptyList();
129-
}
130-
131124
}

scim-server-examples/scim-server-jersey-4/src/main/java/org/apache/directory/scim/example/jersey4/service/InMemoryUserService.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.apache.directory.scim.spec.filter.PageRequest;
4040
import org.apache.directory.scim.spec.resources.Email;
4141
import org.apache.directory.scim.spec.resources.Name;
42-
import org.apache.directory.scim.spec.resources.ScimExtension;
4342
import org.apache.directory.scim.spec.resources.ScimUser;
4443

4544
import java.util.List;
@@ -70,7 +69,7 @@ public class InMemoryUserService extends BaseRepository<ScimUser> {
7069

7170
@Inject
7271
public InMemoryUserService(SchemaRegistry schemaRegistry, PatchHandler patchHandler) {
73-
super(ScimUser.class, patchHandler);
72+
super(ScimUser.class, patchHandler, LuckyNumberExtension.class, EnterpriseExtension.class);
7473
this.schemaRegistry = schemaRegistry;
7574
}
7675

@@ -156,8 +155,4 @@ public FilterResponse<ScimUser> find(Filter filter, ScimRequestContext requestCo
156155
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
157156
}
158157

159-
@Override
160-
public List<Class<? extends ScimExtension>> getExtensionList() {
161-
return List.of(LuckyNumberExtension.class, EnterpriseExtension.class);
162-
}
163158
}

scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryGroupService.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,8 @@
3636
import org.apache.directory.scim.spec.filter.FilterExpressions;
3737
import org.apache.directory.scim.spec.filter.FilterResponse;
3838
import org.apache.directory.scim.spec.filter.PageRequest;
39-
import org.apache.directory.scim.spec.resources.ScimExtension;
4039
import org.apache.directory.scim.spec.resources.ScimGroup;
4140

42-
import java.util.Collections;
4341
import java.util.List;
4442
import java.util.Map;
4543
import java.util.UUID;
@@ -123,9 +121,4 @@ public FilterResponse<ScimGroup> find(Filter filter, ScimRequestContext requestC
123121
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
124122
}
125123

126-
@Override
127-
public List<Class<? extends ScimExtension>> getExtensionList() {
128-
return Collections.emptyList();
129-
}
130-
131124
}

scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryUserService.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.apache.directory.scim.spec.filter.PageRequest;
4040
import org.apache.directory.scim.spec.resources.Email;
4141
import org.apache.directory.scim.spec.resources.Name;
42-
import org.apache.directory.scim.spec.resources.ScimExtension;
4342
import org.apache.directory.scim.spec.resources.ScimUser;
4443

4544
import java.util.List;
@@ -70,7 +69,7 @@ public class InMemoryUserService extends BaseRepository<ScimUser> {
7069

7170
@Inject
7271
public InMemoryUserService(SchemaRegistry schemaRegistry, PatchHandler patchHandler) {
73-
super(ScimUser.class, patchHandler);
72+
super(ScimUser.class, patchHandler, LuckyNumberExtension.class, EnterpriseExtension.class);
7473
this.schemaRegistry = schemaRegistry;
7574
}
7675

@@ -156,8 +155,4 @@ public FilterResponse<ScimUser> find(Filter filter, ScimRequestContext requestCo
156155
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
157156
}
158157

159-
@Override
160-
public List<Class<? extends ScimExtension>> getExtensionList() {
161-
return List.of(LuckyNumberExtension.class, EnterpriseExtension.class);
162-
}
163158
}

scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryGroupService.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,8 @@
3636
import org.apache.directory.scim.spec.filter.FilterExpressions;
3737
import org.apache.directory.scim.spec.filter.FilterResponse;
3838
import org.apache.directory.scim.spec.filter.PageRequest;
39-
import org.apache.directory.scim.spec.resources.ScimExtension;
4039
import org.apache.directory.scim.spec.resources.ScimGroup;
4140

42-
import java.util.Collections;
4341
import java.util.List;
4442
import java.util.Map;
4543
import java.util.UUID;
@@ -123,9 +121,4 @@ public FilterResponse<ScimGroup> find(Filter filter, ScimRequestContext requestC
123121
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
124122
}
125123

126-
@Override
127-
public List<Class<? extends ScimExtension>> getExtensionList() {
128-
return Collections.emptyList();
129-
}
130-
131124
}

scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryUserService.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.apache.directory.scim.spec.filter.PageRequest;
4040
import org.apache.directory.scim.spec.resources.Email;
4141
import org.apache.directory.scim.spec.resources.Name;
42-
import org.apache.directory.scim.spec.resources.ScimExtension;
4342
import org.apache.directory.scim.spec.resources.ScimUser;
4443

4544
import java.util.List;
@@ -70,7 +69,7 @@ public class InMemoryUserService extends BaseRepository<ScimUser> {
7069

7170
@Inject
7271
public InMemoryUserService(SchemaRegistry schemaRegistry, PatchHandler patchHandler) {
73-
super(ScimUser.class, patchHandler);
72+
super(ScimUser.class, patchHandler, LuckyNumberExtension.class, EnterpriseExtension.class);
7473
this.schemaRegistry = schemaRegistry;
7574
}
7675

@@ -156,8 +155,4 @@ public FilterResponse<ScimUser> find(Filter filter, ScimRequestContext requestCo
156155
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
157156
}
158157

159-
@Override
160-
public List<Class<? extends ScimExtension>> getExtensionList() {
161-
return List.of(LuckyNumberExtension.class, EnterpriseExtension.class);
162-
}
163158
}

scim-server-examples/scim-server-quarkus/src/main/java/org/apache/directory/scim/example/quarkus/service/InMemoryGroupService.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,8 @@
3636
import org.apache.directory.scim.spec.filter.FilterExpressions;
3737
import org.apache.directory.scim.spec.filter.FilterResponse;
3838
import org.apache.directory.scim.spec.filter.PageRequest;
39-
import org.apache.directory.scim.spec.resources.ScimExtension;
4039
import org.apache.directory.scim.spec.resources.ScimGroup;
4140

42-
import java.util.Collections;
4341
import java.util.List;
4442
import java.util.Map;
4543
import java.util.UUID;
@@ -123,9 +121,4 @@ public FilterResponse<ScimGroup> find(Filter filter, ScimRequestContext requestC
123121
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
124122
}
125123

126-
@Override
127-
public List<Class<? extends ScimExtension>> getExtensionList() {
128-
return Collections.emptyList();
129-
}
130-
131124
}

scim-server-examples/scim-server-quarkus/src/main/java/org/apache/directory/scim/example/quarkus/service/InMemoryUserService.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.apache.directory.scim.spec.filter.PageRequest;
4040
import org.apache.directory.scim.spec.resources.Email;
4141
import org.apache.directory.scim.spec.resources.Name;
42-
import org.apache.directory.scim.spec.resources.ScimExtension;
4342
import org.apache.directory.scim.spec.resources.ScimUser;
4443

4544
import java.util.List;
@@ -70,7 +69,7 @@ public class InMemoryUserService extends BaseRepository<ScimUser> {
7069

7170
@Inject
7271
public InMemoryUserService(SchemaRegistry schemaRegistry, PatchHandler patchHandler) {
73-
super(ScimUser.class, patchHandler);
72+
super(ScimUser.class, patchHandler, LuckyNumberExtension.class, EnterpriseExtension.class);
7473
this.schemaRegistry = schemaRegistry;
7574
}
7675

@@ -156,8 +155,4 @@ public FilterResponse<ScimUser> find(Filter filter, ScimRequestContext requestCo
156155
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
157156
}
158157

159-
@Override
160-
public List<Class<? extends ScimExtension>> getExtensionList() {
161-
return List.of(LuckyNumberExtension.class, EnterpriseExtension.class);
162-
}
163158
}

0 commit comments

Comments
 (0)