//private int SessionIndexPlaying = -1; private void StartPlayer(int index) { //SessionIndexPlaying = index; StartIndex = index; CurrentIndex = index; CurrentState = EventsState.Playing; var lst = SessionElementOrderedList[CurrentIndex]; Sessions.ForEach(x => x.State = SessionState.WaitingForStartingElement); foreach (var sessionElement in lst.Where(x => IsValidStartingEvent(x))) //TODO: Check if sessionElements are able to start { sessionElement.Session.State = SessionState.Playing; sessionElement.State = SessionElementState.Playing; var logElementDTO = OnLoadLogElement?.Invoke(sessionElement); if (logElementDTO != null) { sessionElement.LogElementInfo.GUID = logElementDTO.GUID; var playElementResponse = OnPlayElement?.Invoke(logElementDTO, ableToWaitForExecution: true); if (playElementResponse == PlayElementResponse.WaitingToBeExecuted) { sessionElement.State = SessionElementState.WaitingToTestIfCalledAutomatically; var t = new Thread(() => WaitForSessionElementToBeCalledAutomatically(logElementDTO)); t.IsBackground = true; t.Start(); } } } }
private NewEvent StartNewEventsIfPossible() //REMEMBER ONLY START CLIENTSIDE EVENTS!!! Serverside-events should have time to be executed before doing anything else... Denne metode sender blot information videre via OnPlayElement-eventet, som sørger for ikke at starte eventet hvis det er serverside { var lst = SessionElementOrderedList[CurrentIndex]; if (lst.Any(x => x.State == SessionElementState.Playing)) { return(NewEvent.WaitingForOtherClientEvents); //Still waiting for at least one element to complete } CurrentIndex++; if (SessionElementOrderedList.Count <= CurrentIndex) { return(NewEvent.None); //Completed everything! } var newEvent = NewEvent.None; lst = SessionElementOrderedList[CurrentIndex]; foreach (var sessionElement in lst.Where(x => x.Session.State == SessionState.Playing || x.Session.State == SessionState.WaitingForStartingElement && IsValidStartingEvent(x))) { //if (LogTypeHelper.IsClientsideEvent(sessionElement.LogElementInfo.LogType)) //{} sessionElement.Session.State = SessionState.Playing; sessionElement.State = SessionElementState.Playing; var logElementDTO = OnLoadLogElement?.Invoke(sessionElement); if (logElementDTO != null) { sessionElement.LogElementInfo.GUID = logElementDTO.GUID; var playElementResponse = OnPlayElement?.Invoke(logElementDTO, ableToWaitForExecution: true); if (playElementResponse == PlayElementResponse.WaitingToBeExecuted) { //Hmm, noget er galt her... for den ovenstående foreach udfører alt for mange sessionElements på én gang... noget kalder BrowserJobComplete/done for events der overhovedet ikke er færdige???? sessionElement.State = SessionElementState.WaitingToTestIfCalledAutomatically; var t = new Thread(() => WaitForSessionElementToBeCalledAutomatically(logElementDTO)); t.IsBackground = true; t.Start(); newEvent = NewEvent.WaitingForServerEvents; } else { newEvent = NewEvent.StartedAtLeastOne; } } } return(newEvent); }
public FetchLogElementResponse FetchLogElement(Guid?sessionGUID, Guid?pageGUID, LogType logType, string handlerUrl = null, int?currentIndex = null) { currentIndex = currentIndex ?? CurrentIndex; if (SessionElementOrderedList.Count <= currentIndex.Value) { return new FetchLogElementResponse() { Type = FetchLogElementResponseType.NoMore } } ; var lst = SessionElementOrderedList[currentIndex.Value]; LRAPSessionElement sessionElement = null; if (sessionGUID.HasValue) { sessionElement = lst.FirstOrDefault(x => x.Session.GUID.Equals(sessionGUID)); } if (sessionElement == null && pageGUID.HasValue) { sessionElement = lst.FirstOrDefault(x => x.LogElementInfo.PageGUID.Equals(pageGUID)); } sessionElement = sessionElement ?? lst.First() /*Only one session is supported atm*/; //Skal være på samme linie som denne.. eller de efterfølgende "bundlede" events er ikke nødvendigvis på samme index switch (sessionElement.State) { case SessionElementState.Played: //Look at the next event if it matches the LogType for the current PageGUID return(FetchLogElement(sessionGUID, pageGUID, logType, handlerUrl, currentIndex.Value + 1)); case SessionElementState.WaitingToTestIfCalledAutomatically: case SessionElementState.Playing: if (sessionElement.LogElementInfo.LogType == logType) { var logElementDTO = OnLoadLogElement?.Invoke(sessionElement); //"Element":"/TestHandler.ashx?request=%7B%22SomeValue%22%3A%22andersand%22%7D" if (handlerUrl != null && logElementDTO.Element != handlerUrl) { throw new Exception($"LogType({logType}) was located, but with invalid url ({logElementDTO.Element}), should have been ({handlerUrl})"); } sessionElement.LogElementInfo.GUID = logElementDTO.GUID; return(new FetchLogElementResponse() { Type = FetchLogElementResponseType.OK, LogElementDTO = logElementDTO }); } return(new FetchLogElementResponse() { Type = FetchLogElementResponseType.IncorrectLogType }); //throw new Exception("Shouldn't happen, unless the running events are in a different order now"); case SessionElementState.Waiting: throw new Exception("Shouldn't happen"); default: throw new NotImplementedException(); } }