Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,8 @@ public Object childEvaluate(
return MapTool.getParser().getMacroName();

} else if (functionName.equalsIgnoreCase("getMacroLocation")) {
return MapTool.getParser().getMacroSource().getLocation();

var source = MapTool.getParser().getMacroSource();
return source.getCallableLocation();
} else if (functionName.equalsIgnoreCase("setMacroCommand")) {
FunctionUtil.checkNumberParam(functionName, parameters, 2, 4);
FunctionUtil.blockUntrustedMacro(functionName);
Expand Down
72 changes: 58 additions & 14 deletions src/main/java/net/rptools/maptool/client/macro/MacroLocation.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ public class MacroLocation {
/** The URI of the macro, if applicable. */
@Nullable private final URI uri;

/** The token associated with this macro, if applicable. */
@Nullable private final Token token;

/** MacroLocationFactory used to create locations during parsing. */
private static final MacroLocationFactory factory = MacroLocationFactory.getInstance();

Expand All @@ -65,16 +68,30 @@ public class MacroLocation {
* @param source the source of the macro.
* @param location the location of the macro.
* @param uri the URI of the macro, if applicable.
* @param token the associated token, if applicable.
*/
MacroLocation(
@Nonnull String name,
@Nonnull MacroSource source,
@Nonnull String location,
@Nullable URI uri) {
@Nullable URI uri,
@Nullable Token token) {
this.name = name;
this.source = source;
this.location = location;
this.uri = uri;
this.token = token;
}

/**
* Creates a new MacroLocation with the given name and source.
*
* @param name the name of the macro.
* @param source the source of the macro.
* @param location the location of the macro.
*/
MacroLocation(@Nonnull String name, @Nonnull MacroSource source, @Nonnull String location) {
this(name, source, location, null, null);
}

/** Enumeration to represent the source of the macro. */
Expand Down Expand Up @@ -148,7 +165,7 @@ public boolean allowsAtThis() {
*
* @param qMacroName the qualified macro name to parse.
* @param calledFrom the location that called this macro, if applicable.
* @param token the token that called this macro, if applicable.
* @param token the token for this macro, if applicable.
* @return a MacroLocation object representing the parsed macro name.
*/
public static MacroLocation parseMacroName(
Expand All @@ -159,24 +176,21 @@ public static MacroLocation parseMacroName(
return new MacroLocation(
qMacroName.substring(0, qMacroName.indexOf("@")),
MacroSource.campaign,
MacroSource.campaign.getSourceName(),
null);
MacroSource.campaign.getSourceName());
}

if (qMacroNameLower.contains("@gm")) {
return new MacroLocation(
qMacroName.substring(0, qMacroName.indexOf("@")),
MacroSource.gm,
MacroSource.gm.getSourceName(),
null);
MacroSource.gm.getSourceName());
}

if (qMacroNameLower.contains("@global")) {
return new MacroLocation(
qMacroName.substring(0, qMacroName.indexOf("@")),
MacroSource.global,
MacroSource.global.getSourceName(),
null);
MacroSource.global.getSourceName());
}

if (qMacroNameLower.contains("@token")) {
Expand All @@ -187,13 +201,14 @@ public static MacroLocation parseMacroName(
qMacroName.substring(0, qMacroName.indexOf("@")),
MacroSource.token,
token.getName(),
null);
null,
token);
}

if (qMacroNameLower.contains("@lib:")) {
String libName = qMacroName.substring(qMacroName.indexOf("@") + 1);
return new MacroLocation(
qMacroName.substring(0, qMacroName.indexOf("@")), MacroSource.library, libName, null);
String macroName = qMacroName.substring(0, qMacroName.indexOf("@"));
String namespace = qMacroName.replaceFirst("^[^@]*@(?i)lib:", "");
return new MacroLocation(macroName, MacroSource.library, namespace, null, token);
}

if (qMacroNameLower.contains("@this")) {
Expand All @@ -207,7 +222,7 @@ public static MacroLocation parseMacroName(
return factory.createUnknownLocation(qMacroName);
}
}
return new MacroLocation(name, cfrom.getSource(), cfrom.getLocation(), null);
return new MacroLocation(name, cfrom.getSource(), cfrom.getLocation(), null, token);
}

// If none of the above then assume it is a URI
Expand All @@ -230,7 +245,7 @@ public static MacroLocation parseMacroName(
return factory.createUnknownLocation(qMacroName);
}

return new MacroLocation(uri.getPath().substring(1), MacroSource.uri, uri.getHost(), uri);
return new MacroLocation(uri.getPath().substring(1), MacroSource.uri, uri.getHost(), uri, null);
}

/**
Expand Down Expand Up @@ -269,6 +284,31 @@ public URI getUri() {
return uri;
}

/**
* Returns the token associated with this macro, if applicable.
*
* @return the token associated with this macro, or null if not applicable.
*/
public Token getToken() {
return token;
}

