Exemplo n.º 1
0
        public static SqlBoolean EvaluateAsBoolean([SqlFacet(MaxSize = -1)] SqlXml input, [SqlFacet(MaxSize = -1)] SqlString path, SqlString nsMap)
        {
            if (input.IsNull || path.IsNull)
            {
                return(SqlBoolean.Null);
            }

            using (var reader = input.CreateReader())
            {
                var navigator = new XPathDocument(reader).CreateNavigator();
                var resolver  = GetNamespaceResolver(navigator.NameTable, !nsMap.IsNull ? nsMap.Value : null);
                var value     = navigator.Evaluate(XPathExpression.Compile(path.Value, resolver));
                if (value == null)
                {
                    return(SqlBoolean.Null);
                }
                var iterator = value as XPathNodeIterator;
                if (iterator == null)
                {
                    return(new SqlBoolean((Boolean)Convert.ChangeType(value, typeof(Boolean))));
                }
                var result = ((XPathNodeIterator)value).Cast <XPathNavigator>().FirstOrDefault();
                return(result == null ? SqlBoolean.Null : new SqlBoolean((Boolean)result.ValueAs(typeof(Boolean), resolver)));
            }
        }
Exemplo n.º 2
0
        public void RspecExample(string user, string pass) // https://jira.sonarsource.com/browse/RSPEC-4876
        {
            var xpathNavigator = new XPathDocument("http://uri").CreateNavigator();

            var expression = "/users/user[@name='" + user + "' and @pass='******']";

            xpathNavigator.Evaluate(expression);             // Noncompliant {{Make sure that executing this XPATH expression is safe.}}
//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        }
 public static double Evaluate(string expression)
 {
     using (var stringReader = new StringReader("<dummy/>"))
     {
         var navigator = new XPathDocument(stringReader).CreateNavigator();
         expression = Regex.Replace(expression, @"([\+\-\*])", " ${1} ");     // add some space
         expression = expression.Replace("/", " div ").Replace("%", " mod ");
         return((double)navigator.Evaluate(string.Format("number({0})", expression)));
     }
 }
Exemplo n.º 4
0
        public static SqlXml Evaluate([SqlFacet(MaxSize = -1)] SqlXml input, [SqlFacet(MaxSize = -1)] SqlString path, SqlString nsMap)
        {
            if (input.IsNull || path.IsNull)
            {
                return(SqlXml.Null);
            }

            using (var reader = input.CreateReader())
            {
                var navigator = new XPathDocument(reader).CreateNavigator();
                var resolver  = GetNamespaceResolver(navigator.NameTable, !nsMap.IsNull ? nsMap.Value : null);
                var iterator  = navigator.Evaluate(XPathExpression.Compile(path.Value, resolver)) as XPathNodeIterator;
                if (iterator == null)
                {
                    return(SqlXml.Null);
                }
                var result = iterator.Cast <XPathNavigator>().SingleOrDefault();
                return(result != null ? new SqlXml(result.ReadSubtree()) : SqlXml.Null);
            }
        }
Exemplo n.º 5
0
        public static IEnumerable SelectAsDateTime([SqlFacet(MaxSize = -1)] SqlXml input, [SqlFacet(MaxSize = -1)] SqlString path, SqlString nsMap)
        {
            if (input.IsNull || path.IsNull)
            {
                yield break;
            }

            using (var reader = input.CreateReader())
            {
                var navigator = new XPathDocument(reader).CreateNavigator();
                var resolver  = GetNamespaceResolver(navigator.NameTable, !nsMap.IsNull ? nsMap.Value : null);
                var iterator  = navigator.Evaluate(XPathExpression.Compile(path.Value, resolver)) as XPathNodeIterator;
                if (iterator != null)
                {
                    foreach (var item in iterator.Cast <XPathNavigator>())
                    {
                        yield return(item == null ? (DateTime?)null : (DateTime)item.ValueAs(typeof(DateTime), item));
                    }
                }
            }
        }
Exemplo n.º 6
0
        // Methods
        public static int Main(string[] args)
        {
            XPathDocument document;

            ConsoleApplication.WriteBanner();

            OptionCollection options = new OptionCollection {
                new SwitchOption("?", "Show this help page."),
                new StringOption("config", "Specify a configuration file.", "versionCatalog"),
                new StringOption("out", "Specify an output file containing version information.", "outputFile"),
                new BooleanOption("rip", "Specify whether to rip old APIs which are not supported by the " +
                                  "latest versions.")
            };

            ParseArgumentsResult result = options.ParseArguments(args);

            if (result.Options["?"].IsPresent)
            {
                Console.WriteLine("VersionBuilder [options]");
                options.WriteOptionSummary(Console.Out);
                return(0);
            }

            if (!result.Success)
            {
                result.WriteParseErrors(Console.Out);
                return(1);
            }

            if (result.UnusedArguments.Count != 0)
            {
                Console.WriteLine("No non-option arguments are supported.");
                return(1);
            }

            if (!result.Options["config"].IsPresent)
            {
                ConsoleApplication.WriteMessage(LogLevel.Error, "You must specify a version catalog file.");
                return(1);
            }

            bool rip = true;

            if (result.Options["rip"].IsPresent && !((bool)result.Options["rip"].Value))
            {
                rip = false;
            }

            string uri = (string)result.Options["config"].Value;

            try
            {
                document = new XPathDocument(uri);
            }
            catch (IOException ioEx)
            {
                ConsoleApplication.WriteMessage(LogLevel.Error, String.Format(CultureInfo.CurrentCulture,
                                                                              "An error occurred while accessing the version catalog file '{0}'. The error message " +
                                                                              "is: {1}", uri, ioEx.Message));
                return(1);
            }
            catch (XmlException xmlEx)
            {
                ConsoleApplication.WriteMessage(LogLevel.Error, String.Format(CultureInfo.CurrentCulture,
                                                                              "The version catalog file '{0}' is not well-formed. The error message is: {1}", uri,
                                                                              xmlEx.Message));
                return(1);
            }

            XPathNavigator     navigator      = document.CreateNavigator().SelectSingleNode("versions");
            XPathExpression    expr           = XPathExpression.Compile("string(ancestor::versions/@name)");
            List <VersionInfo> allVersions    = new List <VersionInfo>();
            List <string>      latestVersions = new List <string>();

            foreach (XPathNavigator navigator2 in document.CreateNavigator().Select("versions//version[@file]"))
            {
                string group     = (string)navigator2.Evaluate(expr);
                string attribute = navigator2.GetAttribute("name", String.Empty);

                if (string.IsNullOrEmpty(attribute))
                {
                    ConsoleApplication.WriteMessage(LogLevel.Error, "Every version element must have a name attribute.");
                }

                string name = navigator2.GetAttribute("file", String.Empty);

                if (String.IsNullOrEmpty(attribute))
                {
                    ConsoleApplication.WriteMessage(LogLevel.Error, "Every version element must have a file attribute.");
                }

                name = Environment.ExpandEnvironmentVariables(name);
                VersionInfo item = new VersionInfo(attribute, group, name);
                allVersions.Add(item);
            }

            string str5 = String.Empty;

            foreach (VersionInfo info2 in allVersions)
            {
                if (info2.Group != str5)
                {
                    latestVersions.Add(info2.Name);
                    str5 = info2.Group;
                }
            }

            if (Cancel)
            {
                ConsoleApplication.WriteMessage(LogLevel.Info, "VersionBuilder canceled");
                return(1);
            }

            XmlReaderSettings settings = new XmlReaderSettings
            {
                IgnoreWhitespace = true
            };

            XmlWriterSettings settings2 = new XmlWriterSettings
            {
                Indent = true
            };

            Dictionary <string, List <KeyValuePair <string, string> > > versionIndex = new Dictionary <string, List <KeyValuePair <string, string> > >();
            Dictionary <string, Dictionary <string, ElementInfo> >      dictionary2  = new Dictionary <string, Dictionary <string, ElementInfo> >();
            XPathExpression expression2 = XPathExpression.Compile("string(/api/@id)");
            XPathExpression expression4 = XPathExpression.Compile("/api/elements/element");
            XPathExpression expression  = XPathExpression.Compile("/api/attributes/attribute[type[@api='T:System.ObsoleteAttribute']]");
            XPathExpression extensionAttributeExpression      = XPathExpression.Compile("/api/attributes/attribute[type[@api='T:System.Runtime.CompilerServices.ExtensionAttribute']]");
            XPathExpression extensionFirstParameterExpression = XPathExpression.Compile("/api/parameters/parameter[1]/*");
            XPathExpression specialization = XPathExpression.Compile("./specialization");
            XPathExpression templates      = XPathExpression.Compile("./template[boolean(@index) and starts-with(@api, 'M:')]");
            XPathExpression skipFirstParam = XPathExpression.Compile("./parameter[position()>1]");
            XPathExpression expression6    = XPathExpression.Compile("boolean(argument[type[@api='T:System.Boolean'] and value[.='True']])");
            XPathExpression apiChild       = XPathExpression.Compile("./api");

            foreach (VersionInfo info3 in allVersions)
            {
                if (Cancel)
                {
                    ConsoleApplication.WriteMessage(LogLevel.Info, "VersionBuilder canceled");
                    return(1);
                }

                ConsoleApplication.WriteMessage(LogLevel.Info, String.Format(CultureInfo.CurrentCulture,
                                                                             "Indexing version '{0}' using file '{1}'.", info3.Name, info3.File));
                try
                {
                    XmlReader reader = XmlReader.Create(info3.File, settings);
                    try
                    {
                        reader.MoveToContent();
                        while (reader.Read())
                        {
                            if ((reader.NodeType == XmlNodeType.Element) && (reader.LocalName == "api"))
                            {
                                string key = String.Empty;
                                List <KeyValuePair <string, string> > list3 = null;
                                string str7 = String.Empty;
                                Dictionary <string, ElementInfo> dictionary3 = null;
                                XmlReader      reader2    = reader.ReadSubtree();
                                XPathNavigator navigator3 = new XPathDocument(reader2).CreateNavigator();

                                key = (string)navigator3.Evaluate(expression2);

                                if (!versionIndex.TryGetValue(key, out list3))
                                {
                                    list3 = new List <KeyValuePair <string, string> >();
                                    versionIndex.Add(key, list3);
                                }

                                if (!dictionary2.TryGetValue(key, out dictionary3))
                                {
                                    dictionary3 = new Dictionary <string, ElementInfo>();
                                    dictionary2.Add(key, dictionary3);
                                }

                                foreach (XPathNavigator navigator4 in navigator3.Select(expression4))
                                {
                                    ElementInfo info4;
                                    string      str8 = navigator4.GetAttribute("api", String.Empty);
                                    if (!dictionary3.TryGetValue(str8, out info4))
                                    {
                                        XPathNavigator elementNode = null;
                                        if ((navigator4.SelectSingleNode("*") != null) || (navigator4.SelectChildren(XPathNodeType.Attribute).Count > 1))
                                        {
                                            elementNode = navigator4;
                                        }
                                        info4 = new ElementInfo(info3.Group, info3.Name, elementNode);
                                        dictionary3.Add(str8, info4);
                                        continue;
                                    }
                                    if (!info4.Versions.ContainsKey(info3.Group))
                                    {
                                        info4.Versions.Add(info3.Group, info3.Name);
                                    }
                                }
                                XPathNavigator navigator6 = navigator3.SelectSingleNode(expression);
                                if (navigator6 != null)
                                {
                                    str7 = ((bool)navigator6.Evaluate(expression6)) ? "error" : "warning";
                                }

                                if (key.StartsWith("M:", StringComparison.Ordinal))
                                {
                                    // Only check for extension methods when this is actually a method in question
                                    var navigator7 = navigator3.SelectSingleNode(extensionAttributeExpression);
                                    if (navigator7 != null)
                                    {
                                        // Check first parameter
                                        var navigator8 = navigator3.SelectSingleNode(extensionFirstParameterExpression);
                                        if (navigator8 != null)
                                        {
                                            // Get type node
                                            var typeID = navigator8.GetAttribute("api", String.Empty);
                                            if (navigator8.LocalName == "type")
                                            {
                                                var specNode = navigator8.SelectSingleNode(specialization);
                                                if (specNode == null || specNode.SelectChildren(XPathNodeType.Element).Count == specNode.Select(templates).Count)
                                                {
                                                    // Either non-generic type or all type parameters are from within this method
                                                    Dictionary <String, XPathNavigator> extMethods;
                                                    if (!extensionMethods.TryGetValue(typeID, out extMethods))
                                                    {
                                                        extMethods = new Dictionary <String, XPathNavigator>();
                                                        extensionMethods.Add(typeID, extMethods);
                                                    }
                                                    if (!extMethods.ContainsKey(key))
                                                    {
                                                        extMethods.Add(key, navigator3.SelectSingleNode(apiChild));
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                // TODO extension methods for generic parameters...
                                            }
                                        }
                                    }
                                }

                                list3.Add(new KeyValuePair <string, string>(info3.Name, str7));
                                str7 = String.Empty;
                                reader2.Close();
                            }
                        }
                    }
                    finally
                    {
                        reader.Close();
                    }
                    continue;
                }
                catch (IOException ioEx)
                {
                    ConsoleApplication.WriteMessage(LogLevel.Error, String.Format(CultureInfo.CurrentCulture,
                                                                                  "An error occurred while accessing the input file '{0}'. The error message is: {1}",
                                                                                  info3.File, ioEx.Message));
                    return(1);
                }
                catch (XmlException xmlEx)
                {
                    ConsoleApplication.WriteMessage(LogLevel.Error, String.Format(CultureInfo.CurrentCulture,
                                                                                  "The input file '{0}' is not well-formed. The error message is: {1}", info3.File,
                                                                                  xmlEx.Message));
                    return(1);
                }
            }

            if (rip)
            {
                RemoveOldApis(versionIndex, latestVersions);
            }

            ConsoleApplication.WriteMessage(LogLevel.Info, String.Format(CultureInfo.CurrentCulture,
                                                                         "Indexed {0} entities in {1} versions.", versionIndex.Count, allVersions.Count));

            try
            {
                XmlWriter writer;

                if (result.Options["out"].IsPresent)
                {
                    writer = XmlWriter.Create((string)result.Options["out"].Value, settings2);
                }
                else
                {
                    writer = XmlWriter.Create(Console.Out, settings2);
                }

                try
                {
                    writer.WriteStartDocument();
                    writer.WriteStartElement("reflection");
                    writer.WriteStartElement("assemblies");
                    Dictionary <string, object> dictionary4 = new Dictionary <string, object>();

                    foreach (VersionInfo info5 in allVersions)
                    {
                        if (Cancel)
                        {
                            ConsoleApplication.WriteMessage(LogLevel.Info, "VersionBuilder canceled");
                            return(1);
                        }

                        using (XmlReader reader3 = XmlReader.Create(info5.File, settings))
                        {
                            reader3.MoveToContent();

                            while (reader3.Read())
                            {
                                if ((reader3.NodeType == XmlNodeType.Element) && (reader3.LocalName == "assembly"))
                                {
                                    string str9 = reader3.GetAttribute("name");
                                    if (!dictionary4.ContainsKey(str9))
                                    {
                                        XmlReader reader4 = reader3.ReadSubtree();
                                        writer.WriteNode(reader4, false);
                                        reader4.Close();
                                        dictionary4.Add(str9, null);
                                    }
                                }
                            }
                        }
                    }

                    writer.WriteEndElement();
                    writer.WriteStartElement("apis");
                    var readElements = new HashSet <String>();

                    foreach (VersionInfo info6 in allVersions)
                    {
                        if (Cancel)
                        {
                            ConsoleApplication.WriteMessage(LogLevel.Info, "VersionBuilder canceled");
                            return(1);
                        }

                        XmlReader reader5 = XmlReader.Create(info6.File, settings);
                        reader5.MoveToContent();

                        while (reader5.Read())
                        {
                            if ((reader5.NodeType == XmlNodeType.Element) && (reader5.LocalName == "api"))
                            {
                                string str10 = reader5.GetAttribute("id");
                                if (versionIndex.ContainsKey(str10))
                                {
                                    List <KeyValuePair <string, string> > versions = versionIndex[str10];
                                    KeyValuePair <string, string>         pair     = versions[0];
                                    if (info6.Name == pair.Key)
                                    {
                                        writer.WriteStartElement("api");
                                        writer.WriteAttributeString("id", str10);
                                        XmlReader reader6 = reader5.ReadSubtree();
                                        reader6.MoveToContent();
                                        reader6.ReadStartElement();
                                        Dictionary <String, XPathNavigator> eElems;
                                        var hasExtensionMethods = extensionMethods.TryGetValue(str10, out eElems);
                                        if (hasExtensionMethods)
                                        {
                                            readElements.Clear();
                                            readElements.UnionWith(extensionMethods[str10].Keys);
                                        }
                                        while (!reader6.EOF)
                                        {
                                            if ((reader6.NodeType == XmlNodeType.Element) && (reader6.LocalName == "elements"))
                                            {
                                                Dictionary <string, ElementInfo> dictionary5 = dictionary2[str10];
                                                Dictionary <string, object>      dictionary6 = new Dictionary <string, object>();
                                                writer.WriteStartElement("elements");
                                                XmlReader reader7 = reader6.ReadSubtree();
                                                foreach (XPathNavigator navigator8 in new XPathDocument(reader7).CreateNavigator().Select("elements/element"))
                                                {
                                                    string str11 = navigator8.GetAttribute("api", String.Empty);
                                                    dictionary6[str11] = null;
                                                    writer.WriteStartElement("element");
                                                    writer.WriteAttributeString("api", str11);
                                                    if (hasExtensionMethods)
                                                    {
                                                        readElements.Remove(str11);
                                                    }
                                                    foreach (string str12 in dictionary5[str11].Versions.Keys)
                                                    {
                                                        writer.WriteAttributeString(str12, dictionary5[str11].Versions[str12]);
                                                    }
                                                    foreach (XPathNavigator navigator9 in navigator8.Select("@*"))
                                                    {
                                                        if (navigator9.LocalName != "api")
                                                        {
                                                            writer.WriteAttributeString(navigator9.LocalName, navigator9.Value);
                                                        }
                                                    }
                                                    foreach (XPathNavigator navigator10 in navigator8.Select("*"))
                                                    {
                                                        writer.WriteNode(navigator10, false);
                                                    }
                                                    writer.WriteEndElement();
                                                }
                                                reader7.Close();
                                                if (dictionary6.Count != dictionary5.Count)
                                                {
                                                    foreach (string str13 in dictionary5.Keys)
                                                    {
                                                        if (dictionary6.ContainsKey(str13) || (rip && !IsLatestElement(dictionary5[str13].Versions.Values, latestVersions)))
                                                        {
                                                            continue;
                                                        }
                                                        writer.WriteStartElement("element");
                                                        writer.WriteAttributeString("api", str13);
                                                        if (hasExtensionMethods)
                                                        {
                                                            readElements.Remove(str13);
                                                        }
                                                        foreach (string str14 in dictionary5[str13].Versions.Keys)
                                                        {
                                                            writer.WriteAttributeString(str14, dictionary5[str13].Versions[str14]);
                                                        }
                                                        if (dictionary5[str13].ElementNode != null)
                                                        {
                                                            foreach (XPathNavigator navigator11 in dictionary5[str13].ElementNode.Select("@*"))
                                                            {
                                                                if (navigator11.LocalName != "api")
                                                                {
                                                                    writer.WriteAttributeString(navigator11.LocalName, navigator11.Value);
                                                                }
                                                            }
                                                            foreach (XPathNavigator navigator12 in dictionary5[str13].ElementNode.Select("*"))
                                                            {
                                                                writer.WriteNode(navigator12, false);
                                                            }
                                                        }
                                                        writer.WriteEndElement();
                                                    }
                                                }

                                                if (hasExtensionMethods)
                                                {
                                                    foreach (var eMethodID in readElements)
                                                    {
                                                        writer.WriteStartElement("element");
                                                        writer.WriteAttributeString("api", eMethodID);
                                                        writer.WriteAttributeString("source", "extension");
                                                        foreach (XPathNavigator extMember in eElems[eMethodID].SelectChildren(XPathNodeType.Element))
                                                        {
                                                            switch (extMember.LocalName)
                                                            {
                                                            case "apidata":
                                                                writer.WriteStartElement("apidata");
                                                                foreach (XPathNavigator apidataAttr in extMember.Select("@*"))
                                                                {
                                                                    writer.WriteAttributeString(apidataAttr.LocalName, apidataAttr.Value);
                                                                }
                                                                writer.WriteAttributeString("subsubgroup", "extension");
                                                                foreach (XPathNavigator child in extMember.SelectChildren(XPathNodeType.All & ~XPathNodeType.Attribute))
                                                                {
                                                                    writer.WriteNode(child, false);
                                                                }
                                                                writer.WriteEndElement();
                                                                break;

                                                            case "parameters":
                                                                var noParamsWritten = true;
                                                                foreach (XPathNavigator eParam in extMember.Select(skipFirstParam))
                                                                {
                                                                    if (noParamsWritten)
                                                                    {
                                                                        writer.WriteStartElement("parameters");
                                                                        noParamsWritten = false;
                                                                    }
                                                                    writer.WriteNode(eParam, false);
                                                                }
                                                                if (!noParamsWritten)
                                                                {
                                                                    writer.WriteEndElement();
                                                                }
                                                                break;

                                                            case "memberdata":
                                                                writer.WriteStartElement("memberdata");
                                                                foreach (XPathNavigator mDataAttr in extMember.Select("@*"))
                                                                {
                                                                    if (mDataAttr.LocalName != "static")
                                                                    {
                                                                        writer.WriteAttributeString(mDataAttr.LocalName, mDataAttr.Value);
                                                                    }
                                                                }
                                                                foreach (XPathNavigator child in extMember.SelectChildren(XPathNodeType.All & ~XPathNodeType.Attribute))
                                                                {
                                                                    writer.WriteNode(child, false);
                                                                }
                                                                writer.WriteEndElement();
                                                                break;

                                                            case "attributes":
                                                                break;

                                                            default:
                                                                writer.WriteNode(extMember, false);
                                                                break;
                                                            }
                                                        }
                                                        writer.WriteEndElement();
                                                    }
                                                }

                                                writer.WriteEndElement();
                                                reader6.Read();
                                            }
                                            else if (reader6.NodeType == XmlNodeType.Element)
                                            {
                                                writer.WriteNode(reader6, false);
                                            }
                                            else
                                            {
                                                reader6.Read();
                                            }
                                        }
                                        reader6.Close();
                                        writer.WriteStartElement("versions");
                                        foreach (XPathNavigator navigator13 in navigator.SelectChildren(XPathNodeType.Element))
                                        {
                                            WriteVersionTree(versions, navigator13, writer);
                                        }
                                        writer.WriteEndElement();
                                        writer.WriteEndElement();
                                    }
                                }
                            }
                        }

                        reader5.Close();
                    }

                    writer.WriteEndElement();
                    writer.WriteEndElement();
                    writer.WriteEndDocument();
                }
                finally
                {
                    writer.Close();
                }
            }
            catch (IOException ioEx)
            {
                ConsoleApplication.WriteMessage(LogLevel.Error, "An error occurred while generating the " +
                                                "output file. The error message is: {0}", ioEx.Message);
                return(1);
            }

            return(0);
        }