_formSupport = new FormSupportImpl();
_environment.push(ValidationTracker.class, _tracker);
_environment.push(FormSupport.class, _formSupport);
Heartbeat heartbeat = new HeartbeatImpl();
_environment.push(Heartbeat.class, heartbeat);
heartbeat.begin();
try
{
final Holder<ActionResponseGenerator> holder = Holder.create();
ComponentEventHandler handler = new ComponentEventHandler()
{
public boolean handleResult(Object result, Component component,
String methodDescription)
{
if (result instanceof Boolean) return ((Boolean) result);
holder.put(_eventResultProcessor.processComponentEvent(
result,
component,
methodDescription));
return true; // Abort other event processing.
}
};
_resources.triggerEvent(PREPARE, context, handler);
if (holder.hasValue()) return holder.get();
// TODO: Ajax stuff will eventually mean there are multiple values for this parameter
// name
String actionsBase64 = _request.getParameter(FORM_DATA);
ObjectInputStream ois = null;
Component component = null;
try
{
ois = new Base64ObjectInputStream(actionsBase64);
while (true)
{
String componentId = ois.readUTF();
ComponentAction action = (ComponentAction) ois.readObject();
component = _source.getComponent(componentId);
action.execute(component);
component = null;
}
}
catch (EOFException ex)
{
// Expected
}
catch (Exception ex)
{
throw new TapestryException(ex.getMessage(), component, ex);
}
finally
{
TapestryInternalUtils.close(ois);
}
heartbeat.end();
ValidationTracker tracker = _environment.peek(ValidationTracker.class);
// Let the listeners peform any final validations