Example #1
0
    public static void Main(string[] args)
    {
        string uri = "http://www.mozilla.org/news.rdf";

        if (args.Length > 0)
        {
            uri = args[0];
        }

        MemoryStore store = new MemoryStore();

        // Here's one way...

        store.Import(RdfReader.LoadFromUri(new Uri(uri)));

        using (RdfWriter writer = new N3Writer(Console.Out))
            store.Select(writer);

        // Or....

        RdfReader file = RdfReader.LoadFromUri(new Uri(uri));

        file.Select(new StatementPrinter());
    }
Example #2
0
        public override void Select(StatementSink storage)
        {
            foreach (string infile in files)
            {
                if (!quiet)
                {
                    Console.Error.Write(infile + " ");
                }

                try {
                    DateTime start = DateTime.Now;

                    StatementFilterSink filter = new StatementFilterSink(storage);

                    if (format == null || format != "spec")
                    {
                        string fmt = format;
                        if (fmt == null)
                        {
                            // Use file extension to override default parser type.
                            if (infile.StartsWith("http:"))
                            {
                                fmt = "url";
                            }
                            else if (infile.EndsWith(".nt") || infile.EndsWith(".n3") || infile.EndsWith(".ttl"))
                            {
                                fmt = "n3";
                            }
                            else if (infile.EndsWith(".xml") || infile.EndsWith(".rdf"))
                            {
                                fmt = "xml";
                            }
                            else
                            {
                                Console.Error.WriteLine("Unrecognized file extension in " + infile + ": Trying RDF/XML.");
                                fmt = "xml";
                            }
                        }

                        using (RdfReader parser = RdfReader.Create(fmt, infile)) {
                            if (baseuri != null)
                            {
                                parser.BaseUri = baseuri;
                            }
                            if (meta != null)
                            {
                                parser.Meta = meta;
                            }

                            if (storage is RdfWriter)
                            {
                                ((RdfWriter)storage).Namespaces.AddFrom(parser.Namespaces);
                            }

                            try {
                                parser.Select(filter);
                            } finally {
                                if (parser.Warnings.Count > 0)
                                {
                                    Console.Error.WriteLine("\nThere were warnings parsing this file:");
                                }
                                foreach (string warning in parser.Warnings)
                                {
                                    Console.Error.WriteLine("> " + warning);
                                }
                            }
                        }
                    }
                    else
                    {
                        StatementSource src = Store.Create(infile);
                        src.Select(filter);
                        if (src is IDisposable)
                        {
                            ((IDisposable)src).Dispose();
                        }
                    }

                    totalStatementsRead += filter.StatementCount;

                    TimeSpan time = DateTime.Now - start;

                    if (!quiet)
                    {
                        Console.Error.WriteLine(" {0}m{1}s, {2} statements, {3} st/sec", (int)time.TotalMinutes, (int)time.Seconds, filter.StatementCount, time.TotalSeconds == 0 ? "?" : ((int)(filter.StatementCount / time.TotalSeconds)).ToString());
                    }
                } catch (ParserException e) {
                    Console.Error.WriteLine(" " + e.Message);
                } catch (Exception e) {
                    Console.Error.WriteLine("\n" + e + "\n");
                }
            }
        }
