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); }
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); }