コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="elemNode"></param>
        /// <param name="sortByPosFlg"></param>
        /// <param name="elemvo"></param>
        private static void readElementContents(XmlNode elemNode, bool sortByPosFlg, ref ElementVO elemvo)
        {
            List <AttributeVO>   retAttrList   = new List <AttributeVO>();
            List <MethodVO>      retMethList   = new List <MethodVO>();
            List <TaggedValueVO> retTagValList = new List <TaggedValueVO>();
            List <ConnectorVO>   retConnList   = new List <ConnectorVO>();

            foreach (XmlNode eNode in elemNode.ChildNodes)
            {
                switch (eNode.Name)
                {
                case "srcElementProperty":
                    // srcElementPropertyの読み込み
                    elemvo.srcElementProperty = readElementProperty(eNode);
                    break;

                case "destElementProperty":
                    // destElementPropertyの読み込み
                    elemvo.destElementProperty = readElementProperty(eNode);
                    break;

                case "ref":
                    // ElementReferenceの読み込み
                    elemvo.elementReferenceVO = readElementReference(eNode);
                    break;

                case "attribute":
                    // attributesの読み込み
                    retAttrList.Add(readAttribute(eNode));
                    break;

                case "method":
                    // methodsの読み込み
                    retMethList.Add(readMethod(eNode));
                    break;

                case "taggedValues":
                    retTagValList = readTaggedValues(eNode);
                    break;

                case "notes":
                    // notesタグの読み込み
                    elemvo.notes = eNode.InnerText;
                    break;
                }

                // クラス間接続情報の読み込み
                //    this.connReader.readConnectorByGUID(convo, elemvo);
                //    retConnList.Add(convo);
            }

            elemvo.attributes   = retAttrList;
            elemvo.methods      = retMethList;
            elemvo.taggedValues = retTagValList;

            // ConnectionSearcher
            elemvo.connectors = new List <ConnectorVO>();

            // 要素配下のソート
            if (sortByPosFlg)
            {
                elemvo.sortChildNodes();
                //elemvo.sortAttributes();
                //elemvo.sortMethods();
                //elemvo.sortTaggedValues();
            }
            else
            {
                elemvo.sortChildNodesGuid();
                //elemvo.sortMethodsGUID();
                //elemvo.sortTaggedValuesGUID();
            }
        }