public HashSet<string> MergeCaseCoverageData(CoverageDataDescriptor cdata,string caseId)
 {
     HashSet<string> differentStamps = new HashSet<string>();
     foreach (string key in cdata.CoverageMap.Keys)
     {
         if (!m_coverageMap.ContainsKey(key))
         {
             m_coverageMap.Add(key, new CaseCoverageDataHolder(cdata.CoverageMap[key].Coverage, cdata.CoverageMap[key].Stamp, caseId));
         }
         else
         {
             //标识不一致表示同个类前后两次内容不一致,可能是错误操作引起得,记录类名以供分析
             if (m_coverageMap[key].Stamp != cdata.CoverageMap[key].Stamp)
             {
                 differentStamps.Add(key);
                 continue;
             }
             for (int i = 0; i < m_coverageMap[key].CaseCoverage.Length; i++)
             {
                 for (int j = 0; j < m_coverageMap[key].CaseCoverage[i].Length; j++)
                 {
                     if (cdata.CoverageMap[key].Coverage[i][j])
                     {
                         m_coverageMap[key].CaseCoverage[i][j].Add(caseId);
                     }
                 }
             }
         }
     }
     return differentStamps;
 }
        public RootItem CreateView(MetaDataDescriptor mdata, CoverageDataDescriptor cdata, bool srcView)
        {
            if (mdata == null) throw new ArgumentNullException("null input: mdata");
            if (cdata == null) throw new ArgumentNullException("null input: cdata");

            m_mdata = mdata;

            if (srcView && !mdata.HasSrcFileData)
                throw new ArgumentException("source file data view requested for metadata with incomplete SourceFile debug info");

            m_view = new RootItem();
            m_packageMap = new Dictionary<string, PackageItem>();
            m_srcFileMap = new Dictionary<string, SrcFileItem>();
            m_classMap = new Dictionary<string, ClassItem>();
            PackageItem packageItem = null;

            foreach (string key in mdata.ClassMap.Keys)
            {
                ClassDescriptor cls = mdata.ClassMap[key];
                string packageVMName = cls.PackageVMName;

                if (!m_packageMap.ContainsKey(packageVMName))
                {
                    string packageName = packageVMName.Length == 0 ? "default package" : VMNameConvert.VMNameToJavaName(packageVMName);
                    packageItem = new PackageItem(m_view, packageName, packageVMName);
                    m_packageMap.Add(packageVMName, packageItem);
                    m_view.AddChild(packageItem);
                }
                else packageItem = m_packageMap[packageVMName];

                SrcFileItem srcfileItem = null;
                if (srcView)
                {
                    string srcFileName = cls.SrcFileName;
                    if (srcFileName == null)
                        throw new ArgumentNullException("src file name = null");

                    string fullSrcFileName = VMNameConvert.CombineVMName(packageVMName, srcFileName);

                    if (!m_srcFileMap.ContainsKey(fullSrcFileName))
                    {
                        srcfileItem = new SrcFileItem(packageItem, srcFileName, fullSrcFileName);
                        m_srcFileMap.Add(fullSrcFileName, srcfileItem);

                        packageItem.AddChild(srcfileItem);
                    }
                    else srcfileItem = m_srcFileMap[fullSrcFileName];
                }

                DataHolder data = cdata.GetCoverage(cls);

                if (data != null)
                {
                    if (data.Stamp != cls.Stamp)
                        throw new Exception("class stamp mismatch:" + VMNameConvert.VMNameToJavaName(cls.ClassVMName));
                }

                bool[][] coverage = (data != null ? data.Coverage : null);

                ClassItem classItem = srcView ? new ClassItem(srcfileItem, cls, coverage) : new ClassItem(packageItem, cls, coverage);
                MethodDescriptor[] methods = cls.Methods;

                for (int m = 0; m < methods.Length; ++m)
                {
                    MethodDescriptor method = methods[m];

                    if ((method.Status & DataConstants.METHOD_NO_BLOCK_DATA) != 0)
                        continue;
                    MethodItem methodItem = new MethodItem(classItem, m, method.Name, method.Descriptor, method.FirstLine);
                    classItem.AddChild(methodItem);
                }

                if (srcView)
                {
                    srcfileItem.AddChild(classItem);
                    m_classMap.Add(classItem.Name, classItem);
                }
                else
                    packageItem.AddChild(classItem);
            }
            return m_view;
        }