Guidance for AI coding agents (and humans) working in the Apache Directory SCIMple codebase. Treat this like a CLAUDE.md: read it before making changes and follow the conventions below.
Apache Directory SCIMple is a Jakarta EE implementation of the SCIM 2.0 specification (RFC 7642, RFC 7643, RFC 7644). It provides:
ResourceTypes and Extensions using annotations (@ScimResourceType, @ScimExtensionType, @ScimAttribute)./Schema, /ServiceProvider, and /ResourceTypes endpoints.Repository<T> SPI: implementers customize CRUD + find + patch and the server handles marshaling SCIM requests/responses to/from those methods.This is an Apache Software Foundation (ASF) project. Issues are tracked using GitHub Issues on the project's GitHub repository; contributions come in as GitHub pull requests.
| Module | Purpose |
|---|---|
scim-spec/scim-spec-schema | SCIM resource models (RFC 7643) and filter models (RFC 7644) |
scim-spec/scim-spec-protocol | REST protocol models (RFC 7644) |
scim-core | Repository SPI and core CRUD plumbing |
scim-server | REST endpoint implementations |
scim-client | SCIM REST client |
scim-tools | Utilities for building/verifying SCIM resources against schemas |
support/spring-boot | Spring Boot starter |
scim-server-examples/* | Reference servers (in-memory, Jersey, Quarkus, Spring Boot) |
scim-compliance-tests | Integration tests for verifying a SCIM server |
scim-test | Shared test fixtures/utilities |
scim-coverage | Aggregates JaCoCo coverage across modules (report-aggregate) |
release and the enforcer plugin). Do not introduce APIs or language features newer than Java 17../mvnw, or mvnw.cmd on Windows) so everyone builds with the pinned Maven version.parallel.mode.default = concurrent). Keep tests independent and free of shared mutable static state.Common examples:
# Build and run unit tests ./mvnw verify # Run a single module's tests ./mvnw test -pl scim-core # Run one test class ./mvnw test -pl scim-server -Dtest=SomeServiceTest
ci profile (coverage, PMD, SpotBugs)The ci profile activates automatically when the CI environment variable is set (as it is in GitHub Actions), and can be enabled locally with -Pci. It adds the static-analysis quality gates that run in CI:
spotbugs:check) at the verify phasepmd:check) at the verify phaseThe canonical CI build is:
./mvnw verify -Pci
Run this locally before opening a PR to catch SpotBugs/PMD findings that the default build skips. SpotBugs exclusions live in src/spotbugs/excludes.xml — prefer fixing a finding over excluding it; only add an exclusion with a clear justification.
JaCoCo coverage is collected during the test run; the aggregated coverage report is produced by the scim-coverage module (report-aggregate), so a full reactor build (install/verify) is needed to get cross-module numbers.
.editorconfig governs formatting: 2-space indentation, UTF-8, LF line endings, and a trailing newline on every file. Match it.@Data, @EqualsAndHashCode(callSuper = true), @Accessors). Prefer Lombok over hand-written boilerplate to stay consistent with existing code.@XmlElement, @XmlRootElement, @XmlAccessorType) accompany the SCIM model classes — keep them in sync when adding fields.Every source file must carry the Apache license header. This is enforced by Apache RAT (apache-rat:check), which also runs as a pre-push git hook. A missing or malformed header fails the build. Copy the header from an existing file in the same language when creating new files.
assertThat(...) fluent assertions over raw JUnit assert*.mockito-junit-jupiter) for mocking; don't mock what you can construct and test directly.scim-compliance-tests; some example-server tests use Testcontainers../mvnw clean verify -Pci passes (build, tests, RAT headers, SpotBugs, PMD).README.md — feature overview, module table, and declarative-syntax examplesMIGRATION_GUIDE.md — upgrade/migration notesRELEASE_GUIDE.md — release processSECURITY.md / THREAT_MODEL.md — security policy and threat model