Issue Summary

      This is reproducible on Data Center: yes

      Running a space backup when the space contains references to inexistent users fails with NullPointerException

      Steps to Reproduce

      1. Create a test space
      2. Create a new page and add the following using the source viewer to the page: 
        <ac:structured-macro ac:macro-id="4f850f29-b691-46f7-a0b6-4b534b17b4d9" ac:name="profile" ac:schema-version="1">
        <ac:parameter ac:name="user">
        <ri:user ri:username="asdf"/>
        </ac:parameter>
        </ac:structured-macro> 
      3. Go to Space Tools -> Content Tools -> Backup and create a backup

      Expected Results

      The backup will be successfully created.

      Actual Results

      The below exception is thrown in the GUI:

      java.util.concurrent.ExecutionException: java.lang.NullPointerException 

      And in the atlassian-confluence.log we see:

      2023-08-04 15:19:34,373 WARN [ConfluenceBackupRestoreManager:thread-11] [confluence.impl.backuprestore.ConfluenceBackupRestoreManager] runJobAndUpdateJobProperties Backup restore job BackupRestoreJob{id=1277958, jobOperation=BACKUP, jobScope=SPACE, jobState=PROCESSING, createTime=2023-08-04T13:19:34Z, startProcessingTime=2023-08-04T13:19:34Z, finishProcessingTime=null, cancelTime=null, owner='admin', whoCancelledTheJob='null', errorMessage='null'} failed: java.util.concurrent.ExecutionException: java.lang.NullPointerException
       -- url: /c840/rest/api/backup-restore/backup/space | userName: admin | referer: http://localhost:6840/c840/plugins/servlet/space-tool-backup/TEST | traceId: d6ed5d5679e7d6e4
      com.atlassian.confluence.backuprestore.exception.BackupRestoreException: java.util.concurrent.ExecutionException: java.lang.NullPointerException
      	at com.atlassian.confluence.impl.backuprestore.backup.SpaceBackupService.doBackupSynchronously(SpaceBackupService.java:133)
      	at com.atlassian.confluence.impl.backuprestore.BackupRestoreJobRunner.runJobSynchronously(BackupRestoreJobRunner.java:58)
      	at com.atlassian.confluence.impl.backuprestore.ConfluenceBackupRestoreManager.runJobAndUpdateJobProperties(ConfluenceBackupRestoreManager.java:277)
      	at com.atlassian.confluence.impl.backuprestore.ConfluenceBackupRestoreManager.processJobsFromTheQueue(ConfluenceBackupRestoreManager.java:259)
      	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
      	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
      	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
      	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
      	at java.base/java.lang.Thread.run(Thread.java:834)
      Caused by: java.util.concurrent.ExecutionException: java.lang.NullPointerException
      	at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
      	at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
      	at com.atlassian.confluence.impl.backuprestore.ParallelTasksExecutor.waitUntilAllJobsComplete(ParallelTasksExecutor.java:150)
      	at com.atlassian.confluence.impl.backuprestore.ParallelTasksExecutor.waitUntilAllJobsComplete(ParallelTasksExecutor.java:122)
      	at com.atlassian.confluence.impl.backuprestore.ParallelTasksExecutor.waitUntilAllJobsComplete(ParallelTasksExecutor.java:139)
      	at com.atlassian.confluence.impl.backuprestore.backup.SpaceBackupService.backupAllEntitiesAndAttachments(SpaceBackupService.java:173)
      	at com.atlassian.confluence.impl.backuprestore.backup.SpaceBackupService.doBackupSynchronously(SpaceBackupService.java:109)
      	... 8 more
      Caused by: java.lang.NullPointerException
      	at com.atlassian.confluence.impl.backuprestore.backup.exporters.UserKeyExtractorFragmentTransformer.lambda$getReferences$0(UserKeyExtractorFragmentTransformer.java:67)
      	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
      	at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1620)
      	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
      	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
      	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
      	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
      	at com.atlassian.confluence.impl.backuprestore.backup.exporters.UserKeyExtractorFragmentTransformer.getReferences(UserKeyExtractorFragmentTransformer.java:68)
      	at com.atlassian.confluence.impl.backuprestore.backup.exporters.ReferenceEntityFromBodyContentExtractor.lambda$extractReferenceContentFrom$1(ReferenceEntityFromBodyContentExtractor.java:85)
      	at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:271)
      	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
      	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
      	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
      	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
      	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
      	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
      	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
      	at com.atlassian.confluence.impl.backuprestore.backup.exporters.ReferenceEntityFromBodyContentExtractor.extractReferenceContentFrom(ReferenceEntityFromBodyContentExtractor.java:90)
      	at com.atlassian.confluence.impl.backuprestore.backup.exporters.BodyContentDataExporter.extractReferencesFromBody(BodyContentDataExporter.java:162)
      	at com.atlassian.confluence.impl.backuprestore.backup.exporters.BodyContentDataExporter.extractReferencesFromBody(BodyContentDataExporter.java:130)
      	at com.atlassian.confluence.impl.backuprestore.backup.exporters.BodyContentDataExporter.lambda$exportInBatchByQueryWithCondition$0(BodyContentDataExporter.java:99)
      	... 4 more

      Workaround

      The old XML export function can still be accessed by going directly there via the URL:

      <BASE_URL>/spaces/exportspacexml.action?key=<SPACE_KEY>

      This issue does not appear to happen using this function.

            [CONFSERVER-93795] Backport CONFSERVER-90581 to 8.5

            A fix for this issue is available in Confluence Server and Data Center 8.5.5.
            Upgrade now or check out the Release Notes to see what other issues are resolved.

            Jordan Anslow added a comment - A fix for this issue is available in Confluence Server and Data Center 8.5.5. Upgrade now or check out the Release Notes to see what other issues are resolved.

              8b5c2ab424ac Jing Zheng
              23540fb20e73 Chris Psonis
              Affected customers:
              0 This affects my team
              Watchers:
              2 Start watching this issue

                Created:
                Updated:
                Resolved: