private <T> MemoryAgentActionResult<T> executeOperation(Callable<MemoryAgentActionResult<T>> callable) throws EvaluateException {
    if (myState == MemoryAgentActionState.RUNNING) {
      throw new EvaluateException("Some action is already running");
    }

    if (myCancellationFile != null) {
      FileUtil.delete(myCancellationFile);
      myCancellationFile = null;
    }

    if (myProgressIndicator != null) {
      myProgressTracker = new MemoryAgentProgressTrackerImpl(this, myProgressIndicator);
    }
    else {
      myProgressTracker = MemoryAgentProgressTracker.DISABLED;
    }

    try {
      myState = MemoryAgentActionState.RUNNING;
      myProgressTracker.startMonitoringProgress();
      return callable.call();
    }
    catch (Exception ex) {
      throw new EvaluateException(ex.getMessage());
    }
    finally {
      myProgressTracker.stopMonitoringProgress();
      myProgressIndicator = null;
      myProgressTracker = MemoryAgentProgressTracker.DISABLED;
      FileUtil.delete(new File(myProxy.getProgressFileName()));
      myState = MemoryAgentActionState.FINISHED;
    }
  }
private <T> MemoryAgentActionResult<T> executeOperation(Callable<MemoryAgentActionResult<T>> callable)