Moved here from helma.xmlrpc package which has been replaced by org.apache.xmlrpc
This commit is contained in:
parent
016ed7a0f5
commit
e59c848a11
1 changed files with 140 additions and 0 deletions
140
src/helma/scripting/fesi/extensions/XmlRpcExtension.java
Normal file
140
src/helma/scripting/fesi/extensions/XmlRpcExtension.java
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
// XmlRpcExtension.java
|
||||||
|
// Copyright (c) Hannes Wallnöfer, 1999 - All rights reserved
|
||||||
|
|
||||||
|
package helma.scripting.fesi.extensions;
|
||||||
|
|
||||||
|
import org.apache.xmlrpc.*;
|
||||||
|
|
||||||
|
import helma.scripting.fesi.FesiEvaluator;
|
||||||
|
|
||||||
|
import FESI.Interpreter.*;
|
||||||
|
import FESI.Exceptions.*;
|
||||||
|
import FESI.Extensions.*;
|
||||||
|
import FESI.Data.*;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.net.*;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An extension to transparently call and serve XML-RPC from the
|
||||||
|
* <a href=http://home.worldcom.ch/jmlugrin/fesi/>FESI EcmaScript</a> interpreter.
|
||||||
|
* The extension adds constructors for XML-RPC clients and servers to the Global Object.
|
||||||
|
* For more information on how to use this please look at the files <tt>server.es</tt> and
|
||||||
|
* <tt>client.es</tt> in the src/fesi directory of the distribution.
|
||||||
|
*
|
||||||
|
* All argument conversion is done automatically. Currently the following argument and return
|
||||||
|
* types are supported:
|
||||||
|
* <ul>
|
||||||
|
* <li> plain objects (with all properties returned by ESObject.getProperties ())
|
||||||
|
* <li> arrays
|
||||||
|
* <li> strings
|
||||||
|
* <li> date objects
|
||||||
|
* <li> booleans
|
||||||
|
* <li> integer and float numbers (long values are not supported!)
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class XmlRpcExtension extends Extension {
|
||||||
|
|
||||||
|
Evaluator evaluator;
|
||||||
|
ESObject op;
|
||||||
|
|
||||||
|
public void initializeExtension (Evaluator evaluator) throws EcmaScriptException {
|
||||||
|
// XmlRpc.setDebug (true);
|
||||||
|
this.evaluator = evaluator;
|
||||||
|
GlobalObject go = evaluator.getGlobalObject();
|
||||||
|
FunctionPrototype fp = (FunctionPrototype) evaluator.getFunctionPrototype();
|
||||||
|
|
||||||
|
op = evaluator.getObjectPrototype();
|
||||||
|
|
||||||
|
go.putHiddenProperty ("Remote", new GlobalObjectRemote ("Remote", evaluator, fp)); // the Remote constructor
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class GlobalObjectRemote extends BuiltinFunctionObject {
|
||||||
|
|
||||||
|
GlobalObjectRemote (String name, Evaluator evaluator, FunctionPrototype fp) {
|
||||||
|
super(fp, evaluator, name, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ESValue callFunction(ESObject thisObject, ESValue[] arguments) throws EcmaScriptException {
|
||||||
|
return doConstruct(thisObject, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ESObject doConstruct(ESObject thisObject, ESValue[] arguments) throws EcmaScriptException {
|
||||||
|
ESObject remote = null;
|
||||||
|
String url = null;
|
||||||
|
String robj = null;
|
||||||
|
if (arguments.length >= 1)
|
||||||
|
url = arguments[0].toString ();
|
||||||
|
if (arguments.length >= 2)
|
||||||
|
robj = arguments[1].toString ();
|
||||||
|
try {
|
||||||
|
remote = new ESRemote (op, this.evaluator, url, robj);
|
||||||
|
} catch (MalformedURLException x) {
|
||||||
|
throw new EcmaScriptException (x.toString ());
|
||||||
|
}
|
||||||
|
return remote;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ESRemote extends ObjectPrototype {
|
||||||
|
|
||||||
|
URL url;
|
||||||
|
String remoteObject;
|
||||||
|
|
||||||
|
public ESRemote (ESObject prototype, Evaluator evaluator, String urlstring, String robj) throws MalformedURLException {
|
||||||
|
super (prototype, evaluator);
|
||||||
|
this.url = new URL (urlstring);
|
||||||
|
remoteObject = robj;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ESRemote (ESObject prototype, Evaluator evaluator, URL url, String robj) {
|
||||||
|
super (prototype, evaluator);
|
||||||
|
this.url = url;
|
||||||
|
remoteObject = robj;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ESValue doIndirectCall(Evaluator evaluator, ESObject target, String functionName, ESValue arguments[])
|
||||||
|
throws EcmaScriptException, NoSuchMethodException {
|
||||||
|
// System.out.println ("doIndirectCall called with "+functionName);
|
||||||
|
XmlRpcClient client = new XmlRpcClient (url);
|
||||||
|
// long now = System.currentTimeMillis ();
|
||||||
|
Object retval = null;
|
||||||
|
int l = arguments.length;
|
||||||
|
Vector v = new Vector ();
|
||||||
|
for (int i=0; i<l; i++) {
|
||||||
|
Object arg = FesiEvaluator.processXmlRpcResponse (arguments[i]);
|
||||||
|
// System.out.println ("converted to J: "+arg.getClass ());
|
||||||
|
v.addElement (arg);
|
||||||
|
}
|
||||||
|
// System.out.println ("spent "+(System.currentTimeMillis ()-now)+" millis in argument conversion");
|
||||||
|
ESObject esretval = ObjectObject.createObject (evaluator);
|
||||||
|
try {
|
||||||
|
String method = remoteObject == null ? functionName : remoteObject+"."+functionName;
|
||||||
|
retval = client.execute (method, v);
|
||||||
|
esretval.putProperty ("error", ESNull.theNull, "error".hashCode());
|
||||||
|
esretval.putProperty ("result", FesiEvaluator.processXmlRpcArgument (retval, evaluator), "result".hashCode());
|
||||||
|
} catch (Exception x) {
|
||||||
|
String msg = x.getMessage();
|
||||||
|
if (msg == null || msg.length() == 0)
|
||||||
|
msg = x.toString ();
|
||||||
|
esretval.putProperty ("error", new ESString(msg), "error".hashCode());
|
||||||
|
esretval.putProperty ("result", ESNull.theNull, "result".hashCode());
|
||||||
|
}
|
||||||
|
return esretval;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ESValue getProperty (String name, int hash) throws EcmaScriptException {
|
||||||
|
ESValue sprop = super.getProperty (name, hash);
|
||||||
|
if (sprop != ESUndefined.theUndefined && sprop != ESNull.theNull)
|
||||||
|
return sprop;
|
||||||
|
String newRemoteObject = remoteObject == null ? name : remoteObject+"."+name;
|
||||||
|
return new ESRemote (op, this.evaluator, url, newRemoteObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue