diff --git a/spring-webflow-reference/src/flow-inheritance.xml b/spring-webflow-reference/src/flow-inheritance.xml new file mode 100644 index 00000000..38267106 --- /dev/null +++ b/spring-webflow-reference/src/flow-inheritance.xml @@ -0,0 +1,185 @@ + + + Flow Inheritance + + Introduction + + Flow inheritance allows one flow to inherit the configuration of another flow. + Inheritance can occur at both the flow and state levels. + A common use case is for a parent flow to define global transitions and exception handlers, then each child flow can inherit those settings. + + + In order for a parent flow to be found, it must be added to the flow-registry just like any other flow. + + + + Is flow inheritance like Java inheritance? + + Flow inheritance is similar to Java inheritance in that elements defined in a parent are exposed via the child, however, there are key differences. + + + A child flow cannot override an element from a parent flow. + Similar elements between the parent and child flows will be merged. + Unique elements in the parent flow will be added to the child. + + + A child flow can inherit from multiple parent flows. + Java inheritance is limited to a single class. + + + + Types of Flow Inheritance + + Flow level inheritance + + Flow level inheritance is defined by the parent attribute on the flow element. + The attribute contains a comma separated list of flow identifiers to inherit from. + The child flow will inherit from each parent in the order it is listed adding elements and content to the resulting flow. + The resulting flow from the first merge will be considered the child in the second merge, and so on. + + +<flow parent="common-transitions, common-states"> + + + + State level inheritance + + State level inheritance is similar to flow level inheritance, except only one state inherits from the parent, instead of the entire flow. + + + Unlike flow inheritance, only a single parent is allowed. + Additionally, the identifier of the flow state to inherit from must also be defined. + The identifiers for the flow and the state within that flow are separated by a #. + + + The parent and child states must be of the same type. + For instance a view-state cannot inherit from an end-state, only another view-state. + + +<view-state id="child-state" parent="parent-flow#parent-view-state"> + + + + + Abstract flows + + Often parent flows are not designed to be executed directly. + In order to protect these flow from running, they can be marked as abstract. + If an abstract flow attempts to run, a FlowBuilderException will be thrown. + + +<flow abstract="true"> + + + + Inheritance Algorithm + + When a child flow inherits from it's parent, essentially what happens is that the parent and child are merged together to create a new flow. + There are rules for every element in the Web Flow definition language that govern how that particular element is merged. + + + There are two types of elements mergable and non-mergeable. + Mergeable elements will always attempt to merge together if the elements are similar. + Non-mergeable elements in a parent or child flow will always be contained in the resulting flow intact. + They will not be modified as part of the merge process. + + + Mergeable Elements + + If the elements are of the same type and the keyed attribute are identical, the content of the parent element will be merged with the child element. + The merge algorithm will continue to merge each sub-element of the merging parent and child. + Otherwise the parent element is added as a new element to the child. + + + In most cases, elements from a parent flow that are added will be added after elements in the child flow. + Exceptions to this rule include actions elements (evaluate, render and set) which will be added at the beginning. + This allows for the results of parent actions to be used by child actions. + + + Mergeable elements are: + + + action-state: id + + + attribute: name + + + decision-state: id + + + end-state: id + + + flow: always merges + + + if: test + + + on-end: always merges + + + on-entry: always merges + + + on-exit: always merges + + + on-render: always merges + + + on-start: always merges + + + input: name + + + output: name + + + secured: attributes + + + subflow-state: id + + + transition: on + + + view-state: id + + + + + + Non-mergeable Elements + + Non-mergeable elements are: + + + bean-import + + + evaluate + + + exception-handler + + + persistence-context + + + render + + + set + + + var + + + + + + \ No newline at end of file diff --git a/spring-webflow-reference/src/spring-webflow-reference.xml b/spring-webflow-reference/src/spring-webflow-reference.xml index a62345d4..2a22ade2 100644 --- a/spring-webflow-reference/src/spring-webflow-reference.xml +++ b/spring-webflow-reference/src/spring-webflow-reference.xml @@ -5,6 +5,7 @@ + ]> @@ -51,5 +52,6 @@ &overview; &defining-flows; &flow-security; + &flow-inheritance;