private Permission getValidPermission(Master master, Slave slave) {
   HashMap<Integer, Permission> permissions = master.getPermissions(this);
   if (permissions == null || permissions.size() == 0) {
     return null;
   }
   Permission permission = permissions.get(0);
   if (permission == null
       || Permission.getType(permission.getType()) != Permission.ADMIN_PERMISSION) {
     permission = null;
     Object[] permissionsArray = permissions.values().toArray();
     for (int i = 0; i < permissionsArray.length; i++) {
       Permission p = (Permission) permissionsArray[i];
       // If it is valid and (the permission is associated with the same slave id OR it is
       // for all slaves)
       if (p.isValid()
           && (p.getSlaveId() == slave.getId() || p.getSlaveId() == Slave.ALL_SLAVES)) {
         permission = (Permission) permissionsArray[i];
         break;
       }
     }
   }
   return permission;
 }
    /**
     * Set the array of permissions you want to use in your application
     *
     * @param permissions
     */
    public Builder setPermissions(Permission[] permissions) {
      for (Permission permission : permissions) {
        switch (permission.getType()) {
          case READ:
            mReadPermissions.add(permission.getValue());
            break;
          case PUBLISH:
            mPublishPermissions.add(permission.getValue());
            break;
          default:
            break;
        }
      }

      return this;
    }
  /**
   * Add new permissions in a runtime
   *
   * @param permissions
   */
  void addNewPermissions(Permission[] permissions) {
    for (Permission permission : permissions) {
      switch (permission.getType()) {
        case READ:
          if (!mReadPermissions.contains(permission.getValue())) {
            mReadPermissions.add(permission.getValue());
          }
          break;
        case PUBLISH:
          if (!mPublishPermissions.contains(permission.getValue())) {
            mPublishPermissions.add(permission.getValue());
          }
          break;
        default:
          break;
      }
    }

    if (this.mPublishPermissions.size() > 0) {
      this.mHasPublishPermissions = true;
    }
  }