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

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

                if (xml.Contains("<Value>") &&
                    xml.Contains("<Field>"))
                {
                    //		<AxQuerySimpleDataSourceRange>
                    //			<Name>NamedCategoryHierarchyRoleRetail</Name>
                    //			<Field>NamedCategoryHierarchyRole</Field>
                    //			<Value>4</Value>
                    //		</AxQuerySimpleDataSourceRange>

                    string value = MetaData.extractFromXML(xml, "//AxQuerySimpleDataSourceRange/Value");

                    if (value.IndexOfAny(matchChars) != -1 &&
                        !value.Contains("(") &&
                        !value.Contains(">") &&
                        !value.Contains("<") &&
                        !value.Contains("..") &&
                        !value.Contains("!"))
                    {
                        string fieldName = MetaData.extractFromXML(xml, "//AxQuerySimpleDataSourceRange/Field");
                        string rangeName = MetaData.extractFromXML(xml, "//AxQuerySimpleDataSourceRange/Name");

                        string tableName = MetaData.getTableNameFromQueryRange(input, rangeName);

                        if (tableName == String.Empty)
                        {
                            Debug.WriteLine(string.Format("{0} has unknown table range {1} with value {2} on field {3}", Scanner.FILENAME, rangeName, value, fieldName));
                        }
                        string enumName = MetaData.getEnumFromTable(tableName, fieldName);

                        if (enumName != String.Empty &&
                            enumName.ToLowerInvariant() != "Boolean".ToLowerInvariant() &&
                            enumName.ToLowerInvariant() != "NoYes".ToLowerInvariant() &&
                            enumName.ToLowerInvariant() != "NoYesId".ToLowerInvariant())
                        {
                            string symbols = string.Empty;

                            foreach (var v in value.Split(','))
                            {
                                string symbol = MetaData.getSymbolFromEnum(enumName, v.Trim());

                                if (symbol == string.Empty)
                                {
//                                    Debug.WriteLine(string.Format("{0} is referencing unknown enum value. Enum={1} with value {2}", Scanner.FILENAME, enumName, v));
                                    break;
                                }
                                Debug.WriteLine(string.Format("{0};{1};{2}", enumName, v, symbol));

                                if (symbols != string.Empty)
                                {
                                    symbols += ", " + symbol;
                                }
                                else
                                {
                                    symbols = symbol;
                                }
                            }
                            if (symbols != "")
                            {
                                string originalText = match.Value;
                                int    startPos     = originalText.IndexOf("<Value>");
                                int    endPos       = originalText.IndexOf("</Value>") + "</Value>".Length;
                                string updatedText;
                                updatedText = originalText.Remove(startPos, endPos - startPos);
                                updatedText = updatedText.Insert(startPos, "<Value>" + symbols + "</Value>");

                                string updatedInput = input.Remove(match.Index, match.Length);
                                updatedInput = updatedInput.Insert(match.Index, updatedText);
                                Hits++;
                                return(this.Run(updatedInput, match.Index + match.Length));
                            }
                            else
                            {
                                //Debug.WriteLine(string.Format("{0} has integer based range {1} on enum {2} on field {3}.{4}", Scanner.FILENAME, value, enumName, tableName, fieldName));
                                //  Debug.WriteLine(string.Format("{0};{1};{2};{3};{4}", Scanner.FILENAME, value, enumName, tableName, fieldName));
                            }
                        }
                    }
                }
                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 = match.Value;

                if (!xml.Contains("<ValueStr>") &&
                    (xml.Contains("AxTableRelationConstraintFixed") ||
                     xml.Contains("AxTableRelationConstraintRelatedFixed")))
                {
                    //            <AxTableRelationConstraint xmlns=""
                    //					i:type="AxTableRelationConstraintFixed">
                    //					<Name>InventAccountType</Name>
                    //					<Field>InventAccountType</Field>
                    //					<Value>21</Value>
                    //					<ValueStr>InventAccountType::SalesIssue</ValueStr>
                    //				</AxTableRelationConstraint>

                    int startPos = xml.IndexOf("xmlns") - 1;
                    int endPos   = xml.IndexOf(">");
                    xml = xml.Remove(startPos, endPos - startPos);  //Remove the i:type...

                    string fieldName = MetaData.extractFromXML(xml, "//AxTableRelationConstraint/Field");

                    string value = MetaData.extractFromXML(xml, "//AxTableRelationConstraint/Value");
                    if (value == String.Empty)
                    {
                        //default
                        value = "0";
                    }
                    string enumName = "";
                    string token    = "Field";
                    if (fieldName != "")
                    {
                        enumName = MetaData.extractFromXML(input, "//AxTable/Fields/AxTableField[Name=\"" + fieldName + "\"]/EnumType");
                    }
                    else
                    {
                        string relatedFieldName = MetaData.extractFromXML(xml, "//AxTableRelationConstraint/RelatedField");
                        string sub              = input.Substring(1, match.Index);
                        int    pos              = sub.LastIndexOf("<RelatedTable>") + "<RelatedTable>".Length;
                        int    pos2             = sub.IndexOf("</RelatedTable>", pos);
                        string relatedTableName = sub.Substring(pos, pos2 - pos);
                        fieldName = relatedTableName + "." + relatedFieldName;
                        enumName  = MetaData.getEnumFromTable(relatedTableName, relatedFieldName);
                        token     = "RelatedField";
                    }
                    if (enumName != "")
                    {
                        string symbol = MetaData.getSymbolFromEnum(enumName, value);
                        if (symbol != "")
                        {
                            string originalText = match.Value;
                            startPos = originalText.IndexOf("<Value>");
                            endPos   = originalText.IndexOf("</Value>") + "</Value>".Length;
                            string updatedText;
                            if (startPos != -1)
                            {
                                updatedText = originalText.Remove(startPos, endPos - startPos);
                            }
                            else
                            {
                                startPos = originalText.IndexOf("</Name>") + "</Name>".Length;
                                endPos   = originalText.IndexOf("<" + token + ">");
                                string whiteSpace = originalText.Substring(startPos, endPos - startPos);
                                int    iPos       = whiteSpace.IndexOf("<");
                                if (iPos != -1)
                                {
                                    whiteSpace = whiteSpace.Substring(1, iPos - 1);
                                }
                                startPos    = originalText.IndexOf("</" + token + ">") + ("</" + token + ">").Length;
                                updatedText = originalText.Insert(startPos, whiteSpace);
                                startPos   += whiteSpace.Length;
                            }
                            updatedText = updatedText.Insert(startPos, "<ValueStr>" + enumName + "::" + symbol + "</ValueStr>");

                            string updatedInput = input.Remove(match.Index, match.Length);
                            updatedInput = updatedInput.Insert(match.Index, updatedText);
                            Hits++;
                            return(this.Run(updatedInput, match.Index + match.Length));
                        }
                        else
                        {
                            if (enumName != "NoYes" &&
                                enumName != "Boolean")
                            {
                                Debug.WriteLine(string.Format("{0} references non existing value {1} in enum {2} via constraint on field {3}", Scanner.FILENAME, value, enumName, fieldName));
                            }
                        }
                    }
                }
                return(this.Run(input, match.Index + match.Length));
            }

            return(input);
        }