Implement rootObjectPropertyName setting to allow "pure" javascript applications where root object is fetched from a global variable in the scripting engine.
This commit is contained in:
parent
6d3f6c3165
commit
eba343b868
4 changed files with 49 additions and 7 deletions
|
@ -24,6 +24,7 @@ import helma.main.Server;
|
|||
import helma.objectmodel.*;
|
||||
import helma.objectmodel.db.*;
|
||||
import helma.util.*;
|
||||
import helma.scripting.ScriptingEngine;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
|
@ -69,6 +70,9 @@ public final class Application implements Runnable {
|
|||
// otherwise this is managed by the NodeManager and not cached here.
|
||||
Object rootObject = null;
|
||||
String rootObjectClass;
|
||||
// if defined this will cause us to get the root object straight
|
||||
// from the scripting engine, circumventing all hopobject db fluff
|
||||
String rootObjectPropertyName;
|
||||
|
||||
// The session manager
|
||||
SessionManager sessionMgr;
|
||||
|
@ -834,7 +838,7 @@ public final class Application implements Runnable {
|
|||
/**
|
||||
* This method returns the root object of this application's object tree.
|
||||
*/
|
||||
public Object getDataRoot() {
|
||||
public Object getDataRoot(ScriptingEngine scriptingEngine) {
|
||||
// check if we have a custom root object class
|
||||
if (rootObjectClass != null) {
|
||||
// create custom root element.
|
||||
|
@ -861,9 +865,11 @@ public final class Application implements Runnable {
|
|||
}
|
||||
|
||||
return rootObject;
|
||||
}
|
||||
// no custom root object is defined - use standard helma objectmodel
|
||||
else {
|
||||
} else if (rootObjectPropertyName != null) {
|
||||
// get root object from a global scripting engine property
|
||||
return scriptingEngine.getGlobalProperty(rootObjectPropertyName);
|
||||
} else {
|
||||
// no custom root object is defined - use standard helma objectmodel
|
||||
return nmgr.safe.getRootNode();
|
||||
}
|
||||
}
|
||||
|
@ -1167,7 +1173,7 @@ public final class Application implements Runnable {
|
|||
* Return the href to the root of this application.
|
||||
*/
|
||||
public String getRootHref() throws UnsupportedEncodingException {
|
||||
return getNodeHref(getDataRoot(), null);
|
||||
return getNodeHref(null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1823,6 +1829,7 @@ public final class Application implements Runnable {
|
|||
}
|
||||
|
||||
hrefRootPrototype = props.getProperty("hrefrootprototype");
|
||||
rootObjectPropertyName = props.getProperty("rootobjectpropertyname");
|
||||
|
||||
// update the XML-RPC access list, containting prototype.method
|
||||
// entries of functions that may be called via XML-RPC
|
||||
|
|
|
@ -218,7 +218,7 @@ public final class RequestEvaluator implements Runnable {
|
|||
transactor = Transactor.getInstance(app.nmgr);
|
||||
transactor.begin(txname);
|
||||
|
||||
Object root = app.getDataRoot();
|
||||
Object root = app.getDataRoot(scriptingEngine);
|
||||
initGlobals(root, requestPath);
|
||||
|
||||
String action = null;
|
||||
|
|
|
@ -116,11 +116,18 @@ public interface ScriptingEngine {
|
|||
*/
|
||||
public void abort();
|
||||
|
||||
/**
|
||||
* Get a global property
|
||||
* @param propertyName the property name
|
||||
* @return the property value, or null
|
||||
*/
|
||||
public Object getGlobalProperty(String propertyName);
|
||||
|
||||
/**
|
||||
* Get a property on an object
|
||||
* @param thisObject the object
|
||||
* @param propertyName the property name
|
||||
* @return true the property value, or null
|
||||
* @return the property value, or null
|
||||
*/
|
||||
public Object getProperty(Object thisObject, String propertyName);
|
||||
|
||||
|
|
|
@ -424,6 +424,34 @@ public class RhinoEngine implements ScriptingEngine {
|
|||
return wrapped.has(propname, wrapped);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a property from the global object.
|
||||
* @param propname the property name
|
||||
* @return the property value if the property is defined, or null
|
||||
*/
|
||||
public Object getGlobalProperty(String propname) {
|
||||
if (propname == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
Object prop = core.global.get(propname, global);
|
||||
if (prop == null
|
||||
|| prop == Undefined.instance
|
||||
|| prop == ScriptableObject.NOT_FOUND) {
|
||||
return null;
|
||||
} else if (prop instanceof Wrapper) {
|
||||
return ((Wrapper) prop).unwrap();
|
||||
} else {
|
||||
// Do not return functions as properties as this
|
||||
// is a potential security problem
|
||||
return (prop instanceof Function) ? null : prop;
|
||||
}
|
||||
} catch (Exception esx) {
|
||||
app.logError("Error getting global property " + propname + ": " + esx);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an object has a defined property (public field if it
|
||||
* is a java object) with that name.
|
||||
|
|
Loading…
Add table
Reference in a new issue