Пример #1
0
        /// <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);
            }
        }