All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jd.blockchain.ledger.PrivilegeBitset Maven / Gradle / Ivy

There is a newer version: 1.6.5.RELEASE
Show newest version
package com.jd.blockchain.ledger;

import java.util.BitSet;

import utils.Int8Code;
import utils.io.BytesSerializable;

/**
 * PrivilegeBitset 定义了用位表示的权限码;
 * 
 * @author huanghaiquan
 *
 */
public abstract class PrivilegeBitset & Int8Code> implements Privilege, BytesSerializable, Cloneable {
	// 加入1个字节的前缀位 0xF1,可避免序列化时输出空的字节数组;
	private static final byte PREFIX = (byte) 0xF1;
	private static final byte[] PREFIX_BYTES = { PREFIX };
	private static final int OFFSET = 8;
	private static final int MAX_SIZE = 32;

	// 前缀中置为 1 的位数,值 0xF1 有 5 个比特位为 1;
	private static final int PREFIX_CARDINALITY = 5;

	private BitSet permissionBits;

	public PrivilegeBitset() {
		// 设置前缀;
		this.permissionBits = BitSet.valueOf(PREFIX_BYTES);
	}

	/**
	 * @param codeBytes   权限的字节位;
	 * @param codeIndexer
	 */
	public PrivilegeBitset(byte[] codeBytes) {
		// 检查长度;
		if (codeBytes.length == 0) {
			throw new IllegalArgumentException("Empty code bytes!");
		}
		if (codeBytes.length > MAX_SIZE) {
			throw new IllegalArgumentException(
					"The size of code bytes specified to PrivilegeBitset exceed the max size[" + MAX_SIZE + "]!");
		}
		// 校验前缀;
		if (codeBytes[0] != PREFIX) {
			throw new IllegalArgumentException("The code bytes is not match the privilege prefix code!");
		}

		this.permissionBits = BitSet.valueOf(codeBytes);
	}

	protected PrivilegeBitset(BitSet bits) {
		this.permissionBits = bits;
	}

	public boolean isEnable(E permission) {
		return permissionBits.get(index(permission));
	}

	public void enable(E permission) {
		permissionBits.set(index(permission));
	}

	public void disable(E permission) {
		permissionBits.clear(index(permission));
	}

	@SuppressWarnings("unchecked")
	public void enable(E... permissions) {
		for (E p : permissions) {
			permissionBits.set(index(p));
		}
	}

	@SuppressWarnings("unchecked")
	public void disable(E... permissions) {
		for (E p : permissions) {
			permissionBits.clear(index(p));
		}
	}

	@Override
	public byte[] toBytes() {
		return permissionBits.toByteArray();
	}

	/**
	 * 把指定的权限合并到当前的权限中; 
* * @param privileges * @return */ @SuppressWarnings("unchecked") public Privilege union(PrivilegeBitset... privileges) { return union(privileges, 0, privileges.length); } /** * 把指定的权限合并到当前的权限中;
* * @param privileges * @param offset * @param count * @return */ public Privilege union(PrivilegeBitset[] privileges, int offset, int count) { BitSet bits = this.permissionBits; for (int i = 0; i < count; i++) { bits.or(privileges[i + offset].permissionBits); } return this; } /** * 保留当前的权限与指定权限的共同生效的部分,同时清除其它的权限位;
* * @param privileges * @return */ @SuppressWarnings("unchecked") public Privilege intersect(PrivilegeBitset... privileges) { return intersect(privileges, 0, privileges.length); } /** * 保留当前的权限与指定权限的共同生效的部分,同时清除其它的权限位;
* * @param privileges * @param offset * @param count * @return */ public Privilege intersect(PrivilegeBitset[] privileges, int offset, int count) { BitSet bits = this.permissionBits; for (int i = 0; i < count; i++) { bits.and(privileges[i + offset].permissionBits); } return this; } @Override public Privilege clone() { try { BitSet bitSet = (BitSet) permissionBits.clone(); @SuppressWarnings("unchecked") PrivilegeBitset privilege = (PrivilegeBitset) super.clone(); privilege.permissionBits = bitSet; return privilege; } catch (CloneNotSupportedException e) { throw new IllegalStateException(e.getMessage(), e); } } protected BitSet cloneBitSet() { return (BitSet) permissionBits.clone(); } private int index(E permission) { return OFFSET + permission.getCode(); } public int getPermissionCount() { return permissionBits.cardinality() - PREFIX_CARDINALITY; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy