/// <summary>
        /// Cleans all text fields in this element
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="visitSubNodes"></param>
        public override void visit(Generated.Type obj, bool visitSubNodes)
        {
            if ( obj.getDefault() != null )
              {
            obj.setDefault(obj.getDefault().Trim());
              }

              base.visit(obj, visitSubNodes);
        }
        /// <summary>
        /// Cleans all text fields in this element
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="visitSubNodes"></param>
        public override void visit(Generated.StructureElement obj, bool visitSubNodes)
        {
            if ( obj.getTypeName() != null )
              {
            obj.setTypeName(obj.getTypeName().Trim());
              }
              if ( obj.getDefault() != null )
              {
            obj.setDefault(obj.getDefault().Trim());
              }

              base.visit(obj, visitSubNodes);
        }
        /// <summary>
        /// Duplicates a source StructureElement into its target
        /// </summary>
        /// <param name="source"></param>
        /// <param name="target"></param>
        public static void DuplicateStructureElement(Generated.StructureElement source, Generated.StructureElement target)
        {
            if ( source != null && target != null )
            {
                DuplicateReqRelated (source, target);

                target.setTypeName(source.getTypeName());
                target.setDefault(source.getDefault());
                target.setMode(source.getMode());
            }
        }
        /// <summary>
        /// Duplicates a source Type into its target
        /// </summary>
        /// <param name="source"></param>
        /// <param name="target"></param>
        public static void DuplicateType(Generated.Type source, Generated.Type target)
        {
            if ( source != null && target != null )
            {
                DuplicateReqRelated (source, target);

                target.setDefault(source.getDefault());
                target.setWidth(source.getWidth());
                target.setHeight(source.getHeight());
                target.setX(source.getX());
                target.setY(source.getY());
                target.setHidden(source.getHidden());
                target.setPinned(source.getPinned());
            }
        }
        /// <summary>
        /// Duplicates a source RequirementSet into its target
        /// </summary>
        /// <param name="source"></param>
        /// <param name="target"></param>
        public static void DuplicateRequirementSet(Generated.RequirementSet source, Generated.RequirementSet target)
        {
            if ( source != null && target != null )
            {
                DuplicateNamable (source, target);

                target.setWidth(source.getWidth());
                target.setHeight(source.getHeight());
                target.setX(source.getX());
                target.setY(source.getY());
                target.setRecursiveSelection(source.getRecursiveSelection());
                target.setObsoleteRequirementsStatus(source.getObsoleteRequirementsStatus());
                target.setDefault(source.getDefault());
                target.setPinned(source.getPinned());
            }
        }
        /// <summary>
        /// Compares two Type and annotates the differences on the first one
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="other"></param>
        public static void compareType(Generated.Type obj, Generated.Type other, VersionDiff diff)
        {
            if ( other == null )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aAdd, "", "", obj.Name ) );
                return;
            }

            compareReqRelated (obj, other, diff);

            if ( !CompareUtil.canonicalStringEquality(obj.getDefault(), other.getDefault()) )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Default", other.getDefault(), obj.getDefault()) );
            }
            if ( obj.getWidth() != other.getWidth() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Width", other.getWidth().ToString(), obj.getWidth().ToString()) );
            }
            if ( obj.getHeight() != other.getHeight() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Height", other.getHeight().ToString(), obj.getHeight().ToString()) );
            }
            if ( obj.getX() != other.getX() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "X", other.getX().ToString(), obj.getX().ToString()) );
            }
            if ( obj.getY() != other.getY() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Y", other.getY().ToString(), obj.getY().ToString()) );
            }
            if ( obj.getHidden() != other.getHidden() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Hidden", other.getHidden().ToString(), obj.getHidden().ToString()) );
            }
            if ( obj.getPinned() != other.getPinned() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Pinned", other.getPinned().ToString(), obj.getPinned().ToString()) );
            }
        }
        /// <summary>
        /// Compares two StructureElement and annotates the differences on the first one
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="other"></param>
        public static void compareStructureElement(Generated.StructureElement obj, Generated.StructureElement other, VersionDiff diff)
        {
            if ( other == null )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aAdd, "", "", obj.Name ) );
                return;
            }

            compareReqRelated (obj, other, diff);

            if ( !CompareUtil.canonicalStringEquality(obj.getTypeName(), other.getTypeName()) )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "TypeName", other.getTypeName(), obj.getTypeName()) );
            }
            if ( !CompareUtil.canonicalStringEquality(obj.getDefault(), other.getDefault()) )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Default", other.getDefault(), obj.getDefault()) );
            }
            if ( obj.getMode() != other.getMode() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Mode", other.getMode().ToString(), obj.getMode().ToString()) );
            }
        }
        /// <summary>
        /// Compares two RequirementSet and annotates the differences on the first one
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="other"></param>
        public static void compareRequirementSet(Generated.RequirementSet obj, Generated.RequirementSet other, VersionDiff diff)
        {
            if ( other == null )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aAdd, "", "", obj.Name ) );
                return;
            }

            compareNamable (obj, other, diff);

            if ( obj.allDependancies() != null )
            {
                if ( other.allDependancies() != null )
                {
                    foreach ( Generated.RequirementSetDependancy subElement in obj.allDependancies() )
                    {
                        bool compared = false;
                        foreach ( Generated.RequirementSetDependancy otherElement in other.allDependancies() )
                        {
                            if ( subElement.Guid == otherElement.Guid )
                            {
                                compareRequirementSetDependancy ( subElement, otherElement, diff );
                                compared = true;
                            break;
                            }
                        }

                        if ( !compared )
                        {
                            diff.appendChanges ( new Diff(subElement, HistoricalData.Generated.acceptor.ChangeOperationEnum.aAdd, "Dependancies", "", subElement.Name ) );
                        }
                    }

                    foreach ( Generated.RequirementSetDependancy otherElement in other.allDependancies() )
                    {
                        bool found = false;
                        foreach ( Generated.RequirementSetDependancy subElement in obj.allDependancies() )
                        {
                            if ( subElement.Guid == otherElement.Guid )
                            {
                                found = true;
                                break;
                            }
                        }

                        if ( !found )
                        {
                            diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aRemove , "Dependancies", otherElement.Name) );
                        }
                    }
                }
                else
                {
                    foreach ( Generated.RequirementSetDependancy subElement in obj.allDependancies() )
                    {
                        diff.appendChanges ( new Diff(subElement, HistoricalData.Generated.acceptor.ChangeOperationEnum.aAdd, "Dependancies", "", subElement.Name ) );
                    }
                }
            }
            else
            {
                if ( other.allDependancies() != null )
                {
                    foreach ( Generated.RequirementSetDependancy otherElement in other.allDependancies() )
                    {
                        diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aRemove , "Dependancies", otherElement.Name) );
                    }
                }
            }
            if ( obj.allSubSets() != null )
            {
                if ( other.allSubSets() != null )
                {
                    foreach ( Generated.RequirementSet subElement in obj.allSubSets() )
                    {
                        bool compared = false;
                        foreach ( Generated.RequirementSet otherElement in other.allSubSets() )
                        {
                            if ( subElement.Guid == otherElement.Guid )
                            {
                                compareRequirementSet ( subElement, otherElement, diff );
                                compared = true;
                            break;
                            }
                        }

                        if ( !compared )
                        {
                            diff.appendChanges ( new Diff(subElement, HistoricalData.Generated.acceptor.ChangeOperationEnum.aAdd, "SubSets", "", subElement.Name ) );
                        }
                    }

                    foreach ( Generated.RequirementSet otherElement in other.allSubSets() )
                    {
                        bool found = false;
                        foreach ( Generated.RequirementSet subElement in obj.allSubSets() )
                        {
                            if ( subElement.Guid == otherElement.Guid )
                            {
                                found = true;
                                break;
                            }
                        }

                        if ( !found )
                        {
                            diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aRemove , "SubSets", otherElement.Name) );
                        }
                    }
                }
                else
                {
                    foreach ( Generated.RequirementSet subElement in obj.allSubSets() )
                    {
                        diff.appendChanges ( new Diff(subElement, HistoricalData.Generated.acceptor.ChangeOperationEnum.aAdd, "SubSets", "", subElement.Name ) );
                    }
                }
            }
            else
            {
                if ( other.allSubSets() != null )
                {
                    foreach ( Generated.RequirementSet otherElement in other.allSubSets() )
                    {
                        diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aRemove , "SubSets", otherElement.Name) );
                    }
                }
            }
            if ( obj.getWidth() != other.getWidth() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Width", other.getWidth().ToString(), obj.getWidth().ToString()) );
            }
            if ( obj.getHeight() != other.getHeight() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Height", other.getHeight().ToString(), obj.getHeight().ToString()) );
            }
            if ( obj.getX() != other.getX() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "X", other.getX().ToString(), obj.getX().ToString()) );
            }
            if ( obj.getY() != other.getY() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Y", other.getY().ToString(), obj.getY().ToString()) );
            }
            if ( obj.getRecursiveSelection() != other.getRecursiveSelection() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "RecursiveSelection", other.getRecursiveSelection().ToString(), obj.getRecursiveSelection().ToString()) );
            }
            if ( obj.getObsoleteRequirementsStatus() != other.getObsoleteRequirementsStatus() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "ObsoleteRequirementsStatus", other.getObsoleteRequirementsStatus().ToString(), obj.getObsoleteRequirementsStatus().ToString()) );
            }
            if ( obj.getDefault() != other.getDefault() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Default", other.getDefault().ToString(), obj.getDefault().ToString()) );
            }
            if ( obj.getPinned() != other.getPinned() )
            {
                diff.appendChanges ( new Diff(obj, HistoricalData.Generated.acceptor.ChangeOperationEnum.aChange, "Pinned", other.getPinned().ToString(), obj.getPinned().ToString()) );
            }
        }
        /// <summary>
        /// Searches a specific string in Type and updates the list 
        /// of model element with all the elements in which that string is found
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="obj">The string to search for</param>
        /// <param name="occurences">The list of model elements which hold the searched string</param>
        public static void searchType(Generated.Type obj, string searchString, List<ModelElement> occurences)
        {
            searchReqRelated (obj, searchString, occurences);

            if ( obj.getDefault() != null && obj.getDefault().Contains (searchString) )
            {
                occurences.Add ( obj );
            }
        }