/**
* Starts the service flow.
*/
public Instance invoke(Metaclass metaclass, String sName, Object message, String sOutput, Pair args, ActionContext actx) throws IntegrationException
{
Service service = (Service)getFlow(sName);
boolean bSecure = m_context.isSecure();
if (bSecure && service.getPrivilege() != null &&
!m_context.getPrivilegeSet().contains(service.getPrivilege()))
{
throw new SecurityViolationException("err.integration.service.unauthorized",
new Object[]{service.getFullName()});
}
if (service.getInterface() != null)
{
MessageTable table = service.getInterface().getRequestTable();
if (!(message instanceof TransferObject) ||
table.getMessageCount() != 0 && table.findMessage(((TransferObject)message).getClassName()) == null)
{
throw new IntegrationException("err.integration.service.inputMessage", new Object[]{service.getFullName()});
}
}
if (s_logger.isDebugEnabled())
{
s_logger.debug("Invoking " + service);
}
Instance instance = null;
try
{
m_context.setSecure(false);
instance = new Instance(metaclass, m_context);
State state = new State(service, true);
state.setReservedValue(0, instance);
state.setReservedValue(1, state);
state.setValue(Service.OUTPUT, sOutput);
state.setToken(service, message);
int i = 0;
for (Pair pair = args; pair != null; pair = pair.getNext())
{
if (i >= service.getArgumentCount())
{
i = -1;
break;
}
state.setValue(service.getArgument(i++), pair.getHead());
}
if (i != service.getArgumentCount())
{
throw new IntegrationException("err.integration.service.argCount",
new Object[]{Primitive.createInteger(Pair.length(args)),
Primitive.createInteger(service.getArgumentCount())});
}
instance.setNew();
instance.setValue("name", service.getName());
instance.setValue("version", Primitive.createInteger(service.getVersion()));
instance.setValue("oid", EMPTY_BINARY);
instance.setValue("class", "");
instance.setValue("local", GUIDUtil.generateGUID());
instance.setValue("object", null);
instance.setValue("state", state);