attrs.put("+" + Provisioning.A_zimbraPasswordLockoutFailureTime, DateUtil.toGeneralizedTime(new Date()));
attrs.put("+" + Provisioning.A_zimbraPasswordLockoutFailureTime, currentFailure);
    private int updateFailureTimes(Map<String, Object> attrs) {        // need to toss out any "expired" failures         long duration = mAccount.getTimeInterval(Provisioning.A_zimbraPasswordLockoutFailureLifetime, 0);        if (duration != 0) {            String expiredTime = DateUtil.toGeneralizedTime(new Date(System.currentTimeMillis() - duration));            for (String failure : mFailures) {                if (failure.compareTo(expiredTime) < 0) {                    if (mFailuresToRemove == null) mFailuresToRemove = new ArrayList<String>();                    mFailuresToRemove.add(failure);                }            }        }        // need to toss out the oldest if we are at our limit                boolean removeOldest = mFailures.length == mMaxFailures && mFailuresToRemove == null;        if (removeOldest) {            int i, j = 0;            for (i=1; i < mFailures.length; i++) {                if (mFailures[i].compareTo(mFailures[j]) < 0) {                    j = i;                }            }            // remove oldest            attrs.put("-" + Provisioning.A_zimbraPasswordLockoutFailureTime, mFailures[j]);        } else if (mFailuresToRemove != null) {            // remove any expired            attrs.put("-" + Provisioning.A_zimbraPasswordLockoutFailureTime, mFailuresToRemove);        }        // add latest failure        attrs.put("+" + Provisioning.A_zimbraPasswordLockoutFailureTime, DateUtil.toGeneralizedTime(new Date()));                // return total of all outstanding failures, including latest        return 1 + mFailures.length - (removeOldest ? 1 : 0 ) - (mFailuresToRemove == null ? 0 : mFailuresToRemove.size());    }