CgiServerDemo.java
01 package com.flat502.rox.demo;
02 
03 import java.net.InetAddress;
04 import java.util.Iterator;
05 import java.util.List;
06 
07 import com.flat502.rox.http.HttpConstants;
08 import com.flat502.rox.marshal.RpcCall;
09 import com.flat502.rox.marshal.RpcResponse;
10 import com.flat502.rox.marshal.xmlrpc.XmlRpcMethodResponse;
11 import com.flat502.rox.server.*;
12 
13 /**
14  * A demo synchronous server illustrating the 
15  {@link com.flat502.rox.server.HttpRpcServer#registerRequestUnmarshaller(String, HttpRequestUnmarshaller)}
16  * method.
17  */
18 public class CgiServerDemo implements SynchronousRequestHandler {
19   public RpcResponse handleRequest(RpcCall call, RpcCallContext contextthrows Exception {
20     Object[] params = call.getParameters();
21     System.out.println("Method [" + call.getName() "] called with "
22         + params.length + " parameters");
23     for (int i = 0; i < params.length; i++) {
24       System.out.println("   Param " (i + 1" [" + params[i"]");
25     }
26 
27     if (call.getName().equals("example.getDate")) {
28       return new XmlRpcMethodResponse(new TimeInfo());
29     else if (call.getName().equals("example.sum")) {
30       Integer sum = new Integer(sum((List)call.getParameters()[0]));
31       return new XmlRpcMethodResponse(sum);
32     else if (call.getName().equals("example.getInfo")) {
33       throw new NoSuchMethodException();
34     }
35     throw new NoSuchMethodException();
36   }
37   
38   private int sum(List list) {
39     int total = 0;
40     Iterator i = list.iterator();
41     while (i.hasNext()) {
42       total += ((Integeri.next()).intValue();
43     }
44     return total;
45   }
46 
47   /**
48    * Start an instance of this demo server.
49    <p>
50    * The following XML-RPC methods are supported by
51    * this server:
52    <ul>
53    <li>{@link RMIServerInterface#sum(int[]) rmi.sum}</li>
54    <li>{@link RMIServerInterface#getDate() rmi.getDate}</li>
55    <li>{@link RMIServerInterface#getVersionInfo(boolean) rmi.getVersion}</li>
56    </ul>
57    @param args
58    *   A list of parameters indicating
59    *   the <code>host/address</code> and
60    *   <code>port</code> to bind to. These default to 
61    *   <code>localhost</code> and <code>8080</code> if
62    *   not specified.
63    */
64   public static void main(String[] args) {
65     try {
66       String host = "localhost";
67       int port = 8080;
68 
69       if (args != null && args.length > 0) {
70         host = args[0];
71         if (args.length > 1) {
72           port = Integer.parseInt(args[1]);
73         }
74       }
75       System.out.println("Starting server on " + host + ":" + port);
76 
77       XmlRpcServer server = new XmlRpcServer(InetAddress.getByName(host), port);
78       
79       // Vive Le Difference!
80       server.registerRequestUnmarshaller(HttpConstants.Methods.GET, new CgiRequestUnmarshaller());
81       
82       server.registerHandler(null, "^example\\."new CgiServerDemo());
83       server.start();
84     catch (Exception e) {
85       e.printStackTrace();
86     }
87   }
88 }