Example #3
0
        private static void ProcessResponse(string mimetype, Stream stream, object outputObj)
        {
            // If the user wants the output sent to a TextWriter, copy the response from
            // the response stream to the TextWriter. TODO: Get encoding from HTTP header.
            if (outputObj is TextWriter)
            {
                TextWriter tw = (TextWriter)outputObj;
                using (StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8)) {
                    char[] buffer = new char[512];
                    while (true)
                    {
                        int len = reader.Read(buffer, 0, buffer.Length);
                        if (len <= 0)
                        {
                            break;
                        }
                        tw.Write(buffer, 0, len);

                        if (Debug)
                        {
                            Console.Error.WriteLine(">> " + new String(buffer, 0, len));
                        }
                    }
                }
                tw.Flush();
                return;
            }

            // If the user wants a boolean out of this, then we're expecting a
            // SPARQL XML Results document with a boolean response element.
            if (outputObj is BooleanWrap)
            {
                BooleanWrap bw = (BooleanWrap)outputObj;

                if (mimetype != null && mimetype != "application/sparql-results+xml" && mimetype != "text/xml" && mimetype != "application/xml")
                {
                    throw new ApplicationException("The result of the query was not a SPARQL Results document.");
                }

                XmlReader xmldoc = new XmlTextReader(stream);
                {
                    // Move to the document element
                    while (xmldoc.Read())
                    {
                        if (xmldoc.NodeType == XmlNodeType.Element)
                        {
                            break;
                        }
                    }

                    // Just check that it has the right local name.
                    if (xmldoc.LocalName != "sparql" || xmldoc.IsEmptyElement)
                    {
                        throw new ApplicationException("Invalid server response: Not a SPARQL results document.");
                    }

                    // Move to the next node.
                    while (xmldoc.Read())
                    {
                        if (xmldoc.NodeType == XmlNodeType.Element)
                        {
                            break;
                        }
                    }

                    // If it's a head node, skip it.
                    if (xmldoc.LocalName == "head")
                    {
                        xmldoc.Skip();
                        // Move to the 'boolean' element, it better be next
                        while (xmldoc.Read())
                        {
                            if (xmldoc.NodeType == XmlNodeType.Element)
                            {
                                break;
                            }
                        }
                    }

                    if (xmldoc.LocalName != "boolean")
                    {
                        throw new ApplicationException("Invalid server response: Missing 'boolean' element.");
                    }

                    string value = xmldoc.ReadElementString();
                    bw.value = (value == "true");
                }

                if (Debug)
                {
                    Console.Error.WriteLine(">> " + bw.value);
                }

                return;
            }

            // If the user wants statements out of the response, read it with an RDFReader.
            if (outputObj is StatementSink)
            {
                // If the mime type is application/sparql-results+xml, just try to
                // read it as if it were an RDF/XML MIME type.
                if (mimetype != null && mimetype == "application/sparql-results+xml")
                {
                    mimetype = "text/xml";
                }
                using (RdfReader reader = RdfReader.Create(mimetype, stream))
                    reader.Select((StatementSink)outputObj);
                if (Debug)
                {
                    Console.Error.WriteLine(">> (read as statements)");
                }
                return;
            }

            // If the user wants query result bindings, read the response XML.
            if (outputObj is QueryResultSink)
            {
                QueryResultSink sink = (QueryResultSink)outputObj;

                if (mimetype != null && mimetype != "application/sparql-results+xml" && mimetype != "text/xml")
                {
                    throw new ApplicationException("The result of the query was not a SPARQL Results document.");
                }

                ArrayList  variableNames  = new ArrayList();
                ArrayList  variables      = new ArrayList();
                Variable[] variablesArray = null;
                Hashtable  bnodes         = new Hashtable();

                XmlReader xmldoc = new XmlTextReader(stream);
                {
                    // Move to the document element
                    while (xmldoc.Read())
                    {
                        if (xmldoc.NodeType == XmlNodeType.Element)
                        {
                            break;
                        }
                    }

                    // Just check that it has the right local name.
                    if (xmldoc.LocalName != "sparql" || xmldoc.IsEmptyElement)
                    {
                        throw new ApplicationException("Invalid server response: Not a SPARQL results document.");
                    }

                    // Move to the 'head' node, it better be the first element
                    while (xmldoc.Read())
                    {
                        if (xmldoc.NodeType == XmlNodeType.Element)
                        {
                            break;
                        }
                    }

                    if (xmldoc.LocalName != "head" || xmldoc.IsEmptyElement)
                    {
                        throw new ApplicationException("Invalid server response: Missing head full element.");
                    }

                    // Read the head element
                    while (xmldoc.Read())
                    {
                        if (xmldoc.NodeType == XmlNodeType.Element && xmldoc.LocalName == "variable")
                        {
                            if (xmldoc.GetAttribute("name") == null)
                            {
                                throw new ApplicationException("Invalid server response: Head/variable node missing name attribute.");
                            }
                            variableNames.Add(xmldoc.GetAttribute("name"));
                            variables.Add(new Variable(xmldoc.GetAttribute("name")));
                            if (!xmldoc.IsEmptyElement)
                            {
                                xmldoc.Skip();
                            }
                        }
                        else if (xmldoc.NodeType == XmlNodeType.EndElement)
                        {
                            break;
                        }
                    }

                    // Move to the 'results' element, it better be next
                    while (xmldoc.Read())
                    {
                        if (xmldoc.NodeType == XmlNodeType.Element)
                        {
                            break;
                        }
                    }

                    if (xmldoc.LocalName != "results")
                    {
                        throw new ApplicationException("Invalid server response: Missing results element.");
                    }

                    variablesArray = (Variable[])variables.ToArray(typeof(Variable));
                    sink.Init(variablesArray);

                    // Read the results

                    while (xmldoc.Read())
                    {
                        if (xmldoc.NodeType == XmlNodeType.Element && xmldoc.LocalName == "result")
                        {
                            // Read the bindings in this result
                            Resource[] valuesArray = new Resource[variablesArray.Length];
                            while (xmldoc.Read())
                            {
                                if (xmldoc.NodeType == XmlNodeType.Element && xmldoc.LocalName == "binding")
                                {
                                    if (xmldoc.IsEmptyElement)
                                    {
                                        throw new ApplicationException("Invalid server response: Binding element empty.");
                                    }
                                    if (xmldoc.GetAttribute("name") == null)
                                    {
                                        throw new ApplicationException("Invalid server response: Result binding node missing name attribute.");
                                    }
                                    int vIndex = variableNames.IndexOf(xmldoc.GetAttribute("name"));
                                    if (vIndex == -1)
                                    {
                                        throw new ApplicationException("Invalid server response: Result binding name does not match a variable in the head.");
                                    }

                                    Resource value = null;

                                    while (xmldoc.Read())
                                    {
                                        if (xmldoc.NodeType == XmlNodeType.Whitespace || xmldoc.NodeType == XmlNodeType.SignificantWhitespace)
                                        {
                                            continue;
                                        }
                                        if (xmldoc.NodeType == XmlNodeType.Element && xmldoc.LocalName == "uri")
                                        {
                                            value = new Entity(xmldoc.ReadElementString());
                                            if (!xmldoc.IsEmptyElement)
                                            {
                                                xmldoc.Skip();
                                            }
                                        }
                                        else if (xmldoc.NodeType == XmlNodeType.Element && xmldoc.LocalName == "literal")
                                        {
                                            string lang = xmldoc.XmlLang;
                                            if (lang == "")
                                            {
                                                lang = null;
                                            }
                                            string dt = xmldoc.GetAttribute("datatype");
                                            value = new Literal(xmldoc.ReadElementString(), lang, dt);
                                            if (!xmldoc.IsEmptyElement)
                                            {
                                                xmldoc.Skip();
                                            }
                                        }
                                        else if (xmldoc.NodeType == XmlNodeType.Element && xmldoc.LocalName == "bnode")
                                        {
                                            string id = xmldoc.ReadElementString();
                                            if (bnodes.ContainsKey(id))
                                            {
                                                value = (BNode)bnodes[id];
                                            }
                                            else
                                            {
                                                value      = new BNode(id);
                                                bnodes[id] = value;
                                            }
                                            if (!xmldoc.IsEmptyElement)
                                            {
                                                xmldoc.Skip();
                                            }
                                        }
                                        else
                                        {
                                            throw new ApplicationException("Invalid server response: Invalid content in binding node.");
                                        }
                                        break;
                                    }
                                    if (value == null)
                                    {
                                        throw new ApplicationException("Invalid server response: Result binding value is invalid.");
                                    }

                                    valuesArray[vIndex] = value;
                                }
                                else if (xmldoc.NodeType == XmlNodeType.EndElement)
                                {
                                    break;
                                }
                            }

                            sink.Add(new VariableBindings(variablesArray, valuesArray));
                            if (Debug)
                            {
                                Console.Error.WriteLine(">> " + new VariableBindings(variablesArray, valuesArray));
                            }
                        }
                        else if (xmldoc.NodeType == XmlNodeType.EndElement)
                        {
                            break;
                        }
                    }

                    sink.Finished();
                }
            }
        }