You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by bd...@apache.org on 2022/12/12 23:22:39 UTC

[directory-scimple] 02/02: SCIM Resources will now have predictable ordered sets and maps

This is an automated email from the ASF dual-hosted git repository.

bdemers pushed a commit to branch consistant-ordering
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git

commit d1d41d17265737f1948dafc33d3beca622eaac24
Author: Brian Demers <bd...@apache.org>
AuthorDate: Mon Dec 12 18:22:31 2022 -0500

    SCIM Resources will now have predictable ordered sets and maps
    
    Previously generated patch objects would have added a "move" op for non-ordered attributes like `schemas`
---
 .../directory/scim/spec/resources/BaseResource.java  | 20 ++++++++++++++------
 .../directory/scim/spec/resources/ScimResource.java  |  3 ++-
 .../apache/directory/scim/spec/schema/Schemas.java   |  1 +
 3 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/resources/BaseResource.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/resources/BaseResource.java
index da6da1d4..a772aaa1 100644
--- a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/resources/BaseResource.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/resources/BaseResource.java
@@ -22,6 +22,7 @@ package org.apache.directory.scim.spec.resources;
 import java.io.Serializable;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.TreeSet;
 
 import jakarta.validation.constraints.Size;
 import jakarta.xml.bind.annotation.XmlAccessType;
@@ -48,17 +49,24 @@ public abstract class BaseResource implements Serializable {
   @Size(min = 1)
   @Urn
   Set<String> schemas;
-  
-  public BaseResource(String urn) {
+
+  public BaseResource(@Urn String urn) {
     addSchema(urn);
   }
-  
-  public void addSchema(String urn) {
+
+  public void addSchema(@Urn String urn) {
     if (schemas == null){
-      schemas = new HashSet<>();
+      schemas = new TreeSet<>();
     }
-    
     schemas.add(urn);
   }
+
+  public void setSchemas(@Urn Set<String> schemas) {
+    if (schemas == null) {
+      this.schemas.clear();
+    } else {
+      this.schemas = new TreeSet<>(schemas);
+    }
+  }
   
 }
diff --git a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/resources/ScimResource.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/resources/ScimResource.java
index 67d94679..2085af5d 100644
--- a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/resources/ScimResource.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/resources/ScimResource.java
@@ -38,6 +38,7 @@ import jakarta.xml.bind.annotation.XmlAccessorType;
 import jakarta.xml.bind.annotation.XmlElement;
 import java.io.Serializable;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
@@ -71,7 +72,7 @@ public abstract class ScimResource extends BaseResource implements Serializable
 
   // TODO - Figure out JAXB equivalent of JsonAnyGetter and JsonAnySetter
   // (XmlElementAny?)
-  private Map<String, ScimExtension> extensions = new HashMap<String, ScimExtension>();
+  private Map<String, ScimExtension> extensions = new LinkedHashMap<>();
 
   private final String baseUrn;
 
diff --git a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/schema/Schemas.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/schema/Schemas.java
index bbe5bd41..897afa2a 100644
--- a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/schema/Schemas.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/schema/Schemas.java
@@ -288,6 +288,7 @@ public final class Schemas {
       attributeList.add(attribute);
     }
 
+    attributeList.sort(Comparator.comparing(o -> o.name));
     log.debug("Returning " + attributeList.size() + " attributes");
     return attributeList;
   }