Here is a user macro that I have created for this. Just put it on a page and it should give you a report of all of the macros and user macros that are being used in your instance. This requires at least Confluence 5.5 as the MacroBrowserManager.getMacroSummaries() method was added in 5.5.
## Developed by: Davin Studer
## Date created: 12/17/2014
## @noparams
#set($containerManagerClass = $content.class.forName('com.atlassian.spring.container.ContainerManager'))
#set($getInstanceMethod = $containerManagerClass.getDeclaredMethod('getInstance',null))
#set($containerManager = $getInstanceMethod.invoke(null,null))
#set($containerContext = $containerManager.containerContext)
#set($macroBrowserManager = $containerContext.getComponent('macroBrowserManager'))
#set($allMacros = $macroBrowserManager.getMacroSummaries())
#########################################################################################
## This is used for getting around velocity issues when writing jQuery. ##
#########################################################################################
#set( $d = '$' )
#########################################################################################
## Populate the macro information into a string that we will use as a JS object array. ##
#########################################################################################
#set ($i = 0)
#set($macroObjects = "")
#foreach($macro in $allMacros)
#if($i != 0)
#set($macroObjects = $macroObjects + ",")
#end
#set($macroObjects = $macroObjects + "{title:'" + $macro.getTitle().getKey().replace("'","\'") + "', name:'" + $macro.getMacroName().replace("'","\'") + "'}")
#set ($i = $i + 1)
#end
<script type="text/javascript">
var queue = {
macros: [$macroObjects],
current: 0,
start: function () {
this.macros.sort(compare);
this.current = 0;
this.next();
},
next: function () {
if (this.current >= this.macros.length) {
AJS.$('#queryStatus span').removeClass('aui-lozenge-current');
AJS.$('#queryStatus span').addClass('aui-lozenge-success');
AJS.$('#queryStatus span').text('Report Complete');
AJS.tablessortable.setTableSortable(AJS.$('#macroUsageReport table'));
return null;
}
else {
this.current += 1;
lookupMacro(this.macros[this.current - 1]);
}
}
};
function lookupMacro(macro) {
var html = '';
var searchURL = '';
AJS.$('#queryStatus span').text('Getting counts for macro: ' + macro.title);
searchURL = AJS.params.baseUrl + '/rest/searchv3/1.0/search?where=conf_all&spaceSearch=true&queryString=macroName:' + encodeURIComponent(macro.name);
AJS.${d}.ajax(
{
type: 'GET',
url: searchURL,
dataType: "json",
success: function(data) {
if(data.total > 0) {
var spaces = '';
for(var i = 0; i < data.results.length; i++)
{
if(spaces.indexOf(data.results[i].searchResultContainer.name) == -1)
{
spaces = spaces == '' ? '' : spaces + ', ';
spaces = spaces + data.results[i].searchResultContainer.name;
}
}
html = '<tr>';
html += ' <td class="confluenceTd">' + macro.title + '</td>';
html += ' <td class="confluenceTd">' + macro.name + '</td>';
html += ' <td class="confluenceTd">' + data.total + '</td>';
html += ' <td class="confluenceTd">' + spaces + '</td>';
html += ' <td class="confluenceTd"><a href="' + AJS.params.baseUrl + '/dosearchsite.action?where=conf_all&spaceSearch=true&queryString=macroName:' + encodeURIComponent(macro.name) + '" target="_blank">macro usage</a></td>';
html += '</tr>';
}
AJS.$('#macroUsageReport table tbody').append(html);
queue.next();
},
error: function (x, y, z) {
AJS.$('#queryStatus span').removeClass('aui-lozenge-current');
AJS.$('#queryStatus span').addClass('aui-lozenge-error');
AJS.$('#queryStatus span').text('Error getting counts for macro:' + macro.title);
}
}
);
}
function compare(a, b) {
if (a.title < b.title) {
return -1;
}
if (a.title > b.title) {
return 1;
}
return 0;
}
AJS.toInit(function(){
queue.start();
});
</script>
<div id="queryStatus">
<span class="status-macro aui-lozenge aui-lozenge-current"></span>
</div>
<div id="macroUsageReport">
<table class="confluenceTable">
<thead>
<tr>
<th>Macro Title</th>
<th>Macro Name</th>
<th>Times Used</th>
<th>Spaces Used In</th>
<th>Pages Used On</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
Hi Davin,
Thank you for sharing. Is that all you have to do as it didn't work for me. All I see is the code on the page? I am on Confluence 5.5.3.
Thanks
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You have to make a user macro out of it. Go to Confluence Admin -> User Macros to set it up. Then just put the macro on the page you want once you have created it.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Thanks so much David. Works perfectly. Sorry I'm a beginner. Just one final question, is it ok to have the macro on a page as it builds the report each time the page is loaded, or am I better off instructing staff to see a list of all add ons, install the macro and then run it? ie: does it do any damage having the macro on the page building the report each time? Thanks again
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
It doesn't hurt to put it on a page and have it run each time.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Yes and no. You can go into the database and do a sql query for the macro content but some add ons will add in event listeners, other servlets etc which you wouldn't be able to do that for. Take a look at https://answers.atlassian.com/questions/59203 for more details.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.