@@ -20,6 +20,9 @@ public class Assertion {
     @RdlOptional
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     public Long id;
+    @RdlOptional
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    public Boolean caseSensitive;
 
     public Assertion setRole(String role) {
         this.role = role;
//
// This file generated by rdl 1.5.2. Do not modify!
//

package com.yahoo.athenz.zms;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.yahoo.rdl.*;

//
// Assertion - A representation for the encapsulation of an action to be
// performed on a resource by a principal.
//
public class Assertion {
    public String role;
    public String resource;
    public String action;
    @RdlOptional
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    public AssertionEffect effect;
    @RdlOptional
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    public Long id;

    public Assertion setRole(String role) {
        this.role = role;
        return this;
    }
    public String getRole() {
        return role;
    }
    public Assertion setResource(String resource) {
        this.resource = resource;
        return this;
    }
    public String getResource() {
        return resource;
    }
    public Assertion setAction(String action) {
        this.action = action;
        return this;
    }
    public String getAction() {
        return action;
    }
    public Assertion setEffect(AssertionEffect effect) {
        this.effect = effect;
        return this;
    }
    public AssertionEffect getEffect() {
        return effect;
    }
    public Assertion setId(Long id) {
        this.id = id;
        return this;
    }
    public Long getId() {
        return id;
    }

    @Override
    public boolean equals(Object another) {
        if (this != another) {
            if (another == null || another.getClass() != Assertion.class) {
                return false;
            }
            Assertion a = (Assertion) another;
            if (role == null ? a.role != null : !role.equals(a.role)) {
                return false;
            }
            if (resource == null ? a.resource != null : !resource.equals(a.resource)) {
                return false;
            }
            if (action == null ? a.action != null : !action.equals(a.action)) {
                return false;
            }
            if (effect == null ? a.effect != null : !effect.equals(a.effect)) {
                return false;
            }
            if (id == null ? a.id != null : !id.equals(a.id)) {
                return false;
            }
        }
        return true;
    }
}

I didn't want to change the API. Users that would like to save assertion as case-sensitive will need to set the caseSensitive field in Assertion / Policy in putAssertion and putPolicy calls. Please note the following: 1. This value will not be saved to DB. It will only be used to tell ZMS to keep the resource and action as case sensitive 2. The policy structure will also have this field. If it is set, all assertions will be lowercased 3. If the policy structure case-sensitive field isn't set, it is still possible for some of the assertions to have the case-sensitive field enabled. In which case, only assertions with case-sensitive field enabled will be kept in the original case.