Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/).

## 6.0.1 - TBD
## 6.1.0 - TBD
Added support for [RFC 9944](https://datatracker.ietf.org/doc/html/rfc9944), an update to the SCIM
standard describing device management with SCIM. For an overview on leveraging device management
with the SCIM SDK, see the `DeviceResource` class-level Javadoc. This update includes:
* A new `com.unboundid.scim2.common.types.devices` package that contains model classes for resources
such as `EndpointAppResource`, as well as extension objects such as `BleDeviceExtension`.
* Updated `AttributeDefinition` with new fields such as `pattern`, as well as the addition of
`MANUFACTURER` and `ENTERPRISE` uniqueness constants.

Fixed an issue with deserializing a GenericScimResource object when it was embedded within a list
response.

Expand Down Expand Up @@ -37,6 +45,9 @@ all other SCIM objects in the library.
Updated `DateTimeUtils.parse()` to support date strings without timestamps (e.g., "1970-01-01").
The time values will always be set to the start of the day.

Updated the `@Attribute` annotation of all `$ref` fields to label them as not required for
consistency across groups, devices, and other model classes.

## 6.0.0 - 2026-May-11
The UnboundID SCIM SDK has been updated to use version 3 of the Jackson library (this release ships
with v3.1.3). This change aligns the SCIM SDK with HTTP libraries such as Spring Framework 7/Spring
Expand Down Expand Up @@ -598,4 +609,3 @@ Make sure the Response is always closed after a SCIM operation.

## v1.2.9 - 2016-07-08
Initial Public Release

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ The UnboundID SCIM 2 SDK provides many strong benefits for applications that nee
with SCIM 2.0 clients or servers:

* Full support for the SCIM 2.0 protocol as defined by the latest specification. This includes
support for PATCH operations, filter processing, bulk operations, and cursor-based pagination.
support for bulk operations, cursor-based pagination (RFC 9865), and device management (RFC 9944).
* A simple and intuitive Jackson-based API that facilitates SCIM workflows, minimizing the amount
of code you need to write for tasks such as performing CRUD operations on resources.
* `@NotNull` and `@Nullable` annotations are documented for all library input parameters, member
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.unboundid.product.scim2</groupId>
<artifactId>scim2-parent</artifactId>
<version>6.0.1-SNAPSHOT</version>
<version>6.1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>UnboundID SCIM2 SDK Parent</name>
<description>
Expand Down
2 changes: 1 addition & 1 deletion scim2-assembly/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
<parent>
<groupId>com.unboundid.product.scim2</groupId>
<artifactId>scim2-parent</artifactId>
<version>6.0.1-SNAPSHOT</version>
<version>6.1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>scim2-assembly</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion scim2-sdk-client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
<parent>
<groupId>com.unboundid.product.scim2</groupId>
<artifactId>scim2-parent</artifactId>
<version>6.0.1-SNAPSHOT</version>
<version>6.1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>scim2-sdk-client</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion scim2-sdk-common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
<parent>
<groupId>com.unboundid.product.scim2</groupId>
<artifactId>scim2-parent</artifactId>
<version>6.0.1-SNAPSHOT</version>
<version>6.1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>scim2-sdk-common</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.node.ObjectNode;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
Expand All @@ -57,8 +58,6 @@
import java.util.Objects;
import java.util.Set;

import static com.unboundid.scim2.common.utils.StaticUtils.toList;

/**
* <p>The base SCIM object. This object contains all of the
* attributes required of SCIM objects.</p>
Expand Down Expand Up @@ -223,15 +222,6 @@ public void setSchemaUrns(@NotNull final Collection<String> schemaUrns)
this.schemaUrns = new LinkedHashSet<>(schemaUrns);
}

/**
* {@inheritDoc}
*/
public void setSchemaUrns(@NotNull final String schemaUrn,
@Nullable final String... schemaUrns)
{
setSchemaUrns(toList(schemaUrn, schemaUrns));
}

/**
* This method is used by Jackson when deserializing JSON data into a Java
* object. This will be called for schema extensions and any unknown fields
Expand Down Expand Up @@ -388,6 +378,34 @@ public <T> T getExtension(@NotNull final Class<T> clazz)
return (ext == null) ? null : JsonUtils.nodeToValue(ext, clazz);
}

/**
* This utility method extracts the requested classes from the extension
* object node, and returns each existing reference as a POJO.
*
* @param <T> The data type of the elements in the return list.
* @param clazzList The list of classes to try obtaining from the ObjectNode.
* All classes should have the {@link Schema} annotation.
*
* @return The requested list of Java objects stored on the extension node.
*/
@NotNull
protected <T> List<T> getClassesFromExtension(
@NotNull final List<Class<? extends T>> clazzList)
{
List<T> extensions = new ArrayList<>();
for (var clazz : clazzList)
{
// Calling get() on the extension object node is a map lookup.
T extension = getExtension(clazz);
if (extension != null)
{
extensions.add(extension);
}
}

return extensions;
}

/**
* Sets a SCIM extension to the given value based on the annotations
* of the class provided. The value will be set for an extension named
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,15 +294,6 @@ public void setSchemaUrns(@NotNull final Collection<String> schemaUrns)
}
}

/**
* {@inheritDoc}
*/
public void setSchemaUrns(@NotNull final String schemaUrn,
@Nullable final String... schemaUrns)
{
setSchemaUrns(toList(schemaUrn, schemaUrns));
}

/**
* {@inheritDoc}
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import com.unboundid.scim2.common.annotations.NotNull;
import com.unboundid.scim2.common.annotations.Nullable;
import com.unboundid.scim2.common.types.Meta;
import com.unboundid.scim2.common.utils.StaticUtils;

import java.util.Collection;

Expand Down Expand Up @@ -140,7 +141,11 @@ public interface ScimResource
* @param schemaUrns An optional parameter for additional schema URNs. Any
* {@code null} values will be ignored.
*/
void setSchemaUrns(@NotNull String schemaUrn, @Nullable String... schemaUrns);
default void setSchemaUrns(@NotNull String schemaUrn,
@Nullable String... schemaUrns)
{
setSchemaUrns(StaticUtils.toList(schemaUrn, schemaUrns));
}

/**
* Returns the GenericScimResource representation of this ScimResource. If
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,4 +124,12 @@ AttributeDefinition.Mutability mutability()
* @return For a multi-valued attribute, the type of the child object.
*/
@NotNull Class<?> multiValueClass() default NullType.class;

/**
* An optional regular expression that string-typed values must match.
*
* @return The regular expression, or an empty string for no constraint.
* @since 6.1.0
*/
@NotNull String pattern() default "";
}
Loading
Loading