Author: craigmcc
Date: Thu Nov 30 19:56:17 2006
New Revision: 481140
URL: http://svn.apache.org/viewvc?view=rev&rev=481140
Log:
When BasicDialogContext.advance() was called with a null outcome, we were
correctly staying in the same state (to emulate JSF standard navigation
behavior), but we were *incorrectly* recreating the view. This would destroy
any accumulated information in the component tree and cause it to be
reinitialized, which was the proximate cause for this particular sample app
failing.
Change things so that a null outcome causes us to stay in the same state
*without* recreating the view. Thanks to Mario Buonopane for the concise
reproducible test case, and to Gary for pointing right at the problem area.
SHALE-341
Modified:
shale/framework/trunk/shale-dialog-basic/src/main/java/org/apache/shale/dialog/basic/BasicDialogContext.java
Modified:
shale/framework/trunk/shale-dialog-basic/src/main/java/org/apache/shale/dialog/basic/BasicDialogContext.java
URL:
http://svn.apache.org/viewvc/shale/framework/trunk/shale-dialog-basic/src/main/java/org/apache/shale/dialog/basic/BasicDialogContext.java?view=diff&rev=481140&r1=481139&r2=481140
==============================================================================
---
shale/framework/trunk/shale-dialog-basic/src/main/java/org/apache/shale/dialog/basic/BasicDialogContext.java
(original)
+++
shale/framework/trunk/shale-dialog-basic/src/main/java/org/apache/shale/dialog/basic/BasicDialogContext.java
Thu Nov 30 19:56:17 2006
@@ -91,7 +91,7 @@
}
- // ------------------------------------------------------ DialogContext
Variables
+ // ------------------------------------------------- DialogContext
Variables
/**
@@ -175,7 +175,15 @@
private static final Class[] ACTION_STATE_SIGNATURE = new Class[0];
- // ----------------------------------------------------- DialogContext
Properties
+ /**
+ * <p>Flag outcome value that signals a need to transition to the
+ * start state for this dialg.</p>
+ */
+ private static final String START_OUTCOME =
+ "org.apache.shale.dialog.basic.START_OUTCOME";
+
+
+ // ------------------------------------------------ DialogContext
Properties
/** [EMAIL PROTECTED] */
@@ -256,7 +264,7 @@
}
- // -------------------------------------------------------- DialogContext
Methods
+ // --------------------------------------------------- DialogContext
Methods
/** [EMAIL PROTECTED] */
@@ -273,10 +281,22 @@
+ ", outcome=" + outcome + ")");
}
+ // If the incoming outcome is null, we want to stay in the same
+ // (view) state *without* recreating it, which would destroy
+ // any useful information that components might have stored
+ if (outcome == null) {
+ if (log().isTraceEnabled()) {
+ log().trace("punt early since outcome is null");
+ }
+ return;
+ }
+
// Perform an initial transition from the current state based on
// the logical outcome received from the (current) view state
Position position = peek();
- transition(position, outcome);
+ if (!START_OUTCOME.equals(outcome)) {
+ transition(position, outcome);
+ }
State state = position.getState();
String viewId = null;
boolean redirect = false;
@@ -401,7 +421,7 @@
// Advance the computation of our dialog until a view state
// is encountered, then navigate to it
- advance(context, null);
+ advance(context, START_OUTCOME);
}