use of org.whole.lang.iterators.IEntityIterator in project whole by wholeplatform.
the class WorkflowsDynamicCompilerVisitor method visit.
@Override
public void visit(InvokeJavaInstanceMethod entity) {
final Variable resultVariable = entity.getResult();
final Variable instanceVariable = entity.getObject();
Expressions arguments = entity.getArguments();
int size = arguments.wSize();
IEntityIterator<?>[] runnableIterators = new IEntityIterator<?>[2 + size];
entity.getClassName().accept(this);
runnableIterators[0] = getResultIterator();
entity.getMethod().accept(this);
runnableIterators[1] = getResultIterator();
for (int i = 0; i < size; i++) {
arguments.get(i).accept(this);
runnableIterators[2 + i] = getResultIterator();
}
setResultIterator(IteratorFactory.multiValuedRunnableIterator(new AbstractWorkflowsRunnable() {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... argsEntities) {
String className = argsEntities[0].wStringValue();
IEntity methodData = argsEntities[1];
Method method;
if (DataTypeUtils.getDataKind(methodData).isString())
method = JavaReflectUtils.getMethod(className, methodData.wStringValue(), ReflectionFactory.getClassLoader(bm));
else
method = (Method) methodData.wGetValue();
IEntity instanceEntity = bm.wGet(instanceVariable.getValue());
if (instanceEntity == null)
throw new MissingVariableException(instanceVariable.getValue()).withSourceEntity(getSourceEntity()).withBindings(getBindings());
Object instance = DataTypeUtils.unbox(instanceEntity, method.getDeclaringClass(), false);
Object[] arguments = toArguments(method.getParameterTypes(), method.isVarArgs(), argsEntities);
Object resultValue = JavaReflectUtils.invokeMethod(instance, method, arguments);
setResult(bm, resultVariable, resultValue, method.getReturnType());
}
}, runnableIterators).withSourceEntity(entity));
}
use of org.whole.lang.iterators.IEntityIterator in project whole by wholeplatform.
the class ActionCallIterator method initArguments.
protected void initArguments() {
if (!useSelectedEntities) {
IEntity selectedEntities = BindingManagerFactory.instance.createTuple();
if (argsIterators != null && argsIterators.length > 0)
for (IEntityIterator<?> argIterator : argsIterators) {
argIterator.setBindings(getBindings());
argIterator.reset(resetEntity);
for (IEntity arg : argIterator) selectedEntities.wAdd(arg);
}
else
selectedEntities.wAdd(resetEntity);
getBindings().wDef("selectedEntities", selectedEntities);
if (selectedEntities.wSize() > 0)
getBindings().wDef("primarySelectedEntity", selectedEntities.wGet(0));
}
getBindings().wDef("self", resetEntity);
}
use of org.whole.lang.iterators.IEntityIterator in project whole by wholeplatform.
the class ReusablesDynamicCompilerVisitor method visit.
@Override
public void visit(PathSegments entity) {
int size = entity.wSize();
if (size == 1)
entity.get(0).accept(this);
else {
IEntityIterator<? extends IEntity>[] segmentIterators = new IEntityIterator<?>[size];
for (int i = 0; i < size; i++) {
entity.get(i).accept(this);
segmentIterators[i] = getResultIterator();
}
setResultIterator(IteratorFactory.singleValuedRunnableIterator((IEntity selfEntity, IBindingManager bm, IEntity... arguments) -> {
if (!BindingManagerFactory.instance.isVoid(selfEntity)) {
StringBuilder sb = new StringBuilder();
for (IEntity pathSegment : arguments) appendSegment(sb, pathSegment.wStringValue());
bm.setResult(BindingManagerFactory.instance.createValue(sb.toString()));
}
}, segmentIterators).withSourceEntity(entity));
}
}
Aggregations