/** @inheritDoc */
  public void commit(DigestEdit edit) {
    // check for closed edit
    if (!edit.isActiveEdit()) {
      try {
        throw new Exception();
      } catch (Exception e) {
        M_log.warn(".commit(): closed DigestEdit", e);
      }
      return;
    }

    // update the properties
    // addLiveUpdateProperties(user.getPropertiesEdit());

    // complete the edit
    m_storage.commit(edit);

    // track it
    eventTrackingService()
        .post(
            eventTrackingService()
                .newEvent(((BaseDigest) edit).getEvent(), edit.getReference(), true));

    // close the edit object
    ((BaseDigest) edit).closeEdit();
  }
  /** @inheritDoc */
  public DigestEdit edit(String id) throws InUseException {
    // security
    // unlock(SECURE_EDIT_DIGEST, digestReference(id));

    // one add/edit at a time, please, to make sync. only one digest per user
    // TODO: I don't link sync... could just do the add and let it fail if it already exists
    // -ggolden
    synchronized (m_storage) {
      // check for existance
      if (!m_storage.check(id)) {
        try {
          return add(id);
        } catch (IdUsedException e) {
          M_log.warn(".edit: from the add: " + e);
        }
      }

      // ignore the cache - get the user with a lock from the info store
      DigestEdit edit = m_storage.edit(id);
      if (edit == null) throw new InUseException(id);

      ((BaseDigest) edit).setEvent(SECURE_EDIT_DIGEST);

      return edit;
    }
  }
  /** @inheritDoc */
  public void cancel(DigestEdit edit) {
    // check for closed edit
    if (!edit.isActiveEdit()) {
      try {
        throw new Exception();
      } catch (Exception e) {
        M_log.warn(".cancel(): closed DigestEdit", e);
      }
      return;
    }

    // release the edit lock
    m_storage.cancel(edit);

    // close the edit object
    ((BaseDigest) edit).closeEdit();
  }
  /** @inheritDoc */
  public void remove(DigestEdit edit) {
    // check for closed edit
    if (!edit.isActiveEdit()) {
      try {
        throw new Exception();
      } catch (Exception e) {
        M_log.warn(".remove(): closed DigestEdit", e);
      }
      return;
    }

    // complete the edit
    m_storage.remove(edit);

    // track it
    eventTrackingService()
        .post(eventTrackingService().newEvent(SECURE_REMOVE_DIGEST, edit.getReference(), true));

    // close the edit object
    ((BaseDigest) edit).closeEdit();
  }
 /** @inheritDoc */
 public Edit newResourceEdit(Entity container, Entity other) {
   BaseDigest e = new BaseDigest((Digest) other);
   e.activate();
   return e;
 }
 /** @inheritDoc */
 public Edit newResourceEdit(Entity container, Element element) {
   BaseDigest e = new BaseDigest(element);
   e.activate();
   return e;
 }
 /** @inheritDoc */
 public Edit newResourceEdit(Entity container, String id, Object[] others) {
   BaseDigest e = new BaseDigest(id);
   e.activate();
   return e;
 }