Structure (DC)

Find Structure Gadgets in Dashboards

This script searches every Jira dashboard and returns the names of dashboards that contain Structure gadgets. It also returns the gadget's settings, the name of the selected structure, and the selected view.

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.ofbiz.OfBizDelegator
import groovy.json.JsonOutput

def ofBiz = ComponentAccessor.getComponent(OfBizDelegator)
def prefKeys = ["structureId", "viewId", "filterId", "filterType", "filterQuery",
"customTitle", "numRows", "isConfigured", "allowChanges"]

def plugin = ComponentAccessor.pluginAccessor.getPlugin('com.almworks.jira.structure')
def loader = plugin.classLoader
def resolveComponent = { Class type ->
try {
def beans = plugin.getContainerAccessor().getBeansOfType(type)
if (beans) return beans.iterator().next()
} catch (Exception ignore) { }
ComponentAccessor.getOSGiComponentInstanceOfType(type)
}
def searchRequestManager = ComponentAccessor.getComponent(com.atlassian.jira.issue.search.SearchRequestManager)
def filterName = { String id ->
if (!id) return null
try { return searchRequestManager.getSearchRequestById(id as Long)?.name } catch (Exception e) { return "<error: ${e.message}>" }
}
def structureManager = resolveComponent(loader.loadClass('com.almworks.jira.structure.api.structure.StructureManager'))
def viewManager = resolveComponent(loader.loadClass('com.almworks.jira.structure.api.view.StructureViewManager'))
def permNone = Enum.valueOf(loader.loadClass('com.almworks.jira.structure.api.permissions.PermissionLevel'), 'NONE')

def structureName = { String id ->
if (!id) return null
try { return structureManager.getStructure(id as Long, permNone).name } catch (Exception e) { return "<error: ${e.message}>" }
}
def viewName = { String id ->
if (!id) return null
try { return viewManager.getView(id as Long, permNone).name } catch (Exception e) { return "<error: ${e.message}>" }
}

def matches = []
ofBiz.findAll("PortletConfiguration").each { pc ->
def uri = pc.getString("gadgetXml") ?: ""
if (uri.contains("com.almworks.jira.structure:structure-gadget") ||
uri.contains("com.almworks.jira.structure:cfd-gadget")) {
def pcId = pc.getLong("id")
def prefs = [:]
ofBiz.findByAnd("GadgetUserPreference", [portletconfiguration: pcId]).each {
prefs[it.getString("userprefkey")] = it.getString("userprefvalue")
}
def ppId = pc.getLong("portalpage")
def page = ofBiz.findByPrimaryKey("PortalPage", [id: ppId])
matches << [
type          : uri.contains("cfd-gadget") ? "Predictive CFD" : "Structure",
dashboardId   : ppId,
dashboard     : page?.getString("pagename") ?: "?",
owner         : page?.getString("username") ?: "(shared/system)",
structureId   : prefs["structureId"],
structureName : structureName(prefs["structureId"]),
viewId        : prefs["viewId"],
viewName      : viewName(prefs["viewId"]),
filterId      : prefs["filterId"],
filterName    : filterName(prefs["filterId"]),
prefs         : prefKeys.collectEntries { [(it): prefs[it]] },
gadgetUri     : uri
]
}
}

def byType = matches.groupBy { it.type }.collectEntries { k, v -> [(k): v.size()] }
def result = [total: matches.size(), byType: byType, instances: matches]
return JsonOutput.prettyPrint(JsonOutput.toJson(result))