The dispatch generator is available in the src/org/mitre/cvw/dispatch directory within Mudsy ZIP . I have enclosed MCPDispatch documentation as an attachment.
Richard Godard fixed the negotiation code in Mudsy. The patch will appear in Mudsy 0.6 ZIP very soon.
John
Title: MCPDispatch Documentation
Usage: java org.mitre.cvw.dispatch.MCPDispatch
prefix-file [method-spec-file]
MCPDispatch helps automate the creation of a Java object which interprets MCP messages. The input to this program consists of two files. The first file, called the prefix file, is an unfinished Java class definition. The second file is a method specification file. MCPDispatch parses the method specification file, copies the first file to its output, and then completes the Java class definition by generating Java methods which process the MCP messages.
A method specification file has an entry for
each request to be processed. An entry is syntactially similar to a
Java method definition. An entry to handle the
display-url
request
#$#display-url AUTH url: URL [target: TARGET]might look like:
// MCP message: #$#display-url AUTH url: URL [target: TARGET] display_url(String url, String target @null@) throws MalformedURLException { URL u = new URL(url); if (target == null) getAppletContext().showDocument(u); else getAppletContext().showDocument(u, target); } @@@The method specification invokes
showDocument
in response
to a display-url
request. It assumes the prefix file
defines a class which inherits from java.applet.Applet.
MCP requests and keywords are symbols, which may contain hyphens but not dollar signs. When generating a symbol from a Java identifier, underscores are translated into hyphens and then dollar signs are translated into underscore. To specify a symbol separately from the Java identifier, follow the identifier by a colon and the symbol.
// MCP message: #$#class AUTH throws: THROW-LIST aClass:class(String thr:throws) { ShowWhatYouGot(thr); } private void ShowWhatYouGot(String str) { System.out.println("Got class with throws = " + thr); } @@@
There are two types of MCP message parameters, required and optional. Optional parameters have an at-sign delimited default value which is used when an optional parameter is missing. The absence of a required parameter in an MCP message causes an exception to be thrown instead of executing the associated method.
Data types other than strings can be handled if the prefix file
contains the appropriate converters. Converter names are constructed
by prefixing "string2
" to the name of the type. Suggested
converters for int
's and boolean
's follows.
private static int string2int(String str) throws NumberFormatException { return Integer.parseInt(str); }
private static boolean string2boolean(String str) { return ((str != null) && str.toLowerCase().equals("true")); }They allow method specifications such as:
message(String s, int i, boolean b) { ... } @@@
Arrays can also be handled. Array converter names are constructed by
suffixing "_array
" to the converter name for the type of
the array's elements. Converters for arrays of strings and integers
follow.
/** * Breaks a string into an array of strings. * A space character marks a breaking point. */ private static String[] string2String_array(String str) { Vector v = new Vector(); int s = 0; // s is the start index while (s < str.length()) { if (str.charAt(s) == ' ') s++; else { int e = str.indexOf(' ', s); // e is the end index if (e < 0) { v.addElement(str.substring(s)); break; } v.addElement(str.substring(s, e)); s = e + 1; } } String[] str_array = new String[v.size()]; v.copyInto(str_array); return str_array; }
private static int[] string2int_array(String str) { String[] str_array = string2String_array(str); int[] int_array = new int[str_array.length]; for (int i = 0; i < str_array.length; i++) int_array[i] = string2int(str_array[i]); return int_array; }They allow method specifications such as:
message2(String s[], int i[]) { ... } @@@
If the method to be used to process a message is defined in the prefix file, the body in the method specification file can be replaced by a semicolon to suppress the generation of a method.
message3(String s);
The input syntax accepted by MCPDispatch is:
input ::= ( method )* method ::= method-name "(" args ")" ( ";" | body ) method-name ::= name name ::= ident ( ":" symbol )? args ::= | arg ( "," arg )* arg ::= type parameter ( code )? type ::= ident ( "[]" )? parameter ::= name code ::= "@" any text without at-sign "@" body ::= "{" any text "\n@@@" | "throws" any text "\n@@@" ident ::= alpha ( jalpha )* symbol ::= alpha ( xalpha )* alpha ::= ["a"-"z"] | ["A" - "Z"] jalpha ::= alpha | ["0"-"9"] | "_" | "$" xalpha ::= alpha | ["0"-"9"] | "_" | "-"John D. Ramsdell