001: /*=============================================================================
002: * Copyright Texas Instruments 2003-2004. All Rights Reserved.
003: *
004: * This program is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This program is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: * $ProjectHeader: OSCRIPT 0.155 Fri, 20 Dec 2002 18:34:22 -0800 rclark $
019: */
020:
021: package oscript.data;
022:
023: import oscript.exceptions.*;
024:
025: /**
026: * An XML-RPC handler that can wrap an arbitrary script object, for
027: * serving that object via XML-RPC. For convenience this can start it's
028: * own web server, if you use the {@link #startWebServer} method, or you
029: * can create multiple handler objects and add them to a server that
030: * you create.
031: * <pre>
032: * // stand-alone mode:
033: * (new XmlRpcHandler(adder)).startWebServer( "adder", 12345 );
034: *
035: * // adding multiple handlers to a single server:
036: * var server = new org.apache.xmlrpc.WebServer(12345);
037: * server.addHandler( "adder", new XmlRpcHandler(adder) );
038: * server.addHandler( "multiplier", new XmlRpcHandler(multipler) );
039: * ... etc ...
040: * </pre>
041: *
042: * @author Rob Clark (rob@ti.com)
043: */
044: public class XmlRpcHandler extends OObject implements
045: org.apache.xmlrpc.XmlRpcHandler {
046: /**
047: * The type object for an instance of XmlRpcHandler.
048: */
049: public final static Value TYPE = BuiltinType
050: .makeBuiltinType("oscript.data.XmlRpcHandler");
051: public final static String PARENT_TYPE_NAME = "oscript.data.OObject";
052: public final static String TYPE_NAME = "XmlRpcHandler";
053: public final static String[] MEMBER_NAMES = new String[] { "startWebServer" };
054:
055: /**
056: * The script object that this handler is a wrapper for... remote invocations
057: * on this handler are delegated to this object.
058: */
059: private Value obj;
060:
061: public static void init() {
062: oscript.OscriptInterpreter.getGlobalScope().createMember(
063: "XmlRpcHandler", 0).opAssign(TYPE);
064: }
065:
066: /*=======================================================================*/
067: /**
068: * Class Constructor.
069: *
070: * @param obj the server object
071: */
072: public XmlRpcHandler(Value obj) {
073: super ();
074:
075: this .obj = obj;
076: }
077:
078: /*=======================================================================*/
079: /**
080: * Class Constructor. This is the constructor that gets called via an
081: * BuiltinType instance.
082: *
083: * @param args arguments to this constructor
084: * @throws PackagedScriptObjectException(Exception) if wrong number of args
085: */
086: public XmlRpcHandler(oscript.util.MemberTable args) {
087: this (argsToValue(args));
088: }
089:
090: private final static Value argsToValue(oscript.util.MemberTable args) {
091: if (args.length() != 1)
092: throw PackagedScriptObjectException
093: .makeExceptionWrapper(new OIllegalArgumentException(
094: "wrong number of args!"));
095:
096: return args.referenceAt(0);
097: }
098:
099: /*=======================================================================*/
100: /**
101: * Get the type of this object. The returned type doesn't have to take
102: * into account the possibility of a script type extending a built-in
103: * type, since that is handled by {@link #getType}.
104: *
105: * @return the object's type
106: */
107: protected Value getTypeImpl() {
108: return TYPE;
109: }
110:
111: /*=======================================================================*/
112: /**
113: * A convenience method for creating and initializing a web server to
114: * serve just this object. Methods of this object will be callable
115: * remotely as <code>name.methodName</code>
116: *
117: * @param name the object name.
118: * @param port the port number that the server will listen
119: * for new connections on
120: */
121: public void startWebServer(String name, int port) {
122: (new org.apache.xmlrpc.WebServer(port)).addHandler(name, this );
123: }
124:
125: /*=======================================================================*/
126: /**
127: * Execute the specified method.
128: *
129: * @param name the method name
130: * @param params the parameters to the method
131: * @return the result
132: */
133: public Object execute(String name, java.util.Vector params) {
134: name = name.substring(name.indexOf('.') + 1); // XXX
135: if (DEBUG)
136: System.err.println("XML-RPC execute: name=" + name);
137: return XmlRpc.convertScriptToXmlRpc(obj.getMember(name)
138: .callAsFunction(
139: XmlRpc.convertXmlRpcToScriptArgs(params)));
140: }
141: }
142:
143: /*
144: * Local Variables:
145: * tab-width: 2
146: * indent-tabs-mode: nil
147: * mode: java
148: * c-indentation-style: java
149: * c-basic-offset: 2
150: * eval: (c-set-offset 'substatement-open '0)
151: * eval: (c-set-offset 'case-label '+)
152: * eval: (c-set-offset 'inclass '+)
153: * eval: (c-set-offset 'inline-open '0)
154: * End:
155: */
|