public static AssessmentAssessmentFile createNewAssessmentFileFromExistingOne(
            AssessmentAssessmentFile afOriginalFile)
        {
            // need to create a new one since we don't want to add the findings of the current file
            var afNewFile = new AssessmentAssessmentFile();

            afNewFile.error_status       = afOriginalFile.error_status;
            afNewFile.filename           = afOriginalFile.filename;
            afNewFile.last_modified_time = afOriginalFile.last_modified_time;
            return(afNewFile);
        }
        public static void create_CustomSavedAssessmentRunFile_From_FindingsResult_List(
            List <AnalysisSearch.FindingsResult> lfrFindingsResults, String sPathToNewAssessmentFile)
        {
            O2Timer tTimer =
                new O2Timer("Creating new AssessmentRun File " + sPathToNewAssessmentFile).start();

            if (lfrFindingsResults.Count == 0)
            {
                DI.log.error("Aborting, no findings to save");
            }
            else
            {
                AssessmentRun arNewAssessmentRun = OzasmtUtils_OunceV6.getDefaultAssessmentRunObject();
                arNewAssessmentRun.name = "Search Results Project";
                var lFilesAndFindingsToAdd =
                    new Dictionary <AssessmentAssessmentFile, List <AssessmentAssessmentFileFinding> >();
                var dNewStringIndex = new Dictionary <String, UInt32>();
                var dNewFileIndex   = new Dictionary <String, UInt32>();
                foreach (AnalysisSearch.FindingsResult frFindingsResult in lfrFindingsResults)
                {
                    if (false == lFilesAndFindingsToAdd.ContainsKey(frFindingsResult.fFile))
                    // doesn't exist so we need to add it
                    {
                        lFilesAndFindingsToAdd.Add(frFindingsResult.fFile, new List <AssessmentAssessmentFileFinding>());
                    }

                    lFilesAndFindingsToAdd[frFindingsResult.fFile].Add(
                        VirtualTraces.createNewFindingFromExistingOne(frFindingsResult.fFinding, dNewStringIndex,
                                                                      dNewFileIndex,
                                                                      frFindingsResult.oadO2AssessmentDataOunceV6));
                }
                arNewAssessmentRun.StringIndeces = OzasmtUtils_OunceV6.createStringIndexArrayFromDictionary(dNewStringIndex);
                arNewAssessmentRun.FileIndeces   = OzasmtUtils_OunceV6.createFileIndexArrayFromDictionary(dNewFileIndex);

                var lafNewAssessmentFilesToAdd = new List <AssessmentAssessmentFile>();
                foreach (AssessmentAssessmentFile afOriginalFile in lFilesAndFindingsToAdd.Keys)
                {
                    AssessmentAssessmentFile afNewFile =
                        VirtualTraces.createNewAssessmentFileFromExistingOne(afOriginalFile);
                    afNewFile.Finding = lFilesAndFindingsToAdd[afOriginalFile].ToArray();
                    lafNewAssessmentFilesToAdd.Add(afNewFile);
                }
                arNewAssessmentRun.Assessment.Assessment[0].AssessmentFile = lafNewAssessmentFilesToAdd.ToArray();

                DI.log.info("New assessmentRun file created in memory, now saving it");
                // and save the serialized object as an Xml file
                OzasmtUtils_OunceV6.createSerializedXmlFileFromAssessmentRunObject(arNewAssessmentRun, sPathToNewAssessmentFile);
                tTimer.stop();
            }
            // if (false)
            //     o2Messages.sendMessage("open ViewAssessmentRun," + sPathToNewAssessmentFile);
        }
            public AssessmentAssessmentFileFinding AddNewFindingFromExistingOne(
                AssessmentAssessmentFileFinding fFinding, O2AssessmentData_OunceV6 oadO2AssessmentDataOunceV6)
            {
                AssessmentAssessmentFileFinding fNewFinding = createNewFindingFromExistingOne(fFinding, dNewStringIndex,
                                                                                              dNewFileIndex,
                                                                                              oadO2AssessmentDataOunceV6);

                lfNewFindinds.Add(fNewFinding);

                //AssessmentAssessmentFile fNewFile = AnalysisSearch.createNewAssessmentFileFromExistingOne(fviJoinAtSink.oadO2AssessmentDataOunceV6.dFindings[fviJoinAtSink.fFinding]);
                AssessmentAssessmentFile fNewFile =
                    createNewAssessmentFileFromExistingOne(oadO2AssessmentDataOunceV6.dFindings[fFinding]);

                fNewFile.Finding = new[] { fNewFinding };

                oadNewO2AssessmentDataOunceV6.dFindings =
                    new Dictionary <AssessmentAssessmentFileFinding, AssessmentAssessmentFile>();
                oadNewO2AssessmentDataOunceV6.dFindings.Add(fNewFinding, fNewFile);
                fLastFindingAdded = fNewFinding;
                return(fNewFinding);
            }
        public static void createAssessmentFileWithVirtualTraces_fromTwoSourceAssessmentFiles(String sAssessmentFile1,
                                                                                              String sAssessmentFile2,
                                                                                              String sTargetFile)
        {
            O2AssessmentData_OunceV6 fadF1AssessmentData_sAssessmentFile1 = null;
            O2AssessmentData_OunceV6 fadF1AssessmentData_sAssessmentFile2 = null;


            // get list of traces with
            List <AssessmentAssessmentFileFinding> lfFindingsWithTraces_sAssessmentFile2 =
                AnalysisUtils.getListOfAllFindingsWithTraces(sAssessmentFile2, ref fadF1AssessmentData_sAssessmentFile2);

            // calculate traces to join
            var dTracesToAppend = new Dictionary <String, List <CallInvocation> >();

            foreach (AssessmentAssessmentFileFinding fFinding in lfFindingsWithTraces_sAssessmentFile2)
            {
                if (fFinding.Trace != null && fFinding.Trace[0] != null && fFinding.Trace[0].CallInvocation1 != null &&
                    fFinding.Trace[0].CallInvocation1.Length > 1)
                {
                    if (
                        OzasmtUtils_OunceV6.getStringIndexValue(fFinding.Trace[0].CallInvocation1[0].sig_id,
                                                                fadF1AssessmentData_sAssessmentFile2).IndexOf(
                            sExternalSourceString) > -1)
                    {
                        String sSignatureOfCallbackFunction =
                            OzasmtUtils_OunceV6.getStringIndexValue(fFinding.Trace[0].CallInvocation1[1].sig_id,
                                                                    fadF1AssessmentData_sAssessmentFile2);
                        if (false == dTracesToAppend.ContainsKey(sSignatureOfCallbackFunction))
                        {
                            dTracesToAppend.Add(sSignatureOfCallbackFunction, new List <CallInvocation>());
                        }

                        dTracesToAppend[sSignatureOfCallbackFunction].Add(fFinding.Trace[0].CallInvocation1[1]);
                    }
                }
            }


            // get sinks to append traces
            List <String> lsSinks_sAssessmentFile1 = AnalysisAssessmentFile.getListOf_KnownSinks(sAssessmentFile1, ref fadF1AssessmentData_sAssessmentFile1);

            Analysis.populateDictionariesWithXrefsToLoadedAssessment(Analysis.FindingFilter.SmartTraces, true, true,
                                                                     fadF1AssessmentData_sAssessmentFile1);

            var dNewStringIndex = new Dictionary <String, UInt32>();

            foreach (
                AssessmentRunStringIndex siStringIndex in
                fadF1AssessmentData_sAssessmentFile1.arAssessmentRun.StringIndeces)
            {
                dNewStringIndex.Add(siStringIndex.value, siStringIndex.id);
            }
            var dNewFileIndex = new Dictionary <String, UInt32>();

            foreach (AssessmentRunFileIndex siStringIndex in fadF1AssessmentData_sAssessmentFile1.arAssessmentRun.FileIndeces)
            {
                dNewFileIndex.Add(siStringIndex.value, siStringIndex.id);
            }

            TraceType tTraceType = TraceType.Known_Sink;

            foreach (String sSink in lsSinks_sAssessmentFile1)
            {
                if (dTracesToAppend.ContainsKey(sSink))
                {
                    List <AssessmentAssessmentFileFinding> lfFindingsWithSink =
                        AnalysisUtils.getListOfFindingsWithTraceAndSignature(sSink, tTraceType,
                                                                             fadF1AssessmentData_sAssessmentFile1);
                    foreach (AssessmentAssessmentFileFinding fFindingToJoin in lfFindingsWithSink)
                    {
                        var lfNewFindinds = new List <AssessmentAssessmentFileFinding>();

                        foreach (CallInvocation ciCallInvocationToAppend in dTracesToAppend[sSink])
                        {
                            // append trace

                            AssessmentAssessmentFileFinding fNewFinding = createNewFindingFromExistingOne(
                                fFindingToJoin, dNewStringIndex, dNewFileIndex, fadF1AssessmentData_sAssessmentFile1);
                            CallInvocation ciSinkNode =
                                AnalysisSearch.findTraceTypeAndSignatureInSmartTrace_Recursive_returnCallInvocation(
                                    fNewFinding.Trace, tTraceType, sSink, fadF1AssessmentData_sAssessmentFile1);
                            ciSinkNode.trace_type = (int)TraceType.Source;
                            var lciTempNewCallInvocation = new List <CallInvocation>(); // used by the recursive function
                            ciSinkNode.CallInvocation1 = updateAssessmentRunWithTraceReferences_recursive(
                                lciTempNewCallInvocation,
                                //new CallInvocation[] { ciCallInvocationToAppend },
                                ciCallInvocationToAppend.CallInvocation1,
                                dNewStringIndex,
                                dNewFileIndex,
                                fadF1AssessmentData_sAssessmentFile2);

                            lfNewFindinds.Add(fNewFinding);
                        }
                        AssessmentAssessmentFile fFile = fadF1AssessmentData_sAssessmentFile1.dFindings[fFindingToJoin];
                        var lfFindingsInCurrentFile    = new List <AssessmentAssessmentFileFinding>(fFile.Finding);
                        lfFindingsInCurrentFile.Remove(fFindingToJoin);
                        lfFindingsInCurrentFile.AddRange(lfNewFindinds);
                        fFile.Finding = lfFindingsInCurrentFile.ToArray();
                    }
                }
            }

            // update indexes
            fadF1AssessmentData_sAssessmentFile1.arAssessmentRun.StringIndeces =
                OzasmtUtils_OunceV6.createStringIndexArrayFromDictionary(dNewStringIndex);
            fadF1AssessmentData_sAssessmentFile1.arAssessmentRun.FileIndeces =
                OzasmtUtils_OunceV6.createFileIndexArrayFromDictionary(dNewFileIndex);

            //String sTargetFile = config.getTempFileNameInF1TempDirectory();
            OzasmtUtils_OunceV6.createSerializedXmlFileFromAssessmentRunObject(
                fadF1AssessmentData_sAssessmentFile1.arAssessmentRun, sTargetFile);
            DI.log.debug("Joined assesment saved to:{0}", sTargetFile);
        }