private void button_Build_Click(object sender, EventArgs e) { if (!this.checkBox_blocks.Checked && !this.checkBox_functions.Checked) { this.label_Warning.ForeColor = Color.Red; this.label_Warning.Text = "Please check on at least one granularity type!"; return; } this.Close(); if (this.checkBox_blocks.Checked) { CloneGenealogy.mapFileCollection = AdjacentVersionMapping.GetMapFileCollection(true); CloneGenealogy.BuildAndSaveAll(CloneGenealogy.mapFileCollection); MessageBox.Show("Building Genealogy on Blocks level FINISHED!"); } if (this.checkBox_functions.Checked) { CloneGenealogy.mapFileCollection = AdjacentVersionMapping.GetMapFileCollection(false); CloneGenealogy.BuildAndSaveAll(CloneGenealogy.mapFileCollection); MessageBox.Show("Building Genealogy on Functions level FINISHED!"); } }
//静态方法,根据指定的映射文件集生成所有克隆家系 public static void BuildAndSaveAll(List <string> mapFileCollection) { //CloneGenealogy.genealogyList=new List<CloneGenealogy>(); if (!IsMapFileCollectionSuccessive(mapFileCollection)) //判断版本集是否连续 { MessageBox.Show("Map Files NOT Successive! Fix it and Try again!"); return; } List <XmlDocument> mapXmlCollection = new List <XmlDocument>(); //获得存放相邻版本映射信息的XmlDocument对象集合 foreach (string fileName in mapFileCollection) { mapXmlCollection.Add(AdjacentVersionMapping.GetXmlDocument(fileName)); } //寻找每个版本中新产生的CG,以其为根建立克隆家系 int index = -1; int id = 0; CloneGenealogy.SingleCgGenealogyList = new List <SingleCgGenealogy>(); //初始化单克隆群家系列表 foreach (XmlDocument mapXml in mapXmlCollection) { index++; string srcFileName, destFileName; //保存源和目标版本的CRD文件名(不含路径) srcFileName = mapXml.DocumentElement.ChildNodes[0].InnerText; destFileName = mapXml.DocumentElement.ChildNodes[1].InnerText; string prev = "0"; //记录前一个被构造的CG的id,避免重复构造(针对分裂的情况) #region 如果是第一个mapXml,为源版本中所有克隆群构建以其为根的克隆家系 if (index == 0) { #region 对每个CGMap中的源CG,以其为根构建克隆家系 foreach (XmlElement cgMapNode in mapXml.DocumentElement.SelectNodes("CGMap")) { CloneGroupMapping cgMapping = new CloneGroupMapping(); cgMapping.CreateCGMapppingFromCGMapNode(cgMapNode); //根据CGMap元素构造CloneGroupMapping对象 if (cgMapping.srcCGInfo.id != prev) { CloneGenealogy cloneGenealogy = new CloneGenealogy(); cloneGenealogy.BuildForCG(srcFileName, cgMapping.srcCGInfo, mapXmlCollection, ref id); cloneGenealogy.SaveGenealogyToXml(); //CloneGenealogy.genealogyList.Add(cloneGenealogy); prev = cgMapping.srcCGInfo.id; } } #endregion #region 为UnMappedSrcCG中每个CG构建克隆家系 if (mapXml.DocumentElement.SelectSingleNode("UnMappedSrcCG") != null) { foreach (XmlElement unMappedSrcCGNode in mapXml.DocumentElement.SelectSingleNode("UnMappedSrcCG").ChildNodes) { CGInfo cgInfo = new CGInfo(); cgInfo.id = unMappedSrcCGNode.GetAttribute("id"); cgInfo.size = int.Parse(unMappedSrcCGNode.GetAttribute("size")); CloneGenealogy cloneGenealogy = new CloneGenealogy(); //cloneGenealogy.BuildForCG(srcFileName, cgInfo, mapXmlCollection, ref id); //对于第一个版本中的UnMappedSrcCG,不需要此语句 SingleCgGenealogy sGenealogy = new CloneEvolutionAnalyzer.SingleCgGenealogy(); if (CloneGenealogy.granularity == GranularityType.BLOCKS) { sGenealogy.version = srcFileName.Substring(0, srcFileName.IndexOf("_blocks-")); } else { sGenealogy.version = srcFileName.Substring(0, srcFileName.IndexOf("_functions-")); } sGenealogy.cgInfo = cgInfo; CloneGenealogy.SingleCgGenealogyList.Add(sGenealogy); //cloneGenealogy.SaveGenealogyToXml(); //CloneGenealogy.genealogyList.Add(cloneGenealogy); } } #endregion } #endregion #region 对于所有mapXml,为UnMappedDestCG中每个CG构建克隆家系 if (mapXml.DocumentElement.SelectSingleNode("UnMappedDestCG") != null) { foreach (XmlElement unMappedDestCGNode in mapXml.DocumentElement.SelectSingleNode("UnMappedDestCG").ChildNodes) { CGInfo cgInfo = new CGInfo(); cgInfo.id = unMappedDestCGNode.GetAttribute("id"); cgInfo.size = int.Parse(unMappedDestCGNode.GetAttribute("size")); CloneGenealogy cloneGenealogy = new CloneGenealogy(); cloneGenealogy.BuildForCG(destFileName, cgInfo, mapXmlCollection, ref id); if (cloneGenealogy.evolutionList != null && cloneGenealogy.evolutionList.Count != 0) { cloneGenealogy.SaveGenealogyToXml(); } else { SingleCgGenealogy sGenealogy = new CloneEvolutionAnalyzer.SingleCgGenealogy(); if (CloneGenealogy.granularity == GranularityType.BLOCKS) { sGenealogy.version = destFileName.Substring(0, destFileName.IndexOf("_blocks-")); } else { sGenealogy.version = destFileName.Substring(0, destFileName.IndexOf("_functions-")); } sGenealogy.cgInfo = cgInfo; CloneGenealogy.SingleCgGenealogyList.Add(sGenealogy); } //CloneGenealogy.genealogyList.Add(cloneGenealogy); } } #endregion } SaveSingleCgGenealogiesToXml(); //保存SingleCgGenealogies.xml文件 }