Confluence Macro plugin - How to pass parameter to my Macro?

Hi,

I don’t get how to pass parameters to my confluence Macro plugin. Any help or link to tutorial explaining that?

Below my actual impl of the Macro interface in where I’d like to grab parameters. Where and How shall I define these parameters? in an .xml files of the plugin or anywhere else?

package org.iter.plugins.macropoc.confluence;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import com.atlassian.confluence.content.render.xhtml.ConversionContext;
import com.atlassian.confluence.macro.Macro;
import com.atlassian.confluence.macro.MacroExecutionException;

import com.atlassian.confluence.xhtml.api.XhtmlContent;
import com.atlassian.plugin.spring.scanner.annotation.component.Scanned;
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
import com.atlassian.renderer.v2.RenderMode;

import java.util.ArrayList;
import java.util.List;

import com.atlassian.confluence.content.render.xhtml.XhtmlException;
import com.atlassian.confluence.xhtml.api.MacroDefinition;
import com.atlassian.confluence.xhtml.api.MacroDefinitionHandler;

@Scanned
public class MyMacroPoc implements Macro {

	private final XhtmlContent xhtmlUtils;
	
	@Autowired
	public MyMacroPoc(@ComponentImport XhtmlContent xhtmlUtils) 
	{
	    this.xhtmlUtils = xhtmlUtils;   
	}

