Add a default outcome to the dialog manager
-------------------------------------------
Key: SHALE-188
URL: http://issues.apache.org/struts/browse/SHALE-188
Project: Shale
Type: Improvement
Components: Core
Environment: Debian Linux - JDK 1.5
Reporter: Laure Goudon
Version from manifest: Implementation-Version: 20060326
Hello,
When we click on the browser back button while in a dialog and then click on
another link or button, an Illegal argument exception comes (see stacktrace).
This error occurs because Shale can't find any transition for this action. It
would be a good idea that we could have a default transition (for instance
named "*" or "default") that the dialog navigation handler class would use if
no other transition was found for this state or dialog.
Thanks.
stacktrace :
java.lang.IllegalArgumentException: You have requested a transition outcome
named "clusterMenu" from a state named "viewApplicationView" in a dialog named
"viewApplication", but no transition definition can be found. Double check the
spelling of the transition outcome name.
at
org.apache.shale.dialog.faces.DialogNavigationHandler.transition(DialogNavigationHandler.java:526)
at
org.apache.shale.dialog.faces.DialogNavigationHandler.postprocess(DialogNavigationHandler.java:353)
at
org.apache.shale.dialog.faces.DialogNavigationHandler.handleNavigation(DialogNavigationHandler.java:219)
at
org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:84)
at javax.faces.component.UICommand.broadcast(UICommand.java:106)
at
org.apache.myfaces.custom.navmenu.htmlnavmenu.HtmlCommandNavigationItem.broadcast(HtmlCommandNavigationItem.java:228)
Proposed solution :
In the class DialogNavigationHandler in the method transition
/** Default outcome name constant as in :
* <transition outcome="*" target="exit"/>
*/
public static final String DEFAULT_OUTCOME_NAME = "*";
// Identify the appropriate Transition
Transition transition = state.findTransition(outcome);
if (transition == null) {
transition = state.getDialog().findTransition(outcome);
// ---- Begin patch ----
// If not found, check the default outcome for the current state
if (transition == null) {
Transition transition = state.findTransition(outcome);
// If not found, check the default outcome for the current dialog.
if (transition == null) {
transition =
state.getDialog().findTransition(DEFAULT_OUTCOME_NAME);
}
}
// ---- End patch ----
}
if (transition == null) {
throw new
IllegalArgumentException(messages.getMessage("dialog.noTransition",
new Object[] { outcome,
state.getName(),
state.getDialog().getName() }));
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/struts/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira