final String override = context.getParameter("_" + RESULT_OVERRIDE);
String resultName = context.getParameter("_" + RESULT_NAME);
final String message = context.getParameter("_" + MESSAGE);
resultName = resultName == null ? RequestContext.RESULT : resultName;
FormState entryState = null;
try {
final ObjectAdapter object = MethodsUtils.findObject(context, objectId);
// FIXME need to find method based on the set of parameters.
// otherwise overloaded method may be incorrectly
// selected.
final ObjectAction action = MethodsUtils.findAction(object, methodName);
entryState = validateParameters(context, action, object);
AuthenticationSession session = context.getSession();
if (session == null && action.isVisible(new AnonymousSession(), object, where).isVetoed()) {
session = new AnonymousSession();
}
final Version originalVersion = context.getVersion(version);
object.checkLock(originalVersion);
if (entryState.isValid()) {
final boolean hasResult = invokeMethod(context, resultName, object, action, entryState);
String view = context.getParameter(hasResult ? "_" + VIEW : "_" + VOID);
final int questionMark = view == null ? -1 : view.indexOf("?");
if (questionMark > -1) {
final String params[] = view.substring(questionMark + 1).split("&");
for (final String param : params) {
final int equals = param.indexOf("=");
context.addVariable(param.substring(0, equals), param.substring(equals + 1), Scope.REQUEST);
view = view.substring(0, questionMark);
}
}
context.setRequestPath(view);
if (message != null) {
final MessageBroker messageBroker = getMessageBroker();
messageBroker.addMessage(message);
}
if (override != null) {
context.addVariable(resultName, override, Scope.REQUEST);
}
if (!action.hasReturn() && context.getVariable(resultName) == null) {
context.addVariable(resultName, objectId, Scope.REQUEST);
}
} else {
entryState.setForm(formId);
context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
context.addVariable(resultName, objectId, Scope.REQUEST);
if (override != null) {
context.addVariable(resultName, override, Scope.REQUEST);
}
final String error = entryState.getError();
final String view = context.getParameter("_" + ERROR);
context.setRequestPath(view, Dispatcher.ACTION);
final MessageBroker messageBroker = getMessageBroker();
messageBroker.addWarning(error);
}
} catch (final ConcurrencyException e) {
final ObjectAdapter adapter = getAdapterManager().getAdapterFor(e.getOid());
String user = adapter.getOid().getVersion().getUser();
String errorMessage = "The data for '" + adapter.titleString() + "' was changed by " + user
+ ". Please repeat the action based on those changes.";
getMessageBroker().addMessage(errorMessage);
entryState.setForm(formId);
context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
context.addVariable(resultName, objectId, Scope.REQUEST);
if (override != null) {
context.addVariable(resultName, override, Scope.REQUEST);
}
final String error = entryState.getError();
if (error != null) {
context.addVariable(RequestContext.ERROR, error, Scope.REQUEST);
}
final String view = context.getParameter("_" + ERROR);