/*public static List<String> getListOfUniqueSignatures_UsingUniqueList(List<IO2Finding> o2Findings)
         * {
         *  // mode 1 use one big list
         *  var uniqueSignatures = new List<String>();
         *  // calculate unique signatures
         *  var itemsProcessed = 0;
         *  var itemsToProcess = o2Findings.Count;
         *  foreach (var o2Finding in o2Findings)
         *  {
         *      getListOfUniqueSignatures(o2Finding.o2Traces, uniqueSignatures);
         *      if ((itemsProcessed++) % 5000 == 0)
         *          DI.log.info("on [{0}/{1}] there are {2} unique signatures", itemsProcessed, itemsToProcess, uniqueSignatures.Count);
         *  }
         *  DI.log.info("There are {0} unique signatures", uniqueSignatures.Count);
         *  return uniqueSignatures;
         * }*/



        internal static O2RulePack mapFindingsToCurrentRulePack(
            O2RulePack currentO2RulePack, List <IO2Finding> o2Findings, string languageId, bool keepRulesLoadedFromDatabase)
        {
            var newCallbackSignature = "O2.AutoMapping";

            DI.log.info("converting {0} Findings into rules", o2Findings.Count);

            // get rules that we will keep (if there are rules loaded from Db and keepRulesLoadedFromDatabase is set)
            var newO2Rules = (keepRulesLoadedFromDatabase)
                                 ? O2RulePackUtils.getRulesThatAreFromDB(currentO2RulePack)
                                 : new List <IO2Rule>();

            //update index
            var indexedCurrentO2Rules = IndexedO2Rules.indexAll(newO2Rules);

            // and if there are any rules from the database, remove any Tagged values
            if (keepRulesLoadedFromDatabase)
            {
                foreach (var o2Rule in newO2Rules)
                {
                    o2Rule.Tagged = false;
                }
            }

            // create rulepack
            var newRulePack = new O2RulePack("Rule Pack", newO2Rules);

            // and call the function that does the mappings
            mapInRulePack_FindingsSourcesAndSinks(newRulePack, indexedCurrentO2Rules, o2Findings, languageId);

            DI.log.info("{0} rules created", newRulePack.o2Rules.Count);

            return(newRulePack);
        }
        public static O2RulePack createRulePackWithSignatures(O2RulePack o2rulePack, List <String> signaturesToFind, string rulePackName, bool addNonMatchingSignaturesAsNewRule, string languageDBId)
        {
            DI.log.info("in createRulePackWithSignatures");
            var o2RulesThatMatchSignatures = new List <IO2Rule>();
            var indexedRules = IndexedO2Rules.indexAll(o2rulePack.getIO2Rules());

            foreach (var signature in signaturesToFind)
            {
                if (indexedRules.ContainsKey(signature))
                {
                    foreach (var o2Rule in indexedRules[signature])
                    {
                        o2RulesThatMatchSignatures.Add(o2Rule);
                    }
                }
                else
                if (addNonMatchingSignaturesAsNewRule)
                {
                    o2RulesThatMatchSignatures.Add(O2RulePackUtils.createRule(O2RuleType.NotMapped, signature, languageDBId));
                }
            }
            DI.log.info("createRulePackWithSignatures completed, there were {0} rules found", o2RulesThatMatchSignatures.Count);
            return(new O2RulePack(rulePackName, o2RulesThatMatchSignatures));
        }