Skip to content

Commit 389deae

Browse files
bdemersclaude
andcommitted
Add pagination helpers to PageRequest and use in all InMemory services
Add PageRequest.paginate(List) to apply offset/limit as a page slice, and ScimRequestContext.getPageRequestOrDefault() to avoid null-checking. Refactor all InMemory*Service.find() to filter BEFORE paginating, fixing a bug where skip/limit was applied before the filter predicate. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent db77536 commit 389deae

20 files changed

Lines changed: 263 additions & 235 deletions

File tree

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@ public Optional<PageRequest> getPageRequest() {
9999
return Optional.ofNullable(pageRequest);
100100
}
101101

102+
/**
103+
* Returns the page request, defaulting to an unbounded request if none was specified.
104+
*
105+
* @return the page request; never null
106+
*/
107+
public PageRequest getPageRequestOrDefault() {
108+
return pageRequest != null ? pageRequest : new PageRequest();
109+
}
110+
102111
public ScimRequestContext setPageRequest(PageRequest pageRequest) {
103112
this.pageRequest = pageRequest;
104113
return this;

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,12 @@ public void delete(String id) throws ResourceException {
115115

116116
@Override
117117
public FilterResponse<ScimGroup> find(Filter filter, ScimRequestContext requestContext) {
118-
long count = requestContext.getPageRequest().map(PageRequest::getCount).orElse(groups.size());
119-
long startIndex = requestContext.getPageRequest().map(PageRequest::getStartIndex).map(it -> it - 1).orElse(0);
120-
121-
List<ScimGroup> result = groups.values().stream()
122-
.skip(startIndex)
123-
.limit(count)
118+
List<ScimGroup> filtered = groups.values().stream()
124119
.filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimGroup.SCHEMA_URI)))
125120
.toList();
126121

127-
return new FilterResponse<>(result, result.size());
122+
PageRequest pageRequest = requestContext.getPageRequestOrDefault();
123+
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
128124
}
129125

130126
@Override

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

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,6 @@ public void init() {
108108
users.put(user.getId(), user);
109109
}
110110

111-
/**
112-
* @see Repository#create(ScimResource, ScimRequestContext)
113-
*/
114111
@Override
115112
public ScimUser create(ScimUser resource, ScimRequestContext requestContext) throws UnableToCreateResourceException {
116113
String id = UUID.randomUUID().toString();
@@ -137,44 +134,28 @@ public ScimUser update(String id, ScimUser resource, ScimRequestContext requestC
137134
return resource;
138135
}
139136

140-
/**
141-
* @see Repository#get(java.lang.String, ScimRequestContext)
142-
*/
143137
@Override
144138
public ScimUser get(String id, ScimRequestContext requestContext) {
145139
return users.get(id);
146140
}
147141

148-
/**
149-
* @see Repository#delete(java.lang.String)
150-
*/
151142
@Override
152143
public void delete(String id) throws ResourceException {
153144
if (users.remove(id) == null) {
154145
throw new ResourceNotFoundException(id);
155146
}
156147
}
157148

158-
/**
159-
* @see Repository#find(Filter, ScimRequestContext)
160-
*/
161149
@Override
162150
public FilterResponse<ScimUser> find(Filter filter, ScimRequestContext requestContext) {
163-
long count = requestContext.getPageRequest().map(PageRequest::getCount).orElse(users.size());
164-
long startIndex = requestContext.getPageRequest().map(PageRequest::getStartIndex).map(it -> it - 1).orElse(0);
165-
166-
List<ScimUser> result = users.values().stream()
167-
.skip(startIndex)
168-
.limit(count)
151+
List<ScimUser> filtered = users.values().stream()
169152
.filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimUser.SCHEMA_URI)))
170153
.toList();
171154

172-
return new FilterResponse<>(result, result.size());
155+
PageRequest pageRequest = requestContext.getPageRequestOrDefault();
156+
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
173157
}
174158

175-
/**
176-
* @see Repository#getExtensionList()
177-
*/
178159
@Override
179160
public List<Class<? extends ScimExtension>> getExtensionList() {
180161
return List.of(LuckyNumberExtension.class, EnterpriseExtension.class);

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,12 @@ public void delete(String id) throws ResourceException {
115115

116116
@Override
117117
public FilterResponse<ScimGroup> find(Filter filter, ScimRequestContext requestContext) {
118-
long count = requestContext.getPageRequest().map(PageRequest::getCount).orElse(groups.size());
119-
long startIndex = requestContext.getPageRequest().map(PageRequest::getStartIndex).map(it -> it - 1).orElse(0);
120-
121-
List<ScimGroup> result = groups.values().stream()
122-
.skip(startIndex)
123-
.limit(count)
118+
List<ScimGroup> filtered = groups.values().stream()
124119
.filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimGroup.SCHEMA_URI)))
125120
.toList();
126121

