use of org.mozilla.javascript.Function in project servoy-client by Servoy.
the class RuntimeWebComponent method executeScopeFunction.
public Object executeScopeFunction(WebObjectFunctionDefinition functionSpec, Object[] arrayOfSabloJavaMethodArgs) {
if (functionSpec != null) {
Object object = scopeObject.get(functionSpec.getName(), scopeObject);
if (object instanceof Function) {
Context context = Context.enter();
try {
// find spec for method
List<PropertyDescription> argumentPDs = (functionSpec != null ? functionSpec.getParameters() : null);
// convert arguments to Rhino
Object[] array = new Object[arrayOfSabloJavaMethodArgs.length];
for (int i = 0; i < arrayOfSabloJavaMethodArgs.length; i++) {
array[i] = NGConversions.INSTANCE.convertSabloComponentToRhinoValue(arrayOfSabloJavaMethodArgs[i], (argumentPDs != null && argumentPDs.size() > i) ? argumentPDs.get(i) : null, component, this);
}
context.putThreadLocal(SERVER_SIDE_SCRIPT_EXECUTE, Boolean.TRUE);
try {
Object retValue = ((Function) object).call(context, scopeObject, scopeObject, array);
PropertyDescription retValuePD = (functionSpec != null ? functionSpec.getReturnType() : null);
return NGConversions.INSTANCE.convertRhinoToSabloComponentValue(retValue, null, retValuePD, component);
} finally {
context.removeThreadLocal(SERVER_SIDE_SCRIPT_EXECUTE);
}
} catch (JSONException e) {
e.printStackTrace();
return null;
} finally {
Context.exit();
}
} else {
throw new RuntimeException("trying to call a function '" + functionSpec.getName() + "' that does not exists on a component '" + component.getName() + " with spec: " + webComponentSpec.getName());
}
}
return null;
}
use of org.mozilla.javascript.Function in project servoy-client by Servoy.
the class FoundSet method sort.
/**
* Sorts the foundset based on the given record comparator function.
* Tries to preserve selection based on primary key. If first record is selected or cannot select old record it will select first record after sort.
* The comparator function is called to compare
* two records, that are passed as arguments, and
* it will return -1/0/1 if the first record is less/equal/greater
* then the second record.
*
* The function based sorting does not work with printing.
* It is just a temporary in-memory sort.
*
* NOTE: starting with 7.2 release this function doesn't save the data anymore
*
* @sample
* %%prefix%%foundset.sort(mySortFunction);
*
* function mySortFunction(r1, r2)
* {
* var o = 0;
* if(r1.id < r2.id)
* {
* o = -1;
* }
* else if(r1.id > r2.id)
* {
* o = 1;
* }
* return o;
* }
*
* @param recordComparisonFunction record comparator function
*/
@JSFunction
@JSSignature(arguments = { Function.class })
public void sort(Object recordComparisonFunction) {
if (recordComparisonFunction instanceof Function) {
final Function func = (Function) recordComparisonFunction;
final IExecutingEnviroment scriptEngine = fsm.getApplication().getScriptEngine();
final Scriptable recordComparatorScope = func.getParentScope();
sort(new Comparator<Object[]>() {
public int compare(Object[] o1, Object[] o2) {
try {
Object compareResult = scriptEngine.executeFunction(func, recordComparatorScope, recordComparatorScope, new Object[] { getRecord(o1), getRecord(o2) }, false, true);
double cmp = Utils.getAsDouble(compareResult, true);
return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
} catch (Exception ex) {
Debug.error(ex);
}
return 0;
}
});
}
}
use of org.mozilla.javascript.Function in project servoy-client by Servoy.
the class FoundSetManager method getTriggerFunctions.
private List<TriggerFunction> getTriggerFunctions(ITable table, TypedProperty<Integer> property, Scriptable foundsetScope) {
FlattenedSolution solutionRoot = getApplication().getFlattenedSolution();
IExecutingEnviroment scriptEngine = getApplication().getScriptEngine();
return stream(solutionRoot.getTableNodes(table)).map(tableNode -> {
Object function = null;
Scriptable scope = null;
ScriptMethod scriptMethod = solutionRoot.getScriptMethod(((Integer) tableNode.getProperty(property.getPropertyName())).intValue());
if (scriptMethod != null) {
if (scriptMethod.getParent() instanceof Solution) {
// global method
GlobalScope gs = scriptEngine.getScopesScope().getGlobalScope(scriptMethod.getScopeName());
if (gs != null) {
scope = gs;
function = gs.get(scriptMethod.getName());
}
} else if (foundsetScope != null) {
// foundset method
scope = foundsetScope;
function = scope.getPrototype().get(scriptMethod.getName(), scope);
}
}
if (function instanceof Function) {
return new TriggerFunction((Function) function, scope, tableNode);
}
return null;
}).filter(Objects::nonNull).collect(toList());
}
use of org.mozilla.javascript.Function in project servoy-client by Servoy.
the class JSForm method js_setOnShowAllRecordsCmdMethod.
/**
* @deprecated As of release 4.1, replaced by setOnShowAllRecordsCmd(JSMethod).
*/
@Deprecated
public void js_setOnShowAllRecordsCmdMethod(Object functionOrInteger) {
checkModification();
if (functionOrInteger instanceof Function) {
Function function = (Function) functionOrInteger;
ScriptMethod scriptMethod = getScriptMethod(function, application.getFlattenedSolution());
if (scriptMethod != null) {
getForm().setOnShowAllRecordsCmdMethodID(scriptMethod.getID());
} else {
getForm().setOnShowAllRecordsCmdMethodID(0);
}
} else if (functionOrInteger instanceof Number) {
getForm().setOnShowAllRecordsCmdMethodID(((Number) functionOrInteger).intValue());
}
}
use of org.mozilla.javascript.Function in project servoy-client by Servoy.
the class JSForm method js_setOnOmitRecordCmdMethod.
/**
* @deprecated As of release 4.1, replaced by setOnOmitRecordCmd(JSMethod).
*/
@Deprecated
public void js_setOnOmitRecordCmdMethod(Object functionOrInteger) {
checkModification();
if (functionOrInteger instanceof Function) {
Function function = (Function) functionOrInteger;
ScriptMethod scriptMethod = getScriptMethod(function, application.getFlattenedSolution());
if (scriptMethod != null) {
getForm().setOnOmitRecordCmdMethodID(scriptMethod.getID());
} else {
getForm().setOnOmitRecordCmdMethodID(0);
}
} else if (functionOrInteger instanceof Number) {
getForm().setOnOmitRecordCmdMethodID(((Number) functionOrInteger).intValue());
}
}
Aggregations