/**
* Returns the location of the macro that can be called from macro code using the '@' syntax.
*
* @return the location of the macro that can be called from other macros.
*/
@Nonnull
public String getCallableLocation() {
if (source == MacroSource.token) {
return "Token:" + location;
} else if (source == MacroSource.library) {
return token != null ? token.getName() : location;
} else {
return location;
}
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Expand All @@ -282,6 +322,10 @@ public String toString() {
sb.append(", uri='");
sb.append(uri);
}
if (token != null) {
sb.append(", token='");
sb.append(token.getName());
}
sb.append("'}");

return sb.toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public static MacroLocationFactory getInstance() {
* @return a new {@link MacroLocation} object for an unknown location.
*/
public MacroLocation createUnknownLocation(@Nonnull String name) {
return new MacroLocation(name, MacroSource.unknown, "", null);
return new MacroLocation(name, MacroSource.unknown, "");
}

/**
Expand All @@ -59,7 +59,7 @@ public MacroLocation createUnknownLocation(@Nonnull String name) {
* @return a new {@link MacroLocation} object for a global Panel.
*/
public MacroLocation createGlobalLocation(@Nonnull String name) {
return new MacroLocation(name, MacroSource.global, MacroSource.global.getSourceName(), null);
return new MacroLocation(name, MacroSource.global, MacroSource.global.getSourceName());
}

/**
Expand All @@ -69,8 +69,7 @@ public MacroLocation createGlobalLocation(@Nonnull String name) {
* @return a new {@link MacroLocation} object for a campaign Panel.
*/
public MacroLocation createCampaignLocation(@Nonnull String name) {
return new MacroLocation(
name, MacroSource.campaign, MacroSource.campaign.getSourceName(), null);
return new MacroLocation(name, MacroSource.campaign, MacroSource.campaign.getSourceName());
}

/**
Expand All @@ -81,18 +80,7 @@ public MacroLocation createCampaignLocation(@Nonnull String name) {
* @return a new {@link MacroLocation} object for a token.
*/
public MacroLocation createTokenLocation(@Nonnull String name, @Nonnull Token token) {
return createTokenLocation(name, token.getName());
}

/**
* Creates a new {@link MacroLocation} object for a token.
*
* @param name the name of the macro.
* @param tokenName the name of the token associated with the macro.
* @return a new {@link MacroLocation} object for a token.
*/
public MacroLocation createTokenLocation(@Nonnull String name, @Nonnull String tokenName) {
return new MacroLocation(name, MacroSource.token, tokenName, null);
return new MacroLocation(name, MacroSource.token, token.getName(), null, token);
}

/**
Expand All @@ -103,18 +91,8 @@ public MacroLocation createTokenLocation(@Nonnull String name, @Nonnull String t
* @return a new {@link MacroLocation} object for a library token.
*/
public MacroLocation createLibTokenLocation(@Nonnull String name, @Nonnull Token libToken) {
return createLibTokenLocation(name, libToken.getName());
}

/**
* Creates a new {@link MacroLocation} object for a library token.
*
* @param name the name of the macro.
* @param libTokenName the name of the library token associated with the macro.
* @return a new {@link MacroLocation} object for a library token.
*/
public MacroLocation createLibTokenLocation(@Nonnull String name, @Nonnull String libTokenName) {
return new MacroLocation(name, MacroSource.library, libTokenName.substring(4), null);
return new MacroLocation(
name, MacroSource.library, libToken.getName().substring(4), null, libToken);
}

/**
Expand All @@ -124,7 +102,7 @@ public MacroLocation createLibTokenLocation(@Nonnull String name, @Nonnull Strin
* @return a new {@link MacroLocation} object for a GM Panel.
*/
public MacroLocation createGmLocation(@Nonnull String name) {
return new MacroLocation(name, MacroSource.gm, MacroSource.gm.getSourceName(), null);
return new MacroLocation(name, MacroSource.gm, MacroSource.gm.getSourceName());
}

/**
Expand All @@ -135,7 +113,7 @@ public MacroLocation createGmLocation(@Nonnull String name) {
*/
public MacroLocation createExecFunctionLocation(@Nonnull String functionName) {
return new MacroLocation(
MacroSource.execFunction.getSourceName(), MacroSource.execFunction, functionName, null);
MacroSource.execFunction.getSourceName(), MacroSource.execFunction, functionName);
}

/**
Expand All @@ -148,8 +126,7 @@ public MacroLocation createMacroLinkLocation(@Nonnull String name) {
return new MacroLocation(
MacroSource.macroLink.getSourceName(),
MacroSource.macroLink,
MacroSource.macroLink.getSourceName(),
null);
MacroSource.macroLink.getSourceName());
}

/**
Expand All @@ -159,15 +136,14 @@ public MacroLocation createMacroLinkLocation(@Nonnull String name) {
* @return a new {@link MacroLocation} object for an event.
*/
public MacroLocation createEventLocation(@Nonnull String name) {
return new MacroLocation(MacroSource.event.getSourceName(), MacroSource.event, name, null);
return new MacroLocation(MacroSource.event.getSourceName(), MacroSource.event, name);
}

public MacroLocation createSentryIoLoggingLocation() {
return new MacroLocation(
MacroSource.sentryIoLogging.getSourceName(),
MacroSource.sentryIoLogging,
MacroSource.sentryIoLogging.getSourceName(),
null);
MacroSource.sentryIoLogging.getSourceName());
}

