<html><body><p><font size="+1"><strong>Package org.eclipse.wst.xsl.debugger</strong></font></p><hr><h2><font size="-1"><strong>org.eclipse.wst.xsl.debugger</strong></font><br>
               Class DebugRunner</h2><br><hr><pre>public class <strong>DebugRunner</strong>
extends java.lang.Object</pre>The entry point to the debug process which is responsible for configuring a debugger 
 and then communicating with the Eclipse process via sockets using a common set of commands.
 
 <ul>
 <li>instantiates an implementation of <code>IXSLDebugger</code>
 <li>configures the debugger with the transformation pipeline
 <li>starts the debugger in a separate thread
 <li>the main thread is then used to listen to incoming requests and call the appropriate debugger methods
 </ul><p></p><hr><table width="100%" border="1"><tr bgcolor="#CCCCFF"><td width="100%"><h2>Constructor Summary</h2></td></tr><tr><td><code><strong><a href="#con_DebugRunner">DebugRunner</a></strong>(java.io.BufferedReader requestIn
         ,
      java.io.PrintWriter requestOut
         ,
      java.io.PrintWriter eventOut)</code></td></tr><tr><td><code><strong><a href="#con_DebugRunner">DebugRunner</a></strong>(int requestPort
         ,
      int eventPort)</code></td></tr></table><br><table width="100%" border="1"><tr cols="2" bgcolor="#CCCCFF"><td colspan="2" width="100%"><h2>Method Summary</h2></td></tr><tr valign="top"><td width="20%" align="right"><code>public void</code></td><td width="" align="left"><code><a href="#method_dispose">dispose</a>()</code><br>
               &nbsp;&nbsp;&nbsp;&nbsp;
               Dispose of this - close all open sockets.</td></tr><tr valign="top"><td width="20%" align="right"><code>public void</code></td><td width="" align="left"><code><a href="#method_loop">loop</a>(org.eclipse.wst.xsl.debugger.IXSLDebugger debugger)</code><br>
               &nbsp;&nbsp;&nbsp;&nbsp;
               This method starts the given debugger in its own thread, and blocks while waiting 
 for incoming requests from the request port, until there are no more requests.</td></tr><tr valign="top"><td width="20%" align="right"><code>public static void</code></td><td width="" align="left"><code><a href="#method_main">main</a>(java.lang.String[] args)</code><br>
               &nbsp;&nbsp;&nbsp;&nbsp;
               Expected arguments:
 
 <ol>
 <li>the class name of the invoker
 <li>the file name of the XML launch configuration file
 <li>the URL of the source document
 <li>the file of the output document
 <li>not used (anything)
 <li>the class name of the <code>IXSLDebugger</code> instance
 <li>the port used for requests
 <li>the port used for debug events
 </ol></td></tr></table><hr><table cols="2" width="100%" border="1"><tr colspan="2" width="100%" bgcolor="#CCCCFF" align="left"><td><h2>
                  Constructor Detail
               </h2></td></tr></table><h2><a name="con_DebugRunner">DebugRunner</a></h2><p><code>public <strong>DebugRunner</strong>(java.io.BufferedReader requestIn
         ,
      java.io.PrintWriter requestOut
         ,
      java.io.PrintWriter eventOut)</code></p><p>Create a new instance of this using the supplied readers and writers.</p><hr><h2><a name="con_DebugRunner">DebugRunner</a></h2><p><code>public <strong>DebugRunner</strong>(int requestPort
         ,
      int eventPort)</code></p><p>Create a new instance of this given a request port and an event port.</p><hr><table cols="2" width="100%" border="1"><tr colspan="2" width="100%" bgcolor="#CCCCFF" align="left"><td><h2>
                  Methods Detail
               </h2></td></tr></table><h2><a name="method_dispose">dispose</a></h2><p><code>public void <strong>dispose</strong>()</code></p><p>Dispose of this - close all open sockets.</p><hr><h2><a name="method_loop">loop</a></h2><p><code>public void <strong>loop</strong>(org.eclipse.wst.xsl.debugger.IXSLDebugger debugger)</code></p><p>This method starts the given debugger in its own thread, and blocks while waiting 
 for incoming requests from the request port, until there are no more requests.</p><h3>Parameters</h3><p><code>debugger</code> - the debugger to start in a thread</p><h3>Throws:</h3><p><code>org.eclipse.wst.xsl.invoker.TransformationException - if a problem occurred while transforming</code></p><hr><h2><a name="method_main">main</a></h2><p><code>public void <strong>main</strong>(java.lang.String[] args)</code></p><p>Expected arguments:
 
 <ol>
 <li>the class name of the invoker
 <li>the file name of the XML launch configuration file
 <li>the URL of the source document
 <li>the file of the output document
 <li>not used (anything)
 <li>the class name of the <code>IXSLDebugger</code> instance
 <li>the port used for requests
 <li>the port used for debug events
 </ol></p><h3>Parameters</h3><p><code>args</code></p><hr></body></html>