- Allow the debugger client to attach arbitrary data to the Breakpoint, that it will get back with the suspension event. This could be the source java.io.File for example.
- DebugBreak doesn't extract the template name from the Breakpoint anymore, but uses the actual template name (they should b the same anyway). This is how it was earlier too.
diff --git a/src/main/java/freemarker/core/DebugBreak.java b/src/main/java/freemarker/core/DebugBreak.java
index c1c22b7..1de26f5 100644
--- a/src/main/java/freemarker/core/DebugBreak.java
+++ b/src/main/java/freemarker/core/DebugBreak.java
@@ -53,8 +53,8 @@
package freemarker.core;
import java.io.IOException;
+import java.io.Serializable;
-import freemarker.debug.Breakpoint;
import freemarker.debug.DebuggerService;
import freemarker.template.TemplateException;
@@ -64,21 +64,20 @@
public class DebugBreak extends TemplateElement
{
private final DebuggerService debuggerService;
- private final String templateName;
+ private final Serializable data;
- public DebugBreak(TemplateElement nestedBlock, DebuggerService debuggerService, Breakpoint breakpoint)
+ public DebugBreak(TemplateElement nestedBlock, DebuggerService debuggerService, Serializable data)
{
this.nestedBlock = nestedBlock;
nestedBlock.parent = this;
copyLocationFrom(nestedBlock);
this.debuggerService = debuggerService;
-
- this.templateName = breakpoint.getTemplateName();
+ this.data = data;
}
protected void accept(Environment env) throws TemplateException, IOException
{
- if(!debuggerService.suspendEnvironment(env, templateName, nestedBlock.getBeginLine()))
+ if(!debuggerService.suspendEnvironment(env, getTemplate().getName(), nestedBlock.getBeginLine(), data))
{
nestedBlock.accept(env);
}
diff --git a/src/main/java/freemarker/debug/Breakpoint.java b/src/main/java/freemarker/debug/Breakpoint.java
index d54e910..d12c7cc 100644
--- a/src/main/java/freemarker/debug/Breakpoint.java
+++ b/src/main/java/freemarker/debug/Breakpoint.java
@@ -64,16 +64,28 @@
private final String templateName;
private final int line;
+ private final Serializable data;
+
+ public Breakpoint(String templateName, int line) {
+ this(templateName, line, null);
+ }
/**
* Creates a new breakpoint.
* @param templateName the name of the template
* @param line the line number in the template where to put the breakpoint
+ * @param data arbitrary data attached to this breakpoint, that the debugger client will get back with the
+ * suspension event. As this data will travel back and forth between the client and server, <b>it has to be
+ * de-serializable on the server</b>. Also, it shouldn't be very big serialized, as it will be possibly sent
+ * through network. So if the data is big or might not be de-serializable on another JVM (missing classes),
+ * the client should just use an identifier as data (like a {@link Long}) with which later it can get
+ * the actual data that's only stored on the client.
*/
- public Breakpoint(String templateName, int line)
+ public Breakpoint(String templateName, int line, Serializable data)
{
this.templateName = templateName;
this.line = line;
+ this.data = data;
}
/**
@@ -83,6 +95,7 @@
{
return line;
}
+
/**
* Returns the template name of the breakpoint
*/
@@ -91,6 +104,14 @@
return templateName;
}
+ /**
+ * Returns the arbitrary data attached to this breakpoint.
+ */
+ public Serializable getData()
+ {
+ return data;
+ }
+
public int hashCode()
{
return templateName.hashCode() + 31 * line;
diff --git a/src/main/java/freemarker/debug/DebuggerService.java b/src/main/java/freemarker/debug/DebuggerService.java
index 0236f18..dd9a344 100644
--- a/src/main/java/freemarker/debug/DebuggerService.java
+++ b/src/main/java/freemarker/debug/DebuggerService.java
@@ -52,6 +52,7 @@
package freemarker.debug;
+import java.io.Serializable;
import java.rmi.RemoteException;
import freemarker.core.Environment;
@@ -71,7 +72,7 @@
void removeBreakpoint(Breakpoint breakpoint);
- boolean suspendEnvironment(Environment env, String templateName, int line) throws
+ boolean suspendEnvironment(Environment env, String templateName, int line, Serializable data) throws
RemoteException;
void registerTemplate(Template template);
diff --git a/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java b/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
index 360bb66..b9bc2cc 100644
--- a/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
+++ b/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
@@ -1,5 +1,6 @@
package freemarker.debug;
+import java.io.Serializable;
import java.util.EventObject;
/**
@@ -13,13 +14,15 @@
private final String name;
private final int line;
+ private final Serializable data;
private final DebuggedEnvironment env;
- public EnvironmentSuspendedEvent(Object source, String templateName, int line, DebuggedEnvironment env)
+ public EnvironmentSuspendedEvent(Object source, String templateName, int line, Serializable data, DebuggedEnvironment env)
{
super(source);
this.name = templateName;
this.line = line;
+ this.data = data;
this.env = env;
}
@@ -42,6 +45,14 @@
{
return line;
}
+
+ /**
+ * Returns the arbitrary data that the debugger clients has attached to the {@link Breakpoint};
+ * possibly {@code null}.
+ */
+ public Serializable getData() {
+ return data;
+ }
/**
* The environment that was suspended
diff --git a/src/main/java/freemarker/debug/impl/AbstractDebuggerService.java b/src/main/java/freemarker/debug/impl/AbstractDebuggerService.java
index c16dd98..0c55cb4 100644
--- a/src/main/java/freemarker/debug/impl/AbstractDebuggerService.java
+++ b/src/main/java/freemarker/debug/impl/AbstractDebuggerService.java
@@ -52,6 +52,7 @@
package freemarker.debug.impl;
+import java.io.Serializable;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.rmi.RemoteException;
@@ -110,7 +111,7 @@
return sumlist;
}
- public boolean suspendEnvironment(Environment env, String templateName, int line)
+ public boolean suspendEnvironment(Environment env, String templateName, int line, Serializable data)
throws
RemoteException
{
@@ -125,7 +126,7 @@
try
{
EnvironmentSuspendedEvent breakpointEvent =
- new EnvironmentSuspendedEvent(this, templateName, line, denv);
+ new EnvironmentSuspendedEvent(this, templateName, line, data, denv);
synchronized(listeners)
{
@@ -235,7 +236,7 @@
return;
}
TemplateElement parent = (TemplateElement)te.getParent();
- DebugBreak db = new DebugBreak(te, this, breakpoint);
+ DebugBreak db = new DebugBreak(te, this, breakpoint.getData());
// TODO: Ensure there always is a parent by making sure
// that the root element in the template is always a MixedContent
// Also make sure it doesn't conflict with anyone's code.