This script searches every Jira dashboard and returns the names of dashboards that contain Gantt Charts gadgets. It also returns the gadget's settings, the number of gadgets, and the names of structures that use the gadget.
Groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.ofbiz.OfBizDelegator
import groovy.json.JsonOutput
def ofBiz = ComponentAccessor.getComponent(OfBizDelegator)
def prefKeys = ["structureId", "sandboxId", "baselineId", "filterType", "filterQuery", "mode",
"startDate", "todayOffset", "zoom", "hierarchyLevel", "maxRows", "wbs", "wbsMaxWidth",
"itemInfo", "chartDetails", "refresh", "fiscalYearStartMonth", "isConfigured"]
def resolveIn = { plugin, String className ->
def type = plugin.classLoader.loadClass(className)
try {
def beans = plugin.getContainerAccessor().getBeansOfType(type)
if (beans) return beans.iterator().next()
} catch (Exception ignore) { }
ComponentAccessor.getOSGiComponentInstanceOfType(type)
}
def structurePlugin = ComponentAccessor.pluginAccessor.getPlugin('com.almworks.jira.structure')
def ganttPlugin = ComponentAccessor.pluginAccessor.getPlugin('com.almworks.structure.gantt')
def structureManager = resolveIn(structurePlugin, 'com.almworks.jira.structure.api.structure.StructureManager')
def permNone = Enum.valueOf(structurePlugin.classLoader.loadClass('com.almworks.jira.structure.api.permissions.PermissionLevel'), 'NONE')
def ganttManager = resolveIn(ganttPlugin, 'com.almworks.structure.gantt.gantt.GanttManager')
def sandboxManager = resolveIn(ganttPlugin, 'com.almworks.structure.gantt.sandbox.SandboxManager')
def baselineManager = resolveIn(ganttPlugin, 'com.almworks.structure.gantt.api.baseline.BaselineManager')
def configManager = resolveIn(ganttPlugin, 'com.almworks.structure.gantt.config.AOGanttConfigBeanManager')
def isSet = { String v -> v && v != "0" }
def err = { Exception e -> "<error: ${e.class.simpleName}: ${e.message}>" }
def structureName = { String id ->
if (!isSet(id)) return null
try { return structureManager.getStructure(id as Long, permNone).name } catch (Exception e) { return err(e) }
}
def configName = { Long id ->
if (id == null) return null
try { return configManager.getConfigBeanNoPermissionCheck(id).name } catch (Exception e) { return err(e) }
}
def ganttInfo = { String structureId, String sandboxId ->
if (isSet(sandboxId)) {
try {
def sb = sandboxManager.load(sandboxId as Long)
def g = sb.toIGantt()
return [ganttId: g.id, mainGanttId: sb.originalGanttId, sandboxName: sb.name,
configId: g.configId, configName: configName(g.configId)]
} catch (Exception e) { return [sandboxName: err(e)] }
}
if (!isSet(structureId)) return [:]
try {
def g = ganttManager.getMainGantt(structureId as Long).orElse(null)
if (g == null) return [ganttId: "<no gantt for structure>"]
return [ganttId: g.id, ganttName: g.name, configId: g.configId, configName: configName(g.configId)]
} catch (Exception e) { return [ganttId: err(e)] }
}
def baselineName = { String id ->
if (!isSet(id)) return null
try { return baselineManager.getBaseline(id as Long)?.name ?: "<not found>" } catch (Exception e) { return err(e) }
}
def matches = []
ofBiz.findAll("PortletConfiguration").each { pc ->
def uri = pc.getString("gadgetXml") ?: ""
if (uri.contains("com.almworks.structure.gantt:gantt-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 << ([
gadgetId : pcId,
dashboardId : ppId,
dashboard : page?.getString("pagename") ?: "?",
owner : page?.getString("username") ?: "(shared/system)",
structureId : prefs["structureId"],
structureName: structureName(prefs["structureId"]),
sandboxId : prefs["sandboxId"],
baselineId : prefs["baselineId"],
baselineName : baselineName(prefs["baselineId"])
] + ganttInfo(prefs["structureId"], prefs["sandboxId"]) + [
prefs : prefKeys.collectEntries { [(it): prefs[it]] },
gadgetUri: uri
])
}
}
def result = [
total : matches.size(),
withSandbox : matches.count { isSet(it.sandboxId) },
withBaseline : matches.count { isSet(it.baselineId) },
notConfigured : matches.count { it.prefs.isConfigured != "true" },
instances : matches
]
return JsonOutput.prettyPrint(JsonOutput.toJson(result))