	@Override
	public String execute(Map<String, String> parameters, String bodyContent, ConversionContext conversionContext)
			throws MacroExecutionException {
		final List<MacroDefinition> macros = new ArrayList<MacroDefinition>();
		String body = conversionContext.getEntity().getBodyAsString();
		
		try
		{
		    xhtmlUtils.handleMacroDefinitions(body, conversionContext, new MacroDefinitionHandler()
		    {
		        public void handle(MacroDefinition macroDefinition)
		        {
		            macros.add(macroDefinition);
		        }
		    });
		}
		catch (XhtmlException e)
		{
		    throw new MacroExecutionException(e);
		}
		
		StringBuilder builder = new StringBuilder();
		builder.append("<script type='text/javascript'>\r\n");
		builder.append("alert(' ws API url in parameter: ");
		builder.append(parameters.get("0"));
		builder.append("');\r\n");
		builder.append("function updateCarsData(){\r\n");
		builder.append("var jsonString = '{\"IsSuccess\":true,\"Message\":\"Data retrieved successfully. Timestamp:7 25 2018 3:30:12 PM from ITER B72\",\"Data\":{\"Cars\":[{\"Name\":\"Shuttle car # 1\",\"CurrentStatus\":\"Awaiting\",\"CurrentPosition\":\"In Use\",\"LastPosition\":\"ITER B81\",\"CurrentUser\":\"De Temmerman Gregory\",\"LastUser\":null,\"LastEvent\":\"Date(1532523222000+0200)\",\"BookingNotes\":null,\"LastEventAge\":2252,\"IsBooked\":false},{\"Name\":\"Shuttle car # 3\",\"CurrentStatus\":\"Awaiting\",\"CurrentPosition\":\"In Use\",\"LastPosition\":\"ITER B72\",\"CurrentUser\":\"Parmar Darshankumar\",\"LastUser\":null,\"LastEvent\":\"Date(1532525257000+0200)\",\"BookingNotes\":null,\"LastEventAge\":217,\"IsBooked\":false},{\"Name\":\"Shuttle car # 2\",\"CurrentStatus\":\"Parked\",\"CurrentPosition\":\"ITER B72\",\"LastPosition\":\"ITER B81\",\"CurrentUser\":null,\"LastUser\":\"Appel Gregory\",\"LastEvent\":\"Date(1532525415000+0200)\",\"BookingNotes\":null,\"LastEventAge\":59,\"IsBooked\":false},{\"Name\":\"Shuttle car # 4\",\"CurrentStatus\":\"Parked\",\"CurrentPosition\":\"ITER B81\",\"LastPosition\":\"ITER B72\",\"CurrentUser\":null,\"LastUser\":\"Appel Gregory\",\"LastEvent\":\"Date(1532524266000+0200)\",\"BookingNotes\":null,\"LastEventAge\":1208,\"IsBooked\":false}],\"DataAge\":62,\"DataTimestamp\":\"Date(1532525412000+0200)\",\"NumberOfCars\":4}}'\r\n");
		builder.append("alert(' update by pulling data from Shuttle Cars API');\r\n");
		builder.append("var carsDOM = $('<div>Shuttle Cars</div>');\r\n");
		builder.append("carsDOM.appendTo('#shuttle-cont');\r\n");
		builder.append("var carsData = jQuery.parseJSON(jsonString);\r\n");
		builder.append("carsData.Data.Cars.forEach( function(element, index, array) {\r\n");
		builder.append("var car = element;\r\n");
		builder.append("car.Id = element.Name.replace( 'Shuttle car # ', '' );\r\n");
		builder.append("car.Position = element.CurrentPosition.replace( 'ITER B', '' );\r\n");
		builder.append("car.Status = element.CurrentStatus;\r\n");
		builder.append("car.IsBooked = element.IsBooked;\r\n");
		builder.append("car.BookingNotes = element.BookingNotes;\r\n");
		builder.append("carsDOM.append('<li class=\"shuttle-car\"><h2> ' + car.Id + '</h2><p> Position: ' + car.Position + ' </p><p> Status: ' + car.Status + ' </p><p> IsBooked: ' + car.IsBooked + ' </p><p> Notes: ' + car.BookingNotes + ' </p></li>');\r\n");
		builder.append("alert(' car info: ' + car.Id + ', ' + car.Position + ', ' + car.Status + ', ' + car.IsBooked + ', ' + car.BookingNotes);\r\n");
		builder.append("} );\r\n");
		builder.append("}\r\n");
		builder.append("$(document).ready(function(){\r\n");
		//builder.append("AJS.$.ajax({\r\n");
		//builder.append(" url: \"https://portal.iter.org/pre-buzz/api/com/rest/car/status\",\r\n");
		//builder.append("type: \"GET\",\r\n");
		//builder.append("contentType: \"application/json\",\r\n");
		//builder.append("  success: function(data){\r\n"); 
		//builder.append("    alert('got the json result: ' + data);\r\n");
		//builder.append("  }\r\n });");
		builder.append("setInterval(function(){updateCarsData();}, 60000)\r\n");
		builder.append("});\r\n");
		builder.append("</script>\r\n");
		builder.append("<div id='shuttle-cont'>\r\n");
		builder.append("<p>Macro POC + AJS.ajax</p>\r\n");
		builder.append("</div>\r\n");
		/*if (!macros.isEmpty())
		{
		    builder.append("<table width=\"50%\">");
		    builder.append("<tr><th>Macro Name</th><th>Has Body?</th></tr>");
		    for (MacroDefinition defn : macros)
		    {
		        builder.append("<tr>");
		        builder.append("<td>").append(defn.getName()).append("</td><td>").append(defn.hasBody()).append("</td>");
		        builder.append("</tr>");
		    }
		    builder.append("</table>");
		}
		else
		{
		    builder.append("You've done built yourself a macro! Nice work.");
		}*/
		
		builder.append("</p>");

		return builder.toString();
	}
	
	public boolean hasBody()
    {
        return true;
    }
	
	 public RenderMode getBodyRenderMode()
	 {
	    return RenderMode.ALL;
	 }

	@Override
	public BodyType getBodyType() {
		return BodyType.RICH_TEXT;
	}

	@Override
	public OutputType getOutputType() {
		return OutputType.BLOCK;
	}

}

Regards,

Parameters are defined in the atlassian-plugin.xml inside the xhtml-macro element.

https://developer.atlassian.com/server/framework/atlassian-sdk/create-a-confluence-hello-world-macro/

1 Like