private List <TaggedValueVO> readTaggedValues(XmlNode tvNode) { List <TaggedValueVO> retTagVal = new List <TaggedValueVO>(); foreach (XmlNode tagvalNode in tvNode.ChildNodes) { TaggedValueVO tvvo = new TaggedValueVO(); foreach (XmlAttribute attr in tagvalNode.Attributes) { switch (attr.Name) { case "name": tvvo.name = attr.Value; break; case "guid": tvvo.guid = attr.Value; break; case "value": tvvo.tagValue = attr.Value; if ("<memo>".Equals(attr.Value)) { tvvo.tagValue = tagvalNode.InnerText; } break; case "changed": tvvo.changed = attr.Value[0]; break; } } retTagVal.Add(tvvo); } return(retTagVal); }
/// <summary> /// 比較して差異があったメソッドに対して左右それぞれのオリジナル情報を出力し、ピンポイントの比較ができるようにする /// </summary> /// <param name="tagVal">該当メソッド</param> /// <param name="leftRight"> "L" もしくは "R" を指定する(出力ファイル名のサフィックスになる)</param> private void outputOriginalTaggedValueFile(TaggedValueVO tagVal, string leftRight) { XmlDocument xmlDocument = new XmlDocument(); string xmlDir = null; if ("L".Equals(leftRight)) { xmlDir = this.fromArtifactDir; } else { xmlDir = this.toArtifactDir; } ArtifactXmlReader atfReader = new ArtifactXmlReader(xmlDir); // 現在処理中の成果物のGUID、およびメソッドのGUIDから(左もしくは右の)XMLノードを取得 XmlNode taggedValueNode = atfReader.readTaggedValueNode(procArtifact.guid, tagVal.guid); // 成果物のGUID, メソッドのGUIDから読み取ったメソッドNodeがNULLだったらスキップ if (taggedValueNode != null) { // 新しいrootノードを、成果物XMLからインポートする形で作成 XmlNode root = xmlDocument.ImportNode(taggedValueNode, true); // ルート配下に引数のドキュメントを追加 xmlDocument.AppendChild(root); // この内容で操作の詳細に記録する xmlDocument.Save(this.outputDir + "\\detail\\#taggedValue_" + tagVal.guid.Substring(1, 36) + "_" + leftRight + ".xml"); } }
/// <summary> /// 要素のタグ付き値を取得し、taggedValues プロパティにセットする /// </summary> /// <param name="elem">対象の要素オブジェクト</param> private void readTaggedValuesByElement(ElementVO elem) { string strSQL; strSQL = "select PropertyID, ea_guid, Property, Notes, Value " + " from t_objectproperties " + " where object_id = " + elem.elementId + " order by ea_guid, Property, Value, Notes "; // SQLを実行する OleDbCommand dbCom = new OleDbCommand(); dbCom.CommandText = strSQL; dbCom.Connection = objConn; OleDbDataReader reader = dbCom.ExecuteReader(); List <TaggedValueVO> retTagVals = new List <TaggedValueVO>(); // 結果を表示します。 while (reader.Read()) { TaggedValueVO tag = new TaggedValueVO(); // tag.propertyId = reader.GetValue(0); tag.guid = DbUtil.readStringField(reader, 1); tag.name = StringUtil.excludeSpecialChar("t_objectproperties", "name", tag.guid, DbUtil.readStringField(reader, 2)); tag.notes = DbUtil.readStringField(reader, 3); tag.tagValue = StringUtil.excludeSpecialChar("t_objectproperties", "value", tag.guid, DbUtil.readStringField(reader, 4)); retTagVals.Add(tag); } reader.Close(); elem.taggedValues = retTagVals; }
/// <summary> /// 詳細のCSVファイルを出力する(タグ付き値) /// </summary> /// <param name="atf"></param> /// <param name="elem"></param> /// <param name="tv"></param> /// <param name="sw"></param> private void outputChangedDetailTaggedValue(ArtifactVO atf, ElementVO elem, TaggedValueVO tv, StreamWriter sw) { sw.Write("\"" + atf.changed + "\""); sw.Write(",\"" + atf.guid + "\""); sw.Write(",\"" + filterDoubleQuote(atf.name) + "\""); sw.Write(",\"" + filterDoubleQuote(atf.pathName) + "\""); sw.Write(",\"" + elem.changed + "\""); sw.Write(",\"" + elem.guid + "\""); sw.Write(",\"" + filterDoubleQuote(elem.name) + "\""); sw.Write(",\"タグ\""); sw.Write(",\"" + tv.changed + "\""); sw.Write(",\"" + tv.guid + "\""); sw.Write(",\"" + filterDoubleQuote(tv.name) + "\""); if (tv.changed == 'D' || tv.changed == 'U') { sw.Write(",\"#taggedvalue_" + tv.guid.Substring(1, 36) + "_L.xml\""); } else { sw.Write(",\"\""); } if (tv.changed == 'C' || tv.changed == 'U') { sw.Write(",\"#taggedvalue_" + tv.guid.Substring(1, 36) + "_R.xml\""); } else { sw.Write(",\"\""); } sw.WriteLine(""); }
/// <summary> /// 片方のタグ付き値のダンプ /// </summary> /// <param name="leftAtr"></param> /// <param name="rightAtr"></param> /// <returns></returns> internal static void getMonoTaggedValueDesc(TaggedValueVO tgv, ref string text) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(tgv.name + ":\r\n"); sb.Append(tgv.getComparableString()); text = sb.ToString(); return; }
/// <summary> /// 操作のタグ付き値をDBから読み込み /// </summary> /// <param name="methods"></param> private void setMethodTags(List <MethodVO> methods) { Console.WriteLine("setMethodTag(): methods.Count=" + methods.Count); int mthIdx = 0; int methodId, saveMethodId = 0; string strSQL, strFields; // 読み込む項目リスト strFields = "ElementID, PropertyID, ea_guid, Property, VALUE, NOTES "; // SQL文 を作成 strSQL = "select " + strFields + " from t_operationtag " + " order by ElementID, ea_guid "; OleDbCommand dbCom = new OleDbCommand(); // SQLを実行する dbCom.CommandText = strSQL; dbCom.Connection = objConn; var retMthTags = new List <TaggedValueVO>(); OleDbDataReader reader = dbCom.ExecuteReader(); while (reader.Read()) { methodId = DbUtil.readIntField(reader, 0); TaggedValueVO mtag = new TaggedValueVO(); mtag.guid = DbUtil.readStringField(reader, 2); mtag.name = StringUtil.excludeSpecialChar("t_operationtag", "Property", mtag.guid, DbUtil.readStringField(reader, 3)); mtag.tagValue = DbUtil.readStringField(reader, 4); mtag.notes = DbUtil.readStringField(reader, 5); if (saveMethodId > 0 && saveMethodId < methodId) { mthIdx = searchMethodAndSetTags(methods, saveMethodId, mthIdx + 1, retMthTags); retMthTags = new List <TaggedValueVO>(); } retMthTags.Add(mtag); saveMethodId = methodId; } // 最後に retMthTags に溜まっている分をメソッドにセット if (saveMethodId > 0) { mthIdx = searchMethodAndSetTags(methods, saveMethodId, mthIdx + 1, retMthTags); } reader.Close(); }
/// <summary> /// 属性のタグ付き値を読み込み /// </summary> /// <param name="attributes"></param> private void setAttributeTag(List <AttributeVO> attributes) { Console.WriteLine("setAttributeTag(): attributes.Count=" + attributes.Count); int attrIdx = 0; int attributeId, savedAttributeId = 0; string strSQL, strFields; // 読み込む項目リスト strFields = "ElementID, PropertyID, ea_guid, Property, VALUE, NOTES "; // SQL文 を作成 strSQL = "select " + strFields + " from t_attributetag " + " order by ElementID, Property "; OleDbCommand dbCom = new OleDbCommand(); // SQLを実行する dbCom.CommandText = strSQL; dbCom.Connection = objConn; var retAttrTags = new List <TaggedValueVO>(); OleDbDataReader reader = dbCom.ExecuteReader(); while (reader.Read()) { attributeId = DbUtil.readIntField(reader, 0); TaggedValueVO atag = new TaggedValueVO(); atag.guid = DbUtil.readStringField(reader, 2); atag.name = StringUtil.excludeSpecialChar("t_attributetag", "Property", atag.guid, DbUtil.readStringField(reader, 3)); atag.tagValue = DbUtil.readStringField(reader, 4); atag.notes = DbUtil.readStringField(reader, 5); if (savedAttributeId > 0 && savedAttributeId < attributeId) { attrIdx = searchAttributeAndSetTags(attributes, savedAttributeId, attrIdx + 1, retAttrTags); retAttrTags = new List <TaggedValueVO>(); } retAttrTags.Add(atag); savedAttributeId = attributeId; } // 最後に retAttrTags に溜まっている分をメソッドにセット if (savedAttributeId > 0) { attrIdx = searchAttributeAndSetTags(attributes, savedAttributeId, attrIdx + 1, retAttrTags); } reader.Close(); }
private static TaggedValueVO getTaggedValueFromEAObject(EA.TaggedValue eaTagObj) { TaggedValueVO tvvo = new TaggedValueVO(); tvvo.name = excludeSpecialChar(eaTagObj.Name); tvvo.guid = eaTagObj.PropertyGUID; tvvo.tagValue = excludeSpecialChar(eaTagObj.Value); tvvo.notes = eaTagObj.Notes; tvvo.changed = ' '; return(tvvo); }
public static TaggedValueVO getMethodTagFromEAObject(EA.MethodTag eaMethodTagObj) { TaggedValueVO mtvvo = new TaggedValueVO(); mtvvo.name = excludeSpecialChar(eaMethodTagObj.Name); mtvvo.guid = eaMethodTagObj.TagGUID; mtvvo.tagValue = excludeSpecialChar(eaMethodTagObj.Value); mtvvo.notes = eaMethodTagObj.Notes; mtvvo.changed = ' '; return(mtvvo); }
public static TaggedValueVO getAttributeTagFromEAObject(EA.AttributeTag eaAttributeTagObj) { TaggedValueVO atvvo = new TaggedValueVO(); atvvo.name = excludeSpecialChar(eaAttributeTagObj.Name); atvvo.guid = eaAttributeTagObj.TagGUID; atvvo.tagValue = excludeSpecialChar(eaAttributeTagObj.Value); atvvo.notes = eaAttributeTagObj.Notes; atvvo.changed = ' '; return(atvvo); }
internal static TaggedValueVO readTaggedValue(XmlNode tagvalNode) { TaggedValueVO tvvo = new TaggedValueVO(); foreach (XmlAttribute attr in tagvalNode.Attributes) { switch (attr.Name) { case "name": tvvo.name = attr.Value; break; case "guid": tvvo.guid = attr.Value; break; case "value": tvvo.tagValue = attr.Value; if ("<memo>".Equals(attr.Value)) { tvvo.notes = tagvalNode.InnerText; } break; case "changed": tvvo.changed = attr.Value[0]; break; } } // 旧形式のXMLの対応 // タグ付き値のタグ(tv)の子ノードに <notes> タグがあったら XmlNode notesNode = tagvalNode.SelectSingleNode("notes"); if (notesNode != null) { // notesタグの中身 を タグ付き値の notes とする tvvo.notes = notesNode.InnerText; } XmlNode srcTagNode = tagvalNode.SelectSingleNode("srcTaggedValue"); XmlNode destTagNode = tagvalNode.SelectSingleNode("destTaggedValue"); if (tvvo.changed == 'U' && srcTagNode != null && destTagNode != null) { tvvo.srcTaggedValue = readTaggedValue(srcTagNode.SelectSingleNode("tv")); tvvo.destTaggedValue = readTaggedValue(destTagNode.SelectSingleNode("tv")); } return(tvvo); }
/// <summary> /// 差異が検出された2つのタグ付き値の不一致な項目=値をつなげた文字列を作成 /// </summary> /// <param name="leftTgv">(in)左の属性VO</param> /// <param name="rightTgv">(in)右の属性VO</param> /// <param name="leftText">(out)左用の出力テキスト</param> /// <param name="rightText">(out)右用の出力テキスト</param> /// <returns></returns> internal static void getDisagreedTaggedValueDesc(TaggedValueVO leftTgv, TaggedValueVO rightTgv, ref string leftText, ref string rightText) { System.Text.StringBuilder lsb = new System.Text.StringBuilder(); System.Text.StringBuilder rsb = new System.Text.StringBuilder(); lsb.Append(leftTgv.name + ":\r\n"); rsb.Append(rightTgv.name + ":\r\n"); lsb.Append(leftTgv.getComparedString(rightTgv)); rsb.Append(rightTgv.getComparedString(leftTgv)); leftText = lsb.ToString(); rightText = rsb.ToString(); return; }
/// <summary> /// EAのTaggedValueを上書きもしくは追加する /// </summary> internal static void updateEaTaggedValueObject(ElementVO myElement, TaggedValueVO selectedTag) { EA.Repository repo = ProjectSetting.getVO().eaRepo; EA.Element elem = null; // この属性を持っているはずの要素をGUIDより検索 elem = (EA.Element)repo.GetElementByGuid(myElement.guid); if (elem == null) { return; } TaggedValue tvObj = null; if (elem.TaggedValues != null && elem.TaggedValues.Count > 0) { for (int i = 0; i < elem.TaggedValues.Count; i++) { tvObj = elem.TaggedValues.GetAt((short)i); if (selectedTag.guid == tvObj.PropertyGUID) { break; } } } // 結果的に TaggedValue のオブジェクトが取得できなかったら、この要素の配下にタグ付き値を追加する if (tvObj == null) { tvObj = elem.TaggedValues.AddNew(selectedTag.name, ""); } // 更新前後で更新ログ出力 writeUpdateLogTaggedValue(tvObj, false); tvObj.Name = selectedTag.name; tvObj.Notes = selectedTag.notes; // tvObj.ObjectType = selectedTag.name; tvObj.PropertyGUID = selectedTag.guid; tvObj.Value = selectedTag.tagValue; // トランザクションのコミット tvObj.Update(); // 更新前後で更新ログ出力 writeUpdateLogTaggedValue(tvObj, true); }
/// <summary> /// 不一致なタグ付き値の抽出 /// </summary> /// <param name="leftTag"></param> /// <param name="rightTag"></param> /// <returns></returns> private TaggedValueVO getDisagreedTaggedValue(TaggedValueVO leftTag, TaggedValueVO rightTag) { TaggedValueVO outTag; outTag = leftTag.Clone(); outTag.changed = ' '; if (!compareNullable(leftTag.name, rightTag.name)) { outTag.name = leftTag.name + " → " + rightTag.name; outTag.changed = 'U'; } if (!compareNullable(leftTag.tagValue, rightTag.tagValue)) { outTag.tagValue = leftTag.tagValue + " → " + rightTag.tagValue; outTag.changed = 'U'; } if (!compareNullable(leftTag.notes, rightTag.notes)) { outTag.notes = leftTag.notes + "\r\n------ ↓ ↓ ↓ ↓ ------\r\n" + rightTag.notes; outTag.changed = 'U'; } if (outTag.changed == ' ') { return(null); } else { // 空白以外なら 'U' で何かしら変更があったとみなされるため、左を比較元、右を比較先として情報を残す outTag.srcTaggedValue = leftTag; outTag.destTaggedValue = rightTag; return(outTag); } }
private void addTaggedValueBox(int rowIndex, ArtifactXmlReader reader, TaggedValueVO tgv) { int longerLine; TaggedValueVO leftTgv = tgv; TaggedValueVO rightTgv = tgv; string leftText = ""; string rightText = ""; ListBox listL = makeNewListBox(); ListBox listR = makeNewListBox(); switch (tgv.changed) { case 'U': leftTgv = reader.readTaggedValueDiffDetail(tgv.guid, "L"); rightTgv = reader.readTaggedValueDiffDetail(tgv.guid, "R"); DiffPresenter.getDisagreedTaggedValueDesc(leftTgv, rightTgv, ref leftText, ref rightText); leftDiffBuffer = new StringBuilder(); rightDiffBuffer = new StringBuilder(); var simpleDiff = new SimpleDiff <string>(leftText.Split('\n'), rightText.Split('\n')); simpleDiff.LineUpdate += new EventHandler <DiffEventArgs <string> >(ElementDiff_LineUpdate); simpleDiff.RunDiff(); leftText = leftDiffBuffer.ToString(); rightText = rightDiffBuffer.ToString(); selectedTag = rightTgv; leftDiffBuffer.Clear(); rightDiffBuffer.Clear(); break; case 'C': rightTgv = reader.readTaggedValueDiffDetail(tgv.guid, "R"); DiffPresenter.getMonoTaggedValueDesc(rightTgv, ref rightText); selectedTag = rightTgv; break; case 'D': leftTgv = reader.readTaggedValueDiffDetail(tgv.guid, "L"); DiffPresenter.getMonoTaggedValueDesc(leftTgv, ref leftText); selectedTag = leftTgv; break; default: break; } longerLine = getLongerLine(leftText, rightText); setListItems(listL, leftText); setListItems(listR, rightText); setListBoxSize(listL, leftText, longerLine); setListBoxSize(listR, rightText, longerLine); if (tgv.changed == 'D' || tgv.changed == 'U') { listL.Tag = leftTgv; listL.ContextMenuStrip = contextMenuStrip1; listL.Click += new System.EventHandler(this.TaggedValueListClick); // listL.Click += new System.EventHandler(this.MethodTextClick); } if (tgv.changed == 'C' || tgv.changed == 'U') { listR.Tag = rightTgv; listR.ContextMenuStrip = contextMenuStrip1; listR.Click += new System.EventHandler(this.TaggedValueListClick); // listR.Click += new System.EventHandler(this.MethodTextClick); } tableLayoutPanel1.Controls.Add(listL, 0, rowIndex); tableLayoutPanel1.Controls.Add(listR, 1, rowIndex); return; }
/// <summary> /// マージ時に使用:GUIDによるタグ付き値の比較 /// </summary> /// <param name="leftTag">左の操作</param> /// <param name="rightTag">右の操作</param> /// <returns>string#CompareTo()の戻り値と同じ(L=Rなら0, L>Rなら1, L<Rなら-1)</returns> private static int compareTaggedValueGuid(TaggedValueVO leftTag, TaggedValueVO rightTag) { return(leftTag.guid.CompareTo(rightTag.guid)); }
private static void Main(string[] args) { DetailType detailType; if (args == null || args.Length < 5) { dispErrorMessage("引数が足りません"); Application.Exit(); } string prjfile = "project.bdprj"; if (ProjectSetting.load(args[0] + "\\" + prjfile) == false) { dispErrorMessage("第1引数のプロジェクトパスが正しいかを確認ください"); Application.Exit(); return; } ElementVO elem = new ElementVO(); elem.guid = args[3]; elem.attributes = new List <AttributeVO>(); elem.methods = new List <MethodVO>(); elem.taggedValues = new List <TaggedValueVO>(); switch (args[1]) { case "a": case "A": detailType = DetailType.Attribute; break; case "m": case "M": detailType = DetailType.Method; break; case "t": case "T": detailType = DetailType.TaggedValue; break; default: dispErrorMessage("第2引数には a,m,t のいずれかを指定してください"); Application.Exit(); return; } char changed; if (args[2] == "C" || args[2] == "U" || args[2] == "D") { changed = args[2][0]; } else { dispErrorMessage("第2引数には a,m,t のいずれかを指定してください"); Application.Exit(); return; } switch (detailType) { case DetailType.Attribute: AttributeVO att = new AttributeVO(); att.guid = args[4]; att.changed = changed; elem.attributes.Add(att); break; case DetailType.Method: MethodVO mth = new MethodVO(); mth.guid = args[4]; mth.changed = changed; elem.methods.Add(mth); break; case DetailType.TaggedValue: TaggedValueVO tgv = new TaggedValueVO(); tgv.guid = args[4]; tgv.changed = changed; elem.taggedValues.Add(tgv); break; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm(elem)); }