How to pass parameters to my custom Macro

Julien Brachet July 31, 2018

Hi,

I try to get how to pass to my custom Macro some parameters defined when including this macro to my confluence page.

 

Any help? tutorial to read please?

 

Below the code of a POC macro from where I try to get parameters but what is missing to define those parameters somewhere? Thank you.

 

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("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;
}

}

 

1 answer

0 votes
Julien Brachet August 3, 2018

Any help please?

Suggest an answer

Log in or Sign up to answer
TAGS
AUG Leaders

Atlassian Community Events