/**
   * @param action is the action on the assignment (null means default action)
   * @param attributeDefName
   * @param checkSecurity
   * @return if removed or already not assigned
   */
  private AttributeAssignResult removeAttributeHelper(
      String action, AttributeDefName attributeDefName, boolean checkSecurity) {
    if (checkSecurity) {
      this.assertCanUpdateAttributeDefName(attributeDefName);
    }

    AttributeAssignResult attributeAssignResult = new AttributeAssignResult();
    attributeAssignResult.setChanged(false);
    // see if it exists
    if (!this.hasAttributeHelper(action, attributeDefName, false)) {
      return attributeAssignResult;
    }
    action = StringUtils.defaultIfEmpty(action, AttributeDef.ACTION_DEFAULT);
    Set<AttributeAssign> attributeAssigns =
        retrieveAttributeAssignsByOwnerAndAttributeDefNameId(attributeDefName.getId());
    Set<AttributeAssign> attributeAssignsToReturn = new LinkedHashSet<AttributeAssign>();
    for (AttributeAssign attributeAssign : attributeAssigns) {
      String currentAttributeAction = attributeAssign.getAttributeAssignAction().getName();
      if (StringUtils.equals(action, currentAttributeAction)) {
        attributeAssignResult.setChanged(true);
        attributeAssignsToReturn.add(attributeAssign);
        attributeAssign.delete();
      }
    }
    attributeAssignResult.setAttributeAssigns(attributeAssignsToReturn);
    return attributeAssignResult;
  }
  /**
   * see if the group
   *
   * @param action is the action on the assignment (null means default action)
   * @param attributeDefNameName
   * @return true if has attribute, false if not
   */
  public boolean hasAttributeByName(String action, String attributeDefNameName) {
    AttributeDefName attributeDefName =
        GrouperDAOFactory.getFactory()
            .getAttributeDefName()
            .findByNameSecure(attributeDefNameName, true);

    Set<AttributeAssign> attributeAssigns = retrieveAssignments(attributeDefName);
    action = StringUtils.defaultIfEmpty(action, AttributeDef.ACTION_DEFAULT);
    for (AttributeAssign attributeAssign : attributeAssigns) {
      String currentAttributeAction = attributeAssign.getAttributeAssignAction().getName();
      if (StringUtils.equals(action, currentAttributeAction)) {
        return true;
      }
    }
    return false;
  }
  /**
   * @param action on the assignment
   * @param attributeDefName
   * @param checkSecurity
   * @return true if has attribute, false if not
   */
  boolean hasAttributeHelper(
      String action, AttributeDefName attributeDefName, boolean checkSecurity) {
    if (checkSecurity) {
      this.assertCanReadAttributeDefName(attributeDefName);
    }
    Set<AttributeAssign> attributeAssigns =
        retrieveAttributeAssignsByOwnerAndAttributeDefNameId(attributeDefName.getId());

    action = StringUtils.defaultIfEmpty(action, AttributeDef.ACTION_DEFAULT);
    for (AttributeAssign attributeAssign : attributeAssigns) {
      String currentAttributeAction = attributeAssign.getAttributeAssignAction().getName();
      if (StringUtils.equals(action, currentAttributeAction)) {
        return true;
      }
    }

    return false;
  }
 /**
  * @param action
  * @param attributeDefName
  * @param exceptionIfNull
  * @param attributeAssigns
  * @return assignment
  */
 private AttributeAssign retrieveAssignmentHelper(
     String action,
     AttributeDefName attributeDefName,
     boolean exceptionIfNull,
     Set<AttributeAssign> attributeAssigns) {
   AttributeAssign attributeAssignResult = null;
   action = StringUtils.defaultIfEmpty(action, AttributeDef.ACTION_DEFAULT);
   for (AttributeAssign attributeAssign : attributeAssigns) {
     String currentAttributeAction = attributeAssign.getAttributeAssignAction().getName();
     if (StringUtils.equals(action, currentAttributeAction)) {
       if (attributeAssignResult != null) {
         throw new RuntimeException(
             "Multiple assignments exist: " + attributeDefName + ", " + action + ", " + this);
       }
       attributeAssignResult = attributeAssign;
     }
   }
   if (exceptionIfNull && attributeAssignResult == null) {
     throw new RuntimeException(
         "Cant find assignment: " + action + ", " + attributeDefName + ", " + this);
   }
   return attributeAssignResult;
 }