GrouperLog.debug(LOG, s, msg + rv + " (cached)");
  protected boolean hasPriv(    GrouperSession s, Group g, Subject subj, Privilege priv  )  {    GrouperSession.validate(s);    boolean rv = false;    String  msg = "hasPriv: " + SubjectHelper.getPretty(subj)       + " " + priv + ": ";    GrouperLog.debug(LOG, s, msg + "checking");    Element el = this.ac.get(g, subj, priv);    if (el != null) {      if (el.getValue().equals(GrouperConfig.BT)) {        rv = true;      }      GrouperLog.debug(LOG, s, msg + rv + " (cached)");    }    else if (this.isRoot(subj)) {      rv = true;        GrouperLog.debug(LOG, s, msg + rv + " (isRoot)");    }    else {      try {        rv = access.hasPriv(s, g, subj, priv);        GrouperLog.debug(LOG, s, msg + rv);        if (rv == false) {          rv = this._isAll(s, g, priv);          GrouperLog.debug(LOG, s, msg + rv + " (ALL)");        }       }      catch (SchemaException eS) {        rv = false;        GrouperLog.debug(LOG, s, msg + rv + "(" + eS.getMessage() + ")");        return rv;      }    }    if (el == null) {      ac.put(g, subj, priv, rv);    }    return rv;  } // protected boolean hasPriv(s, g, subj, priv)