@Override
  public Object getOldValue() {
    try {
      if (isOriginRemote() && getRegion().isProxy()) {
        return null;
      }
      @Unretained
      Object ov = handleNotAvailableOldValue();
      if (ov != null) {
        boolean doCopyOnRead = getRegion().isCopyOnRead();
        if (ov instanceof CachedDeserializable) {
          return callWithOffHeapLock((CachedDeserializable) ov, oldValueCD -> {
            if (doCopyOnRead) {
              return oldValueCD.getDeserializedWritableCopy(getRegion(), re);
            } else {
              return oldValueCD.getDeserializedValue(getRegion(), re);
            }
          });
        } else {
          if (doCopyOnRead) {
            return CopyHelper.copy(ov);
          } else {
            return ov;
          }
        }
      }
      return null;
    } catch (IllegalArgumentException i) {
      IllegalArgumentException iae = new IllegalArgumentException(String.format("%s",
          "Error while deserializing value for key=" + getKey()), i);
      throw iae;
    }
  }
Returns the value in the cache prior to this event. When passed to an event handler after an
event occurs, this value reflects the value that was in the cache in this VM, not necessarily
the value that was in the cache VM that initiated the operation.

@return the value in the cache prior to this event.
geode-core/src/main/java/org/apache/geode/internal/cache/EntryEventImpl.java