/// <summary> /// 差異が検出された2つの属性の不一致な項目=値をつなげた文字列を作成 /// </summary> /// <param name="leftElemProp">(in)左の属性VO</param> /// <param name="rightElemProp">(in)右の属性VO</param> /// <param name="leftText">(out)左用の出力テキスト</param> /// <param name="rightText">(out)右用の出力テキスト</param> /// <returns></returns> private void getDisagreedElemPropertyDesc(ElementPropertyVO leftElemProp, ElementPropertyVO rightElemProp, ref string leftText, ref string rightText) { System.Text.StringBuilder lsb = new System.Text.StringBuilder(); lsb.Append(leftElemProp.name + "[" + leftElemProp.alias + "]" + "\r\n"); lsb.Append(leftElemProp.getComparedString(rightElemProp)); leftText = lsb.ToString(); System.Text.StringBuilder rsb = new System.Text.StringBuilder(); rsb.Append(rightElemProp.name + "[" + rightElemProp.alias + "]" + "\r\n"); rsb.Append(rightElemProp.getComparedString(leftElemProp)); rightText = rsb.ToString(); // if ( !compareNullable(leftAttr.stereoType, rightAttr.stereoType) ) { // lsb.Append("stereoType=" + leftAttr.stereoType + "\r\n"); // rsb.Append("stereoType=" + rightAttr.stereoType + "\r\n"); // } //// if( leftAtr.pos != rightAtr.pos ) { //// lsb.Append("pos=" + leftAtr.pos + "\n"); //// rsb.Append("pos=" + rightAtr.pos + "\n"); //// } // if( !compareNullable(leftAttr.notes, rightAttr.notes) ) { // lsb.Append("[notes]\r\n" + leftAttr.notes + "\r\n"); // rsb.Append("[notes]\r\n" + rightAttr.notes + "\r\n"); // } return; }
private static ElementPropertyVO readElementProperty(XmlNode elemPropNode) { int p; ElementPropertyVO elemPropVo = null; XmlNode propNode = elemPropNode.SelectSingleNode("elementProperty"); if (propNode != null) { elemPropVo = new ElementPropertyVO(); foreach (XmlAttribute attr in propNode.Attributes) { switch (attr.Name) { case "tpos": if (!Int32.TryParse(attr.Value, out p)) { p = 0; } elemPropVo.treePos = p; break; case "type": elemPropVo.eaType = attr.Value; break; case "name": elemPropVo.name = attr.Value; break; case "alias": elemPropVo.alias = attr.Value; break; case "stereotype": elemPropVo.stereoType = attr.Value; break; } } } return(elemPropVo); }
private static void outputElementDiffedProperty(ElementPropertyVO elemPropvo, int depth, StreamWriter sw) { sw.Write(indent(depth) + "<elementProperty "); sw.Write("tpos=\"" + elemPropvo.treePos + "\" "); sw.Write("type=\"" + elemPropvo.eaType + "\" "); sw.Write("name=\"" + escapeXML(elemPropvo.name) + "\" "); sw.Write("alias=\"" + escapeXML(elemPropvo.alias) + "\" "); if (elemPropvo.stereoType != null) { sw.Write(" stereotype=\"" + escapeXML(elemPropvo.stereoType) + "\""); } sw.WriteLine(">"); // ノートが入っていたら notes タグを出力 if (elemPropvo.notes != null) { sw.WriteLine(indent(depth + 1) + "<notes>" + escapeXML(elemPropvo.notes) + "</notes>"); } sw.WriteLine(indent(depth) + "</elementProperty>"); }
/// <summary> /// 要素の不一致部分の抽出 /// </summary> /// <param name="leftElem">左の要素</param> /// <param name="rightElem">右の要素</param> /// <returns></returns> public ElementVO getDisagreedElement(ElementVO leftElm, ElementVO rightElm) { // 出力する要素のインスタンスは一旦左側要素のクローンとする ElementVO outElm = leftElm.Clone(); outElm.changed = ' '; // 要素自体が保持するプロパティの比較 ElementPropertyVO lProp = new ElementPropertyVO(leftElm); ElementPropertyVO rProp = new ElementPropertyVO(rightElm); if (lProp.getComparableString() != rProp.getComparableString()) { outElm.changed = 'U'; outElm.propertyChanged = 'U'; outElm.srcElementProperty = lProp; outElm.destElementProperty = rProp; } leftElm.sortChildNodesGuid(); rightElm.sortChildNodesGuid(); // 要素が保持する属性リストの比較 Int16 lCnt, rCnt; AttributeVO lAtr, rAtr, oAtr; List <AttributeVO> outAttributeList = new List <AttributeVO>(); for (lCnt = 0, rCnt = 0; lCnt < leftElm.attributes.Count || rCnt < rightElm.attributes.Count;) { // 左側が最終の属性に達した場合 if (lCnt >= leftElm.attributes.Count) { // 右側の属性が追加されたものとして出力パッケージリストに追加 oAtr = rightElm.attributes[rCnt]; oAtr.changed = 'C'; outAttributeList.Add(oAtr); rCnt++; continue; } // 右側が最終の属性に達した場合 if (rCnt >= rightElm.attributes.Count) { // 左側の属性が削除されたものとして出力パッケージリストに追加 oAtr = leftElm.attributes[lCnt]; oAtr.changed = 'D'; outAttributeList.Add(oAtr); lCnt++; continue; } lAtr = leftElm.attributes[lCnt]; rAtr = rightElm.attributes[rCnt]; // GUIDの比較で一致した場合 if (compareAttributeGuid(lAtr, rAtr) == 0) { oAtr = getDisagreedAttribute(lAtr, rAtr); if (oAtr != null) { oAtr.changed = 'U'; oAtr.srcAttribute = lAtr; oAtr.destAttribute = rAtr; outAttributeList.Add(oAtr); } lCnt++; rCnt++; } else { // 比較で一致するものが無かった場合: L > R なら Rの追加、 R < L なら Lの削除 とみなす if (compareAttributeGuid(lAtr, rAtr) > 0) { oAtr = rAtr; oAtr.changed = 'C'; outAttributeList.Add(oAtr); rCnt++; } else { oAtr = lAtr; oAtr.changed = 'D'; outAttributeList.Add(oAtr); lCnt++; } } } outElm.attributes = outAttributeList; // 要素が保持するメソッドリストの比較 MethodVO lMth, rMth, oMth; List <MethodVO> outMethods = new List <MethodVO>(); for (lCnt = 0, rCnt = 0; lCnt < leftElm.methods.Count || rCnt < rightElm.methods.Count;) { // 左側が最終の操作に達した場合 if (lCnt >= leftElm.methods.Count) { // 右側の操作が追加されたものとして出力パッケージリストに追加 oMth = rightElm.methods[rCnt]; oMth.changed = 'C'; outMethods.Add(oMth); rCnt++; continue; } // 右側が最終の操作に達した場合 if (rCnt >= rightElm.methods.Count) { // 左側の操作が削除されたものとして出力パッケージリストに追加 oMth = leftElm.methods[lCnt]; oMth.changed = 'D'; outMethods.Add(oMth); lCnt++; continue; } lMth = leftElm.methods[lCnt]; rMth = rightElm.methods[rCnt]; // GUIDで一致するものがあった場合: if (compareMethodGuid(lMth, rMth) == 0) { oMth = getDisagreedMethod(lMth, rMth); if (oMth != null) { oMth.changed = 'U'; oMth.srcMethod = lMth; oMth.destMethod = rMth; outMethods.Add(oMth); } lCnt++; rCnt++; } else { // GUIDで一致するものが無かった場合: L > R なら Rの追加、 R < L なら Lの削除 とみなす if (compareMethodGuid(lMth, rMth) > 0) { rMth.changed = 'C'; outMethods.Add(rMth); rCnt++; } else { lMth.changed = 'D'; outMethods.Add(lMth); lCnt++; } } } outElm.methods = outMethods; // 要素が保持するタグ付き値リストの比較 TaggedValueVO lTag, rTag, oTag; List <TaggedValueVO> outTaggedValues = new List <TaggedValueVO>(); for (lCnt = 0, rCnt = 0; lCnt < leftElm.taggedValues.Count && rCnt < rightElm.taggedValues.Count;) { // 左側が最終の操作に達した場合 if (lCnt >= leftElm.taggedValues.Count) { // 右側の操作が追加されたものとして出力パッケージリストに追加 oTag = rightElm.taggedValues[rCnt]; oTag.changed = 'C'; outTaggedValues.Add(oTag); rCnt++; continue; } // 右側が最終の操作に達した場合 if (rCnt >= rightElm.taggedValues.Count) { // 左側の操作が削除されたものとして出力パッケージリストに追加 oTag = leftElm.taggedValues[lCnt]; oTag.changed = 'D'; outTaggedValues.Add(oTag); lCnt++; continue; } lTag = leftElm.taggedValues[lCnt]; rTag = rightElm.taggedValues[rCnt]; // GUIDで一致するものがあった場合: if (compareTaggedValueGuid(lTag, rTag) == 0) { oTag = getDisagreedTaggedValue(lTag, rTag); if (oTag != null) { oTag.changed = 'U'; oTag.srcTaggedValue = lTag; oTag.destTaggedValue = rTag; outTaggedValues.Add(oTag); } lCnt++; rCnt++; } else { // GUIDで一致するものが無かった場合: L > R なら Rの追加、 R < L なら Lの削除 とみなす if (compareTaggedValueGuid(lTag, rTag) > 0) { rTag.changed = 'C'; outTaggedValues.Add(rTag); rCnt++; } else { lTag.changed = 'D'; outTaggedValues.Add(lTag); lCnt++; } } } outElm.taggedValues = outTaggedValues; if (outElm.attributes.Count == 0 && outElm.methods.Count == 0 && outElm.taggedValues.Count == 0) { if (outElm.changed == ' ') { return(null); } else { outElm.changed = 'U'; return(outElm); } } else { outElm.changed = 'U'; return(outElm); } }