Ejemplo n.º 1
0
        /// <summary>
        /// Metoda poskytující rozhraní pro provádění simulací.
        /// </summary>
        /// <param name="sparams">Parametry simulace.</param>
        /// <returns>Výsledky simulace</returns>
        /// <remarks> Metoda provádí bezstavovou simulaci, tj. nedochází ke změně vstupních údajů. Přidělené případy během simulace ovlivňují pouze aktuální simulaci.
        /// Všechny parametry simulace jako jsou senáty, jejich zatížení, počet případů k rozdělení je nutné zadat na vstupu. Metoda nepoužívá žádnou databázi pro čtení těchto informací. Co se jí předá, to použije. Pokud je některý ze senátů použitý pro simulaci zakázaný, tak si je automaticky vyjmut ze simulace.
        /// Předávané informace o uživateli jsou použité pro logování.
        /// </remarks>
        /// <remarks>
        /// Použijí se pouze povolené senáty, pokud není žádný povolený, je volána výjimka.
        /// </remarks>
        /// <remarks>
        /// Identifikátor algoritmu musí odpovídat vnitřnímu seznamu použitelných algoritmů, jinak dochází k výjimce.
        /// </remarks>
        /// <exception cref="GeneratorServiceFault">V případě neplatných parametrů dochází k vyvolání výjimky.</exception>
        public List <SimulationResult> DoSimulation(SimulationParams sparams)
        {
            bool   fault        = false;//predpokladej ze chyba neni
            string faultmessage = "UNKNOWN";

            try
            {
                Debug.WriteLine("DOSIMULATION");
                List <SimulationResult> results = null;                        //pro ulozeni vysledku simulace
                if (SimulationParams.CheckSimulationParams(sparams))           //pokud by bylo nesplneno, dochazi na volani vyjimky
                {
                    results = new List <SimulationResult>();                   //seznam s vysledky simulace pro kazdou iteraci a kazdy algoritmus
                    foreach (var algorithm_id in sparams.AlgorithmsToSimulate) //pro kazdy algoritmus k simulaci
                    {
                        Debug.WriteLine("Simulate: " + algorithm_id.ToString());
                        var algorithm = factory.GetSelectionAlgorithm(algorithm_id);                       //vem algoritmus
                        var simresult = Simulate(algorithm, sparams);                                      //volej simulaci danym algoritmem, mam jak data, tak diference
                        results.Add(new SimulationResult(simresult.Item1, simresult.Item2, algorithm_id)); //pridej vysledky do celkovych vysledku
                    }
                    return(results);                                                                       //vrat vysledky
                }
            }
            catch (FaultException <GeneratorServiceFault> ex)                                       //nastane pri vnitrnich problem s validovanim parametru
            {
                fault        = true;                                                                //nastala chyba pri validovani
                faultmessage = ex.Reason.ToString() + ((ex.Detail != null)? ex.Detail.Message:" "); //uloz si zpravu i sp pripadnym detailem
                throw;                                                                              //vyhod vyjimku znovu
            }
            catch (ArgumentException e)                                                             //nejaka chyba v parametrech
            {
                faultmessage = e.Message;
                fault        = true;
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("Wrong simulation parameters: " + e.Message), new FaultReason("Wrong simulation parameters."));
            }
            catch (KeyNotFoundException e) //nastava v pripade pouziti neexistujiciho algoritmu-identifikatoru
            {
                faultmessage = "Simulation algorithm  invalid ID " + e.Message;
                fault        = true;
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("Invalid algorithm ID in AlgorithmsToSimulate list."), new FaultReason("Simulation algorithm  invalid ID."));
            }
            catch (Exception e)//nemelo by nastavat
            {
                faultmessage = e.Message;
                fault        = true;
                throw new FaultException <GeneratorServiceFault>(new GeneratorServiceFault("Unknown problem: " + e.Message), new FaultReason("Simulation algorithm unknown problem."));
            }
            finally
            {
                if (ConfigurationManager.AppSettings["LoggingSimulationService"].ToUpper() == "TRUE")//kdyz je logovani zapnuto
                {
                    Debug.WriteLine("LOGING:");
                    if (fault)//kdyz byla chyba
                    {
                        //osetreni situace kdy neni ani zadan uzivatel
                        string user = (sparams != null && sparams.User != null && sparams.User.ID != null) ? sparams.User.ID : "UNKNOWN"; //nemusel byt zadan uzivatel
                        Debug.WriteLine("Fault " + user + " : " + faultmessage);
                        MSPGeneratorServicesLog.WriteActionFault(user, "DoSimulation", faultmessage);                                     //loguj akci a chybu
                    }
                    else//kdyz chyba nebyla
                    {
                        Debug.WriteLine("Succes");
                        MSPGeneratorServicesLog.WriteSimulationActionSuccess(sparams.User.ID, "DoSimulation", sparams);//loguj akci
                    }
                }
            }
            return(null);
        }