PART 1:
public class ModelDrivenInterceptor extends AbstractInterceptor {
protected boolean refreshModelBeforeResult = false;
public void setRefreshModelBeforeResult(boolean val) {
this.refreshModelBeforeResult = val;
}
//Derek: the signature is impressive and noteworthy, recursively invoked scenario
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if (action instanceof ModelDriven) {
ModelDriven modelDriven = (ModelDriven) action;
ValueStack stack = invocation.getStack();
Object model = modelDriven.getModel();
if (model != null) {
//Derek: Notice the exact simple behavior of ModelDriven
stack.push(model);
}
if (refreshModelBeforeResult) {
invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
}
}
//Derek: Notice the return clause, which enables recurrsive invoking.
return invocation.invoke();
}
THINK: Under the params-prepare-params pattern, the first time parametersInterceptor invoked must not apply the params to any model, since no model pushed into ValueStack at that moment.
INVESTIGATE: When does Struts 2 set values for the model's properties?
DELVE: the model object would be on the top of the stack? and would be matched with priority(given top-down retrieval)?