127-
return new FilterResponse<>(result, result.size());
122+
PageRequest pageRequest = requestContext.getPageRequestOrDefault();
123+
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
128124
}
129125

130126
@Override

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

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,6 @@ public void init() {
108108
users.put(user.getId(), user);
109109
}
110110

111-
/**
112-
* @see Repository#create(ScimResource, ScimRequestContext)
113-
*/
114111
@Override
115112
public ScimUser create(ScimUser resource, ScimRequestContext requestContext) throws UnableToCreateResourceException {
116113
String id = UUID.randomUUID().toString();
@@ -137,44 +134,28 @@ public ScimUser update(String id, ScimUser resource, ScimRequestContext requestC
137134
return resource;
138135
}
139136

140-
/**
141-
* @see Repository#get(java.lang.String, ScimRequestContext)
142-
*/
143137
@Override
144138
public ScimUser get(String id, ScimRequestContext requestContext) {
145139
return users.get(id);
146140
}
147141

148-
/**
149-
* @see Repository#delete(java.lang.String)
150-
*/
151142
@Override
152143
public void delete(String id) throws ResourceException {
153144
if (users.remove(id) == null) {
154145
throw new ResourceNotFoundException(id);
155146
}
156147
}
157148

158-
/**
159-
* @see Repository#find(Filter, ScimRequestContext)
160-
*/
161149
@Override
162150
public FilterResponse<ScimUser> find(Filter filter, ScimRequestContext requestContext) {
163-
long count = requestContext.getPageRequest().map(PageRequest::getCount).orElse(users.size());
164-
long startIndex = requestContext.getPageRequest().map(PageRequest::getStartIndex).map(it -> it - 1).orElse(0);
165-
166-
List<ScimUser> result = users.values().stream()
167-
.skip(startIndex)
168-
.limit(count)
151+
List<ScimUser> filtered = users.values().stream()
169152
.filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimUser.SCHEMA_URI)))
170153
.toList();
171154

172-
return new FilterResponse<>(result, result.size());
155+
PageRequest pageRequest = requestContext.getPageRequestOrDefault();
156+
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
173157
}
174158

175-
/**
176-
* @see Repository#getExtensionList()
177-
*/
178159
@Override
179160
public List<Class<? extends ScimExtension>> getExtensionList() {
180161
return List.of(LuckyNumberExtension.class, EnterpriseExtension.class);

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,12 @@ public void delete(String id) throws ResourceException {
115115

116116
@Override
117117
public FilterResponse<ScimGroup> find(Filter filter, ScimRequestContext requestContext) {
118-
long count = requestContext.getPageRequest().map(PageRequest::getCount).orElse(groups.size());
119-
long startIndex = requestContext.getPageRequest().map(PageRequest::getStartIndex).map(it -> it - 1).orElse(0);
120-
121-
List<ScimGroup> result = groups.values().stream()
122-
.skip(startIndex)
123-
.limit(count)
118+
List<ScimGroup> filtered = groups.values().stream()
124119
.filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimGroup.SCHEMA_URI)))
125120
.toList();
126121

127-
return new FilterResponse<>(result, result.size());
122+
PageRequest pageRequest = requestContext.getPageRequestOrDefault();
123+
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
128124
}
129125

130126
@Override

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

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,6 @@ public void init() {
108108
users.put(user.getId(), user);
109109
}
110110

111-
/**
112-
* @see Repository#create(ScimResource, ScimRequestContext)
113-
*/
114111
@Override
115112
public ScimUser create(ScimUser resource, ScimRequestContext requestContext) throws UnableToCreateResourceException {
116113
String id = UUID.randomUUID().toString();
@@ -137,44 +134,28 @@ public ScimUser update(String id, ScimUser resource, ScimRequestContext requestC
137134
return resource;
138135
}
139136

140-
/**
141-
* @see Repository#get(java.lang.String, ScimRequestContext)
142-
*/
143137
@Override
144138
public ScimUser get(String id, ScimRequestContext requestContext) {
145139
return users.get(id);
146140
}
147141

148-
/**
149-
* @see Repository#delete(java.lang.String)
150-
*/
151142
@Override
152143
public void delete(String id) throws ResourceException {
153144
if (users.remove(id) == null) {
154145
throw new ResourceNotFoundException(id);
155146
}
156147
}
157148

158-
/**
159-
* @see Repository#find(Filter, ScimRequestContext)
160-
*/
161149
@Override
162150
public FilterResponse<ScimUser> find(Filter filter, ScimRequestContext requestContext) {
163-
long count = requestContext.getPageRequest().map(PageRequest::getCount).orElse(users.size());
164-
long startIndex = requestContext.getPageRequest().map(PageRequest::getStartIndex).map(it -> it - 1).orElse(0);
165-
166-
List<ScimUser> result = users.values().stream()
167-
.skip(startIndex)
168-
.limit(count)
151+
List<ScimUser> filtered = users.values().stream()
169152
.filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimUser.SCHEMA_URI)))
170153
.toList();
171154

172-
return new FilterResponse<>(result, result.size());
155+
PageRequest pageRequest = requestContext.getPageRequestOrDefault();
156+
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
173157
}
174158

175-
/**
176-
* @see Repository#getExtensionList()
177-
*/
178159
@Override
179160
public List<Class<? extends ScimExtension>> getExtensionList() {
180161
return List.of(LuckyNumberExtension.class, EnterpriseExtension.class);

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,12 @@ public void delete(String id) throws ResourceException {
115115

116116
@Override
117117
public FilterResponse<ScimGroup> find(Filter filter, ScimRequestContext requestContext) {
118-
long count = requestContext.getPageRequest().map(PageRequest::getCount).orElse(groups.size());
119-
long startIndex = requestContext.getPageRequest().map(PageRequest::getStartIndex).map(it -> it - 1).orElse(0);
120-
121-
List<ScimGroup> result = groups.values().stream()
122-
.skip(startIndex)
123-
.limit(count)
118+
List<ScimGroup> filtered = groups.values().stream()
124119
.filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimGroup.SCHEMA_URI)))
125120
.toList();
126121

127-
return new FilterResponse<>(result, result.size());
122+
PageRequest pageRequest = requestContext.getPageRequestOrDefault();
123+
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
128124
}
129125

130126
@Override

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

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,6 @@ public void init() {
108108
users.put(user.getId(), user);
109109
}
110110

111-
/**
112-
* @see Repository#create(ScimResource, ScimRequestContext)
113-
*/
114111
@Override
115112
public ScimUser create(ScimUser resource, ScimRequestContext requestContext) throws UnableToCreateResourceException {
116113
String id = UUID.randomUUID().toString();
@@ -137,44 +134,28 @@ public ScimUser update(String id, ScimUser resource, ScimRequestContext requestC
137134
return resource;
138135
}
139136

140-
/**
141-
* @see Repository#get(java.lang.String, ScimRequestContext)
142-
*/
143137
@Override
144138
public ScimUser get(String id, ScimRequestContext requestContext) {
145139
return users.get(id);
146140
}
147141

148-
/**
149-
* @see Repository#delete(java.lang.String)
150-
*/
151142
@Override
152143
public void delete(String id) throws ResourceException {
153144
if (users.remove(id) == null) {
154145
throw new ResourceNotFoundException(id);
155146
}
156147
}
157148

158-
/**
159-
* @see Repository#find(Filter, ScimRequestContext)
160-
*/
161149
@Override
162150
public FilterResponse<ScimUser> find(Filter filter, ScimRequestContext requestContext) {
163-
long count = requestContext.getPageRequest().map(PageRequest::getCount).orElse(users.size());
164-
long startIndex = requestContext.getPageRequest().map(PageRequest::getStartIndex).map(it -> it - 1).orElse(0);
165-
166-
List<ScimUser> result = users.values().stream()
167-
.skip(startIndex)
168-
.limit(count)
151+
List<ScimUser> filtered = users.values().stream()
169152
.filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimUser.SCHEMA_URI)))
170153
.toList();
171154

172-
return new FilterResponse<>(result, result.size());
155+
PageRequest pageRequest = requestContext.getPageRequestOrDefault();
156+
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
173157
}
174158

175-
/**
176-
* @see Repository#getExtensionList()
177-
*/
178159
@Override
179160
public List<Class<? extends ScimExtension>> getExtensionList() {
180161
return List.of(LuckyNumberExtension.class, EnterpriseExtension.class);

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,16 +109,12 @@ public void delete(String id) throws ResourceException {
109109

110110
@Override
111111
public FilterResponse<ScimGroup> find(Filter filter, ScimRequestContext requestContext) {
112-
long count = requestContext.getPageRequest().map(PageRequest::getCount).orElse(groups.size());
113-
long startIndex = requestContext.getPageRequest().map(PageRequest::getStartIndex).map(it -> it - 1).orElse(0);
114-
115-
List<ScimGroup> result = groups.values().stream()
116-
.skip(startIndex)
117-
.limit(count)
112+
List<ScimGroup> filtered = groups.values().stream()
118113
.filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimGroup.SCHEMA_URI)))
119114
.toList();
120115

121-
return new FilterResponse<>(result, result.size());
116+
PageRequest pageRequest = requestContext.getPageRequestOrDefault();
117+
return new FilterResponse<>(pageRequest.paginate(filtered), filtered.size());
122118
}
123119

124120
@Override

0 commit comments

Comments
 (0)