JSoarPrinting - soartech/jsoar GitHub Wiki
See also:
Introduction
The agent trace/printing system in JSoar is significantly different (not necessarily better) from SML. In SML, anything the agent (or the kernel) writes out triggers a print callback. In JSoar, you register a java.io.Writer with the agent's Printer.
Printer
The printer Printer is accessible through the Agent.getPrinter()
(or ThreadedAgent.getPrinter()
) method. Though it's usually used internally by the agent to print information to the debugger trace, you can use it as well to print your own messages to the trace. It supported the usual printf formatting:
agent.getPrinter().startNewLine().spaces(10).print("Hello, %s", "World");
This will print a newline (if not already at the start of line), print 10 spaces, and then "Hello, World".
As mentioned above, writers are used to customize the output destination of the printer. A Writer
can be registered with the Printer
in two ways. The first
method is to register a persistent writer:
agent.getPrinter().addPersistentWriter(new OutputStreamWriter(System.out));
// Now all agent output (modulo trace settings) will be written
// to stdout.
If you wanted to log output to a file:
final Writer logger = new BufferedWriter(new FileWriter("soar.log"));
agent.getPrinter().addPersistentWriter(logger);
// Now all agent output (modulo trace settings) will be written
// to "soar.log"
A persistent writer receives all agent output regardless of any writers that have been pushed on the writer stack (see below).
The second method is the writer stack. The top writer on the stack always receives agent output. Pushing a new writer on the stack will cause output to go to the new writer until it is popped:
// Push a temporary writer
final StringWriter temp = new StringWriter();
agent.getPrinter().pushWriter(temp);
// ... run agent or use the printer directlyr ...
agent.getPrinter().print("Hello");
// Pop the temporary writer
agent.getPrinter().popWriter();
// Do something with the captured output...
System.out.println("Agent said: " + temp);
By default, no persistent or stack writers are installed on new agents so you won't see any output
The printer is buffered so it may be necessary to call agent.getPrinter().flush()
to force output to writers.
Trace
The agent Trace is a facade around the
Printer
which implements the trace output control settings associated
with the watch
command. The trace defines a number of output categories which can be controller with the Trace.setEnabled()
method.
Trace
has the same print
methods as Printer
, exception that they take an additional Category
parameter used for filtering:
agent.getTrace().print(Category.VERBOSE, "HI!");
In this case, "HI!" will only be printed when the agent is in verbose mode, e.g. verbose --on
.