Skip to main content
Example scripts
arrow icon
To homepage
Confluence
Data centre icon
Data Center

Identify Pages with broken image links

Tags
Created 1 year ago, Updated 2 month(s) ago
App in script
ScriptRunner For Confluence
ScriptRunner For Confluence
by Adaptavist
Compatibility
compatibility bullet
Confluence (7.15 - 8.6)
compatibility bullet
ScriptRunner For Confluence (7.10.0)
Language |
groovy
import com.atlassian.confluence.pages.AttachmentManager
import com.atlassian.confluence.pages.Page
import com.atlassian.confluence.pages.PageManager
import com.atlassian.confluence.setup.settings.GlobalSettingsManager
import com.atlassian.sal.api.component.ComponentLocator
import com.onresolve.scriptrunner.canned.confluence.utils.CQLSearch
import com.onresolve.scriptrunner.canned.confluence.utils.CQLSearchUtils
import com.onresolve.scriptrunner.canned.util.OutputFormatter
import com.onresolve.scriptrunner.parameters.annotation.ShortTextInput
import com.onresolve.scriptrunner.runner.ScriptRunnerImpl
import org.jsoup.parser.Parser

@ShortTextInput(label = 'CQL query', description = 'CQL query to select pages')
String cqlStr
assert cqlStr

def baseUrl = ComponentLocator.getComponent(GlobalSettingsManager).getGlobalSettings().getBaseUrl()
def cqlSearchUtils = ScriptRunnerImpl.scriptRunner.getBean(CQLSearchUtils)
def attachmentManager = ComponentLocator.getComponent(AttachmentManager)
def pageManager = ComponentLocator.getComponent(PageManager)

def pages = cqlSearchUtils.searchForPages(CQLSearch.fromQuery("(${cqlStr}) and type = page"))

def pagesWithBrokenImage = pages.findAll { Page page ->
    def bodyString = page.bodyAsString
    if (bodyString.contains("unknown-attachment")) {
        return true
    }

    def pageAttachments = page.attachments.findAll { !it.deleted }.fileName.toSet()
    def fileNamesInContent = Parser
        .xmlParser()
        .parseInput(page.bodyAsString, "")
        .getElementsByTag('ri:attachment')

    def brokenFile = fileNamesInContent.find {
        def fileName = it.attr("ri:filename")
        def pageElement = it.getElementsByTag("ri:page")

        if (pageElement.empty) {
            if (!pageAttachments.contains(fileName)) {
                return true
            }
        } else {
            def spaceKey = pageElement.attr("ri:space-key")
            def pageTitle = pageElement.attr("ri:content-title")

            def sourcePage = pageManager.getPage(spaceKey ?: page.space.key, pageTitle)
            if (!sourcePage) {
                return true
            }

            def sourcePageAtt = attachmentManager.getAttachment(sourcePage, fileName)
            if (!sourcePageAtt || sourcePageAtt.deleted) {
                return true
            }
        }
    }

    brokenFile != null
} as Collection<Page>

OutputFormatter.markupBuilder {
    p("${pagesWithBrokenImage.size()} page(s) found with broken image link(s)")
    hr()
    pagesWithBrokenImage.each { page ->
        p {
            a(page.title, [href: "${baseUrl + page.urlPath}", target: "_blank"])
        }
    }
}
Having an issue with this script?
Report it here