Update examples to pass external SCIM testing
diff --git a/pom.xml b/pom.xml
index c2b519b..43e9223 100644
--- a/pom.xml
+++ b/pom.xml
@@ -175,7 +175,6 @@
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.5.Final</version>
- <scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
diff --git a/scim-server-examples/scim-server-jersey/pom.xml b/scim-server-examples/scim-server-jersey/pom.xml
index c8b05ff..f7ff32d 100644
--- a/scim-server-examples/scim-server-jersey/pom.xml
+++ b/scim-server-examples/scim-server-jersey/pom.xml
@@ -28,7 +28,7 @@
<name>SCIM - Server - Examples - Jersey</name>
<properties>
- <jersey.version>3.0.6</jersey.version>
+ <jersey.version>3.0.5</jersey.version>
</properties>
<dependencyManagement>
diff --git a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/JerseyApplication.java b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/JerseyApplication.java
index 0e0e62b..5fcd742 100644
--- a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/JerseyApplication.java
+++ b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/JerseyApplication.java
@@ -19,6 +19,9 @@
package org.apache.directory.scim.example.jersey;
+import jakarta.inject.Inject;
+import org.apache.directory.scim.server.ScimConfiguration;
+import org.apache.directory.scim.server.configuration.ServerConfiguration;
import org.apache.directory.scim.server.rest.ScimResourceHelper;
import java.net.URI;
@@ -33,6 +36,8 @@
import org.slf4j.LoggerFactory;
import org.slf4j.bridge.SLF4JBridgeHandler;
+import static org.apache.directory.scim.spec.schema.ServiceProviderConfiguration.AuthenticationSchema.oauthBearer;
+
// @ApplicationPath("v2")
// Embedded Jersey + Jetty ignores the ApplicationPath annotation
// https://github.com/eclipse-ee4j/jersey/issues/3222
@@ -44,7 +49,30 @@
@Override
public Set<Class<?>> getClasses() {
- return new HashSet<>(ScimResourceHelper.getScimClassesToLoad());
+ Set<Class<?>> clazzes = new HashSet<>(ScimResourceHelper.getScimClassesToLoad());
+ clazzes.add(ServerConfigInitializer.class);
+ return clazzes;
+ }
+
+ /**
+ * A {@link ScimConfiguration} allow for eager initialization of beans, this class configures the {@link ServerConfiguration}.
+ */
+ public static class ServerConfigInitializer implements ScimConfiguration {
+
+ @Inject
+ private ServerConfiguration serverConfiguration;
+
+ @Override
+ public void configure() {
+
+ // Set any unique configuration bits
+ serverConfiguration
+ .setId("scimple-jersey-example")
+ .setDocumentationUri("https://github.com/apache/directory-scimple");
+
+ // set the auth scheme too
+ // .addAuthenticationSchema(oauthBearer());
+ }
}
public static void main(String[] args) {
diff --git a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryGroupService.java b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryGroupService.java
index 7f4ae69..fca8299 100644
--- a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryGroupService.java
+++ b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryGroupService.java
@@ -20,9 +20,14 @@
package org.apache.directory.scim.example.jersey.service;
import jakarta.annotation.PostConstruct;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Response;
+import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
import org.apache.directory.scim.server.repository.Repository;
import org.apache.directory.scim.server.repository.UpdateRequest;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
import org.apache.directory.scim.spec.protocol.search.Filter;
import org.apache.directory.scim.spec.protocol.search.PageRequest;
@@ -34,6 +39,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Named;
@@ -44,6 +50,15 @@
private final Map<String, ScimGroup> groups = new HashMap<>();
+ private SchemaRegistry schemaRegistry;
+
+ @Inject
+ public InMemoryGroupService(SchemaRegistry schemaRegistry) {
+ this.schemaRegistry = schemaRegistry;
+ }
+
+ protected InMemoryGroupService() {}
+
@PostConstruct
public void init() {
ScimGroup group = new ScimGroup();
@@ -57,7 +72,7 @@
}
@Override
- public ScimGroup create(ScimGroup resource) {
+ public ScimGroup create(ScimGroup resource) throws UnableToCreateResourceException {
String resourceId = resource.getId();
int idCandidate = resource.hashCode();
String id = resourceId != null ? resourceId : Integer.toString(idCandidate);
@@ -66,8 +81,17 @@
id = Integer.toString(idCandidate);
++idCandidate;
}
- groups.put(id, resource);
+
+ // check to make sure the group doesn't already exist
+ boolean existingUserFound = groups.values().stream()
+ .anyMatch(group -> group.getExternalId().equals(resource.getExternalId()));
+ if (existingUserFound) {
+ // HTTP leaking into data layer
+ throw new UnableToCreateResourceException(Response.Status.CONFLICT, "Group '" + resource.getExternalId() + "' already exists.");
+ }
+
resource.setId(id);
+ groups.put(id, resource);
return resource;
}
@@ -91,7 +115,18 @@
@Override
public FilterResponse<ScimGroup> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) {
- return new FilterResponse<>(groups.values(), pageRequest, groups.size());
+ long count = pageRequest.getCount() != null ? pageRequest.getCount() : groups.size();
+ long startIndex = pageRequest.getStartIndex() != null
+ ? pageRequest.getStartIndex() - 1 // SCIM is 1-based indexed
+ : 0;
+
+ List<ScimGroup> result = groups.values().stream()
+ .skip(startIndex)
+ .limit(count)
+ .filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimGroup.SCHEMA_URI)))
+ .collect(Collectors.toList());
+
+ return new FilterResponse<>(result, pageRequest, result.size());
}
@Override
diff --git a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryUserService.java b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryUserService.java
index 971a248..7dc686b 100644
--- a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryUserService.java
+++ b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryUserService.java
@@ -19,38 +19,40 @@
package org.apache.directory.scim.example.jersey.service;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import jakarta.inject.Named;
+import jakarta.ws.rs.core.Response;
import org.apache.directory.scim.example.jersey.extensions.LuckyNumberExtension;
+import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
import org.apache.directory.scim.server.repository.Repository;
import org.apache.directory.scim.server.repository.UpdateRequest;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
import org.apache.directory.scim.spec.protocol.search.Filter;
import org.apache.directory.scim.spec.protocol.search.PageRequest;
import org.apache.directory.scim.spec.protocol.search.SortRequest;
-import org.apache.directory.scim.spec.resources.Email;
-import org.apache.directory.scim.spec.resources.ScimExtension;
-import org.apache.directory.scim.spec.resources.ScimResource;
-import org.apache.directory.scim.spec.resources.ScimUser;
+import org.apache.directory.scim.spec.resources.*;
/**
* Creates a singleton (effectively) Repository<ScimUser> with a memory-based
* persistence layer.
- *
+ *
* @author Chris Harm <crh5255@psu.edu>
*/
@Named
@ApplicationScoped
public class InMemoryUserService implements Repository<ScimUser> {
-
+
static final String DEFAULT_USER_ID = "1";
static final String DEFAULT_USER_EXTERNAL_ID = "e" + DEFAULT_USER_ID;
static final String DEFAULT_USER_DISPLAY_NAME = "User " + DEFAULT_USER_ID;
@@ -58,8 +60,17 @@
static final String DEFAULT_USER_EMAIL_TYPE = "work";
static final int DEFAULT_USER_LUCKY_NUMBER = 7;
- private Map<String, ScimUser> users = new HashMap<>();
-
+ private final Map<String, ScimUser> users = new HashMap<>();
+
+ private SchemaRegistry schemaRegistry;
+
+ @Inject
+ public InMemoryUserService(SchemaRegistry schemaRegistry) {
+ this.schemaRegistry = schemaRegistry;
+ }
+
+ protected InMemoryUserService() {}
+
@PostConstruct
public void init() {
ScimUser user = new ScimUser();
@@ -67,18 +78,21 @@
user.setExternalId(DEFAULT_USER_EXTERNAL_ID);
user.setUserName(DEFAULT_USER_EXTERNAL_ID);
user.setDisplayName(DEFAULT_USER_DISPLAY_NAME);
+ user.setName(new Name()
+ .setGivenName("Tester")
+ .setFamilyName("McTest"));
Email email = new Email();
email.setDisplay(DEFAULT_USER_EMAIL_VALUE);
email.setValue(DEFAULT_USER_EMAIL_VALUE);
email.setType(DEFAULT_USER_EMAIL_TYPE);
email.setPrimary(true);
- user.setEmails(Arrays.asList(email));
-
+ user.setEmails(List.of(email));
+
LuckyNumberExtension luckyNumberExtension = new LuckyNumberExtension();
luckyNumberExtension.setLuckyNumber(DEFAULT_USER_LUCKY_NUMBER);
-
+
user.addExtension(luckyNumberExtension);
-
+
users.put(user.getId(), user);
}
@@ -91,7 +105,7 @@
* @see Repository#create(ScimResource)
*/
@Override
- public ScimUser create(ScimUser resource) {
+ public ScimUser create(ScimUser resource) throws UnableToCreateResourceException {
String resourceId = resource.getId();
int idCandidate = resource.hashCode();
String id = resourceId != null ? resourceId : Integer.toString(idCandidate);
@@ -100,8 +114,17 @@
id = Integer.toString(idCandidate);
++idCandidate;
}
- users.put(id, resource);
+
+ // check to make sure the user doesn't already exist
+ boolean existingUserFound = users.values().stream()
+ .anyMatch(user -> user.getUserName().equals(resource.getUserName()));
+ if (existingUserFound) {
+ // HTTP leaking into data layer
+ throw new UnableToCreateResourceException(Response.Status.CONFLICT, "User '" + resource.getUserName() + "' already exists.");
+ }
+
resource.setId(id);
+ users.put(id, resource);
return resource;
}
@@ -137,7 +160,19 @@
*/
@Override
public FilterResponse<ScimUser> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) {
- return new FilterResponse<>(users.values(), pageRequest, users.size());
+
+ long count = pageRequest.getCount() != null ? pageRequest.getCount() : users.size();
+ long startIndex = pageRequest.getStartIndex() != null
+ ? pageRequest.getStartIndex() - 1 // SCIM is 1-based indexed
+ : 0;
+
+ List<ScimUser> result = users.values().stream()
+ .skip(startIndex)
+ .limit(count)
+ .filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimUser.SCHEMA_URI)))
+ .collect(Collectors.toList());
+
+ return new FilterResponse<>(result, pageRequest, result.size());
}
/**
@@ -145,7 +180,6 @@
*/
@Override
public List<Class<? extends ScimExtension>> getExtensionList() {
- return Arrays.asList(LuckyNumberExtension.class);
+ return List.of(LuckyNumberExtension.class);
}
-
}
diff --git a/scim-server-examples/scim-server-memory/pom.xml b/scim-server-examples/scim-server-memory/pom.xml
index 0a89d63..4fd4b02 100644
--- a/scim-server-examples/scim-server-memory/pom.xml
+++ b/scim-server-examples/scim-server-memory/pom.xml
@@ -45,6 +45,7 @@
</dependencies>
<build>
+ <defaultGoal>package tomee:run</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.geronimo.genesis.plugins</groupId>
diff --git a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/rest/RestApplication.java b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/rest/RestApplication.java
index 864136f..5a65c00 100644
--- a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/rest/RestApplication.java
+++ b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/rest/RestApplication.java
@@ -19,6 +19,9 @@
package org.apache.directory.scim.example.memory.rest;
+import jakarta.inject.Inject;
+import org.apache.directory.scim.server.ScimConfiguration;
+import org.apache.directory.scim.server.configuration.ServerConfiguration;
import org.apache.directory.scim.server.rest.ScimResourceHelper;
import java.util.HashSet;
@@ -26,6 +29,9 @@
import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;
+import org.apache.directory.scim.spec.schema.ServiceProviderConfiguration;
+
+import static org.apache.directory.scim.spec.schema.ServiceProviderConfiguration.AuthenticationSchema.oauthBearer;
@ApplicationPath("v2")
public class RestApplication extends Application {
@@ -35,8 +41,28 @@
Set<Class<?>> clazzes = new HashSet<>();
clazzes.addAll(ScimResourceHelper.getScimClassesToLoad());
+ clazzes.add(ServerConfigInitializer.class);
return clazzes;
}
-
+
+ /**
+ * A {@link ScimConfiguration} allow for eager initialization of beans, this class configures the {@link ServerConfiguration}.
+ */
+ public static class ServerConfigInitializer implements ScimConfiguration {
+
+ @Inject
+ private ServerConfiguration serverConfiguration;
+
+ @Override
+ public void configure() {
+ // Set any unique configuration bits
+ serverConfiguration
+ .setId("scimple-in-memory-example")
+ .setDocumentationUri("https://github.com/apache/directory-scimple");
+
+ // set the auth scheme too
+ // .addAuthenticationSchema(oauthBearer());
+ }
+ }
}
diff --git a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryGroupService.java b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryGroupService.java
index e2d2e0e..2288eba 100644
--- a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryGroupService.java
+++ b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryGroupService.java
@@ -20,9 +20,14 @@
package org.apache.directory.scim.example.memory.service;
import jakarta.annotation.PostConstruct;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Response;
+import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
import org.apache.directory.scim.server.repository.Repository;
import org.apache.directory.scim.server.repository.UpdateRequest;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
import org.apache.directory.scim.spec.protocol.search.Filter;
import org.apache.directory.scim.spec.protocol.search.PageRequest;
@@ -34,6 +39,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Named;
@@ -44,6 +50,15 @@
private final Map<String, ScimGroup> groups = new HashMap<>();
+ private SchemaRegistry schemaRegistry;
+
+ @Inject
+ public InMemoryGroupService(SchemaRegistry schemaRegistry) {
+ this.schemaRegistry = schemaRegistry;
+ }
+
+ protected InMemoryGroupService() {}
+
@PostConstruct
public void init() {
ScimGroup group = new ScimGroup();
@@ -57,7 +72,7 @@
}
@Override
- public ScimGroup create(ScimGroup resource) {
+ public ScimGroup create(ScimGroup resource) throws UnableToCreateResourceException {
String resourceId = resource.getId();
int idCandidate = resource.hashCode();
String id = resourceId != null ? resourceId : Integer.toString(idCandidate);
@@ -66,8 +81,17 @@
id = Integer.toString(idCandidate);
++idCandidate;
}
- groups.put(id, resource);
+
+ // check to make sure the group doesn't already exist
+ boolean existingUserFound = groups.values().stream()
+ .anyMatch(group -> group.getExternalId().equals(resource.getExternalId()));
+ if (existingUserFound) {
+ // HTTP leaking into data layer
+ throw new UnableToCreateResourceException(Response.Status.CONFLICT, "Group '" + resource.getExternalId() + "' already exists.");
+ }
+
resource.setId(id);
+ groups.put(id, resource);
return resource;
}
@@ -91,7 +115,18 @@
@Override
public FilterResponse<ScimGroup> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) {
- return new FilterResponse<>(groups.values(), pageRequest, groups.size());
+ long count = pageRequest.getCount() != null ? pageRequest.getCount() : groups.size();
+ long startIndex = pageRequest.getStartIndex() != null
+ ? pageRequest.getStartIndex() - 1 // SCIM is 1-based indexed
+ : 0;
+
+ List<ScimGroup> result = groups.values().stream()
+ .skip(startIndex)
+ .limit(count)
+ .filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimGroup.SCHEMA_URI)))
+ .collect(Collectors.toList());
+
+ return new FilterResponse<>(result, pageRequest, result.size());
}
@Override
diff --git a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryUserService.java b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryUserService.java
index e9a378e..f845b9e 100644
--- a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryUserService.java
+++ b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryUserService.java
@@ -19,27 +19,29 @@
package org.apache.directory.scim.example.memory.service;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import jakarta.inject.Named;
+import jakarta.ws.rs.core.Response;
import org.apache.directory.scim.example.memory.extensions.LuckyNumberExtension;
+import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
import org.apache.directory.scim.server.repository.Repository;
import org.apache.directory.scim.server.repository.UpdateRequest;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
import org.apache.directory.scim.spec.protocol.search.Filter;
import org.apache.directory.scim.spec.protocol.search.PageRequest;
import org.apache.directory.scim.spec.protocol.search.SortRequest;
-import org.apache.directory.scim.spec.resources.Email;
-import org.apache.directory.scim.spec.resources.ScimExtension;
-import org.apache.directory.scim.spec.resources.ScimResource;
-import org.apache.directory.scim.spec.resources.ScimUser;
+import org.apache.directory.scim.spec.resources.*;
/**
* Creates a singleton (effectively) Repository<ScimUser> with a memory-based
@@ -50,7 +52,7 @@
@Named
@ApplicationScoped
public class InMemoryUserService implements Repository<ScimUser> {
-
+
static final String DEFAULT_USER_ID = "1";
static final String DEFAULT_USER_EXTERNAL_ID = "e" + DEFAULT_USER_ID;
static final String DEFAULT_USER_DISPLAY_NAME = "User " + DEFAULT_USER_ID;
@@ -58,8 +60,17 @@
static final String DEFAULT_USER_EMAIL_TYPE = "work";
static final int DEFAULT_USER_LUCKY_NUMBER = 7;
- private Map<String, ScimUser> users = new HashMap<>();
-
+ private final Map<String, ScimUser> users = new HashMap<>();
+
+ private SchemaRegistry schemaRegistry;
+
+ @Inject
+ public InMemoryUserService(SchemaRegistry schemaRegistry) {
+ this.schemaRegistry = schemaRegistry;
+ }
+
+ protected InMemoryUserService() {}
+
@PostConstruct
public void init() {
ScimUser user = new ScimUser();
@@ -67,12 +78,15 @@
user.setExternalId(DEFAULT_USER_EXTERNAL_ID);
user.setUserName(DEFAULT_USER_EXTERNAL_ID);
user.setDisplayName(DEFAULT_USER_DISPLAY_NAME);
+ user.setName(new Name()
+ .setGivenName("Tester")
+ .setFamilyName("McTest"));
Email email = new Email();
email.setDisplay(DEFAULT_USER_EMAIL_VALUE);
email.setValue(DEFAULT_USER_EMAIL_VALUE);
email.setType(DEFAULT_USER_EMAIL_TYPE);
email.setPrimary(true);
- user.setEmails(Arrays.asList(email));
+ user.setEmails(List.of(email));
LuckyNumberExtension luckyNumberExtension = new LuckyNumberExtension();
luckyNumberExtension.setLuckyNumber(DEFAULT_USER_LUCKY_NUMBER);
@@ -91,7 +105,7 @@
* @see Repository#create(ScimResource)
*/
@Override
- public ScimUser create(ScimUser resource) {
+ public ScimUser create(ScimUser resource) throws UnableToCreateResourceException {
String resourceId = resource.getId();
int idCandidate = resource.hashCode();
String id = resourceId != null ? resourceId : Integer.toString(idCandidate);
@@ -100,8 +114,17 @@
id = Integer.toString(idCandidate);
++idCandidate;
}
- users.put(id, resource);
+
+ // check to make sure the user doesn't already exist
+ boolean existingUserFound = users.values().stream()
+ .anyMatch(user -> user.getUserName().equals(resource.getUserName()));
+ if (existingUserFound) {
+ // HTTP leaking into data layer
+ throw new UnableToCreateResourceException(Response.Status.CONFLICT, "User '" + resource.getUserName() + "' already exists.");
+ }
+
resource.setId(id);
+ users.put(id, resource);
return resource;
}
@@ -137,7 +160,19 @@
*/
@Override
public FilterResponse<ScimUser> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) {
- return new FilterResponse<>(users.values(), pageRequest, users.size());
+
+ long count = pageRequest.getCount() != null ? pageRequest.getCount() : users.size();
+ long startIndex = pageRequest.getStartIndex() != null
+ ? pageRequest.getStartIndex() - 1 // SCIM is 1-based indexed
+ : 0;
+
+ List<ScimUser> result = users.values().stream()
+ .skip(startIndex)
+ .limit(count)
+ .filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimUser.SCHEMA_URI)))
+ .collect(Collectors.toList());
+
+ return new FilterResponse<>(result, pageRequest, result.size());
}
/**
@@ -145,7 +180,6 @@
*/
@Override
public List<Class<? extends ScimExtension>> getExtensionList() {
- return Arrays.asList(LuckyNumberExtension.class);
+ return List.of(LuckyNumberExtension.class);
}
-
}