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 <code>XmlRpcMethod</code> object is a wrapper for a method of an
027: * {@link XmlRpcObject} object
028: *
029: * @author Rob Clark (rob@ti.com)
030: */
031: public class XmlRpcMethod extends Value {
032: /**
033: * The type object for an instance of XmlRpcMethod.
034: */
035: public final static Value TYPE = BuiltinType
036: .makeBuiltinType("oscript.data.XmlRpcMethod");
037: public final static String PARENT_TYPE_NAME = "oscript.data.OObject";
038: public final static String TYPE_NAME = "XmlRpcMethod";
039: public final static String[] MEMBER_NAMES = new String[] {
040: "getType", "castToString", "bopInstanceOf", "bopEquals",
041: "bopNotEquals", "callAsFunction" };
042:
043: /**
044: * The actual client object used to access the XML-RPC server.
045: */
046: private org.apache.xmlrpc.XmlRpcClient client;
047:
048: /**
049: * The name of the object
050: */
051: private String objectName;
052:
053: /**
054: * The name of the method
055: */
056: private String methodName;
057:
058: /**
059: * Class Constructor.
060: *
061: * @param client the XmlRpcClient object used to access the server
062: * @param objectName the object name
063: * @param methodName the name of the method of the named object
064: */
065: XmlRpcMethod(org.apache.xmlrpc.XmlRpcClient client,
066: String objectName, String methodName) {
067: super ();
068:
069: this .client = client;
070: this .objectName = objectName;
071: this .methodName = methodName;
072: }
073:
074: /**
075: * For benefit of <code>BuiltinType</code>... always throws an exception because
076: * script code should not be allowed to directly create an instance...
077: *
078: * @param args arguments to this constructor
079: * @throws PackagedScriptObjectException(Exception) if wrong number of args
080: */
081: public XmlRpcMethod(oscript.util.MemberTable args) {
082: throw PackagedScriptObjectException
083: .makeExceptionWrapper(new OIllegalArgumentException(
084: "wrong number of args!"));
085: }
086:
087: /**
088: * Get the type of this object. The returned type doesn't have to take
089: * into account the possibility of a script type extending a built-in
090: * type, since that is handled by {@link #getType}.
091: *
092: * @return the object's type
093: */
094: protected Value getTypeImpl() {
095: return TYPE;
096: }
097:
098: /* XXX should re-implement bopEquals/bopNotEquals/equals/hashCode to do the
099: * right thing... two instances that are wrapping the same method should
100: * appear to be equals()
101: */
102:
103: /**
104: * Call this object as a function.
105: *
106: * @param sf the current stack frame
107: * @param args the arguments to the function, or <code>null</code> if none
108: * @return the value returned by the function
109: * @throws PackagedScriptObjectException
110: */
111: public Value callAsFunction(oscript.util.StackFrame sf,
112: oscript.util.MemberTable args)
113: throws PackagedScriptObjectException {
114: if (DEBUG)
115: System.err.println("XML-RPC call: client=" + client
116: + ", objectName=" + objectName + ", methodName="
117: + methodName);
118:
119: try {
120: return XmlRpc.convertXmlRpcToScript(client.execute(
121: objectName + "." + methodName, XmlRpc
122: .convertScriptToXmlRpcArgs(args)));
123: } catch (java.io.IOException e) {
124: if (DEBUG)
125: e.printStackTrace();
126: throw OJavaException.makeJavaExceptionWrapper(e);
127: } catch (org.apache.xmlrpc.XmlRpcException e) {
128: if (DEBUG)
129: e.printStackTrace();
130: throw OJavaException.makeJavaExceptionWrapper(e);
131: }
132: }
133: }
134:
135: /*
136: * Local Variables:
137: * tab-width: 2
138: * indent-tabs-mode: nil
139: * mode: java
140: * c-indentation-style: java
141: * c-basic-offset: 2
142: * eval: (c-set-offset 'substatement-open '0)
143: * eval: (c-set-offset 'case-label '+)
144: * eval: (c-set-offset 'inclass '+)
145: * eval: (c-set-offset 'inline-open '0)
146: * End:
147: */
|