@@ -219,6 +219,15 @@ internal string[] Keys
219219 private OnGatewayError _onGatewayError ;
220220 public OnGatewayError OnGatewayError { get { return _onGatewayError ; } set { _onGatewayError = value ; } }
221221
222+ private OnSubProcessStarted _onSubProcessStarted ;
223+ public OnSubProcessStarted OnSubProcessStarted { get { return _onSubProcessStarted ; } set { _onSubProcessStarted = value ; } }
224+
225+ private OnSubProcessCompleted _onSubProcessCompleted ;
226+ public OnSubProcessCompleted OnSubProcessCompleted { get { return _onSubProcessCompleted ; } set { _onSubProcessCompleted = value ; } }
227+
228+ private OnSubProcessError _onSubProcessError ;
229+ public OnSubProcessError OnSubProcessError { get { return _onSubProcessError ; } set { _onSubProcessError = value ; } }
230+
222231 public OnStateChange OnStateChange { set { _state . OnStateChange = value ; } }
223232 #endregion
224233
@@ -387,7 +396,8 @@ public BusinessProcess(XmlDocument doc, LogLevels stateLogLevel,sProcessRuntimeC
387396 {
388397 if ( n . NodeType == XmlNodeType . Element )
389398 {
390- map . Load ( ( XmlElement ) n ) ;
399+ if ( map . Load ( ( XmlElement ) n ) )
400+ _elementMapCache . MapIdeals ( map ) ;
391401 IElement elem = Utility . ConstructElementType ( ( XmlElement ) n , map , null ) ;
392402 if ( elem != null )
393403 {
@@ -695,6 +705,9 @@ public BusinessProcess Clone(bool includeState,bool includeDelegates)
695705 ret . OnProcessStarted = OnProcessStarted ;
696706 ret . OnProcessCompleted = OnProcessCompleted ;
697707 ret . OnProcessError = OnProcessError ;
708+ ret . OnSubProcessStarted = OnSubProcessStarted ;
709+ ret . OnSubProcessCompleted = OnSubProcessCompleted ;
710+ ret . OnSubProcessError = OnSubProcessError ;
698711 ret . OnSequenceFlowCompleted = OnSequenceFlowCompleted ;
699712 ret . OnMessageFlowCompleted = OnMessageFlowCompleted ;
700713 ret . IsEventStartValid = IsEventStartValid ;
@@ -724,7 +737,7 @@ public bool BeginProcess(ProcessVariablesContainer variables)
724737 {
725738 if ( elem is Elements . Process )
726739 {
727- if ( ( ( Elements . Process ) elem ) . IsProcessStartvalid ( variables , _isProcessStartValid ) )
740+ if ( ( ( Elements . Process ) elem ) . IsStartValid ( variables , _isProcessStartValid ) )
728741 {
729742 Elements . Process p = ( Elements . Process ) elem ;
730743 foreach ( StartEvent se in p . StartEvents )
@@ -952,6 +965,12 @@ private void _ProcessElement(string sourceID,IElement elem)
952965 else if ( elem is AEvent )
953966 {
954967 AEvent evnt = ( AEvent ) elem ;
968+ if ( evnt is IntermediateCatchEvent )
969+ {
970+ SubProcess sp = evnt . SubProcess ;
971+ if ( sp != null )
972+ _state . Path . StartSubProcess ( sp , sourceID ) ;
973+ }
955974 lock ( _state )
956975 {
957976 _state . Path . StartEvent ( evnt , sourceID ) ;
@@ -999,9 +1018,19 @@ private void _ProcessElement(string sourceID,IElement elem)
9991018 {
10001019 if ( ( ( EndEvent ) evnt ) . IsProcessEnd )
10011020 {
1002- if ( _onProcessCompleted != null )
1003- _onProcessCompleted ( ( ( EndEvent ) evnt ) . Process , new ReadOnlyProcessVariablesContainer ( elem . id , _state , this ) ) ;
1004- _processLock . Set ( ) ;
1021+ SubProcess sp = ( ( EndEvent ) evnt ) . SubProcess ;
1022+ if ( sp != null )
1023+ {
1024+ lock ( _state ) { _state . Path . SucceedSubProcess ( sp ) ; }
1025+ if ( _onSubProcessCompleted != null )
1026+ _onSubProcessCompleted ( sp , new ReadOnlyProcessVariablesContainer ( sp . id , _state , this ) ) ;
1027+ }
1028+ else
1029+ {
1030+ if ( _onProcessCompleted != null )
1031+ _onProcessCompleted ( ( ( EndEvent ) evnt ) . Process , new ReadOnlyProcessVariablesContainer ( elem . id , _state , this ) ) ;
1032+ _processLock . Set ( ) ;
1033+ }
10051034 }
10061035 }
10071036 }
@@ -1059,6 +1088,29 @@ private void _ProcessElement(string sourceID,IElement elem)
10591088 _onTaskError ( tsk , new ReadOnlyProcessVariablesContainer ( elem . id , _state , this , e ) ) ;
10601089 lock ( _state ) { _state . Path . FailTask ( tsk , e ) ; }
10611090 }
1091+ } else if ( elem is SubProcess )
1092+ {
1093+ SubProcess esp = ( SubProcess ) elem ;
1094+ ProcessVariablesContainer variables = new ProcessVariablesContainer ( elem . id , _state , this ) ;
1095+ if ( esp . IsStartValid ( variables , _isProcessStartValid ) )
1096+ {
1097+ foreach ( StartEvent se in esp . StartEvents )
1098+ {
1099+ if ( se . IsEventStartValid ( variables , _isEventStartValid ) )
1100+ {
1101+ WriteLogLine ( LogLevels . Info , new StackFrame ( 1 , true ) , DateTime . Now , string . Format ( "Valid Sub Process Start[{0}] located, beginning process" , se . id ) ) ;
1102+ lock ( _state ) { _state . Path . StartSubProcess ( esp , sourceID ) ; }
1103+ if ( _onSubProcessStarted != null )
1104+ _onSubProcessStarted ( esp , new ReadOnlyProcessVariablesContainer ( variables ) ) ;
1105+ if ( _onEventStarted != null )
1106+ _onEventStarted ( se , new ReadOnlyProcessVariablesContainer ( variables ) ) ;
1107+ _state . Path . StartEvent ( se , null ) ;
1108+ _state . Path . SucceedEvent ( se ) ;
1109+ if ( _onEventCompleted != null )
1110+ _onEventCompleted ( se , new ReadOnlyProcessVariablesContainer ( se . id , _state , this ) ) ;
1111+ }
1112+ }
1113+ }
10621114 }
10631115 }
10641116 }
0 commit comments