Skip to content

chore: port GetUsers/GetNamedUsers API from Go to Java#516

Open
AlabLan wants to merge 3 commits into
apache:masterfrom
AlabLan:dev
Open

chore: port GetUsers/GetNamedUsers API from Go to Java#516
AlabLan wants to merge 3 commits into
apache:masterfrom
AlabLan:dev

Conversation

@AlabLan
Copy link
Copy Markdown

@AlabLan AlabLan commented Apr 24, 2026

Background

Issue: apache/casbin#1621

This PR ports the users/roles separation feature (implemented in Go PR #1652) to the Java version,
ensuring API and implementation logic are synchronized across languages.

Changes

New APIs

  • getUsers() - Get all users in the current policy
  • getNamedUsers(ptype) - Get all users in the specified policy type

Algorithm (consistent with final Go implementation):
Users = subjects from "p" - roles from "g"

Ported Utilities

Go Java
GetFieldIndex Model.getFieldIndex(ptype, field)
SetSubtract Util.setSubtract()

Implementation Note

The initial port used the early-branch algorithm that included "g" column 0 entities.
This has been corrected to match the final Go version (PR #1652).

Files Changed

  • Model.java - Add getFieldIndex() method
  • Util.java - Add setSubtract() method
  • ManagementEnforcer.java - Add getUsers() and getNamedUsers(ptype)
  • SyncedEnforcer.java - Add thread-safe wrappers

Testing

  • ManagementAPIUnitTest passes
  • Behavior consistent with Go's GetAllUsers

AlabLan added 2 commits April 24, 2026 10:41
- add getUsers() method to ManagementEnforcer that returns subjects excluding roles
- add getValuesForFieldInPolicyAllTypes() and getFieldIndex() to Model for subject extraction
- update test imports and organization in ManagementAPIUnitTest
Users = subjects from "p" - roles from "g"
(replacing early-branch logic that included g column 0)
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Ports the Casbin Go GetUsers/GetNamedUsers management APIs to the Java implementation to separate “users” (subjects) from “roles” (grouping targets), keeping behavior aligned across languages.

Changes:

  • Added getUsers() / getNamedUsers(ptype) to ManagementEnforcer, with thread-safe wrappers in SyncedEnforcer.
  • Added supporting utilities: Model.getFieldIndex(ptype, field) and Util.setSubtract(a, b).
  • Added a unit test covering the new APIs with the RBAC example model/policy.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/test/java/org/casbin/jcasbin/main/ManagementAPIUnitTest.java Adds unit test coverage for getUsers() and getNamedUsers() using RBAC example data.
src/main/java/org/casbin/jcasbin/util/Util.java Adds setSubtract() helper used by the new user/role separation logic.
src/main/java/org/casbin/jcasbin/model/Model.java Adds getFieldIndex() (and a helper to get field values across all policy types).
src/main/java/org/casbin/jcasbin/main/SyncedEnforcer.java Adds synchronized wrappers for the new management APIs.
src/main/java/org/casbin/jcasbin/main/ManagementEnforcer.java Implements getUsers() / getNamedUsers(ptype) using subjects minus roles.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/main/java/org/casbin/jcasbin/main/ManagementEnforcer.java Outdated
Comment thread src/main/java/org/casbin/jcasbin/main/SyncedEnforcer.java Outdated
Comment thread src/main/java/org/casbin/jcasbin/model/Model.java Outdated
Comment thread src/main/java/org/casbin/jcasbin/model/Model.java Outdated
- Rename getUsers() to getAllUsers() to align with Go API
- Remove getNamedUsers() as Go final version doesn't have it
- Fix Model.getFieldIndex() to return -1 when not found (instead of 0)
- Add null check in Model.getFieldIndex() to prevent NPE
- Update Javadoc to accurately describe behavior
- Update tests accordingly
@AlabLan
Copy link
Copy Markdown
Author

AlabLan commented Apr 26, 2026

Background

Issue: apache/casbin#1621

Sync GetAllUsers API from Go Casbin (PR #1652) to Java version.

Changes

  • Add getAllUsers() API: returns subjects minus roles (users = subjects from "p" - roles from "g")
  • Rename getUsers() to getAllUsers() to align with Go Casbin API
  • Remove getNamedUsers(ptype) as Go version doesn't have it
  • Fix Model.getFieldIndex(): returns -1 when not found (was 0), add null-check for NPE prevention
  • Expand test coverage for getAllUsers() with edge cases

Testing

  • ManagementAPIUnitTest passes
  • Behavior consistent with Go's GetAllUsers

@AlabLan
Copy link
Copy Markdown
Author

AlabLan commented Apr 30, 2026

Hi @hsluoyz, I've addressed the Copilot review feedback in the latest commit. Could you please take another look when you have a chance? Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants