ParseApplication/ExternalLibs/Parse-SDK-Android/Parse/src/main/java/com/parse/ParseRole.java

142 lines
4.4 KiB
Java

/*
* Copyright (c) 2015-present, Parse, LLC.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.parse;
import java.util.regex.Pattern;
/**
* Represents a Role on the Parse server. {@code ParseRole}s represent groupings of
* {@code ParseUsers} for the purposes of granting permissions (e.g. specifying a {@link ParseACL}
* for a {@link ParseObject}). Roles are specified by their sets of child users and child roles, all
* of which are granted any permissions that the parent role has.<br />
* <br />
* Roles must have a name (which cannot be changed after creation of the role), and must specify an
* ACL.
*/
@ParseClassName("_Role")
public class ParseRole extends ParseObject {
private static final Pattern NAME_PATTERN = Pattern.compile("^[0-9a-zA-Z_\\- ]+$");
/**
* Used for the factory methods. Developers will need to set a name on objects created like this,
* which is why the constructor with a roleName is exposed publicly.
*/
ParseRole() {
}
/**
* Constructs a new ParseRole with the given name. If no default ACL has been specified, you must
* provide an ACL for the role.
*
* @param name
* The name of the Role to create.
*/
public ParseRole(String name) {
this();
setName(name);
}
/**
* Constructs a new ParseRole with the given name.
*
* @param name
* The name of the Role to create.
* @param acl
* The ACL for this role. Roles must have an ACL.
*/
public ParseRole(String name, ParseACL acl) {
this(name);
setACL(acl);
}
/**
* Sets the name for a role. This value must be set before the role has been saved to the server,
* and cannot be set once the role has been saved.<br />
* <br />
* A role's name can only contain alphanumeric characters, _, -, and spaces.
*
* @param name
* The name of the role.
* @throws IllegalStateException
* if the object has already been saved to the server.
*/
public void setName(String name) {
this.put("name", name);
}
/**
* Gets the name of the role.
*
* @return the name of the role.
*/
public String getName() {
return this.getString("name");
}
/**
* Gets the {@link ParseRelation} for the {@link ParseUser}s that are direct children of this
* role. These users are granted any privileges that this role has been granted (e.g. read or
* write access through ACLs). You can add or remove users from the role through this relation.
*
* @return the relation for the users belonging to this role.
*/
public ParseRelation<ParseUser> getUsers() {
return getRelation("users");
}
/**
* Gets the {@link ParseRelation} for the {@link ParseRole}s that are direct children of this
* role. These roles' users are granted any privileges that this role has been granted (e.g. read
* or write access through ACLs). You can add or remove child roles from this role through this
* relation.
*
* @return the relation for the roles belonging to this role.
*/
public ParseRelation<ParseRole> getRoles() {
return getRelation("roles");
}
@Override
/* package */ void validateSave() {
synchronized (mutex) {
if (this.getObjectId() == null && getName() == null) {
throw new IllegalStateException("New roles must specify a name.");
}
super.validateSave();
}
}
@Override
public void put(String key, Object value) {
if ("name".equals(key)) {
if (this.getObjectId() != null) {
throw new IllegalArgumentException(
"A role's name can only be set before it has been saved.");
}
if (!(value instanceof String)) {
throw new IllegalArgumentException("A role's name must be a String.");
}
if (!NAME_PATTERN.matcher((String) value).matches()) {
throw new IllegalArgumentException(
"A role's name can only contain alphanumeric characters, _, -, and spaces.");
}
}
super.put(key, value);
}
/**
* Gets a {@link ParseQuery} over the Role collection.
*
* @return A new query over the Role collection.
*/
public static ParseQuery<ParseRole> getQuery() {
return ParseQuery.getQuery(ParseRole.class);
}
}