@Override
  public void copy(
      AuthData exportAuthData,
      AuthData importAuthData,
      UUID jobId,
      Optional<ExportInformation> exportInfo)
      throws CopyException {
    idempotentImportExecutor.setJobId(jobId);
    String jobIdPrefix = "Job " + jobId + ": ";

    Optional<Stack<ExportInformation>> maybeLoadedStack = jobStore.loadJobStack(jobId);

    if (maybeLoadedStack.isPresent()) {
      // load stack from partially completed transfer
      exportInfoStack = maybeLoadedStack.get();
    } else {
      // start new transfer
      int initialCopyIteration = COPY_ITERATION_COUNTER.incrementAndGet();
      ExportResult<?> initialExportResult =
          copyIteration(
              jobId, exportAuthData, importAuthData, exportInfo, jobIdPrefix, initialCopyIteration);
      // Import and Export were successful, determine what to do next
      ContainerResource exportContainerResource =
          exportInfo.map(ExportInformation::getContainerResource).orElse(null);
      updateStackAfterCopyIteration(
          jobId,
          jobIdPrefix,
          exportContainerResource,
          initialCopyIteration,
          initialExportResult.getContinuationData());
    }
    while (!exportInfoStack.isEmpty()) {
      int copyIteration = COPY_ITERATION_COUNTER.incrementAndGet();
      ExportInformation currentExportInfo = exportInfoStack.pop();
      ExportResult<?> exportResult =
          copyIteration(
              jobId,
              exportAuthData,
              importAuthData,
              Optional.of(currentExportInfo),
              jobIdPrefix,
              copyIteration);
      // Import and Export were successful, determine what to do next
      updateStackAfterCopyIteration(
          jobId,
          jobIdPrefix,
          currentExportInfo.getContainerResource(),
          copyIteration,
          exportResult.getContinuationData());
    }
  }
Transfers data from the given {@code exporter} optionally starting at the point specified in
the provided {@code exportInformation}. Imports the data using the provided {@code importer}.
If there is more data to required to be exported, recursively copies using the specific {@link
ExportInformation} to continue the process.

@param exportAuthData The auth data for the export
@param importAuthData The auth data for the import
@param exportInfo Any pagination or resource information to use for subsequent calls.
extensions/copier/portability-stack-copier/src/main/java/org/datatransferproject/copier/stack/PortabilityStackInMemoryDataCopier.java