public string Run(string input, int startAt = 0)
        {
            Match match = xpoMatch.Match(input, startAt);

            if (match.Success)
            {
                string xml = match.Value;

                if (!xml.Contains("<Optional>"))
                {
                    string fieldName = MetaData.extractFromXML(xml, "//AxTableIndexField/DataField");
                    string indexName = MetaData.extractPreviousXMLElement("Name", match.Index, input);
                    string tableName = MetaData.extractNextXMLElement("Name", 1, input);
                    string token     = tableName + "\\" + indexName + "\\" + fieldName;

                    if (fieldsToMakeOptional.Contains(token.ToLowerInvariant()))
                    {
                        if (xml.Contains("<Tags>"))
                        {
                            throw new NotSupportedException();
                        }
                        if (xml.Contains("<IncludedColumn>"))
                        {
                            throw new NotSupportedException();
                        }

                        int endpos   = xml.IndexOf("</DataField>") + "</DataField>".Length;
                        int startPos = xml.LastIndexOf(Environment.NewLine, endpos);
                        int xmlPos   = xml.IndexOf("<DataField>");

                        string updatedInput = input.Insert(match.Index + endpos, xml.Substring(startPos, xmlPos - startPos) + "<Optional>Yes</Optional>");

                        string indexToken = "<Name>" + indexName + "</Name>";
                        int    indexPos   = updatedInput.IndexOf(indexToken);

                        int endpos2 = updatedInput.IndexOf("</IsSystemGenerated>", indexPos) + "</IsSystemGenerated>".Length;
                        if (endpos2 > indexPos)
                        {
                            int startPos2 = updatedInput.LastIndexOf(Environment.NewLine, endpos2);
                            int xmlPos2   = updatedInput.IndexOf("<IsSystemGenerated>", startPos2);

                            if (!updatedInput.Substring(indexPos, endpos2 - indexPos).Contains("IsManuallyUpdated"))
                            {
                                updatedInput = updatedInput.Insert(xmlPos2, "<IsManuallyUpdated>Yes</IsManuallyUpdated>" + updatedInput.Substring(startPos2, xmlPos2 - startPos2));
                            }
                        }
                        Hits++;
                        return(this.Run(updatedInput, match.Index + match.Length));
                    }
                    return(this.Run(input, match.Index + match.Length));
                }
            }

            return(input);
        }
예제 #2
0
        public string Run(string _input, int _startAt = 0)
        {
            Match match = xpoMatch.Match(_input, _startAt);

            if (match.Success)
            {
                string xml            = _input;
                var    stringToUpdate = match.Value;
                string methodName     = MetaData.extractPreviousXMLElement("Name", match.Index, _input);
                var    sourceFile     = Path.GetFileNameWithoutExtension(Scanner.FILENAME);
                _input = this.processSource(_input, stringToUpdate, sourceFile + "." + methodName);
                _input = this.Run(_input, match.Index + 1);
            }

            return(_input);
        }
예제 #3
0
        private string AOTPath(string xml, int pos)
        {
            string         name    = MetaData.extractPreviousXMLElement("Name", pos, xml);
            Stack <string> paths   = MetaData.XMLPathToFirstToken(xml, "IsObsolete");
            string         path    = string.Empty;
            var            asArray = paths.ToArray();

            for (int i = asArray.Length - 2; i >= 0; i--)
            {
                path += "\\" + asArray[i];
            }
            if (path != string.Empty)
            {
                return(path + "\\" + name);
            }
            return(string.Empty);
        }
예제 #4
0
        public string Run(string input, int startAt = 0)
        {
            Match match = xpoMatch.Match(input, startAt);

            if (match.Success)
            {
                string xml        = match.Value;
                string table1Name = match.Groups[1].Value.Trim();
                string field1Name = match.Groups[2].Value.Trim();
                string table2Name = match.Groups[3].Value.Trim();
                string field2Name = match.Groups[4].Value.Trim();

                methodName = MetaData.extractPreviousXMLElement("Name", match.Index, input);

                if (methodName.ToLowerInvariant() == "init")
                {
                    string dsxml = MetaData.extractPreviousXMLElement("DataSource", match.Index, input);
                    if (dsxml != string.Empty) // Not a datasource method
                    {
                        string dsName = MetaData.extractNextXMLElement("Name", 1, dsxml);
                        if (dsName == table1Name && dsName != table2Name)
                        {
                            string methodxml = MetaData.extractPreviousXMLElement("Source", match.Index, input).ToLowerInvariant();

                            if (!methodxml.Contains(".adddatasource"))
                            {
                                this.log("Possibly wrong order of parameters. " + xml);
                            }
                        }
                    }
                }

                return(this.Run(input, match.Index + match.Length));
            }

            return(input);
        }
        public string Run(string _input, int _startAt = 0)
        {
            Match match = xpoMatch.Match(_input, _startAt);

            if (match.Success)
            {
                string methodName = MetaData.extractPreviousXMLElement("Name", match.Index, _input);
                if (methodName != string.Empty)
                {
                    string  obsAttr       = match.Groups[0].Value.Trim();
                    Boolean isParamsGiven = obsAttr.IndexOf('(') < obsAttr.IndexOf(']');

                    if (!isParamsGiven)
                    {
                        obsAttr = obsAttr.Substring(0, obsAttr.IndexOf(']'));
                    }
                    else
                    {
                        int pos = this.findEndParanthesis(obsAttr);
                        if (pos == -1)
                        {
                            return(this.Run(_input, match.Index + 50));
                        }
                        obsAttr = obsAttr.Substring(0, pos);
                    }

                    //Already has a date
                    if (!obsAttr.Contains(@"\"))
                    {
                        string obsoleteDate = this.getDate(methodName);
                        if (obsoleteDate != string.Empty)
                        {
                            string newObsAttr = obsAttr.Trim();

                            if (!isParamsGiven)
                            {
                                newObsAttr += "(''";
                            }

                            if (!newObsAttr.ToLowerInvariant().EndsWith("false") &&
                                !newObsAttr.ToLowerInvariant().EndsWith("true"))
                            {
                                if (newObsAttr.Trim().ToLowerInvariant().EndsWith("'") ||
                                    newObsAttr.Trim().ToLowerInvariant().EndsWith("\""))
                                {
                                    newObsAttr += ", false";
                                }
                                else
                                {
                                    newObsAttr += "'', false";
                                }
                            }

                            newObsAttr += ", " + obsoleteDate;

                            if (!isParamsGiven)
                            {
                                newObsAttr += ")";
                            }

                            int attributePos = newObsAttr.ToLowerInvariant().IndexOf("sysobsoleteattribute");
                            if (attributePos > -1)
                            {
                                newObsAttr = newObsAttr.Remove(attributePos + "sysobsolete".Length, "attribute".Length);
                            }

                            int    pos          = _input.IndexOf(obsAttr, _startAt);
                            string updatedInput = _input.Remove(pos, obsAttr.Length);
                            updatedInput = updatedInput.Insert(pos, newObsAttr);
                            Hits++;
                            return(this.Run(updatedInput, match.Index + 50));
                        }
                    }
                }
                _input = this.Run(_input, match.Index + 50);
            }

            return(_input);
        }
예제 #6
0
        public string Run(string input, int startAt = 0)
        {
            Match match = xpoMatch.Match(input, startAt);

            if (match.Success)
            {
                string xml     = match.Value;
                string varName = match.Groups[1].Value.Trim();
                formName = match.Groups[2].Value.Replace('\"', ' ').Replace('\'', ' ').Trim();

                methodName = MetaData.extractPreviousXMLElement("Name", match.Index, input);

                if (MetaData.isCodeProtectedByMenuItem(input, match.Index))
                {
                    this.log("Clicked method protected by menu item.");
                    return(this.Run(input, match.Index + match.Length));;
                }

                if (xml.ToLowerInvariant().Contains(".menuitemname") ||
                    xml.ToLowerInvariant().Contains(".run(" + varName + ")"))
                {
                    this.log("Already uses menu item.");
                    return(this.Run(input, match.Index + match.Length));;
                }

                if (MetaData.isFormLookup(formName))
                {
                    this.log("Is lookup form");
                    return(this.Run(input, match.Index + match.Length));
                }

                if (MetaData.isFormDialog(formName))
                {
                    this.log("Is dialog form");
                    return(this.Run(input, match.Index + match.Length));
                }

                var datasources = MetaData.getFormRootDataSources(formName);

                if (datasources.Count == 0)
                {
                    this.log("Has no data sources");
                    return(this.Run(input, match.Index + match.Length));
                }

                bool allDatasourcesTmp = true;
                foreach (var table in datasources)
                {
                    if (MetaData.isTablePersisted(table))
                    {
                        allDatasourcesTmp = false;
                    }
                }

                if (allDatasourcesTmp)
                {
                    this.log("Only has temporary data sources");
                    return(this.Run(input, match.Index + match.Length));;
                }

                var menuItems = MetaData.getMenuItemsFromFormName(formName);
                if (menuItems.Count == 0)
                {
                    this.log("Has no menu item, but datasources: " + getMenuItemsAsString(datasources), "Warning");
                    return(this.Run(input, match.Index + match.Length));;
                }
                string menuItem = string.Empty;

                if (menuItems.Count == 1)
                {
                    menuItem = menuItems[0];
                    this.log("Has one menu item:" + menuItem + ", and datasources: " + getMenuItemsAsString(datasources), "Fixable");
                }

                if (menuItem == string.Empty && datasources.Count == 1)
                {
                    var formRef = MetaData.tableFormRef(datasources[0]);
                    if (formRef != string.Empty &&
                        menuItems.Contains(formRef))
                    {
                        if (MetaData.isFormUsingArgsMenuItemNameAndMenuItem(formName, formRef))
                        {
                            this.log("FormRef points to menu item, but form uses args.menuItemName() and menuitemdisplaystr(" + formRef + ")", "Warning");
                            return(this.Run(input, match.Index + match.Length));;
                        }
                        menuItem = formRef;
                        this.log("Has one data source with formRef: " + menuItem + ", and datasources: " + getMenuItemsAsString(datasources) + ", and menu items:" + getMenuItemsAsString(menuItems), "Fixable");
                    }
                }

                if (menuItem == string.Empty && menuItems.Contains(formName))
                {
                    menuItem = formName;
                    if (MetaData.isFormUsingArgsMenuItemName(formName))
                    {
                        this.log("Has multiple menu items:" + getMenuItemsAsString(menuItems) + ", and datasources: " + getMenuItemsAsString(datasources) + ", and form uses args.menuItemName().", "Warning");
                        return(this.Run(input, match.Index + match.Length));;
                    }
                    this.log("Updated. Has menu item with same name as form. Menu items:" + getMenuItemsAsString(menuItems) + ", and datasources: " + getMenuItemsAsString(datasources), "Fixable");
                }

                if (menuItem != string.Empty)
                {
                    int pos           = xml.IndexOf(';');
                    int nextLineStart = xml.ToLowerInvariant().IndexOfAny("abcdefghijklmnopqrstuvwxyz".ToCharArray(), pos);
                    if (nextLineStart > 0)
                    {
                        string whitespace = xml.Substring(pos, nextLineStart - pos);
                        xml = xml.Insert(nextLineStart, whitespace);
                        xml = xml.Insert(nextLineStart, varName + ".menuItemName(menuItemDisplayStr(" + menuItem + "))");
                        string updatedInput = input.Remove(match.Index, match.Length);
                        updatedInput = updatedInput.Insert(match.Index, xml);
                        Hits++;
                        return(this.Run(updatedInput, match.Index + match.Length));
                    }
                    else
                    {
                        this.log("Cannot update file due to format", "Error");
                    }
                }
                else
                {
                    this.log("Has multiple menu items:" + getMenuItemsAsString(menuItems) + ", and datasources: " + getMenuItemsAsString(datasources), "Warning");
                }

                return(this.Run(input, match.Index + match.Length));
            }

            return(input);
        }