Remove Fesi scripting engine from Trunk
This commit is contained in:
parent
d4b8b3c2af
commit
bfc1b8914d
16 changed files with 0 additions and 6877 deletions
|
@ -1,98 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi;
|
|
||||||
|
|
||||||
import FESI.Data.ESNull;
|
|
||||||
import FESI.Data.ESValue;
|
|
||||||
import FESI.Data.ESWrapper;
|
|
||||||
import FESI.Exceptions.EcmaScriptException;
|
|
||||||
import FESI.Interpreter.Evaluator;
|
|
||||||
import helma.framework.core.ApplicationBean;
|
|
||||||
import helma.objectmodel.INode;
|
|
||||||
import helma.util.SystemProperties;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrap a Java Bean for use in EcmaScript.
|
|
||||||
*/
|
|
||||||
public class ESBeanWrapper extends ESWrapper {
|
|
||||||
FesiEngine engine;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new ESBeanWrapper object.
|
|
||||||
*
|
|
||||||
* @param object ...
|
|
||||||
* @param engine ...
|
|
||||||
*/
|
|
||||||
public ESBeanWrapper(Object object, FesiEngine engine) {
|
|
||||||
super(object, engine.getEvaluator(), true);
|
|
||||||
this.engine = engine;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrap getProperty, return ESNode if INode would be returned,
|
|
||||||
* ESMapWrapper if Map would be returned.
|
|
||||||
*/
|
|
||||||
public ESValue getProperty(String propertyName, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
try {
|
|
||||||
ESValue val = super.getProperty(propertyName, hash);
|
|
||||||
|
|
||||||
if (val instanceof ESWrapper) {
|
|
||||||
Object theObject = ((ESWrapper) val).getJavaObject();
|
|
||||||
|
|
||||||
if (val instanceof ESWrapper && theObject instanceof INode) {
|
|
||||||
return engine.getNodeWrapper((INode) theObject);
|
|
||||||
} else if (val instanceof ESWrapper && theObject instanceof Map) {
|
|
||||||
ESMapWrapper wrapper = new ESMapWrapper(engine, (Map) theObject);
|
|
||||||
|
|
||||||
if (theObject instanceof SystemProperties &&
|
|
||||||
super.getJavaObject() instanceof ApplicationBean) {
|
|
||||||
wrapper.setReadonly(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return wrapper;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return val;
|
|
||||||
} catch (Exception rte) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param propertyValue ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public void putProperty(String propertyName, ESValue propertyValue, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
try {
|
|
||||||
super.putProperty(propertyName, propertyValue, hash);
|
|
||||||
} catch (Exception rte) {
|
|
||||||
// create a nice error message
|
|
||||||
throw new EcmaScriptException("can't set property " + propertyName +
|
|
||||||
" to this value on " +
|
|
||||||
getJavaObject().toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,236 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi;
|
|
||||||
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Interpreter.*;
|
|
||||||
import helma.framework.IPathElement;
|
|
||||||
import helma.framework.core.*;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A wrapper for a Java object that may or may not implement the IPathElement interface.
|
|
||||||
*/
|
|
||||||
public class ESGenericObject extends ObjectPrototype {
|
|
||||||
ESWrapper wrapper;
|
|
||||||
Object wrappedObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new ESGenericObject object.
|
|
||||||
*
|
|
||||||
* @param prototype ...
|
|
||||||
* @param evaluator ...
|
|
||||||
* @param obj ...
|
|
||||||
*/
|
|
||||||
public ESGenericObject(ESObject prototype, Evaluator evaluator, Object obj) {
|
|
||||||
super(prototype, evaluator);
|
|
||||||
wrappedObject = obj;
|
|
||||||
wrapper = new ESWrapper(obj, evaluator);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String getESClassName() {
|
|
||||||
return "GenericObject";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String toString() {
|
|
||||||
return wrappedObject.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String toDetailString() {
|
|
||||||
return wrapper.toDetailString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param propertyValue ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public void putProperty(String propertyName, ESValue propertyValue, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
wrapper.putProperty(propertyName, propertyValue, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public boolean hasProperty(String propertyName, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
return super.hasProperty(propertyName, hash) ||
|
|
||||||
wrapper.hasProperty(propertyName, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public boolean deleteProperty(String propertyName, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
return wrapper.deleteProperty(propertyName, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param i ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public ESValue getProperty(int i) throws EcmaScriptException {
|
|
||||||
return wrapper.getProperty(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param index ...
|
|
||||||
* @param propertyValue ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public void putProperty(int index, ESValue propertyValue)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
wrapper.putProperty(index, propertyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public ESValue getProperty(String propertyName, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESValue val = super.getProperty(propertyName, hash);
|
|
||||||
|
|
||||||
if ((val == null) || (val == ESUndefined.theUndefined)) {
|
|
||||||
val = wrapper.getProperty(propertyName, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param evaluator ...
|
|
||||||
* @param thisObject ...
|
|
||||||
* @param functionName ...
|
|
||||||
* @param arguments ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
* @throws NoSuchMethodException ...
|
|
||||||
*/
|
|
||||||
public ESValue doIndirectCall(Evaluator evaluator, ESObject thisObject,
|
|
||||||
String functionName, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException, NoSuchMethodException {
|
|
||||||
if (super.hasProperty(functionName, functionName.hashCode())) {
|
|
||||||
return super.doIndirectCall(evaluator, thisObject, functionName, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
return wrapper.doIndirectCall(evaluator, thisObject, functionName, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public Enumeration getAllProperties() {
|
|
||||||
return wrapper.getProperties();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public Enumeration getProperties() {
|
|
||||||
return wrapper.getProperties();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public Object toJavaObject() {
|
|
||||||
return wrappedObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An ESNode equals another object if it is an ESNode that wraps the same INode
|
|
||||||
* or the wrapped INode itself. FIXME: doesen't check dbmapping/type!
|
|
||||||
*/
|
|
||||||
public boolean equals(Object what) {
|
|
||||||
if (what == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (what == this) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (what instanceof ESGenericObject) {
|
|
||||||
ESGenericObject other = (ESGenericObject) what;
|
|
||||||
|
|
||||||
return (wrappedObject.equals(other.wrappedObject));
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,189 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi;
|
|
||||||
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Interpreter.Evaluator;
|
|
||||||
import helma.framework.core.*;
|
|
||||||
import helma.objectmodel.INode;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An EcmaScript object that makes stuff in a hashtable accessible as its properties
|
|
||||||
*/
|
|
||||||
public class ESMapWrapper extends ESWrapper {
|
|
||||||
private Map data;
|
|
||||||
private FesiEngine engine;
|
|
||||||
private boolean readonly = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new ESMapWrapper object.
|
|
||||||
*
|
|
||||||
* @param engine ...
|
|
||||||
*/
|
|
||||||
public ESMapWrapper(FesiEngine engine) {
|
|
||||||
super(new Object(), engine.getEvaluator());
|
|
||||||
this.engine = engine;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new ESMapWrapper object.
|
|
||||||
*
|
|
||||||
* @param engine ...
|
|
||||||
* @param data ...
|
|
||||||
*/
|
|
||||||
public ESMapWrapper(FesiEngine engine, Map data) {
|
|
||||||
super(new Object(), engine.getEvaluator());
|
|
||||||
this.engine = engine;
|
|
||||||
this.data = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param readonly ...
|
|
||||||
*/
|
|
||||||
public void setReadonly(boolean readonly) {
|
|
||||||
this.readonly = readonly;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param data ...
|
|
||||||
*/
|
|
||||||
public void setData(Map data) {
|
|
||||||
this.data = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overridden to make the object read-only
|
|
||||||
*/
|
|
||||||
public void putProperty(String propertyName, ESValue propertyValue, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if (data == null) {
|
|
||||||
data = new HashMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (propertyValue == ESNull.theNull) {
|
|
||||||
deleteProperty(propertyName, hash);
|
|
||||||
} else if (readonly == false) {
|
|
||||||
data.put(propertyName, propertyValue.toJavaObject());
|
|
||||||
} else {
|
|
||||||
throw new EcmaScriptException("object is readonly");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public boolean deleteProperty(String propertyName, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if (readonly == false) {
|
|
||||||
data.remove(propertyName);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public ESValue getProperty(String propertyName, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if (data == null) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
}
|
|
||||||
|
|
||||||
Object val = data.get(propertyName);
|
|
||||||
|
|
||||||
if (val == null) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (val instanceof String) {
|
|
||||||
return new ESString((String) val);
|
|
||||||
} else if (val instanceof INode) {
|
|
||||||
return engine.getNodeWrapper((INode) val);
|
|
||||||
} else if (val instanceof Map) {
|
|
||||||
return new ESMapWrapper(engine, (Map) val);
|
|
||||||
} else if (val instanceof ESValue) {
|
|
||||||
return (ESValue) val;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESLoader.normalizeValue(val, evaluator);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public Enumeration getAllProperties() {
|
|
||||||
return getProperties();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public Enumeration getProperties() {
|
|
||||||
Object[] keys = (data == null) ? null : data.keySet().toArray();
|
|
||||||
|
|
||||||
return new Enum(keys);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Enum implements Enumeration {
|
|
||||||
Object[] elements;
|
|
||||||
int pos;
|
|
||||||
|
|
||||||
Enum(Object[] elements) {
|
|
||||||
this.elements = elements;
|
|
||||||
pos = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasMoreElements() {
|
|
||||||
return (elements != null) && (pos < elements.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object nextElement() {
|
|
||||||
if ((elements == null) || (pos >= elements.length)) {
|
|
||||||
throw new NoSuchElementException();
|
|
||||||
}
|
|
||||||
|
|
||||||
return elements[pos++];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,795 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi;
|
|
||||||
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Interpreter.*;
|
|
||||||
import helma.framework.core.*;
|
|
||||||
import helma.objectmodel.*;
|
|
||||||
import helma.objectmodel.db.*;
|
|
||||||
import helma.util.*;
|
|
||||||
import java.io.*;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An EcmaScript wrapper around a Node object. This is the basic
|
|
||||||
* HopObject that can be stored in the internal or external databases.
|
|
||||||
*/
|
|
||||||
public class ESNode extends ObjectPrototype {
|
|
||||||
// the INode object wrapped by this ESObject
|
|
||||||
INode node;
|
|
||||||
|
|
||||||
// the cache node - persistent nodes have a transient property as a commodity to
|
|
||||||
// store temporary stuff.
|
|
||||||
INode cache;
|
|
||||||
|
|
||||||
// the ecmascript wrapper for the cache.
|
|
||||||
ESNode cacheWrapper;
|
|
||||||
|
|
||||||
// The handle of the wrapped Node. Makes ESNodes comparable without accessing the wrapped node.
|
|
||||||
NodeHandle handle;
|
|
||||||
DbMapping dbmap;
|
|
||||||
Throwable lastError = null;
|
|
||||||
FesiEngine engine;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor used to create transient cache nodes
|
|
||||||
*/
|
|
||||||
public ESNode(INode node, FesiEngine engine) {
|
|
||||||
super(engine.getPrototype("hopobject"), engine.getEvaluator());
|
|
||||||
this.engine = engine;
|
|
||||||
this.node = node;
|
|
||||||
cache = null;
|
|
||||||
cacheWrapper = null;
|
|
||||||
|
|
||||||
// this is a transient node, set node handle to null
|
|
||||||
handle = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new ESNode object.
|
|
||||||
*
|
|
||||||
* @param prototype ...
|
|
||||||
* @param evaluator ...
|
|
||||||
* @param obj ...
|
|
||||||
* @param engine ...
|
|
||||||
*/
|
|
||||||
public ESNode(ESObject prototype, Evaluator evaluator, Object obj, FesiEngine engine) {
|
|
||||||
super(prototype, evaluator);
|
|
||||||
|
|
||||||
// eval.app.logEvent ("in ESNode constructor: "+o.getClass ());
|
|
||||||
this.engine = engine;
|
|
||||||
|
|
||||||
if (obj == null) {
|
|
||||||
node = new TransientNode(null);
|
|
||||||
} else if (obj instanceof ESWrapper) {
|
|
||||||
node = (INode) ((ESWrapper) obj).getJavaObject();
|
|
||||||
} else if (obj instanceof INode) {
|
|
||||||
node = (INode) obj;
|
|
||||||
} else {
|
|
||||||
node = new TransientNode(obj.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// set node handle to wrapped node
|
|
||||||
if (node instanceof Node) {
|
|
||||||
handle = ((Node) node).getHandle();
|
|
||||||
} else {
|
|
||||||
handle = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// cache Node is initialized on demend when it is needed
|
|
||||||
cache = null;
|
|
||||||
cacheWrapper = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the node has been invalidated. If so, it has to be re-fetched
|
|
||||||
* from the db via the app's node manager.
|
|
||||||
*/
|
|
||||||
protected void checkNode() {
|
|
||||||
if (node.getState() == INode.INVALID) {
|
|
||||||
try {
|
|
||||||
node = handle.getNode(engine.app.getWrappedNodeManager());
|
|
||||||
} catch (Exception nx) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public INode getNode() {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param protoName ...
|
|
||||||
*/
|
|
||||||
public void setPrototype(String protoName) {
|
|
||||||
checkNode();
|
|
||||||
node.setPrototype(protoName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String getPrototypeName() {
|
|
||||||
return node.getPrototype();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String getESClassName() {
|
|
||||||
return "HopObject";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String toString() {
|
|
||||||
if (node == null) {
|
|
||||||
return "<null>";
|
|
||||||
}
|
|
||||||
|
|
||||||
return node.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String toDetailString() {
|
|
||||||
return "ES:[Object: builtin " + this.getClass().getName() + ":" +
|
|
||||||
((node == null) ? "null" : node.toString()) + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void setError(Throwable e) {
|
|
||||||
lastError = e;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param what ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public boolean add(ESValue[] what) {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
for (int i = 0; i < what.length; i++)
|
|
||||||
if (what[i] instanceof ESNode) {
|
|
||||||
ESNode esn = (ESNode) what[i];
|
|
||||||
INode added = node.addNode(esn.getNode());
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public ESValue list() {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
int l = node.numberOfNodes();
|
|
||||||
Enumeration e = node.getSubnodes();
|
|
||||||
ESObject ap = evaluator.getArrayPrototype();
|
|
||||||
ArrayPrototype theArray = new ArrayPrototype(ap, evaluator);
|
|
||||||
|
|
||||||
if (e != null) {
|
|
||||||
theArray.setSize(l);
|
|
||||||
|
|
||||||
for (int i = 0; i < l; i++) {
|
|
||||||
theArray.setElementAt(engine.getNodeWrapper((INode) e.nextElement()), i);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
theArray.setSize(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return theArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param what ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public boolean addAt(ESValue[] what) throws EcmaScriptException {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
if (what.length < 2) {
|
|
||||||
throw new EcmaScriptException("Wrong number of arguments");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(what[1] instanceof ESNode)) {
|
|
||||||
throw new EcmaScriptException("Can only add Node objects as subnodes");
|
|
||||||
}
|
|
||||||
|
|
||||||
ESNode esn = (ESNode) what[1];
|
|
||||||
INode added = node.addNode(esn.getNode(), (int) what[0].toInt32());
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove node itself or one or more subnodes.
|
|
||||||
*/
|
|
||||||
public boolean remove(ESValue[] args) {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
// semantics: if called without arguments, remove self.
|
|
||||||
// otherwise, remove given subnodes.
|
|
||||||
if (args.length == 0) {
|
|
||||||
return node.remove();
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < args.length; i++) {
|
|
||||||
if (args[i] instanceof ESNode) {
|
|
||||||
ESNode esn = (ESNode) args[i];
|
|
||||||
|
|
||||||
node.removeNode(esn.getNode());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invalidate the node itself or a subnode
|
|
||||||
*/
|
|
||||||
public boolean invalidate(ESValue[] args) {
|
|
||||||
if (node instanceof helma.objectmodel.db.Node) {
|
|
||||||
if (args.length == 0) {
|
|
||||||
((helma.objectmodel.db.Node) node).invalidate();
|
|
||||||
} else {
|
|
||||||
((helma.objectmodel.db.Node) node).invalidateNode(args[0].toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if node is contained in subnodes
|
|
||||||
*/
|
|
||||||
public int contains(ESValue[] args) {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
if ((args.length == 1) && args[0] instanceof ESNode) {
|
|
||||||
ESNode esn = (ESNode) args[0];
|
|
||||||
|
|
||||||
return node.contains(esn.getNode());
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prefetch child objects from (relational) database.
|
|
||||||
*/
|
|
||||||
public void prefetchChildren(ESValue[] args) throws Exception {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
if (!(node instanceof Node)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int start = 0;
|
|
||||||
int length = 0;
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (args.length == 0) {
|
|
||||||
start = 0;
|
|
||||||
length = 1000;
|
|
||||||
} else if (args.length == 2) {
|
|
||||||
if (args[0].isNumberValue()) {
|
|
||||||
start = args[0].toInt32();
|
|
||||||
} else {
|
|
||||||
throw new RuntimeException("Illegal argument in prefetchChildren: " +
|
|
||||||
args[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args[1].isNumberValue()) {
|
|
||||||
length = args[1].toInt32();
|
|
||||||
} else {
|
|
||||||
throw new RuntimeException("Illegal argument in prefetchChildren: " +
|
|
||||||
args[1]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new RuntimeException("Wrong number of arguments in prefetchChildren");
|
|
||||||
}
|
|
||||||
} catch (Exception x) {
|
|
||||||
throw new IllegalArgumentException(x.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
((Node) node).prefetchChildren(start, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param pval ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public boolean setParent(ESValue[] pval) {
|
|
||||||
// do a couple of checks: both nodes need to be persistent in order for setParent to make sense.
|
|
||||||
if (!(node instanceof helma.objectmodel.db.Node)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((pval == null) || (pval.length < 1) || (pval.length > 2)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(pval[0] instanceof ESNode)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ESNode esn = (ESNode) pval[0];
|
|
||||||
INode pn = esn.getNode();
|
|
||||||
|
|
||||||
if (!(pn instanceof helma.objectmodel.db.Node)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if there is an additional string element - if so, it's the property name by which the node is
|
|
||||||
// accessed, otherwise it will be accessed as anonymous subnode via its id
|
|
||||||
String propname = null;
|
|
||||||
|
|
||||||
if ((pval.length == 2) && (pval[1] != null) && !(pval[1] instanceof ESNull)) {
|
|
||||||
propname = pval[1].toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
helma.objectmodel.db.Node n = (helma.objectmodel.db.Node) node;
|
|
||||||
|
|
||||||
n.setParent((helma.objectmodel.db.Node) pn, propname);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param propertyValue ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public void putProperty(String propertyName, ESValue propertyValue, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
// engine.app.logEvent ("put property called: "+propertyName+", "+propertyValue.getClass());
|
|
||||||
if ("cache".equalsIgnoreCase(propertyName)) {
|
|
||||||
throw new EcmaScriptException("Can't modify read-only property \"" +
|
|
||||||
propertyName + "\".");
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("subnodeRelation".equalsIgnoreCase(propertyName)) {
|
|
||||||
node.setSubnodeRelation((propertyValue instanceof ESNull) ? null
|
|
||||||
: propertyValue.toString());
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if the property is write protected, i.e. the type.property file describes it as [readonly]
|
|
||||||
DbMapping dbm = node.getDbMapping();
|
|
||||||
|
|
||||||
if (dbm != null) {
|
|
||||||
Relation rel = dbm.getPropertyRelation(propertyName);
|
|
||||||
|
|
||||||
if ((rel != null) && rel.isReadonly()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (propertyValue instanceof ESNull || propertyValue instanceof ESUndefined) {
|
|
||||||
node.unset(propertyName);
|
|
||||||
} else if (propertyValue instanceof ESString) {
|
|
||||||
node.setString(propertyName, propertyValue.toString());
|
|
||||||
} else if (propertyValue instanceof ESBoolean) {
|
|
||||||
node.setBoolean(propertyName, propertyValue.booleanValue());
|
|
||||||
} else if (propertyValue instanceof ESNumber) {
|
|
||||||
node.setFloat(propertyName, propertyValue.doubleValue());
|
|
||||||
} else if (propertyValue instanceof DatePrototype) {
|
|
||||||
node.setDate(propertyName, (Date) propertyValue.toJavaObject());
|
|
||||||
} else if (propertyValue instanceof ESNode) {
|
|
||||||
// long now = System.currentTimeMillis ();
|
|
||||||
ESNode esn = (ESNode) propertyValue;
|
|
||||||
|
|
||||||
node.setNode(propertyName, esn.getNode());
|
|
||||||
|
|
||||||
// engine.app.logEvent ("*** spent "+(System.currentTimeMillis () - now)+" ms to set property "+propertyName);
|
|
||||||
} else {
|
|
||||||
// engine.app.logEvent ("got "+propertyValue.getClass ());
|
|
||||||
// A persistent node can't store anything other than the types above, so throw an exception
|
|
||||||
// throw new EcmaScriptException ("Can't set a JavaScript Object or Array as property of "+node);
|
|
||||||
node.setJavaObject(propertyName, propertyValue.toJavaObject());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public boolean deleteProperty(String propertyName, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
// engine.app.logEvent ("delete property called: "+propertyName);
|
|
||||||
if (node.get(propertyName) != null) {
|
|
||||||
node.unset(propertyName);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.deleteProperty(propertyName, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param i ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public ESValue getProperty(int i) throws EcmaScriptException {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
INode n = node.getSubnodeAt(i);
|
|
||||||
|
|
||||||
if (n == null) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
}
|
|
||||||
|
|
||||||
return engine.getNodeWrapper(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param index ...
|
|
||||||
* @param propertyValue ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public void putProperty(int index, ESValue propertyValue)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
if (propertyValue instanceof ESNode) {
|
|
||||||
ESNode n = (ESNode) propertyValue;
|
|
||||||
|
|
||||||
node.addNode(n.getNode(), index);
|
|
||||||
} else {
|
|
||||||
throw new EcmaScriptException("Can only add Nodes to Node arrays");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve a property from the node object or the underlying EcmaScript prototype.
|
|
||||||
* Normally we would first check the node object and then the prototype, but since
|
|
||||||
* node properties are potentially expensive to look up because they require database
|
|
||||||
* queries, we do the prototype lookup first. This usually doesn't cause any confusion
|
|
||||||
* because generally things are divided cleanly between prototype and object - the
|
|
||||||
* first holds the functions, the latter the mapped data properties.
|
|
||||||
*/
|
|
||||||
public ESValue getProperty(String propertyName, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
// engine.app.logEvent ("get property called: "+propertyName);
|
|
||||||
ESValue retval = super.getProperty(propertyName, hash);
|
|
||||||
|
|
||||||
if (!(retval instanceof ESUndefined)) {
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
return getNodeProperty(propertyName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve a property only from the node itself, not the underlying EcmaScript prototype object.
|
|
||||||
* This is called directly when we call get(x) on a hopobject, since we don't want to return
|
|
||||||
* the prototype functions in that case.
|
|
||||||
*/
|
|
||||||
public ESValue getNodeProperty(String propertyName)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
// check for null
|
|
||||||
if (propertyName == null) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
}
|
|
||||||
|
|
||||||
// persistent or persistent capable nodes have a cache property that's a transient node.
|
|
||||||
// it it hasn't requested before, initialize it now
|
|
||||||
if ("cache".equalsIgnoreCase(propertyName) && node instanceof Node) {
|
|
||||||
cache = node.getCacheNode();
|
|
||||||
|
|
||||||
if (cacheWrapper == null) {
|
|
||||||
cacheWrapper = new ESNode(cache, engine);
|
|
||||||
} else {
|
|
||||||
cacheWrapper.node = cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
return cacheWrapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("subnodeRelation".equalsIgnoreCase(propertyName)) {
|
|
||||||
String rel = node.getSubnodeRelation();
|
|
||||||
|
|
||||||
return (rel == null) ? (ESValue) ESNull.theNull : new ESString(rel);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Everything starting with an underscore is interpreted as internal property
|
|
||||||
if (propertyName.startsWith("_")) {
|
|
||||||
return getInternalProperty(propertyName);
|
|
||||||
}
|
|
||||||
|
|
||||||
// this _may_ do a relational query if properties are mapped to a relational type.
|
|
||||||
IProperty p = node.get(propertyName);
|
|
||||||
|
|
||||||
if (p != null) {
|
|
||||||
if (p.getType() == IProperty.STRING) {
|
|
||||||
String str = p.getStringValue();
|
|
||||||
|
|
||||||
if (str == null) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
} else {
|
|
||||||
return new ESString(str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p.getType() == IProperty.BOOLEAN) {
|
|
||||||
return ESBoolean.makeBoolean(p.getBooleanValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p.getType() == IProperty.DATE) {
|
|
||||||
return new DatePrototype(evaluator, p.getDateValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p.getType() == IProperty.INTEGER) {
|
|
||||||
return new ESNumber((double) p.getIntegerValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p.getType() == IProperty.FLOAT) {
|
|
||||||
return new ESNumber(p.getFloatValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p.getType() == IProperty.NODE) {
|
|
||||||
INode nd = p.getNodeValue();
|
|
||||||
|
|
||||||
if (nd == null) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
} else {
|
|
||||||
return engine.getNodeWrapper(nd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p.getType() == IProperty.JAVAOBJECT) {
|
|
||||||
return ESLoader.normalizeObject(p.getJavaObjectValue(), evaluator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// as last resort, try to get property as anonymous subnode
|
|
||||||
INode anon = (INode) node.getChildElement(propertyName);
|
|
||||||
|
|
||||||
if (anon != null) {
|
|
||||||
return engine.getNodeWrapper(anon);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESNull.theNull;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Some internal properties defined for every Node object. These are most commonly
|
|
||||||
* used for debugging Helma applications.
|
|
||||||
*/
|
|
||||||
private ESValue getInternalProperty(String propertyName)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if ("__id__".equals(propertyName) || "_id".equals(propertyName)) {
|
|
||||||
return new ESString(node.getID());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("__prototype__".equals(propertyName) || "_prototype".equals(propertyName)) {
|
|
||||||
String p = node.getPrototype();
|
|
||||||
|
|
||||||
if (p == null) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
} else {
|
|
||||||
return new ESString(node.getPrototype());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("__parent__".equals(propertyName) || "_parent".equals(propertyName)) {
|
|
||||||
INode n = node.getParent();
|
|
||||||
|
|
||||||
if (n == null) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
} else {
|
|
||||||
return engine.getNodeWrapper(n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// some more internal properties
|
|
||||||
if ("__name__".equals(propertyName)) {
|
|
||||||
return new ESString(node.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("__fullname__".equals(propertyName)) {
|
|
||||||
return new ESString(node.getFullName());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("__hash__".equals(propertyName)) {
|
|
||||||
return new ESString("" + node.hashCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("__node__".equals(propertyName)) {
|
|
||||||
return new ESWrapper(node, evaluator);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("__created__".equalsIgnoreCase(propertyName)) {
|
|
||||||
return new DatePrototype(evaluator, node.created());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("__lastmodified__".equalsIgnoreCase(propertyName)) {
|
|
||||||
return new DatePrototype(evaluator, node.lastModified());
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESNull.theNull;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public boolean clearCache() {
|
|
||||||
checkNode();
|
|
||||||
node.clearCacheNode();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public Enumeration getAllProperties() {
|
|
||||||
return getProperties();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public Enumeration getProperties() {
|
|
||||||
checkNode();
|
|
||||||
|
|
||||||
return node.properties();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String error() {
|
|
||||||
if (lastError == null) {
|
|
||||||
return "";
|
|
||||||
} else {
|
|
||||||
String exceptionName = lastError.getClass().getName();
|
|
||||||
int l = exceptionName.lastIndexOf(".");
|
|
||||||
|
|
||||||
if (l > 0) {
|
|
||||||
exceptionName = exceptionName.substring(l + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return exceptionName + ": " + lastError.getMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void clearError() {
|
|
||||||
lastError = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public Object toJavaObject() {
|
|
||||||
return getNode();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An ESNode equals another object if it is an ESNode that wraps the same INode
|
|
||||||
* or the wrapped INode itself. FIXME: doesen't check dbmapping/type!
|
|
||||||
*/
|
|
||||||
public boolean equals(Object what) {
|
|
||||||
if (what == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (what == this) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (what instanceof ESNode) {
|
|
||||||
ESNode other = (ESNode) what;
|
|
||||||
|
|
||||||
if (handle != null) {
|
|
||||||
return handle.equals(other.handle);
|
|
||||||
} else {
|
|
||||||
return (node == other.node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param hint ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public ESValue getDefaultValue(int hint) throws EcmaScriptException {
|
|
||||||
return new ESString(this.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// class ESNode
|
|
|
@ -1,260 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi;
|
|
||||||
|
|
||||||
import FESI.AST.ASTFormalParameterList;
|
|
||||||
import FESI.AST.ASTStatementList;
|
|
||||||
import FESI.AST.EcmaScriptTreeConstants;
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Interpreter.*;
|
|
||||||
import FESI.Parser.*;
|
|
||||||
import helma.framework.*;
|
|
||||||
import helma.framework.core.*;
|
|
||||||
import helma.scripting.*;
|
|
||||||
import helma.util.Updatable;
|
|
||||||
import java.io.*;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Vector;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An class that updates fesi interpreters with actionfiles and templates.
|
|
||||||
*/
|
|
||||||
public class FesiActionAdapter {
|
|
||||||
Prototype prototype;
|
|
||||||
Application app;
|
|
||||||
String functionName;
|
|
||||||
String sourceName;
|
|
||||||
|
|
||||||
// this is the parsed function which can be easily applied to FesiEngine objects
|
|
||||||
TypeUpdater pfunc;
|
|
||||||
|
|
||||||
// this is the parsed function which can be easily applied to FesiEngine objects
|
|
||||||
TypeUpdater pfuncAsString;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new FesiActionAdapter object.
|
|
||||||
*
|
|
||||||
* @param action ...
|
|
||||||
*/
|
|
||||||
public FesiActionAdapter(ActionFile action) {
|
|
||||||
prototype = action.getPrototype();
|
|
||||||
app = action.getApplication();
|
|
||||||
|
|
||||||
Reader reader = null;
|
|
||||||
|
|
||||||
functionName = action.getFunctionName();
|
|
||||||
sourceName = action.getSourceName();
|
|
||||||
|
|
||||||
try {
|
|
||||||
reader = action.getReader();
|
|
||||||
pfunc = parseFunction(functionName,
|
|
||||||
"arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10",
|
|
||||||
reader, sourceName);
|
|
||||||
} catch (Throwable x) {
|
|
||||||
String message = x.getMessage();
|
|
||||||
|
|
||||||
pfunc = new ErrorFeedback(functionName, message);
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
reader.close();
|
|
||||||
} catch (Exception ignore) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if this is a template and we need to generate an "_as_string" variant
|
|
||||||
if (action instanceof Template) {
|
|
||||||
String content = "res.pushStringBuffer(); " + action.getContent() +
|
|
||||||
"\r\nreturn res.popStringBuffer();\r\n";
|
|
||||||
|
|
||||||
try {
|
|
||||||
pfuncAsString = parseFunction(functionName + "_as_string",
|
|
||||||
"arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10",
|
|
||||||
new StringReader(content), sourceName);
|
|
||||||
} catch (Throwable x) {
|
|
||||||
String message = x.getMessage();
|
|
||||||
|
|
||||||
pfunc = new ErrorFeedback(functionName + "_as_string", message);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pfuncAsString = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param engine ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public synchronized void updateEvaluator(FesiEngine engine)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if (pfunc != null) {
|
|
||||||
pfunc.updateEvaluator(engine);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pfuncAsString != null) {
|
|
||||||
pfuncAsString.updateEvaluator(engine);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected TypeUpdater parseFunction(String funcName, String params, Reader body,
|
|
||||||
String sourceName)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
// ESObject fp = app.eval.evaluator.getFunctionPrototype();
|
|
||||||
// ConstructedFunctionObject function = null;
|
|
||||||
ASTFormalParameterList fpl = null;
|
|
||||||
ASTStatementList sl = null;
|
|
||||||
FunctionEvaluationSource fes = null;
|
|
||||||
|
|
||||||
/* if (body == null || "".equals (body.trim()))
|
|
||||||
body = ";\r\n";
|
|
||||||
else
|
|
||||||
body = body + "\r\n"; */
|
|
||||||
if (params == null) {
|
|
||||||
params = "";
|
|
||||||
} else {
|
|
||||||
params = params.trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
EcmaScript parser;
|
|
||||||
StringReader is;
|
|
||||||
|
|
||||||
// Special case for empty parameters
|
|
||||||
if (params.length() == 0) {
|
|
||||||
fpl = new ASTFormalParameterList(EcmaScriptTreeConstants.JJTFORMALPARAMETERLIST);
|
|
||||||
} else {
|
|
||||||
is = new java.io.StringReader(params);
|
|
||||||
parser = new EcmaScript(is);
|
|
||||||
|
|
||||||
try {
|
|
||||||
fpl = (ASTFormalParameterList) parser.FormalParameterList();
|
|
||||||
is.close();
|
|
||||||
} catch (ParseException x) {
|
|
||||||
throw new EcmaScriptParseException(x,
|
|
||||||
new FileEvaluationSource(sourceName,
|
|
||||||
null));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is very very very strange: without the toString, lots of obscure exceptions
|
|
||||||
// deep inside the parser...
|
|
||||||
// is = new java.io.StringReader(body.toString ());
|
|
||||||
try {
|
|
||||||
parser = new EcmaScript(body);
|
|
||||||
sl = (ASTStatementList) parser.StatementList();
|
|
||||||
body.close();
|
|
||||||
} catch (ParseException x) {
|
|
||||||
app.logEvent("Error parsing file " + app.getName() + ":" + sourceName + ": " +
|
|
||||||
x);
|
|
||||||
throw new EcmaScriptParseException(x,
|
|
||||||
new FileEvaluationSource(sourceName, null));
|
|
||||||
} catch (Exception x) {
|
|
||||||
app.logEvent("Error parsing file " + app.getName() + ":" + sourceName + ": " +
|
|
||||||
x);
|
|
||||||
throw new RuntimeException(x.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
fes = new FunctionEvaluationSource(new FileEvaluationSource(sourceName, null),
|
|
||||||
funcName);
|
|
||||||
|
|
||||||
return new ParsedFunction(fpl, sl, fes, null, funcName);
|
|
||||||
}
|
|
||||||
|
|
||||||
interface TypeUpdater {
|
|
||||||
public void updateEvaluator(FesiEngine engine)
|
|
||||||
throws EcmaScriptException;
|
|
||||||
}
|
|
||||||
|
|
||||||
class ParsedFunction implements TypeUpdater {
|
|
||||||
ASTFormalParameterList fpl = null;
|
|
||||||
ASTStatementList sl = null;
|
|
||||||
FunctionEvaluationSource fes = null;
|
|
||||||
String fullFunctionText = null;
|
|
||||||
String functionName;
|
|
||||||
|
|
||||||
public ParsedFunction(ASTFormalParameterList fpl, ASTStatementList sl,
|
|
||||||
FunctionEvaluationSource fes, String fullFunctionText,
|
|
||||||
String functionName) {
|
|
||||||
this.fpl = fpl;
|
|
||||||
this.sl = sl;
|
|
||||||
this.fes = fes;
|
|
||||||
this.fullFunctionText = fullFunctionText;
|
|
||||||
this.functionName = functionName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateEvaluator(FesiEngine engine)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ObjectPrototype op = engine.getPrototype(prototype.getName());
|
|
||||||
|
|
||||||
EcmaScriptVariableVisitor vdvisitor = engine.evaluator.getVarDeclarationVisitor();
|
|
||||||
Vector vnames = vdvisitor.processVariableDeclarations(sl, fes);
|
|
||||||
|
|
||||||
FunctionPrototype fp = ConstructedFunctionObject.makeNewConstructedFunction(engine.evaluator,
|
|
||||||
functionName,
|
|
||||||
fes,
|
|
||||||
fullFunctionText,
|
|
||||||
fpl.getArguments(),
|
|
||||||
vnames,
|
|
||||||
sl);
|
|
||||||
|
|
||||||
op.putHiddenProperty(functionName, fp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ErrorFeedback implements TypeUpdater {
|
|
||||||
String functionName;
|
|
||||||
String errorMessage;
|
|
||||||
|
|
||||||
public ErrorFeedback(String fname, String msg) {
|
|
||||||
functionName = fname;
|
|
||||||
errorMessage = msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateEvaluator(FesiEngine engine)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ObjectPrototype op = engine.getPrototype(prototype.getName());
|
|
||||||
|
|
||||||
FunctionPrototype fp = (FunctionPrototype) engine.evaluator.getFunctionPrototype();
|
|
||||||
FunctionPrototype func = new ThrowException(functionName, engine.evaluator,
|
|
||||||
fp, errorMessage);
|
|
||||||
|
|
||||||
op.putHiddenProperty(functionName, func);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ThrowException extends BuiltinFunctionObject {
|
|
||||||
String message;
|
|
||||||
|
|
||||||
ThrowException(String name, Evaluator evaluator, FunctionPrototype fp,
|
|
||||||
String message) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
this.message = (message == null) ? "No error message available" : message;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
throw new EcmaScriptException(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESObject doConstruct(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
throw new EcmaScriptException(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,164 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi;
|
|
||||||
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Interpreter.*;
|
|
||||||
import helma.framework.core.*;
|
|
||||||
import helma.objectmodel.db.Node;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A constructor for user defined data types. This first constructs a node, sets its prototype
|
|
||||||
* and invokes the scripted constructor function on it.
|
|
||||||
*/
|
|
||||||
public class NodeConstructor extends BuiltinFunctionObject {
|
|
||||||
FesiEngine engine;
|
|
||||||
String typename;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new NodeConstructor object.
|
|
||||||
*
|
|
||||||
* @param name ...
|
|
||||||
* @param fp ...
|
|
||||||
* @param engine ...
|
|
||||||
*/
|
|
||||||
public NodeConstructor(String name, FunctionPrototype fp, FesiEngine engine) {
|
|
||||||
super(fp, engine.getEvaluator(), name, 1);
|
|
||||||
typename = name;
|
|
||||||
this.engine = engine;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param thisObject ...
|
|
||||||
* @param arguments ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
return doConstruct(thisObject, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param thisObject ...
|
|
||||||
* @param arguments ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public ESObject doConstruct(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESNode node = null;
|
|
||||||
Application app = engine.getApplication();
|
|
||||||
|
|
||||||
if ("Node".equals(typename) || "hopobject".equalsIgnoreCase(typename)) {
|
|
||||||
String nodeName = null;
|
|
||||||
|
|
||||||
if ((arguments.length > 0) && (arguments[0] != null)) {
|
|
||||||
nodeName = arguments[0].toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
Node n = new Node(nodeName, (String) null, app.getWrappedNodeManager());
|
|
||||||
|
|
||||||
node = new ESNode(engine.getPrototype("hopobject"), this.evaluator, n, engine);
|
|
||||||
engine.putNodeWrapper(node.getNode(), node);
|
|
||||||
} else {
|
|
||||||
// Typed nodes are instantiated as helma.objectmodel.db.Node from the beginning
|
|
||||||
// even if we don't know yet if they are going to be stored in a database. The reason
|
|
||||||
// is that we want to be able to use the specail features like subnode relations even for
|
|
||||||
// transient nodes.
|
|
||||||
ObjectPrototype op = engine.getPrototype(typename);
|
|
||||||
Node n = new Node(typename, typename, app.getWrappedNodeManager());
|
|
||||||
|
|
||||||
node = new ESNode(op, engine.getEvaluator(), n, engine);
|
|
||||||
node.setPrototype(typename);
|
|
||||||
node.getNode().setDbMapping(app.getDbMapping(typename));
|
|
||||||
|
|
||||||
try {
|
|
||||||
// first try calling "constructor", if that doesn't work, try calling a function
|
|
||||||
// with the name of the type.
|
|
||||||
// HACK: There is an incompatibility problem here, because the property
|
|
||||||
// constructor is defined as the constructor of the object by EcmaScript.
|
|
||||||
if (op.getProperty("constructor", "constructor".hashCode()) instanceof ConstructedFunctionObject) {
|
|
||||||
node.doIndirectCall(engine.getEvaluator(), node, "constructor",
|
|
||||||
arguments);
|
|
||||||
} else if (op.getProperty(typename, typename.hashCode()) instanceof ConstructedFunctionObject) {
|
|
||||||
node.doIndirectCall(engine.getEvaluator(), node, typename, arguments);
|
|
||||||
}
|
|
||||||
} catch (Exception x) {
|
|
||||||
throw new EcmaScriptException(x.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param previousScope ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public ESValue getPropertyInScope(String propertyName, ScopeChain previousScope,
|
|
||||||
int hash) throws EcmaScriptException {
|
|
||||||
return super.getPropertyInScope(propertyName, previousScope, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public ESValue getProperty(String propertyName, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if ("prototype".equals(propertyName)) {
|
|
||||||
return engine.getPrototype(typename);
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.getProperty(propertyName, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String[] getSpecialPropertyNames() {
|
|
||||||
String[] ns = { };
|
|
||||||
|
|
||||||
return ns;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// class NodeConstructor
|
|
|
@ -1,32 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi;
|
|
||||||
|
|
||||||
import helma.scripting.ScriptingException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public final class PhantomEngine extends FesiEngine {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public Object invoke(Object thisObject, String functionName, Object[] args,
|
|
||||||
boolean xmlrpc) throws ScriptingException {
|
|
||||||
return super.invoke(thisObject, functionName, args, xmlrpc);
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,307 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi.extensions;
|
|
||||||
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Extensions.*;
|
|
||||||
import FESI.Interpreter.*;
|
|
||||||
import helma.framework.core.Application;
|
|
||||||
import helma.framework.core.RequestEvaluator;
|
|
||||||
import helma.objectmodel.INode;
|
|
||||||
import helma.objectmodel.db.Node;
|
|
||||||
import helma.objectmodel.dom.*;
|
|
||||||
import helma.scripting.fesi.ESNode;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.StringReader;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class DomExtension extends Extension {
|
|
||||||
private transient Evaluator evaluator = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new DomExtension object.
|
|
||||||
*/
|
|
||||||
public DomExtension() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param evaluator ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public void initializeExtension(Evaluator evaluator)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
this.evaluator = evaluator;
|
|
||||||
|
|
||||||
GlobalObject go = evaluator.getGlobalObject();
|
|
||||||
ObjectPrototype op = (ObjectPrototype) evaluator.getObjectPrototype();
|
|
||||||
FunctionPrototype fp = (FunctionPrototype) evaluator.getFunctionPrototype();
|
|
||||||
|
|
||||||
ESObject globalXml = new GlobalObjectXml("Xml", evaluator, fp);
|
|
||||||
|
|
||||||
globalXml.putHiddenProperty("length", new ESNumber(1));
|
|
||||||
globalXml.putHiddenProperty("read", new XmlRead("read", evaluator, fp, false));
|
|
||||||
globalXml.putHiddenProperty("readFromString",
|
|
||||||
new XmlRead("readFromString", evaluator, fp, true));
|
|
||||||
globalXml.putHiddenProperty("write", new XmlWrite("write", evaluator, fp));
|
|
||||||
globalXml.putHiddenProperty("writeToString",
|
|
||||||
new XmlWriteToString("writeToString", evaluator, fp));
|
|
||||||
globalXml.putHiddenProperty("get", new XmlGet("get", evaluator, fp));
|
|
||||||
globalXml.putHiddenProperty("getFromString",
|
|
||||||
new XmlGetFromString("getFromString", evaluator, fp));
|
|
||||||
go.putHiddenProperty("Xml", globalXml);
|
|
||||||
}
|
|
||||||
|
|
||||||
class GlobalObjectXml extends BuiltinFunctionObject {
|
|
||||||
GlobalObjectXml(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 {
|
|
||||||
throw new EcmaScriptException("Xml can't be instanced");
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
|
||||||
try {
|
|
||||||
String parser = javax.xml.parsers.DocumentBuilderFactory.newInstance()
|
|
||||||
.getClass()
|
|
||||||
.getPackage()
|
|
||||||
.getName();
|
|
||||||
|
|
||||||
return "[Xml " + parser + "]";
|
|
||||||
} catch (NullPointerException zeero) {
|
|
||||||
return "[Xml - no parser available]";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class XmlWrite extends BuiltinFunctionObject {
|
|
||||||
XmlWrite(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if ((arguments == null) || (arguments.length != 2)) {
|
|
||||||
throw new EcmaScriptException("Wrong number of arguments in Xml.write()");
|
|
||||||
}
|
|
||||||
|
|
||||||
INode node = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
node = ((ESNode) arguments[0]).getNode();
|
|
||||||
} catch (Exception e) {
|
|
||||||
// we definitly need a node
|
|
||||||
throw new EcmaScriptException("First argument in Xml.write() is not an hopobject");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
File tmpFile = new File(arguments[1].toString() + ".tmp." +
|
|
||||||
XmlWriter.generateID());
|
|
||||||
XmlWriter writer = new XmlWriter(tmpFile, "UTF-8");
|
|
||||||
|
|
||||||
writer.setDatabaseMode(false);
|
|
||||||
|
|
||||||
boolean result = writer.write(node);
|
|
||||||
|
|
||||||
writer.close();
|
|
||||||
|
|
||||||
File finalFile = new File(arguments[1].toString());
|
|
||||||
|
|
||||||
tmpFile.renameTo(finalFile);
|
|
||||||
this.evaluator.engine.getApplication().logEvent("wrote xml to " +
|
|
||||||
finalFile.getAbsolutePath());
|
|
||||||
} catch (IOException io) {
|
|
||||||
throw new EcmaScriptException(io.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Xml.create() is used to get a string containing the xml-content.
|
|
||||||
* Useful if Xml-content should be made public through the web.
|
|
||||||
*/
|
|
||||||
class XmlWriteToString extends BuiltinFunctionObject {
|
|
||||||
XmlWriteToString(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if ((arguments == null) || (arguments.length == 0)) {
|
|
||||||
throw new EcmaScriptException("Not enough arguments in Xml.writeToString()");
|
|
||||||
}
|
|
||||||
|
|
||||||
INode node = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
node = ((ESNode) arguments[0]).getNode();
|
|
||||||
} catch (Exception e) {
|
|
||||||
// we definitly need a node
|
|
||||||
throw new EcmaScriptException("argument is not an hopobject");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
||||||
XmlWriter writer = new XmlWriter(out, "UTF-8");
|
|
||||||
|
|
||||||
// in case we ever want to limit serialization depth...
|
|
||||||
// if (arguments.length > 1 && arguments[1] instanceof ESNumber)
|
|
||||||
// writer.setMaxLevels(arguments[1].toInt32());
|
|
||||||
writer.setDatabaseMode(false);
|
|
||||||
|
|
||||||
boolean result = writer.write(node);
|
|
||||||
|
|
||||||
writer.flush();
|
|
||||||
|
|
||||||
return new ESString(out.toString("UTF-8"));
|
|
||||||
} catch (IOException io) {
|
|
||||||
throw new EcmaScriptException(io.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class XmlRead extends BuiltinFunctionObject {
|
|
||||||
boolean fromstring;
|
|
||||||
|
|
||||||
XmlRead(String name, Evaluator evaluator, FunctionPrototype fp, boolean fromstring) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
this.fromstring = fromstring;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if ((arguments == null) || (arguments.length == 0)) {
|
|
||||||
throw new EcmaScriptException("Missing arguments in Xml.read()");
|
|
||||||
}
|
|
||||||
|
|
||||||
INode node = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
node = ((ESNode) arguments[1]).getNode();
|
|
||||||
} catch (Exception e) { //classcast, arrayindex etc
|
|
||||||
|
|
||||||
// make sure we have a node, even if 2nd arg doesn't exist or is not a node
|
|
||||||
node = new Node((String) null, (String) null,
|
|
||||||
this.evaluator.engine.getApplication()
|
|
||||||
.getWrappedNodeManager());
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
XmlReader reader = new XmlReader();
|
|
||||||
INode result = null;
|
|
||||||
|
|
||||||
if (fromstring) {
|
|
||||||
result = reader.read(new StringReader(arguments[0].toString()), node);
|
|
||||||
} else {
|
|
||||||
result = reader.read(new File(arguments[0].toString()), node);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.evaluator.engine.getNodeWrapper(result);
|
|
||||||
} catch (NoClassDefFoundError e) {
|
|
||||||
throw new EcmaScriptException("Can't load XML parser:" + e);
|
|
||||||
} catch (Exception f) {
|
|
||||||
throw new EcmaScriptException(f.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class XmlGet extends BuiltinFunctionObject {
|
|
||||||
XmlGet(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if ((arguments == null) || (arguments.length == 0)) {
|
|
||||||
throw new EcmaScriptException("Xml.get() needs a location as an argument");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
XmlConverter converter;
|
|
||||||
|
|
||||||
if (arguments.length > 1) {
|
|
||||||
converter = new XmlConverter(arguments[1].toString());
|
|
||||||
} else {
|
|
||||||
converter = new XmlConverter();
|
|
||||||
}
|
|
||||||
|
|
||||||
INode node = new helma.objectmodel.db.Node((String) null, (String) null,
|
|
||||||
this.evaluator.engine.getApplication()
|
|
||||||
.getWrappedNodeManager());
|
|
||||||
INode result = converter.convert(arguments[0].toString(), node);
|
|
||||||
|
|
||||||
return this.evaluator.engine.getNodeWrapper(result);
|
|
||||||
} catch (NoClassDefFoundError e) {
|
|
||||||
throw new EcmaScriptException("Can't load dom-capable xml parser.");
|
|
||||||
} catch (RuntimeException f) {
|
|
||||||
throw new EcmaScriptException(f.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class XmlGetFromString extends BuiltinFunctionObject {
|
|
||||||
XmlGetFromString(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if ((arguments == null) || (arguments.length == 0)) {
|
|
||||||
throw new EcmaScriptException("Xml.getFromString() needs an XML string as parameter");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
XmlConverter converter;
|
|
||||||
|
|
||||||
if (arguments.length > 1) {
|
|
||||||
converter = new XmlConverter(arguments[1].toString());
|
|
||||||
} else {
|
|
||||||
converter = new XmlConverter();
|
|
||||||
}
|
|
||||||
|
|
||||||
INode node = new helma.objectmodel.db.Node((String) null, (String) null,
|
|
||||||
this.evaluator.engine.getApplication()
|
|
||||||
.getWrappedNodeManager());
|
|
||||||
INode result = converter.convertFromString(arguments[0].toString(), node);
|
|
||||||
|
|
||||||
return this.evaluator.engine.getNodeWrapper(result);
|
|
||||||
} catch (NoClassDefFoundError e) {
|
|
||||||
throw new EcmaScriptException("Can't load dom-capable xml parser.");
|
|
||||||
} catch (RuntimeException f) {
|
|
||||||
throw new EcmaScriptException(f.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,353 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi.extensions;
|
|
||||||
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Interpreter.*;
|
|
||||||
import helma.util.*;
|
|
||||||
import java.io.*;
|
|
||||||
import java.util.*;
|
|
||||||
import javax.activation.*;
|
|
||||||
import javax.mail.Address;
|
|
||||||
import javax.mail.Message;
|
|
||||||
import javax.mail.Multipart;
|
|
||||||
import javax.mail.Session;
|
|
||||||
import javax.mail.Transport;
|
|
||||||
import javax.mail.internet.AddressException;
|
|
||||||
import javax.mail.internet.InternetAddress;
|
|
||||||
import javax.mail.internet.MimeBodyPart;
|
|
||||||
import javax.mail.internet.MimeMessage;
|
|
||||||
import javax.mail.internet.MimeMultipart;
|
|
||||||
import javax.mail.internet.MimeUtility;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A JavaScript wrapper around a JavaMail message class to send
|
|
||||||
* mail via SMTP from Helma
|
|
||||||
*/
|
|
||||||
public class ESMail extends ESObject implements Serializable {
|
|
||||||
public static final int OK = 0;
|
|
||||||
public static final int SUBJECT = 10;
|
|
||||||
public static final int TEXT = 11;
|
|
||||||
public static final int MIMEPART = 12;
|
|
||||||
public static final int TO = 20;
|
|
||||||
public static final int CC = 21;
|
|
||||||
public static final int BCC = 22;
|
|
||||||
public static final int FROM = 23;
|
|
||||||
public static final int REPLYTO = 24;
|
|
||||||
public static final int SEND = 30;
|
|
||||||
MailExtension mailx;
|
|
||||||
Properties mprops;
|
|
||||||
MimeMessage message;
|
|
||||||
Multipart multipart;
|
|
||||||
StringBuffer buffer;
|
|
||||||
int status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new ESMail object.
|
|
||||||
*
|
|
||||||
* @param mailx ...
|
|
||||||
*/
|
|
||||||
public ESMail(MailExtension mailx) {
|
|
||||||
super(mailx.esMailPrototype, mailx.eval);
|
|
||||||
this.status = OK;
|
|
||||||
this.mailx = mailx;
|
|
||||||
this.mprops = mailx.mprops;
|
|
||||||
|
|
||||||
// create some properties and get the default Session
|
|
||||||
try {
|
|
||||||
Properties props = new Properties();
|
|
||||||
|
|
||||||
props.put("mail.smtp.host", mprops.getProperty("smtp", "mail"));
|
|
||||||
|
|
||||||
Session session = Session.getDefaultInstance(props, null);
|
|
||||||
|
|
||||||
message = new MimeMessage(session);
|
|
||||||
} catch (Throwable t) {
|
|
||||||
this.evaluator.engine.getApplication().logEvent("Error in mail constructor: " +
|
|
||||||
t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param status ...
|
|
||||||
*/
|
|
||||||
public void setStatus(int status) {
|
|
||||||
// Only register the first error that occurrs
|
|
||||||
if (this.status == 0) {
|
|
||||||
this.status = status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public int getStatus() {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param propertyName ...
|
|
||||||
* @param hash ...
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public ESValue getProperty(String propertyName, int hash)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
if ("status".equalsIgnoreCase(propertyName)) {
|
|
||||||
return new ESNumber(status);
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.getProperty(propertyName, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public void setText(ESValue val) throws Exception {
|
|
||||||
if (buffer == null) {
|
|
||||||
buffer = new StringBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (val != null) {
|
|
||||||
buffer.append(val.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param val ...
|
|
||||||
*
|
|
||||||
* @throws Exception ...
|
|
||||||
* @throws IOException ...
|
|
||||||
*/
|
|
||||||
public void addPart(ESValue[] val) throws Exception {
|
|
||||||
if ((val == null) || (val.length == 0) || (val.length > 2)) {
|
|
||||||
throw new IOException("mail.addPart called with wrong number of arguments.");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (multipart == null) {
|
|
||||||
multipart = new MimeMultipart();
|
|
||||||
}
|
|
||||||
|
|
||||||
MimeBodyPart part = new MimeBodyPart();
|
|
||||||
Object obj = val[0].toJavaObject();
|
|
||||||
|
|
||||||
if (obj instanceof String) {
|
|
||||||
part.setContent(obj.toString(), "text/plain");
|
|
||||||
} else if (obj instanceof File) {
|
|
||||||
FileDataSource source = new FileDataSource((File) obj);
|
|
||||||
|
|
||||||
part.setDataHandler(new DataHandler(source));
|
|
||||||
} else if (obj instanceof MimePart) {
|
|
||||||
MimePartDataSource source = new MimePartDataSource((MimePart) obj);
|
|
||||||
|
|
||||||
part.setDataHandler(new DataHandler(source));
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if an explicit file name was given for this part
|
|
||||||
if (val.length == 2) {
|
|
||||||
try {
|
|
||||||
part.setFileName(val[1].toString());
|
|
||||||
} catch (Exception x) {
|
|
||||||
// FIXME: error setting file name ... should we ignore this or throw an exception?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
multipart.addBodyPart(part);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param val ...
|
|
||||||
*
|
|
||||||
* @throws Exception ...
|
|
||||||
*/
|
|
||||||
public void setSubject(ESValue val) throws Exception {
|
|
||||||
if (val == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
message.setSubject(MimeUtility.encodeWord(val.toString()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param add ...
|
|
||||||
*
|
|
||||||
* @throws Exception ...
|
|
||||||
* @throws AddressException ...
|
|
||||||
*/
|
|
||||||
public void setReplyTo(ESValue add) throws Exception {
|
|
||||||
String addstring = add.toString();
|
|
||||||
|
|
||||||
if (addstring.indexOf("@") < 0) {
|
|
||||||
throw new AddressException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Address[] replyTo = new Address[1];
|
|
||||||
|
|
||||||
replyTo[0] = new InternetAddress(addstring);
|
|
||||||
message.setReplyTo(replyTo);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param add ...
|
|
||||||
*
|
|
||||||
* @throws Exception ...
|
|
||||||
* @throws AddressException ...
|
|
||||||
*/
|
|
||||||
public void setFrom(ESValue[] add) throws Exception {
|
|
||||||
String addstring = add[0].toString();
|
|
||||||
|
|
||||||
if (addstring.indexOf("@") < 0) {
|
|
||||||
throw new AddressException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Address address = null;
|
|
||||||
|
|
||||||
if (add.length > 1) {
|
|
||||||
address = new InternetAddress(addstring,
|
|
||||||
MimeUtility.encodeWord(add[1].toString()));
|
|
||||||
} else {
|
|
||||||
address = new InternetAddress(addstring);
|
|
||||||
}
|
|
||||||
|
|
||||||
message.setFrom(address);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param add ...
|
|
||||||
*
|
|
||||||
* @throws Exception ...
|
|
||||||
* @throws AddressException ...
|
|
||||||
*/
|
|
||||||
public void addTo(ESValue[] add) throws Exception {
|
|
||||||
String addstring = add[0].toString();
|
|
||||||
|
|
||||||
if (addstring.indexOf("@") < 0) {
|
|
||||||
throw new AddressException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Address address = null;
|
|
||||||
|
|
||||||
if (add.length > 1) {
|
|
||||||
address = new InternetAddress(addstring,
|
|
||||||
MimeUtility.encodeWord(add[1].toString()));
|
|
||||||
} else {
|
|
||||||
address = new InternetAddress(addstring);
|
|
||||||
}
|
|
||||||
|
|
||||||
message.addRecipient(Message.RecipientType.TO, address);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param add ...
|
|
||||||
*
|
|
||||||
* @throws Exception ...
|
|
||||||
* @throws AddressException ...
|
|
||||||
*/
|
|
||||||
public void addCC(ESValue[] add) throws Exception {
|
|
||||||
String addstring = add[0].toString();
|
|
||||||
|
|
||||||
if (addstring.indexOf("@") < 0) {
|
|
||||||
throw new AddressException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Address address = null;
|
|
||||||
|
|
||||||
if (add.length > 1) {
|
|
||||||
address = new InternetAddress(addstring,
|
|
||||||
MimeUtility.encodeWord(add[1].toString()));
|
|
||||||
} else {
|
|
||||||
address = new InternetAddress(addstring);
|
|
||||||
}
|
|
||||||
|
|
||||||
message.addRecipient(Message.RecipientType.CC, address);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param add ...
|
|
||||||
*
|
|
||||||
* @throws Exception ...
|
|
||||||
* @throws AddressException ...
|
|
||||||
*/
|
|
||||||
public void addBCC(ESValue[] add) throws Exception {
|
|
||||||
String addstring = add[0].toString();
|
|
||||||
|
|
||||||
if (addstring.indexOf("@") < 0) {
|
|
||||||
throw new AddressException();
|
|
||||||
}
|
|
||||||
|
|
||||||
Address address = null;
|
|
||||||
|
|
||||||
if (add.length > 1) {
|
|
||||||
address = new InternetAddress(addstring,
|
|
||||||
MimeUtility.encodeWord(add[1].toString()));
|
|
||||||
} else {
|
|
||||||
address = new InternetAddress(addstring);
|
|
||||||
}
|
|
||||||
|
|
||||||
message.addRecipient(Message.RecipientType.BCC, address);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @throws Exception ...
|
|
||||||
*/
|
|
||||||
public void send() throws Exception {
|
|
||||||
if (buffer != null) {
|
|
||||||
// if we also have a multipart body, add
|
|
||||||
// plain string as first part to it.
|
|
||||||
if (multipart != null) {
|
|
||||||
MimeBodyPart part = new MimeBodyPart();
|
|
||||||
|
|
||||||
part.setContent(buffer.toString(), "text/plain");
|
|
||||||
multipart.addBodyPart(part, 0);
|
|
||||||
message.setContent(multipart);
|
|
||||||
} else {
|
|
||||||
message.setText(buffer.toString());
|
|
||||||
}
|
|
||||||
} else if (multipart != null) {
|
|
||||||
message.setContent(multipart);
|
|
||||||
} else {
|
|
||||||
message.setText("");
|
|
||||||
}
|
|
||||||
|
|
||||||
Transport.send(message);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,525 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi.extensions;
|
|
||||||
|
|
||||||
import FESI.AST.*;
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Extensions.*;
|
|
||||||
import FESI.Interpreter.*;
|
|
||||||
import FESI.Parser.*;
|
|
||||||
import com.oroinc.net.ftp.*;
|
|
||||||
import helma.objectmodel.*;
|
|
||||||
import java.io.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A FTP-client object that allows to do some FTP from HOP applications.
|
|
||||||
* FTP support is far from complete but can easily be extended if more
|
|
||||||
* functionality is needed.
|
|
||||||
* This uses the NetComponent classes from savarese.org (ex oroinc.com).
|
|
||||||
*/
|
|
||||||
class ESFtpClient extends ESObject {
|
|
||||||
private FTPClient ftpclient;
|
|
||||||
private String server;
|
|
||||||
private Exception lastError = null;
|
|
||||||
private File localDir = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new FTP Client
|
|
||||||
*
|
|
||||||
* @param prototype The prototype object for the FTP object
|
|
||||||
* @param evaluator The current evaluator
|
|
||||||
*/
|
|
||||||
ESFtpClient(ESObject prototype, Evaluator evaluator, ESValue srvstr) {
|
|
||||||
super(prototype, evaluator);
|
|
||||||
this.server = srvstr.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
ESFtpClient(ESObject prototype, Evaluator evaluator) {
|
|
||||||
super(prototype, evaluator);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String getESClassName() {
|
|
||||||
return "FtpClient";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String toString() {
|
|
||||||
return "[FtpClient]";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return ...
|
|
||||||
*/
|
|
||||||
public String toDetailString() {
|
|
||||||
return "ES:[Object: builtin " + this.getClass().getName() + ":" +
|
|
||||||
this.toString() + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
ESValue getLastError() throws EcmaScriptException {
|
|
||||||
if (lastError == null) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
} else {
|
|
||||||
return ESLoader.normalizeValue(lastError, evaluator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Login to the FTP server
|
|
||||||
*
|
|
||||||
* @param arguments The argument list
|
|
||||||
* @return true if successful, false otherwise
|
|
||||||
*/
|
|
||||||
ESValue login(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
if (server == null) {
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
ftpclient = new FTPClient();
|
|
||||||
ftpclient.connect(server);
|
|
||||||
|
|
||||||
boolean b = ftpclient.login(arguments[0].toString(), arguments[1].toString());
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(b);
|
|
||||||
} catch (Exception x) {
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
} catch (NoClassDefFoundError x) {
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ESValue cd(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
if (ftpclient == null) {
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
ftpclient.changeWorkingDirectory(arguments[0].toString());
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
} catch (Exception wrong) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ESValue mkdir(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
if (ftpclient == null) {
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
return ESBoolean.makeBoolean(ftpclient.makeDirectory(arguments[0].toString()));
|
|
||||||
} catch (Exception wrong) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ESValue lcd(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
try {
|
|
||||||
localDir = new File(arguments[0].toString());
|
|
||||||
|
|
||||||
if (!localDir.exists()) {
|
|
||||||
localDir.mkdirs();
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
} catch (Exception wrong) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ESValue putFile(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
if (ftpclient == null) {
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
String fn = arguments[0].toString();
|
|
||||||
File f = (localDir == null) ? new File(fn) : new File(localDir, fn);
|
|
||||||
InputStream fin = new BufferedInputStream(new FileInputStream(f));
|
|
||||||
|
|
||||||
ftpclient.storeFile(arguments[1].toString(), fin);
|
|
||||||
fin.close();
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
} catch (Exception wrong) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ESValue putString(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
if (ftpclient == null) {
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
byte[] bytes = null;
|
|
||||||
|
|
||||||
// check if this already is a byte array
|
|
||||||
if (arguments[0] instanceof ESArrayWrapper) {
|
|
||||||
Object o = ((ESArrayWrapper) arguments[0]).toJavaObject();
|
|
||||||
|
|
||||||
if (o instanceof byte[]) {
|
|
||||||
bytes = (byte[]) o;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bytes == null) {
|
|
||||||
bytes = arguments[0].toString().getBytes();
|
|
||||||
}
|
|
||||||
|
|
||||||
ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
|
|
||||||
|
|
||||||
ftpclient.storeFile(arguments[1].toString(), bin);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
} catch (Exception wrong) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ESValue getFile(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
if (ftpclient == null) {
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
String fn = arguments[0].toString();
|
|
||||||
File f = (localDir == null) ? new File(fn) : new File(localDir, fn);
|
|
||||||
OutputStream out = new BufferedOutputStream(new FileOutputStream(f));
|
|
||||||
|
|
||||||
ftpclient.retrieveFile(arguments[0].toString(), out);
|
|
||||||
out.close();
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
} catch (Exception wrong) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ESValue getString(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
if (ftpclient == null) {
|
|
||||||
return ESNull.theNull;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
ByteArrayOutputStream bout = new ByteArrayOutputStream();
|
|
||||||
|
|
||||||
ftpclient.retrieveFile(arguments[0].toString(), bout);
|
|
||||||
|
|
||||||
return new ESString(bout.toString());
|
|
||||||
} catch (Exception wrong) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESNull.theNull;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disconnect from FTP server
|
|
||||||
*
|
|
||||||
* @param arguments The argument list
|
|
||||||
* @return true if successful, false otherwise
|
|
||||||
*/
|
|
||||||
ESValue logout(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
if (ftpclient != null) {
|
|
||||||
try {
|
|
||||||
ftpclient.logout();
|
|
||||||
} catch (IOException ignore) {
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
ftpclient.disconnect();
|
|
||||||
} catch (IOException ignore) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
ESValue binary(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
if (ftpclient != null) {
|
|
||||||
try {
|
|
||||||
ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
} catch (IOException ignore) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ESValue ascii(ESValue[] arguments) throws EcmaScriptException {
|
|
||||||
if (ftpclient != null) {
|
|
||||||
try {
|
|
||||||
ftpclient.setFileType(FTP.ASCII_FILE_TYPE);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
} catch (IOException ignore) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class FtpExtension extends Extension {
|
|
||||||
private transient Evaluator evaluator = null;
|
|
||||||
private ESObject esFtpPrototype = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new FtpExtension object.
|
|
||||||
*/
|
|
||||||
public FtpExtension() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param evaluator ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
public void initializeExtension(Evaluator evaluator)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
this.evaluator = evaluator;
|
|
||||||
|
|
||||||
GlobalObject go = evaluator.getGlobalObject();
|
|
||||||
ObjectPrototype op = (ObjectPrototype) evaluator.getObjectPrototype();
|
|
||||||
FunctionPrototype fp = (FunctionPrototype) evaluator.getFunctionPrototype();
|
|
||||||
|
|
||||||
esFtpPrototype = new ESFtpClient(op, evaluator);
|
|
||||||
|
|
||||||
ESObject globalFtpObject = new GlobalObjectFtpClient("FtpClient", evaluator, fp);
|
|
||||||
|
|
||||||
globalFtpObject.putHiddenProperty("prototype", esFtpPrototype);
|
|
||||||
globalFtpObject.putHiddenProperty("length", new ESNumber(1));
|
|
||||||
|
|
||||||
esFtpPrototype.putHiddenProperty("login",
|
|
||||||
new FtpClientLogin("login", evaluator, fp));
|
|
||||||
esFtpPrototype.putHiddenProperty("cd", new FtpClientCD("cd", evaluator, fp));
|
|
||||||
esFtpPrototype.putHiddenProperty("mkdir",
|
|
||||||
new FtpClientMKDIR("mkdir", evaluator, fp));
|
|
||||||
esFtpPrototype.putHiddenProperty("lcd", new FtpClientLCD("lcd", evaluator, fp));
|
|
||||||
esFtpPrototype.putHiddenProperty("putFile",
|
|
||||||
new FtpClientPutFile("putFile", evaluator, fp));
|
|
||||||
esFtpPrototype.putHiddenProperty("putString",
|
|
||||||
new FtpClientPutString("putString", evaluator, fp));
|
|
||||||
esFtpPrototype.putHiddenProperty("getFile",
|
|
||||||
new FtpClientGetFile("getFile", evaluator, fp));
|
|
||||||
esFtpPrototype.putHiddenProperty("getString",
|
|
||||||
new FtpClientGetString("getString", evaluator, fp));
|
|
||||||
esFtpPrototype.putHiddenProperty("logout",
|
|
||||||
new FtpClientLogout("logout", evaluator, fp));
|
|
||||||
esFtpPrototype.putHiddenProperty("binary",
|
|
||||||
new FtpClientBinary("binary", evaluator, fp));
|
|
||||||
esFtpPrototype.putHiddenProperty("ascii",
|
|
||||||
new FtpClientAscii("ascii", evaluator, fp));
|
|
||||||
|
|
||||||
go.putHiddenProperty("FtpClient", globalFtpObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
class GlobalObjectFtpClient extends BuiltinFunctionObject {
|
|
||||||
GlobalObjectFtpClient(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 {
|
|
||||||
ESFtpClient ftp = null;
|
|
||||||
|
|
||||||
if (arguments.length != 1) {
|
|
||||||
throw new EcmaScriptException("FtpClient requires 1 argument");
|
|
||||||
}
|
|
||||||
|
|
||||||
ftp = new ESFtpClient(esFtpPrototype, this.evaluator, arguments[0]);
|
|
||||||
|
|
||||||
return ftp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientLogin extends BuiltinFunctionObject {
|
|
||||||
FtpClientLogin(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.login(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientCD extends BuiltinFunctionObject {
|
|
||||||
FtpClientCD(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.cd(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientMKDIR extends BuiltinFunctionObject {
|
|
||||||
FtpClientMKDIR(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.mkdir(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientLCD extends BuiltinFunctionObject {
|
|
||||||
FtpClientLCD(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.lcd(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientPutFile extends BuiltinFunctionObject {
|
|
||||||
FtpClientPutFile(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.putFile(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientPutString extends BuiltinFunctionObject {
|
|
||||||
FtpClientPutString(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.putString(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientGetFile extends BuiltinFunctionObject {
|
|
||||||
FtpClientGetFile(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.getFile(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientGetString extends BuiltinFunctionObject {
|
|
||||||
FtpClientGetString(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.getString(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientLogout extends BuiltinFunctionObject {
|
|
||||||
FtpClientLogout(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.logout(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientBinary extends BuiltinFunctionObject {
|
|
||||||
FtpClientBinary(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.binary(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FtpClientAscii extends BuiltinFunctionObject {
|
|
||||||
FtpClientAscii(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESFtpClient ftp = (ESFtpClient) thisObject;
|
|
||||||
|
|
||||||
return ftp.ascii(arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,124 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi.extensions;
|
|
||||||
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Extensions.*;
|
|
||||||
import FESI.Interpreter.*;
|
|
||||||
import helma.image.*;
|
|
||||||
import helma.objectmodel.*;
|
|
||||||
import helma.util.*;
|
|
||||||
import java.awt.image.*;
|
|
||||||
import java.io.*;
|
|
||||||
import java.rmi.Naming;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension to do Image manipulation from HOP.
|
|
||||||
*/
|
|
||||||
public class ImageExtension extends Extension {
|
|
||||||
static ImageGenerator imggen;
|
|
||||||
protected Evaluator evaluator = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new ImageExtension object.
|
|
||||||
*/
|
|
||||||
public ImageExtension() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called by the evaluator after the extension is loaded.
|
|
||||||
*/
|
|
||||||
public void initializeExtension(Evaluator evaluator)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
this.evaluator = evaluator;
|
|
||||||
|
|
||||||
GlobalObject go = evaluator.getGlobalObject();
|
|
||||||
FunctionPrototype fp = (FunctionPrototype) evaluator.getFunctionPrototype();
|
|
||||||
ESObject image = new GlobalObjectImage("Image", evaluator, fp, this); // the Image constructor
|
|
||||||
|
|
||||||
go.putHiddenProperty("Image", image); // register the constructor for a Image object.
|
|
||||||
}
|
|
||||||
|
|
||||||
class GlobalObjectImage extends BuiltinFunctionObject {
|
|
||||||
ImageExtension imagex;
|
|
||||||
|
|
||||||
GlobalObjectImage(String name, Evaluator evaluator, FunctionPrototype fp,
|
|
||||||
ImageExtension imagex) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
this.imagex = imagex;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
return doConstruct(thisObject, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESObject doConstruct(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
Object img = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (imggen == null) {
|
|
||||||
try {
|
|
||||||
imggen = new ImageGenerator();
|
|
||||||
} catch (UnsatisfiedLinkError noawt) {
|
|
||||||
System.err.println("Error creating Image: " + noawt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arguments.length == 1) {
|
|
||||||
if (arguments[0] instanceof ESArrayWrapper) {
|
|
||||||
Object obj = ((ESArrayWrapper) arguments[0]).toJavaObject();
|
|
||||||
|
|
||||||
if (obj instanceof byte[]) {
|
|
||||||
img = imggen.createImage((byte[]) obj);
|
|
||||||
}
|
|
||||||
} else if (arguments[0] instanceof ESString) {
|
|
||||||
String imgurl = arguments[0].toString();
|
|
||||||
|
|
||||||
img = imggen.createPaintableImage(imgurl);
|
|
||||||
}
|
|
||||||
} else if (arguments.length == 2) {
|
|
||||||
if (arguments[0] instanceof ESWrapper &&
|
|
||||||
arguments[1] instanceof ESWrapper) {
|
|
||||||
// create a new image from an existing one and an image filter
|
|
||||||
Object image = arguments[0].toJavaObject();
|
|
||||||
Object filter = arguments[1].toJavaObject();
|
|
||||||
|
|
||||||
img = imggen.createPaintableImage((ImageWrapper) image,
|
|
||||||
(ImageFilter) filter);
|
|
||||||
} else if (arguments[0].isNumberValue() &&
|
|
||||||
arguments[1].isNumberValue()) {
|
|
||||||
img = imggen.createPaintableImage(arguments[0].toInt32(),
|
|
||||||
arguments[1].toInt32());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception error) {
|
|
||||||
System.err.println("Error creating Image: " + error);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (img == null) {
|
|
||||||
throw new EcmaScriptException("Error creating image: Bad parameters or setup problem.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return new ESWrapper(img, this.evaluator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,324 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi.extensions;
|
|
||||||
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Extensions.*;
|
|
||||||
import FESI.Interpreter.*;
|
|
||||||
import helma.util.*;
|
|
||||||
import java.io.*;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension to create and send mail messages via SMTP from HOP applications
|
|
||||||
*/
|
|
||||||
public class MailExtension extends Extension {
|
|
||||||
protected Evaluator eval = null;
|
|
||||||
protected ObjectPrototype esMailPrototype = null;
|
|
||||||
protected Properties mprops;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new MailExtension object.
|
|
||||||
*/
|
|
||||||
public MailExtension() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param props ...
|
|
||||||
*/
|
|
||||||
public void setProperties(Properties props) {
|
|
||||||
this.mprops = props;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called by the evaluator after the extension is loaded.
|
|
||||||
*/
|
|
||||||
public void initializeExtension(Evaluator evaluator)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
this.eval = evaluator;
|
|
||||||
|
|
||||||
GlobalObject go = evaluator.getGlobalObject();
|
|
||||||
FunctionPrototype fp = (FunctionPrototype) evaluator.getFunctionPrototype();
|
|
||||||
|
|
||||||
ESObject op = evaluator.getObjectPrototype();
|
|
||||||
|
|
||||||
esMailPrototype = new ObjectPrototype(op, evaluator); // the Node prototype
|
|
||||||
|
|
||||||
ESObject mail = new GlobalObjectMail("Mail", evaluator, fp, this); // the Mail constructor
|
|
||||||
|
|
||||||
go.putHiddenProperty("Mail", mail); // register the constructor for a Mail object.
|
|
||||||
|
|
||||||
// methods for sending mail from JS...
|
|
||||||
ESObject p = new MailSetText("setText", evaluator, fp);
|
|
||||||
|
|
||||||
esMailPrototype.putHiddenProperty("setText", p);
|
|
||||||
esMailPrototype.putHiddenProperty("addText", p);
|
|
||||||
|
|
||||||
esMailPrototype.putHiddenProperty("addPart",
|
|
||||||
new MailAddPart("addPart", evaluator, fp));
|
|
||||||
esMailPrototype.putHiddenProperty("setSubject",
|
|
||||||
new MailSetSubject("setSubject", evaluator, fp));
|
|
||||||
esMailPrototype.putHiddenProperty("setReplyTo",
|
|
||||||
new MailSetReplyTo("setReplyTo", evaluator, fp));
|
|
||||||
esMailPrototype.putHiddenProperty("setFrom",
|
|
||||||
new MailSetFrom("setFrom", evaluator, fp));
|
|
||||||
|
|
||||||
p = new MailAddTo("addTo", evaluator, fp);
|
|
||||||
esMailPrototype.putHiddenProperty("addTo", p);
|
|
||||||
esMailPrototype.putHiddenProperty("setTo", p);
|
|
||||||
|
|
||||||
p = new MailAddCC("addCC", evaluator, fp);
|
|
||||||
esMailPrototype.putHiddenProperty("addCC", p);
|
|
||||||
esMailPrototype.putHiddenProperty("setCC", p);
|
|
||||||
|
|
||||||
p = new MailAddBCC("addBCC", evaluator, fp);
|
|
||||||
esMailPrototype.putHiddenProperty("addBCC", p);
|
|
||||||
esMailPrototype.putHiddenProperty("setBCC", p);
|
|
||||||
|
|
||||||
esMailPrototype.putHiddenProperty("send", new MailSend("send", evaluator, fp));
|
|
||||||
}
|
|
||||||
|
|
||||||
class GlobalObjectMail extends BuiltinFunctionObject {
|
|
||||||
MailExtension mailx;
|
|
||||||
|
|
||||||
GlobalObjectMail(String name, Evaluator evaluator, FunctionPrototype fp,
|
|
||||||
MailExtension mailx) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
this.mailx = mailx;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
return doConstruct(thisObject, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESObject doConstruct(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESMail mail = null;
|
|
||||||
|
|
||||||
if (arguments.length == 0) {
|
|
||||||
mail = new ESMail(mailx);
|
|
||||||
} else {
|
|
||||||
mail = new ESMail(mailx);
|
|
||||||
|
|
||||||
// should/could do something with extra arguments...
|
|
||||||
}
|
|
||||||
|
|
||||||
return mail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MailSetText extends BuiltinFunctionObject {
|
|
||||||
MailSetText(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESMail mail = (ESMail) thisObject;
|
|
||||||
|
|
||||||
if (arguments.length == 1) {
|
|
||||||
try {
|
|
||||||
mail.setText(arguments[0]);
|
|
||||||
} catch (Exception x) {
|
|
||||||
mail.setStatus(ESMail.TEXT);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MailAddPart extends BuiltinFunctionObject {
|
|
||||||
MailAddPart(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESMail mail = (ESMail) thisObject;
|
|
||||||
|
|
||||||
try {
|
|
||||||
mail.addPart(arguments);
|
|
||||||
} catch (Exception x) {
|
|
||||||
mail.setStatus(ESMail.MIMEPART);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MailSetSubject extends BuiltinFunctionObject {
|
|
||||||
MailSetSubject(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESMail mail = (ESMail) thisObject;
|
|
||||||
|
|
||||||
if (arguments.length == 1) {
|
|
||||||
try {
|
|
||||||
mail.setSubject(arguments[0]);
|
|
||||||
} catch (Exception x) {
|
|
||||||
mail.setStatus(ESMail.SUBJECT);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MailSetReplyTo extends BuiltinFunctionObject {
|
|
||||||
MailSetReplyTo(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESMail mail = (ESMail) thisObject;
|
|
||||||
|
|
||||||
if (arguments.length == 1) {
|
|
||||||
try {
|
|
||||||
mail.setReplyTo(arguments[0]);
|
|
||||||
} catch (Exception x) {
|
|
||||||
mail.setStatus(ESMail.REPLYTO);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MailSetFrom extends BuiltinFunctionObject {
|
|
||||||
MailSetFrom(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESMail mail = (ESMail) thisObject;
|
|
||||||
|
|
||||||
try {
|
|
||||||
mail.setFrom(arguments);
|
|
||||||
} catch (Exception x) {
|
|
||||||
mail.setStatus(ESMail.FROM);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MailAddTo extends BuiltinFunctionObject {
|
|
||||||
MailAddTo(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESMail mail = (ESMail) thisObject;
|
|
||||||
|
|
||||||
try {
|
|
||||||
mail.addTo(arguments);
|
|
||||||
} catch (Exception x) {
|
|
||||||
mail.setStatus(ESMail.TO);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MailAddCC extends BuiltinFunctionObject {
|
|
||||||
MailAddCC(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESMail mail = (ESMail) thisObject;
|
|
||||||
|
|
||||||
try {
|
|
||||||
mail.addCC(arguments);
|
|
||||||
} catch (Exception x) {
|
|
||||||
mail.setStatus(ESMail.CC);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MailAddBCC extends BuiltinFunctionObject {
|
|
||||||
MailAddBCC(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESMail mail = (ESMail) thisObject;
|
|
||||||
|
|
||||||
try {
|
|
||||||
mail.addBCC(arguments);
|
|
||||||
} catch (Exception x) {
|
|
||||||
mail.setStatus(ESMail.BCC);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MailSend extends BuiltinFunctionObject {
|
|
||||||
MailSend(String name, Evaluator evaluator, FunctionPrototype fp) {
|
|
||||||
super(fp, evaluator, name, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ESValue callFunction(ESObject thisObject, ESValue[] arguments)
|
|
||||||
throws EcmaScriptException {
|
|
||||||
ESMail mail = (ESMail) thisObject;
|
|
||||||
|
|
||||||
try {
|
|
||||||
mail.send();
|
|
||||||
} catch (Exception x) {
|
|
||||||
evaluator.engine.getApplication().logEvent("Error sending mail: " + x);
|
|
||||||
mail.setStatus(ESMail.SEND);
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ESBoolean.makeBoolean(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,182 +0,0 @@
|
||||||
/*
|
|
||||||
* Helma License Notice
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Helma License
|
|
||||||
* Version 2.0 (the "License"). You may not use this file except in
|
|
||||||
* compliance with the License. A copy of the License is available at
|
|
||||||
* http://adele.helma.org/download/helma/license.txt
|
|
||||||
*
|
|
||||||
* Copyright 1998-2003 Helma Software. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* $RCSfile$
|
|
||||||
* $Author$
|
|
||||||
* $Revision$
|
|
||||||
* $Date$
|
|
||||||
*/
|
|
||||||
|
|
||||||
package helma.scripting.fesi.extensions;
|
|
||||||
|
|
||||||
import FESI.Data.*;
|
|
||||||
import FESI.Exceptions.*;
|
|
||||||
import FESI.Extensions.*;
|
|
||||||
import FESI.Interpreter.*;
|
|
||||||
import helma.scripting.fesi.FesiEngine;
|
|
||||||
import org.apache.xmlrpc.*;
|
|
||||||
import java.io.*;
|
|
||||||
import java.net.*;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param evaluator ...
|
|
||||||
*
|
|
||||||
* @throws EcmaScriptException ...
|
|
||||||
*/
|
|
||||||
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 "+remoteObject+"."+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 = FesiEngine.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",
|
|
||||||
FesiEngine.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