/*
* Copyright 2012 LinkedIn Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package azkaban.user;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import azkaban.utils.Utils;
public class Permission {
public enum Type {
READ(0x0000001),
WRITE(0x0000002),
EXECUTE(0x0000004),
SCHEDULE(0x0000008),
METRICS(0x0000010),
CREATEPROJECTS(0x40000000), // Only used for roles
ADMIN(0x8000000);
private final int numVal;
Type(int numVal) {
this.numVal = numVal;
}
public int getFlag() {
return numVal;
}
}
private Set<Type> permissions = new HashSet<Type>();
public Permission() {
}
public Permission(int flags) {
setPermissions(flags);
}
public Permission(Type... list) {
addPermission(list);
}
public void addPermissions(Permission perm) {
this.permissions.addAll(perm.getTypes());
}
public void setPermission(Type type, boolean set) {
if (set) {
addPermission(type);
} else {
removePermissions(type);
}
}
public void setPermissions(int flags) {
permissions.clear();
if ((flags & Type.ADMIN.getFlag()) != 0) {
addPermission(Type.ADMIN);
} else {
for (Type type : Type.values()) {
if ((flags & type.getFlag()) != 0) {
addPermission(type);
}
}
}
}
public void addPermission(Type... list) {
// Admin is all encompassing permission. No need to add other types
if (!permissions.contains(Type.ADMIN)) {
for (Type perm : list) {
permissions.add(perm);
}
// We add everything, and if there's Admin left, we make sure that only
// Admin is remaining.
if (permissions.contains(Type.ADMIN)) {
permissions.clear();
permissions.add(Type.ADMIN);
}
}
}
public void addPermissionsByName(String... list) {
for (String perm : list) {
Type type = Type.valueOf(perm);
if (type != null) {
addPermission(type);
}
;
}
}
public void addPermissions(Collection<Type> list) {
for (Type perm : list) {
addPermission(perm);
}
}
public void addPermissionsByName(Collection<String> list) {
for (String perm : list) {
Type type = Type.valueOf(perm);
if (type != null) {
addPermission(type);
}
;
}
}
public Set<Type> getTypes() {
return permissions;
}
public void removePermissions(Type... list) {
for (Type perm : list) {
permissions.remove(perm);
}
}
public void removePermissionsByName(String... list) {
for (String perm : list) {
Type type = Type.valueOf(perm);
if (type != null) {
permissions.remove(type);
}
;
}
}
public boolean isPermissionSet(Type permission) {
return permissions.contains(permission);
}
public boolean isPermissionNameSet(String permission) {
return permissions.contains(Type.valueOf(permission));
}
public String[] toStringArray() {
ArrayList<String> list = new ArrayList<String>();
int count = 0;
for (Type type : permissions) {
list.add(type.toString());
count++;
}
return list.toArray(new String[count]);
}
@Override
public String toString() {
return Utils.flattenToString(permissions, ",");
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result =
prime * result + ((permissions == null) ? 0 : permissions.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Permission other = (Permission) obj;
if (permissions == null) {
if (other.permissions != null)
return false;
} else if (!permissions.equals(other.permissions))
return false;
return true;
}
public int toFlags() {
int flag = 0;
for (Type type : permissions) {
flag |= type.getFlag();
}
return flag;
}
}