/**
Expand All @@ -186,7 +162,7 @@ public MacroLocation createUriLocation(@Nonnull String name, @Nullable URI calle
}
uri = calledFrom.resolve(uri);
}
return new MacroLocation(uri.getPath(), MacroSource.uri, uri.getHost(), uri);
return new MacroLocation(uri.getPath(), MacroSource.uri, uri.getHost(), uri, null);
} catch (URISyntaxException e) {
return createUnknownLocation(name);
}
Expand All @@ -195,12 +171,12 @@ public MacroLocation createUriLocation(@Nonnull String name, @Nullable URI calle
/**
* Creates a new {@link MacroLocation} object for the chat box.
*
* @param token the token associated with the the chat box.
* @param token the token associated with the chat box.
* @return a new {@link MacroLocation} object for a the chat box.
*/
public MacroLocation createChatLocation() {
return new MacroLocation(
MacroSource.chat.getSourceName(), MacroSource.chat, MacroSource.chat.getSourceName(), null);
MacroSource.chat.getSourceName(), MacroSource.chat, MacroSource.chat.getSourceName());
}

/**
Expand All @@ -214,6 +190,7 @@ public MacroLocation createToolTipLocation(@Nullable Token token) {
MacroSource.tooltip.getSourceName(),
MacroSource.tooltip,
token != null ? token.getName() : "",
null);
null,
token);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,12 @@ void testCreateTokenLocation() {

@Test
void testCreateLibTokenLocation() {
MacroLocation location = factory.createLibTokenLocation("libMacro", "lib:TokenName");
Token mockToken = Mockito.mock(Token.class);
Mockito.when(mockToken.getName()).thenReturn("lib:libToken");
MacroLocation location = factory.createLibTokenLocation("libMacro", mockToken);
assertEquals("libMacro", location.getName());
assertEquals(MacroLocation.MacroSource.library, location.getSource());
assertEquals("TokenName", location.getLocation());
assertEquals("libToken", location.getLocation());
assertNull(location.getUri());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ void testParseNameLibToken() {
MacroLocation location = MacroLocation.parseMacroName("test@lib:libName", null, null);
assertEquals("test", location.getName());
assertEquals(MacroLocation.MacroSource.library, location.getSource());
assertEquals("lib:libName", location.getLocation());
assertEquals("libName", location.getLocation());
assertNull(location.getUri());
}

Expand Down Expand Up @@ -158,7 +158,7 @@ void testParseLibTokenAtThis() {
MacroLocation location = MacroLocation.parseMacroName("test@this", caller, null);
assertEquals("test", location.getName());
assertEquals(MacroLocation.MacroSource.library, location.getSource());
assertEquals("lib:libName", location.getLocation());
assertEquals("libName", location.getLocation());
assertNull(location.getUri());
}

Expand All @@ -183,4 +183,43 @@ void testParseInvalidAtThis() {
assertEquals("", location.getLocation());
assertNull(location.getUri());
}

@Test
void testTokenGetCallableLocation() {
Token mockToken = Mockito.mock(Token.class);
Mockito.when(mockToken.getName()).thenReturn("mockToken");
MacroLocation location = MacroLocation.parseMacroName("test@token", null, mockToken);
assertEquals("Token:mockToken", location.getCallableLocation());
}

@Test
void testCampaignGetCallableLocation() {
MacroLocation location = MacroLocation.parseMacroName("test@campaign", null, null);
assertEquals("campaign", location.getCallableLocation());
}

@Test
void testGmGetCallableLocation() {
MacroLocation location = MacroLocation.parseMacroName("test@gm", null, null);
assertEquals("gm", location.getCallableLocation());
}

@Test
void testGlobalGetCallableLocation() {
MacroLocation location = MacroLocation.parseMacroName("test@global", null, null);
assertEquals("global", location.getCallableLocation());
}

@Test
void testLibGetCallableLocation() {
Token mockToken = Mockito.mock(Token.class);
Mockito.when(mockToken.getName()).thenReturn("Lib:TestToken");
MacroLocation location = MacroLocation.parseMacroName("test@Lib:TestToken", null, mockToken);
assertEquals("Lib:TestToken", location.getCallableLocation());

Token mockToken2 = Mockito.mock(Token.class);
Mockito.when(mockToken2.getName()).thenReturn("lib:TestToken");
MacroLocation location2 = MacroLocation.parseMacroName("test@lib:TestToken", null, mockToken2);
assertEquals("lib:TestToken", location2.getCallableLocation());
}
}