You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Benedikt Ritter <br...@apache.org> on 2015/02/16 08:34:10 UTC

Re: svn commit: r1659973 [1/3] - in /commons/sandbox/rdf/trunk: ./ api/src/main/java/org/apache/commons/rdf/ impl.sparql/ impl.sparql/src/ impl.sparql/src/main/ impl.sparql/src/main/java/ impl.sparql/src/main/java/org/ impl.sparql/src/main/java/org/apache/...

Hello Reto,

how does this relate to github Commons RDF? Is this part of the code base
proposed for incubation?

Regards,
Benedikt

2015-02-15 19:41 GMT+01:00 <re...@apache.org>:

> Author: reto
> Date: Sun Feb 15 18:41:15 2015
> New Revision: 1659973
>
> URL: http://svn.apache.org/r1659973
> Log:
> Started SPARQL Backed Implementation
>
> Added:
>     commons/sandbox/rdf/trunk/alerts.txt
>     commons/sandbox/rdf/trunk/impl.sparql/   (with props)
>     commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>     commons/sandbox/rdf/trunk/impl.sparql/src/
>     commons/sandbox/rdf/trunk/impl.sparql/src/main/
>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/
>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/
>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/
>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>     commons/sandbox/rdf/trunk/impl.sparql/src/main/resources/
>     commons/sandbox/rdf/trunk/impl.sparql/src/test/
>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/
>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/
>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/
>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/
>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/
>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/
>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>     commons/sandbox/rdf/trunk/impl.utils/   (with props)
>     commons/sandbox/rdf/trunk/impl.utils/pom.xml
>       - copied, changed from r1651181, commons/sandbox/rdf/trunk/pom.xml
>     commons/sandbox/rdf/trunk/impl.utils/src/
>     commons/sandbox/rdf/trunk/impl.utils/src/main/
>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/
>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/
>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/
>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphNotIsomorphicException.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GroupMappingIterator.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/HashMatching.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/MappingIterator.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/PermutationIterator.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/Utils.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashMap.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashSet.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntIterator.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntSet.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/package-info.java
>       - copied, changed from r1651181,
> commons/sandbox/rdf/trunk/src/main/java/org/apache/commons/rdf/package-info.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraph.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleMGraph.java
>     commons/sandbox/rdf/trunk/impl.utils/src/main/resources/
>     commons/sandbox/rdf/trunk/impl.utils/src/test/
>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/
>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/
>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/
>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/
>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/
>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/
>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/
>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/
>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/PlainLiteralImplTest.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraphTest.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TripleImplTest.java
>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
>     commons/sandbox/rdf/trunk/report.xml
> Modified:
>
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>     commons/sandbox/rdf/trunk/pom.xml
>
> Added: commons/sandbox/rdf/trunk/alerts.txt
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/alerts.txt?rev=1659973&view=auto
>
> ==============================================================================
>     (empty)
>
> Modified:
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java?rev=1659973&r1=1659972&r2=1659973&view=diff
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> (original)
> +++
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> Sun Feb 15 18:41:15 2015
> @@ -84,7 +84,8 @@ public interface Literal extends RdfTerm
>
>      /**
>       * Returns the hash code of the lexical form plus the hash code of the
> -     * language, plush the hash code of the datatype
> +     * datatype plus if the literal has a language the hash code of the
> +     * language.
>       *
>       * @return hash code
>       */
>
> Propchange: commons/sandbox/rdf/trunk/impl.sparql/
>
> ------------------------------------------------------------------------------
> --- svn:ignore (added)
> +++ svn:ignore Sun Feb 15 18:41:15 2015
> @@ -0,0 +1 @@
> +target
>
> Added: commons/sandbox/rdf/trunk/impl.sparql/pom.xml
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/pom.xml?rev=1659973&view=auto
>
> ==============================================================================
> --- commons/sandbox/rdf/trunk/impl.sparql/pom.xml (added)
> +++ commons/sandbox/rdf/trunk/impl.sparql/pom.xml Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,52 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
> http://maven.apache.org/POM/4.0.0
> http://maven.apache.org/xsd/maven-4.0.0.xsd">
> +    <parent>
> +        <groupId>org.apache.commons</groupId>
> +        <artifactId>commons-parent</artifactId>
> +        <version>37</version>
> +        <relativePath />
> +    </parent>
> +    <modelVersion>4.0.0</modelVersion>
> +    <groupId>commons-rdf</groupId>
> +    <artifactId>commons-rdf-impl-sparql</artifactId>
> +    <version>1.0.0-SNAPSHOT</version>
> +    <packaging>jar</packaging>
> +    <name>Apache Commons RDF SPARQL backed implementation.</name>
> +    <description>An implementation of the rdf commons API backed by a
> sparql
> +        endpoint. STATUS: Incomplete, currecnt code only supports reading
> +        graphs and does not yet support BlankNodes.</description>
> +    <properties>
> +        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
> +        <maven.compiler.source>1.7</maven.compiler.source>
> +        <maven.compiler.target>1.7</maven.compiler.target>
> +    </properties>
> +    <dependencies>
> +        <dependency>
> +            <groupId>org.apache.httpcomponents</groupId>
> +            <artifactId>httpclient</artifactId>
> +            <version>4.4</version>
> +        </dependency>
> +        <dependency>
> +            <groupId>commons-rdf</groupId>
> +            <artifactId>commons-rdf-api</artifactId>
> +            <version>0.1-SNAPSHOT</version>
> +        </dependency>
> +        <dependency>
> +            <groupId>commons-rdf</groupId>
> +            <artifactId>commons-rdf-impl-utils</artifactId>
> +            <version>0.1-SNAPSHOT</version>
> +        </dependency>
> +        <dependency>
> +            <groupId>junit</groupId>
> +            <artifactId>junit</artifactId>
> +            <version>4.12</version>
> +            <scope>test</scope>
> +        </dependency>
> +        <dependency>
> +            <groupId>org.apache.jena</groupId>
> +            <artifactId>jena-fuseki</artifactId>
> +            <version>1.1.1</version>
> +            <scope>test</scope>
> +        </dependency>
> +    </dependencies>
> +</project>
> \ No newline at end of file
>
> Added:
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,220 @@
> +/*
> + * To change this license header, choose License Headers in Project
> Properties.
> + * To change this template file, choose Tools | Templates
> + * and open the template in the editor.
> + */
> +package org.apache.commons.rdf.impl.sparql;
> +
> +import java.io.IOException;
> +import java.io.InputStream;
> +import java.io.UnsupportedEncodingException;
> +import java.util.ArrayList;
> +import java.util.Enumeration;
> +import java.util.HashMap;
> +import java.util.Hashtable;
> +import java.util.List;
> +import java.util.Map;
> +import java.util.logging.Level;
> +import java.util.logging.Logger;
> +import org.apache.http.HttpEntity;
> +import org.apache.http.NameValuePair;
> +import org.apache.http.client.entity.UrlEncodedFormEntity;
> +import org.apache.http.client.methods.CloseableHttpResponse;
> +import org.apache.http.client.methods.HttpPost;
> +import org.apache.http.impl.client.CloseableHttpClient;
> +import org.apache.http.impl.client.HttpClients;
> +import org.apache.http.message.BasicNameValuePair;
> +import org.apache.http.util.EntityUtils;
> +import javax.xml.parsers.*;
> +import org.apache.commons.rdf.BlankNode;
> +import org.apache.commons.rdf.BlankNodeOrIri;
> +import org.apache.commons.rdf.Iri;
> +import org.apache.commons.rdf.Language;
> +import org.apache.commons.rdf.Literal;
> +import org.apache.commons.rdf.RdfTerm;
> +import org.apache.commons.rdf.Triple;
> +import org.apache.commons.rdf.impl.utils.AbstractLiteral;
> +import org.xml.sax.*;
> +import org.xml.sax.helpers.*;
> +
> +/**
> + *
> + * @author developer
> + */
> +public class SparqlClient {
> +
> +    final String endpoint;
> +
> +    public SparqlClient(final String endpoint) {
> +        this.endpoint = endpoint;
> +    }
> +
> +    List<Map<String, RdfTerm>> queryResultSet(final String query) throws
> IOException {
> +        CloseableHttpClient httpclient = HttpClients.createDefault();
> +        HttpPost httpPost = new HttpPost(endpoint);
> +        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
> +        nvps.add(new BasicNameValuePair("query", query));
> +        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
> +        CloseableHttpResponse response2 = httpclient.execute(httpPost);
> +
> +        try {
> +            HttpEntity entity2 = response2.getEntity();
> +            InputStream in = entity2.getContent();
> +            SAXParserFactory spf = SAXParserFactory.newInstance();
> +            spf.setNamespaceAware(true);
> +            SAXParser saxParser = spf.newSAXParser();
> +            XMLReader xmlReader = saxParser.getXMLReader();
> +            final SparqlsResultsHandler sparqlsResultsHandler = new
> SparqlsResultsHandler();
> +            xmlReader.setContentHandler(sparqlsResultsHandler);
> +            xmlReader.parse(new InputSource(in));
> +            /*
> +             for (int ch = in.read(); ch != -1; ch = in.read()) {
> +             System.out.print((char)ch);
> +             }
> +             */
> +            // do something useful with the response body
> +            // and ensure it is fully consumed
> +            EntityUtils.consume(entity2);
> +            return sparqlsResultsHandler.getResults();
> +        } catch (ParserConfigurationException ex) {
> +            throw new RuntimeException(ex);
> +        } catch (SAXException ex) {
> +            throw new RuntimeException(ex);
> +        } finally {
> +            response2.close();
> +        }
> +
> +    }
> +
> +    final public static class SparqlsResultsHandler extends
> DefaultHandler {
> +
> +        private String currentBindingName;
> +        private Map<String, RdfTerm> currentResult = null;
> +        private final List<Map<String, RdfTerm>> results = new
> ArrayList<>();
> +        private boolean readingValue;
> +        private String value;
> +        private Map<String, BlankNode> bNodeMap = new HashMap<>();
> +        private static final Iri XSD_STRING = new Iri("
> http://www.w3.org/2001/XMLSchema#string");
> +
> +        private RdfTerm getBNode(String value) {
> +            if (!bNodeMap.containsKey(value)) {
> +                bNodeMap.put(value, new BlankNode());
> +            }
> +            return bNodeMap.get(value);
> +        }
> +
> +        private List<Map<String, RdfTerm>> getResults() {
> +            return results;
> +        }
> +
> +        enum BindingType {
> +
> +            uri, bnode, literal;
> +        }
> +
> +        @Override
> +        public void startDocument() throws SAXException {
> +
> +        }
> +
> +        @Override
> +        public void startElement(String namespaceURI,
> +                String localName,
> +                String qName,
> +                Attributes atts)
> +                throws SAXException {
> +            if ("http://www.w3.org/2005/sparql-results#".equals(namespaceURI))
> {
> +                if ("result".equals(localName)) {
> +                    if (currentResult != null) {
> +                        throw new SAXException("unexpected tag <result>");
> +                    }
> +                    currentResult = new HashMap<>();
> +                } else if ("binding".equals(localName)) {
> +                    if (currentResult == null) {
> +                        throw new SAXException("unexpected tag
> <binding>");
> +                    }
> +                    currentBindingName = atts.getValue("name");
> +                } else if ("uri".equals(localName) ||
> "bnode".equals(localName) || "literal".equals(localName)) {
> +                    if (readingValue) {
> +                        throw new SAXException("unexpected tag <" +
> localName + ">");
> +                    }
> +                    readingValue = true;
> +                }
> +            }
> +
> +            //System.out.println(namespaceURI);
> +            //System.out.println(qName);
> +        }
> +
> +        @Override
> +        public void characters(char[] chars, int start, int length)
> throws SAXException {
> +            if (readingValue) {
> +                value = new String(chars, start, length);
> +                //System.err.println(value + start + ", " + length);
> +            }
> +        }
> +
> +        @Override
> +        public void endElement(String namespaceURI,
> +                String localName,
> +                String qName)
> +                throws SAXException {
> +            if ("http://www.w3.org/2005/sparql-results#".equals(namespaceURI))
> {
> +                if ("result".equals(localName)) {
> +                    results.add(currentResult);
> +                    currentResult = null;
> +                } else if ("binding".equals(localName)) {
> +                    if (currentBindingName == null) {
> +                        throw new SAXException("unexpected tag
> </binding>");
> +                    }
> +                    currentBindingName = null;
> +                } else {
> +                    try {
> +                        BindingType b = BindingType.valueOf(localName);
> +                        RdfTerm rdfTerm = null;
> +                        switch (b) {
> +                            case uri:
> +                                rdfTerm = new Iri(value);
> +                                break;
> +                            case bnode:
> +                                rdfTerm = getBNode(value);
> +                                break;
> +                            case literal:
> +                                final String lf = value;
> +                                rdfTerm = new AbstractLiteral() {
> +
> +                                    @Override
> +                                    public String getLexicalForm() {
> +                                        return lf;
> +                                    }
> +
> +                                    @Override
> +                                    public Iri getDataType() {
> +                                        //TODO implement
> +                                        return XSD_STRING;
> +                                    }
> +
> +                                    @Override
> +                                    public Language getLanguage() {
> +                                        //TODO impl
> +                                        return null;
> +                                    }
> +                                };
> +                                break;
> +                        }
> +                        currentResult.put(currentBindingName, rdfTerm);
> +                        readingValue = false;
> +                    } catch (IllegalArgumentException e) {
> +                            //not uri|bnode|literal
> +                    }
> +                }
> +            }
> +        }
> +
> +        public void endDocument() throws SAXException {
> +            //System.out.println("results: " + results.size());
> +        }
> +
> +    }
> +
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,121 @@
> +/*
> + * To change this license header, choose License Headers in Project
> Properties.
> + * To change this template file, choose Tools | Templates
> + * and open the template in the editor.
> + */
> +package org.apache.commons.rdf.impl.sparql;
> +
> +import java.io.IOException;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Map;
> +import org.apache.commons.rdf.BlankNode;
> +import org.apache.commons.rdf.BlankNodeOrIri;
> +import org.apache.commons.rdf.Iri;
> +import org.apache.commons.rdf.Literal;
> +import org.apache.commons.rdf.RdfTerm;
> +import org.apache.commons.rdf.Triple;
> +import org.apache.commons.rdf.impl.utils.AbstractGraph;
> +import org.apache.commons.rdf.impl.utils.TripleImpl;
> +
> +/**
> + *
> + * @author reto
> + */
> +public class SparqlGraph extends AbstractGraph {
> +
> +    final SparqlClient sparqlClient;
> +
> +    /** Constructs a Graph representing the default graph at the specified
> +     * endpoint
> +     */
> +    public SparqlGraph(final String endpoint) {
> +        sparqlClient = new SparqlClient(endpoint);
> +    }
> +
> +    @Override
> +    protected Iterator<Triple> performFilter(final BlankNodeOrIri subject,
> +            final Iri predicate, final RdfTerm object) {
> +        try {
> +            final StringBuilder queryBuilder = new StringBuilder();
> +            queryBuilder.append("SELECT * WHERE { ");
> +            if (subject == null) {
> +                queryBuilder.append("?s");
> +            } else {
> +                queryBuilder.append(asSparqlTerm(subject));
> +            }
> +            queryBuilder.append(' ');
> +            if (predicate == null) {
> +                queryBuilder.append("?p");
> +            } else {
> +                queryBuilder.append(asSparqlTerm(predicate));
> +            }
> +            queryBuilder.append(' ');
> +            if (object == null) {
> +                queryBuilder.append("?o");
> +            } else {
> +                queryBuilder.append(asSparqlTerm(object));
> +            }
> +            queryBuilder.append(" }");
> +            List<Map<String, RdfTerm>> sparqlResults =
> sparqlClient.queryResultSet(queryBuilder.toString());
> +            final Iterator<Map<String, RdfTerm>> resultsIterator =
> sparqlResults.iterator();
> +            return new Iterator<Triple>() {
> +
> +                @Override
> +                public boolean hasNext() {
> +                    return resultsIterator.hasNext();
> +                }
> +
> +                @Override
> +                public Triple next() {
> +                    Map<String, RdfTerm> result = resultsIterator.next();
> +                    return new TripleImpl(subject != null ? subject :
> (BlankNodeOrIri)result.get("s"),
> +                            predicate != null ? predicate :
> (Iri)result.get("p"),
> +                            object != null ? object : result.get("o"));
> +                }
> +            };
> +        } catch (IOException ex) {
> +            throw new RuntimeException(ex);
> +        }
> +    }
> +
> +    @Override
> +    protected int performSize() {
> +        try {
> +            return sparqlClient.queryResultSet("SELECT * WHERE { ?s ?p
> ?o}").size();
> +        } catch (IOException ex) {
> +            throw new RuntimeException(ex);
> +        }
> +    }
> +
> +    private String asSparqlTerm(Iri iri) {
> +        return "<"+iri.getUnicodeString()+">";
> +    }
> +
> +    private String asSparqlTerm(Literal literal) {
> +        //TODO langauge and datatype
> +        return "\""+literal.getLexicalForm()+"\"";
> +    }
> +
> +    private String asSparqlTerm(BlankNode bnode) {
> +        //this requires adding additional clauses to the graph pattern
> +        throw new UnsupportedOperationException("Not supported yet.");
> +    }
> +
> +    private String asSparqlTerm(BlankNodeOrIri term) {
> +        if (term instanceof Iri) {
> +            return asSparqlTerm((Iri)term);
> +        } else {
> +            return asSparqlTerm((BlankNode)term);
> +        }
> +    }
> +
> +    private String asSparqlTerm(RdfTerm term) {
> +        if (term instanceof BlankNodeOrIri) {
> +            return asSparqlTerm((BlankNodeOrIri)term);
> +        } else {
> +            return asSparqlTerm((Literal)term);
> +        }
> +    }
> +
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,106 @@
> +/*
> + * To change this license header, choose License Headers in Project
> Properties.
> + * To change this template file, choose Tools | Templates
> + * and open the template in the editor.
> + */
> +package org.apache.commons.rdf.impl.sparql;
> +
> +import com.hp.hpl.jena.query.DatasetAccessor;
> +import com.hp.hpl.jena.query.DatasetAccessorFactory;
> +import java.io.File;
> +import java.io.IOException;
> +import java.net.ServerSocket;
> +import org.apache.jena.fuseki.EmbeddedFusekiServer;
> +import com.hp.hpl.jena.rdf.model.Model;
> +import com.hp.hpl.jena.rdf.model.ModelFactory;
> +import java.io.InputStream;
> +import java.util.HashSet;
> +import java.util.Iterator;
> +import java.util.Set;
> +import org.apache.commons.rdf.Graph;
> +import org.apache.commons.rdf.Iri;
> +import org.apache.commons.rdf.Literal;
> +import org.apache.commons.rdf.RdfTerm;
> +import org.apache.commons.rdf.Triple;
> +import org.apache.commons.rdf.impl.utils.PlainLiteralImpl;
> +import org.junit.AfterClass;
> +import org.junit.Assert;
> +import org.junit.BeforeClass;
> +import org.junit.Test;
> +
> +/**
> + *
> + * @author reto
> + */
> +public class SparqlGraphTest {
> +
> +    final static int serverPort = findFreePort();
> +    static EmbeddedFusekiServer server;
> +
> +    @BeforeClass
> +    public static void prepare() throws IOException {
> +        final String serviceURI = "http://localhost:" + serverPort +
> "/ds/data";
> +        final DatasetAccessorFactory factory = new
> DatasetAccessorFactory();
> +        final DatasetAccessor accessor = factory.createHTTP(serviceURI);
> +        final InputStream in =
> SparqlGraphTest.class.getResourceAsStream("grounded.ttl");
> +        final Model m = ModelFactory.createDefaultModel();
> +        String base = "http://example.org/";
> +        m.read(in, base, "TURTLE");
> +
> +        final File dataSet = File.createTempFile("dataset", "fuseki");
> +        dataSet.delete();
> +        server = EmbeddedFusekiServer.memTDB(serverPort,
> "/ds");//dataSet.getAbsolutePath());
> +        server.start();
> +        System.out.println("Started fuseki on port " + serverPort);
> +        accessor.putModel(m);
> +    }
> +
> +    @AfterClass
> +    public static void cleanup() {
> +        server.stop();
> +    }
> +
> +    @Test
> +    public void graphSize() {
> +        final Graph graph = new SparqlGraph("http://localhost:" +
> serverPort + "/ds/query");
> +        Assert.assertEquals("Graph not of the exepected size", 8,
> graph.size());
> +    }
> +
> +    @Test
> +    public void filter1() {
> +        final Graph graph = new SparqlGraph("http://localhost:" +
> serverPort + "/ds/query");
> +        final Iri spiderman = new Iri("http://example.org/#spiderman");
> +        final Iri greenGoblin = new Iri("http://example.org/#green-goblin
> ");
> +        final Iri enemyOf = new Iri("
> http://www.perceive.net/schemas/relationship/enemyOf");
> +        final Iri foafName = new Iri("http://xmlns.com/foaf/0.1/name");
> +        {
> +            final Iterator<Triple> iter = graph.filter(spiderman, null,
> greenGoblin);
> +            Assert.assertTrue(iter.hasNext());
> +            Assert.assertEquals(enemyOf, iter.next().getPredicate());
> +            Assert.assertFalse(iter.hasNext());
> +        }
> +        {
> +            final Iterator<Triple> iter = graph.filter(spiderman,
> foafName, null);
> +            Set<Literal> names = new HashSet<>();
> +            for (int i = 0; i < 2; i++) {
> +                Assert.assertTrue(iter.hasNext());
> +                RdfTerm name = iter.next().getObject();
> +                Assert.assertTrue(name instanceof Literal);
> +                names.add((Literal)name);
> +            }
> +            Assert.assertFalse(iter.hasNext());
> +            Assert.assertTrue(names.contains(new
> PlainLiteralImpl("Spiderman")));
> +        }
> +    }
> +
> +    public static int findFreePort() {
> +        int port = 0;
> +        try (ServerSocket server = new ServerSocket(0);) {
> +            port = server.getLocalPort();
> +        } catch (Exception e) {
> +            throw new RuntimeException("unable to find a free port");
> +        }
> +        return port;
> +    }
> +
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,16 @@
> +@base <http://example.org/> .
> +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
> +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
> +@prefix foaf: <http://xmlns.com/foaf/0.1/> .
> +@prefix rel: <http://www.perceive.net/schemas/relationship/> .
> +
> +<#green-goblin>
> +    rel:enemyOf <#spiderman> ;
> +    a foaf:Person ;    # in the context of the Marvel universe
> +    foaf:name "Green Goblin" ;
> +    foaf:age 128 .
> +
> +<#spiderman>
> +    rel:enemyOf <#green-goblin> ;
> +    a foaf:Person ;
> +    foaf:name "Spiderman", "Человек-паук"@ru .
> \ No newline at end of file
>
> Propchange: commons/sandbox/rdf/trunk/impl.utils/
>
> ------------------------------------------------------------------------------
> --- svn:ignore (added)
> +++ svn:ignore Sun Feb 15 18:41:15 2015
> @@ -0,0 +1 @@
> +target
>
> Copied: commons/sandbox/rdf/trunk/impl.utils/pom.xml (from r1651181,
> commons/sandbox/rdf/trunk/pom.xml)
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/pom.xml?p2=commons/sandbox/rdf/trunk/impl.utils/pom.xml&p1=commons/sandbox/rdf/trunk/pom.xml&r1=1651181&r2=1659973&rev=1659973&view=diff
>
> ==============================================================================
> --- commons/sandbox/rdf/trunk/pom.xml (original)
> +++ commons/sandbox/rdf/trunk/impl.utils/pom.xml Sun Feb 15 18:41:15 2015
> @@ -22,13 +22,14 @@
>      <parent>
>          <groupId>org.apache.commons</groupId>
>          <artifactId>commons-parent</artifactId>
> -        <version>35</version>
> +        <version>37</version>
> +        <relativePath />
>      </parent>
>      <modelVersion>4.0.0</modelVersion>
>      <groupId>commons-rdf</groupId>
> -    <artifactId>commons-rdf</artifactId>
> +    <artifactId>commons-rdf-impl-utils</artifactId>
>      <version>0.1-SNAPSHOT</version>
> -    <name>Apache Commons RDF</name>
> +    <name>Apache Commons RDF Implementation Utils</name>
>      <description>
>          Apache Commons RDF provides an API modelling the RDF data model
> as defined by
>          http://www.w3.org/TR/rdf11-concepts/
> @@ -50,11 +51,22 @@
>
>      <dependencies>
>          <dependency>
> +            <groupId>commons-rdf</groupId>
> +            <artifactId>commons-rdf-api</artifactId>
> +            <version>0.1-SNAPSHOT</version>
> +        </dependency>
> +        <dependency>
>              <groupId>junit</groupId>
>              <artifactId>junit</artifactId>
>              <version>4.12</version>
>              <scope>test</scope>
>          </dependency>
> +        <dependency>
> +            <groupId>org.slf4j</groupId>
> +            <artifactId>slf4j-api</artifactId>
> +            <version>1.7.7</version>
> +            <type>jar</type>
> +        </dependency>
>      </dependencies>
>
>      <distributionManagement>
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,316 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +package org.apache.commons.rdf.impl.utils;
> +
> +import java.lang.ref.WeakReference;
> +import java.util.AbstractCollection;
> +import java.util.Collection;
> +import java.util.Collections;
> +import java.util.HashSet;
> +import java.util.Iterator;
> +
> +import java.util.Set;
> +import java.util.concurrent.locks.Lock;
> +import java.util.concurrent.locks.ReadWriteLock;
> +import java.util.concurrent.locks.ReentrantReadWriteLock;
> +import org.apache.commons.rdf.BlankNodeOrIri;
> +import org.apache.commons.rdf.RdfTerm;
> +import org.apache.commons.rdf.Triple;
> +import org.apache.commons.rdf.Graph;
> +import org.apache.commons.rdf.ImmutableGraph;
> +import org.apache.commons.rdf.Iri;
> +import org.apache.commons.rdf.WatchableGraph;
> +import org.apache.commons.rdf.event.AddEvent;
> +import org.apache.commons.rdf.event.FilterTriple;
> +import org.apache.commons.rdf.event.GraphEvent;
> +import org.apache.commons.rdf.event.GraphListener;
> +import org.apache.commons.rdf.event.RemoveEvent;
> +import
> org.apache.commons.rdf.impl.utils.debug.ReentrantReadWriteLockTracker;
> +import org.apache.commons.rdf.impl.utils.simple.SimpleImmutableGraph;
> +
> +/**
> + * An abstract implementation of <code>Graph</code> implementing
> + * <code>iterator</code> and <code>contains</code> calling
> <code>filter</code>.
> + *
> + * @author reto
> + */
> +public abstract class AbstractGraph extends AbstractCollection<Triple>
> +        implements Graph {
> +
> +
> +    private static final String DEBUG_MODE = "rdfLocksDebugging";
> +    private final ReadWriteLock lock;
> +
> +    private final Lock readLock;
> +    private final Lock writeLock;
> +
> +    /**
> +     * Constructs a LocalbleMGraph for an Graph.
> +     *
> +     * @param providedMGraph a non-lockable graph
> +     */
> +    public AbstractGraph() {
> +        {
> +            String debugMode = System.getProperty(DEBUG_MODE);
> +            if (debugMode != null &&
> debugMode.toLowerCase().equals("true")) {
> +                lock = new ReentrantReadWriteLockTracker();
> +            } else {
> +                lock = new ReentrantReadWriteLock();
> +            }
> +        }
> +        readLock = lock.readLock();
> +        writeLock = lock.writeLock();
> +    }
> +
> +    public AbstractGraph(final ReadWriteLock lock) {
> +        this.lock = lock;
> +        readLock = lock.readLock();
> +        writeLock = lock.writeLock();
> +    }
> +
> +    @Override
> +    public ReadWriteLock getLock() {
> +        return lock;
> +    }
> +
> +    @Override
> +    public ImmutableGraph getImmutableGraph() {
> +        readLock.lock();
> +        try {
> +            return performGetImmutableGraph();
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    public ImmutableGraph performGetImmutableGraph() {
> +        return new SimpleImmutableGraph(this);
> +    }
> +
> +    @Override
> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri predicate,
> RdfTerm object) {
> +        readLock.lock();
> +        try {
> +            return new LockingIterator(performFilter(subject, predicate,
> object), lock);
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public int size() {
> +        readLock.lock();
> +        try {
> +            return performSize();
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public boolean isEmpty() {
> +        readLock.lock();
> +        try {
> +            return performIsEmpty();
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    @SuppressWarnings("element-type-mismatch")
> +    public boolean contains(Object o) {
> +        readLock.lock();
> +        try {
> +            return performContains(o);
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public Iterator<Triple> iterator() {
> +        readLock.lock();
> +        try {
> +            return new LockingIterator(performIterator(), lock);
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public Object[] toArray() {
> +        readLock.lock();
> +        try {
> +            return performToArray();
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public <T> T[] toArray(T[] a) {
> +        readLock.lock();
> +        try {
> +            return performToArray(a);
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public boolean containsAll(Collection<?> c) {
> +        readLock.lock();
> +        try {
> +            return performContainsAll(c);
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public boolean add(Triple e) {
> +        writeLock.lock();
> +        try {
> +            return performAdd(e);
> +        } finally {
> +            writeLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public boolean remove(Object o) {
> +        writeLock.lock();
> +        try {
> +            return performRemove(o);
> +        } finally {
> +            writeLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public boolean addAll(Collection<? extends Triple> c) {
> +        writeLock.lock();
> +        try {
> +            return performAddAll(c);
> +        } finally {
> +            writeLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public boolean removeAll(Collection<?> c) {
> +        writeLock.lock();
> +        try {
> +            return performRemoveAll(c);
> +        } finally {
> +            writeLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public boolean retainAll(Collection<?> c) {
> +        writeLock.lock();
> +        try {
> +            return performRetainAll(c);
> +        } finally {
> +            writeLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public void clear() {
> +        writeLock.lock();
> +        try {
> +            performClear();
> +        } finally {
> +            writeLock.unlock();
> +        }
> +    }
> +
> +
> +    @Override
> +    public boolean equals(Object obj) {
> +        /*if (obj == null) {
> +            return false;
> +        }
> +        if (obj == this) {
> +            return true;
> +        }
> +        if (obj.getClass() != getClass()) {
> +            return false;
> +        }*/
> +        return this == obj;
> +    }
> +
> +
> +    protected abstract Iterator<Triple> performFilter(BlankNodeOrIri
> subject, Iri predicate, RdfTerm object);
> +
> +    protected abstract int performSize();
> +
> +    protected boolean performIsEmpty() {
> +        return super.isEmpty();
> +    }
> +
> +    protected Object[] performToArray() {
> +        return super.toArray();
> +    }
> +
> +    protected boolean performRemove(Object o) {
> +        return super.remove(o);
> +    }
> +
> +    protected boolean performAddAll(Collection<? extends Triple> c) {
> +        return super.addAll(c);
> +    }
> +
> +    protected boolean performRemoveAll(Collection<?> c) {
> +        return super.removeAll(c);
> +    }
> +
> +    protected boolean performRetainAll(Collection<?> c) {
> +        return super.retainAll(c);
> +    }
> +
> +    protected void performClear() {
> +        super.clear();
> +    }
> +
> +    protected boolean performContains(Object o) {
> +        return super.contains(o);
> +    }
> +
> +    protected Iterator<Triple> performIterator() {
> +        return performFilter(null, null, null);
> +    }
> +
> +    protected boolean performContainsAll(Collection<?> c) {
> +        return super.containsAll(c);
> +    }
> +
> +    protected <T> T[] performToArray(T[] a) {
> +        return super.toArray(a);
> +    }
> +
> +    protected boolean performAdd(Triple e) {
> +        return super.add(e);
> +    }
> +
> +
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,112 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +package org.apache.commons.rdf.impl.utils;
> +
> +import java.util.Collection;
> +import java.util.Iterator;
> +
> +import org.apache.commons.rdf.BlankNode;
> +import org.apache.commons.rdf.ImmutableGraph;
> +import org.apache.commons.rdf.RdfTerm;
> +import org.apache.commons.rdf.Triple;
> +import org.apache.commons.rdf.impl.utils.graphmatching.GraphMatcher;
> +
> +/**
> + * <code>AbstractGraph</code> is an abstract implementation of
> <code>ImmutableGraph</code>
> + * implementing the <code>equals</code> and the <code>hashCode</code>
> methods.
> + *
> + * @author reto
> + *
> + */
> +public abstract class AbstractImmutableGraph extends AbstractGraph
> +        implements ImmutableGraph {
> +
> +    public final synchronized int hashCode() {
> +        int result = 0;
> +        for (Iterator<Triple> iter = iterator(); iter.hasNext();) {
> +            result += getBlankNodeBlindHash(iter.next());
> +        }
> +        return result;
> +    }
> +
> +    /**
> +     * @param triple
> +     * @return hash without BNode hashes
> +     */
> +    private int getBlankNodeBlindHash(Triple triple) {
> +        int hash = triple.getPredicate().hashCode();
> +        RdfTerm subject = triple.getSubject();
> +
> +        if (!(subject instanceof BlankNode)) {
> +            hash ^= subject.hashCode() >> 1;
> +        }
> +        RdfTerm object = triple.getObject();
> +        if (!(object instanceof BlankNode)) {
> +            hash ^= object.hashCode() << 1;
> +        }
> +
> +        return hash;
> +    }
> +
> +    @Override
> +    public boolean add(Triple e) {
> +        throw new UnsupportedOperationException("Graphs are not mutable,
> use Graph");
> +
> +    }
> +
> +    @Override
> +    public boolean addAll(Collection<? extends Triple> c) {
> +        throw new UnsupportedOperationException("Graphs are not mutable,
> use Graph");
> +    }
> +
> +    @Override
> +    public boolean remove(Object o) {
> +        throw new UnsupportedOperationException("Graphs are not mutable,
> use Graph");
> +    }
> +
> +    @Override
> +    public boolean removeAll(Collection<?> c) {
> +        throw new UnsupportedOperationException("Graphs are not mutable,
> use Graph");
> +    }
> +
> +    @Override
> +    public void clear() {
> +        throw new UnsupportedOperationException("Graphs are not mutable,
> use Graph");
> +    }
> +
> +
> +    @Override
> +    public ImmutableGraph getImmutableGraph() {
> +        return this;
> +    }
> +
> +    @Override
> +    public boolean equals(Object obj) {
> +        if (this == obj) {
> +            return true;
> +        }
> +        if (!(obj instanceof ImmutableGraph)) {
> +            return false;
> +        }
> +        if (hashCode() != obj.hashCode()) {
> +            return false;
> +        }
> +        return GraphMatcher.getValidMapping(this, (ImmutableGraph) obj)
> != null;
> +    }
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,61 @@
> +/*
> + * Copyright 2015 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.commons.rdf.impl.utils;
> +
> +import org.apache.commons.rdf.Literal;
> +
> +/**
> + *
> + * @author developer
> + */
> +public abstract class AbstractLiteral implements Literal {
> +
> +    @Override
> +    public int hashCode() {
> +        int result = 0;
> +        if (getLanguage() != null) {
> +            result = getLanguage().hashCode();
> +        }
> +        result += getLexicalForm().hashCode();
> +        result += getDataType().hashCode();
> +        return result;
> +    }
> +
> +    @Override
> +    public boolean equals(Object obj) {
> +        if (this == obj) {
> +            return true;
> +        }
> +        if (obj instanceof Literal) {
> +            Literal other = (Literal) obj;
> +
> +            if (getLanguage() == null) {
> +                if (other.getLanguage() != null) {
> +                    return false;
> +                }
> +            } else {
> +                if (!getLanguage().equals(other.getLanguage())) {
> +                    return false;
> +                }
> +            }
> +            boolean res = getDataType().equals(other.getDataType()) &&
> getLexicalForm().equals(other.getLexicalForm());
> +            return res;
> +        } else {
> +            return false;
> +        }
> +    }
> +
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,112 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +package org.apache.commons.rdf.impl.utils;
> +
> +import java.lang.ref.WeakReference;
> +import java.util.*;
> +
> +import org.apache.commons.rdf.event.GraphEvent;
> +import org.apache.commons.rdf.event.GraphListener;
> +import org.slf4j.Logger;
> +import org.slf4j.LoggerFactory;
> +
> +/**
> + *
> + * @author reto
> + */
> +class DelayedNotificator {
> +
> +    private static final Logger log =
> LoggerFactory.getLogger(DelayedNotificator.class);
> +    private static Timer timer = new Timer("Event delivery timer",true);
> +
> +    static class ListenerHolder {
> +
> +        long delay;
> +        List<GraphEvent> events = null;
> +        WeakReference<GraphListener> listenerRef;
> +
> +        public ListenerHolder(GraphListener listener, long delay) {
> +            this.listenerRef = new WeakReference<GraphListener>(listener);
> +            this.delay = delay;
> +        }
> +
> +        private void registerEvent(GraphEvent event) {
> +            synchronized (this) {
> +                if (events == null) {
> +                    events = new ArrayList<GraphEvent>();
> +                    events.add(event);
> +                    timer.schedule(new TimerTask() {
> +
> +                        @Override
> +                        public void run() {
> +                            List<GraphEvent> eventsLocal;
> +                            synchronized (ListenerHolder.this) {
> +                                eventsLocal = events;
> +                                events = null;
> +                            }
> +                            GraphListener listener = listenerRef.get();
> +                            if (listener == null) {
> +                                log.debug("Ignoring garbage collected
> listener");
> +                            } else {
> +                                try {
> +                                    listener.graphChanged(eventsLocal);
> +                                } catch (Exception e) {
> +                                    log.warn("Exception delivering
> ImmutableGraph event", e);
> +                                }
> +                            }
> +                        }
> +                    }, delay);
> +                } else {
> +                    events.add(event);
> +                }
> +            }
> +        }
> +    }
> +
> +    private final Map<GraphListener, ListenerHolder> map =
> Collections.synchronizedMap(
> +            new WeakHashMap<GraphListener, ListenerHolder>());
> +
> +    void addDelayedListener(GraphListener listener, long delay) {
> +        map.put(listener, new ListenerHolder(listener, delay));
> +    }
> +
> +    /**
> +     * removes a Listener, this doesn't prevent the listenerRef from
> receiving
> +     * events alreay scheduled.
> +     *
> +     * @param listenerRef
> +     */
> +    void removeDelayedListener(GraphListener listener) {
> +        map.remove(listener);
> +    }
> +
> +    /**
> +     * if the listenerRef has not been registered as delayed listenerRef
> te events is
> +     * forwarded synchroneously
> +     * @param event
> +     */
> +    void sendEventToListener(GraphListener listener, GraphEvent event) {
> +        ListenerHolder holder = map.get(listener);
> +        if (holder == null) {
> +            listener.graphChanged(Collections.singletonList(event));
> +        } else {
> +            holder.registerEvent(event);
> +        }
> +    }
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,73 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +package org.apache.commons.rdf.impl.utils;
> +
> +import java.util.Iterator;
> +import java.util.concurrent.locks.Lock;
> +import java.util.concurrent.locks.ReadWriteLock;
> +import org.apache.commons.rdf.Triple;
> +
> +/**
> + * Wrapps an iterator<Triple> reading entering a read-lock on every
> invocation
> + * of hasNext and next
> + * @author reto
> + */
> +class LockingIterator implements Iterator<Triple> {
> +
> +    private Iterator<Triple> base;
> +    private Lock readLock;
> +    private Lock writeLock;
> +
> +    public LockingIterator(Iterator<Triple> iterator, ReadWriteLock lock)
> {
> +        base = iterator;
> +        readLock = lock.readLock();
> +        writeLock = lock.writeLock();
> +    }
> +
> +    @Override
> +    public boolean hasNext() {
> +        readLock.lock();
> +        try {
> +            return base.hasNext();
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public Triple next() {
> +        readLock.lock();
> +        try {
> +            return base.next();
> +        } finally {
> +            readLock.unlock();
> +        }
> +    }
> +
> +    @Override
> +    public void remove() {
> +        writeLock.lock();
> +        try {
> +            base.remove();
> +        } finally {
> +            writeLock.unlock();
> +        }
> +    }
> +
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,104 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +package org.apache.commons.rdf.impl.utils;
> +
> +import java.io.Serializable;
> +import org.apache.commons.rdf.Iri;
> +
> +import org.apache.commons.rdf.Language;
> +import org.apache.commons.rdf.Literal;
> +
> +/**
> + *
> + * @author reto
> + */
> +public class PlainLiteralImpl implements Literal, Serializable {
> +
> +    private String lexicalForm;
> +    private Language language = null;
> +
> +    public PlainLiteralImpl(String value) {
> +        if (value == null) {
> +            throw new IllegalArgumentException("The literal string cannot
> be null");
> +        }
> +        this.lexicalForm = value;
> +    }
> +
> +    public PlainLiteralImpl(String value, Language language) {
> +        if (value == null) {
> +            throw new IllegalArgumentException("The literal string cannot
> be null");
> +        }
> +        this.lexicalForm = value;
> +        this.language = language;
> +    }
> +
> +    @Override
> +    public String getLexicalForm() {
> +        return lexicalForm;
> +    }
> +
> +    @Override
> +    public boolean equals(Object otherObj) {
> +        if (!(otherObj instanceof Literal)) {
> +            return false;
> +        }
> +        Literal other = (Literal) otherObj;
> +        if (!lexicalForm.equals(other.getLexicalForm())) {
> +            return false;
> +        }
> +        if (language != null) {
> +            return language.equals(other.getLanguage());
> +        }
> +        if (other.getLanguage() != null) {
> +            return false;
> +        }
> +        return true;
> +    }
> +
> +    @Override
> +    public int hashCode() {
> +        int hash = lexicalForm.hashCode() + XSD_STRING_HASH;
> +        if (language != null) {
> +            hash += language.hashCode();
> +        }
> +        return hash;
> +    }
> +
> +    @Override
> +    public Language getLanguage() {
> +        return language;
> +    }
> +
> +    @Override
> +    public String toString() {
> +        StringBuffer result = new StringBuffer();
> +        result.append('\"').append(lexicalForm).append('\"');
> +        if (language != null) {
> +            result.append("@").append(language.toString());
> +        }
> +        return result.toString();
> +    }
> +
> +    @Override
> +    public Iri getDataType() {
> +        return XSD_STRING;
> +    }
> +    private static final Iri XSD_STRING = new Iri("
> http://www.w3.org/2001/XMLSchema#string");
> +    private static final int XSD_STRING_HASH = XSD_STRING.hashCode();
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,100 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +package org.apache.commons.rdf.impl.utils;
> +
> +import org.apache.commons.rdf.BlankNodeOrIri;
> +import org.apache.commons.rdf.RdfTerm;
> +import org.apache.commons.rdf.Triple;
> +import org.apache.commons.rdf.Iri;
> +
> +/**
> + *
> + * @author reto
> + */
> +public class TripleImpl implements Triple {
> +
> +    private final BlankNodeOrIri subject;
> +    private final Iri predicate;
> +    private final RdfTerm object;
> +
> +    /**
> +     * Creates a new <code>TripleImpl</code>.
> +     *
> +     * @param subject  the subject.
> +     * @param predicate  the predicate.
> +     * @param object  the object.
> +     * @throws IllegalArgumentException  if an attribute is
> <code>null</code>.
> +     */
> +    public TripleImpl(BlankNodeOrIri subject, Iri predicate, RdfTerm
> object) {
> +        if (subject == null) {
> +            throw new IllegalArgumentException("Invalid subject: null");
> +        } else if (predicate == null) {
> +            throw new IllegalArgumentException("Invalid predicate: null");
> +        } else if (object == null) {
> +            throw new IllegalArgumentException("Invalid object: null");
> +        }
> +        this.subject = subject;
> +        this.predicate = predicate;
> +        this.object = object;
> +    }
> +
> +    @Override
> +    public boolean equals(Object obj) {
> +        if (obj == null) {
> +            return false;
> +        }
> +        if (!(obj instanceof Triple)) {
> +            return false;
> +        }
> +        final Triple other = (Triple) obj;
> +        if (!this.subject.equals(other.getSubject())) {
> +            return false;
> +        }
> +        if (!this.predicate.equals(other.getPredicate())) {
> +            return false;
> +        }
> +        if (!this.object.equals(other.getObject())) {
> +            return false;
> +        }
> +        return true;
> +    }
> +
> +    @Override
> +    public int hashCode() {
> +        return (subject.hashCode() >> 1) ^ predicate.hashCode() ^
> (object.hashCode() << 1);
> +    }
> +
> +    @Override
> +    public BlankNodeOrIri getSubject() {
> +        return subject;
> +    }
> +
> +    public Iri getPredicate() {
> +        return predicate;
> +    }
> +
> +    public RdfTerm getObject() {
> +        return object;
> +    }
> +
> +    @Override
> +    public String toString() {
> +        return subject + " " + predicate + " " + object + ".";
> +    }
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,80 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +package org.apache.commons.rdf.impl.utils;
> +
> +import java.io.Serializable;
> +
> +import org.apache.commons.rdf.Iri;
> +import org.apache.commons.rdf.Language;
> +import org.apache.commons.rdf.Literal;
> +
> +/**
> + *
> + * @author reto
> + */
> +public class TypedLiteralImpl extends AbstractLiteral implements
> Serializable {
> +    private String lexicalForm;
> +    private Iri dataType;
> +    private int hashCode;
> +
> +    /**
> +     * @param lexicalForm
> +     * @param dataType
> +     */
> +    public TypedLiteralImpl(String lexicalForm, Iri dataType) {
> +        this.lexicalForm = lexicalForm;
> +        this.dataType = dataType;
> +        this.hashCode = lexicalForm.hashCode()+dataType.hashCode();
> +    }
> +
> +    public Iri getDataType() {
> +        return dataType;
> +    }
> +
> +    /* (non-Javadoc)
> +     * @see org.apache.clerezza.rdf.core.LiteralNode#getLexicalForm()
> +     */
> +    @Override
> +    public String getLexicalForm() {
> +        return lexicalForm;
> +    }
> +
> +    @Override
> +    public int hashCode() {
> +        return hashCode;
> +    }
> +
> +
> +    @Override
> +    public String toString() {
> +        StringBuffer result = new StringBuffer();
> +        result.append('\"');
> +        result.append(getLexicalForm());
> +        result.append('\"');
> +        result.append("^^");
> +        result.append(getDataType());
> +        return result.toString();
> +    }
> +
> +    @Override
> +    public Language getLanguage() {
> +        return null;
> +    }
> +
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,289 @@
> +/*
> + * Copyright 2015 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.commons.rdf.impl.utils;
> +
> +import java.lang.ref.WeakReference;
> +import java.util.Collection;
> +import java.util.Collections;
> +import java.util.HashSet;
> +import java.util.Iterator;
> +import java.util.Set;
> +import java.util.concurrent.locks.ReadWriteLock;
> +import org.apache.commons.rdf.BlankNodeOrIri;
> +import org.apache.commons.rdf.Graph;
> +import org.apache.commons.rdf.ImmutableGraph;
> +import org.apache.commons.rdf.Iri;
> +import org.apache.commons.rdf.RdfTerm;
> +import org.apache.commons.rdf.Triple;
> +import org.apache.commons.rdf.WatchableGraph;
> +import org.apache.commons.rdf.event.AddEvent;
> +import org.apache.commons.rdf.event.FilterTriple;
> +import org.apache.commons.rdf.event.GraphEvent;
> +import org.apache.commons.rdf.event.GraphListener;
> +import org.apache.commons.rdf.event.RemoveEvent;
> +
> +/**
> + *
> + * @author developer
> + */
> +public class WatchableGraphWrapper implements WatchableGraph {
> +
> +    final Graph wrapped;
> +
> +    public WatchableGraphWrapper(Graph wrapped) {
> +        this.wrapped = wrapped;
> +    }
> +
> +
> +    //all listeners
> +    private final Set<ListenerConfiguration> listenerConfigs =
> Collections.synchronizedSet(
> +            new HashSet<ListenerConfiguration>());
> +    private DelayedNotificator delayedNotificator = new
> DelayedNotificator();
> +
> +    @Override
> +    public Iterator<Triple> iterator() {
> +        return filter(null, null, null);
> +    }
> +
> +    @Override
> +    public boolean contains(Object o) {
> +        if (!(o instanceof Triple)) {
> +            return false;
> +        }
> +        Triple t = (Triple) o;
> +        return filter(t.getSubject(), t.getPredicate(),
> t.getObject()).hasNext();
> +    }
> +
> +    @Override
> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri predicate,
> +            RdfTerm object) {
> +        final Iterator<Triple> baseIter = wrapped.filter(subject,
> predicate, object);
> +        return new Iterator<Triple>() {
> +
> +            Triple currentTriple = null;
> +
> +            @Override
> +            public boolean hasNext() {
> +                return baseIter.hasNext();
> +            }
> +
> +            @Override
> +            public Triple next() {
> +                currentTriple = baseIter.next();
> +                return currentTriple;
> +            }
> +
> +            @Override
> +            public void remove() {
> +                baseIter.remove();
> +                dispatchEvent(new RemoveEvent(WatchableGraphWrapper.this,
> currentTriple));
> +            }
> +        };
> +    }
> +
> +    @Override
> +    public boolean add(Triple triple) {
> +        boolean success = performAdd(triple);
> +        if (success) {
> +            dispatchEvent(new AddEvent(this, triple));
> +        }
> +        return success;
> +    }
> +
> +    /**
> +     * A subclass of <code>AbstractGraph</code> should override
> +     * this method instead of <code>add</code> for Graph event support to
> be
> +     * added.
> +     *
> +     * @param e The triple to be added to the triple collection
> +     * @return
> +     */
> +    protected boolean performAdd(Triple e) {
> +        return wrapped.add(e);
> +    }
> +
> +    @Override
> +    public boolean remove(Object o) {
> +        Triple triple = (Triple) o;
> +        boolean success = performRemove(triple);
> +        if (success) {
> +            dispatchEvent(new RemoveEvent(this, triple));
> +        }
> +        return success;
> +    }
> +
> +    @Override
> +    public boolean removeAll(Collection<?> c) {
> +        boolean modified = false;
> +        for (Iterator<? extends Object> it = c.iterator(); it.hasNext();)
> {
> +            Object object = it.next();
> +            if (remove(object)) {
> +                modified = true;
> +            }
> +        }
> +        return modified;
> +    }
> +
> +    /**
> +     * A subclass of <code>AbstractGraph</code> should override
> +     * this method instead of <code>remove</code> for ImmutableGraph
> event support to be
> +     * added.
> +     *
> +     * @param o The triple to be removed from the triple collection
> +     * @return
> +     */
> +    protected boolean performRemove(Triple triple) {
> +        Iterator<Triple> e = filter(null, null, null);
> +        while (e.hasNext()) {
> +            if (triple.equals(e.next())) {
> +                e.remove();
> +                return true;
> +            }
> +        }
> +        return false;
> +    }
> +
> +    /**
> +     * Dispatches a <code>GraphEvent</code> to all registered listeners
> for which
> +     * the specified <code>Triple</code> matches the
> <code>FilterTriple</code>s
> +     * of the listeners.
> +     *
> +     * @param triple The Triple that was modified
> +     * @param type The type of modification
> +     */
> +    protected void dispatchEvent(GraphEvent event) {
> +        synchronized(listenerConfigs) {
> +            Iterator<ListenerConfiguration> iter =
> listenerConfigs.iterator();
> +            while (iter.hasNext()) {
> +                ListenerConfiguration config = iter.next();
> +                GraphListener registeredListener = config.getListener();
> +                if (registeredListener == null) {
> +                    iter.remove();
> +                    continue;
> +                }
> +                if (config.getFilter().match(event.getTriple())) {
> +
> delayedNotificator.sendEventToListener(registeredListener, event);
> +                }
> +            }
> +        }
> +    }
> +
> +    @Override
> +    public void addGraphListener(GraphListener listener, FilterTriple
> filter) {
> +        addGraphListener(listener, filter, 0);
> +    }
> +
> +    @Override
> +    public void addGraphListener(GraphListener listener, FilterTriple
> filter,
> +            long delay) {
> +        listenerConfigs.add(new ListenerConfiguration(listener, filter));
> +        if (delay > 0) {
> +            delayedNotificator.addDelayedListener(listener, delay);
> +        }
> +    }
> +
> +    @Override
> +    public void removeGraphListener(GraphListener listener) {
> +        synchronized(listenerConfigs) {
> +            Iterator<ListenerConfiguration> iter =
> listenerConfigs.iterator();
> +            while (iter.hasNext()) {
> +                ListenerConfiguration listenerConfig = iter.next();
> +                GraphListener registeredListener =
> listenerConfig.getListener();
> +                if ((registeredListener == null) ||
> (registeredListener.equals(listener))) {
> +                    iter.remove();
> +                }
> +            }
> +        }
> +        delayedNotificator.removeDelayedListener(listener);
> +    }
> +
> +    @Override
> +    public ImmutableGraph getImmutableGraph() {
> +        throw new UnsupportedOperationException("Not supported yet.");
> //To change body of generated methods, choose Tools | Templates.
> +    }
> +
> +    @Override
> +    public ReadWriteLock getLock() {
> +        return wrapped.getLock();
> +    }
> +
> +    @Override
> +    public int size() {
> +        return wrapped.size();
> +    }
> +
> +    @Override
> +    public boolean isEmpty() {
> +        return wrapped.isEmpty();
> +    }
> +
> +    @Override
> +    public Object[] toArray() {
> +        return wrapped.toArray();
> +    }
> +
> +    @Override
> +    public <T> T[] toArray(T[] a) {
> +        return wrapped.toArray(a);
> +    }
> +
> +    @Override
> +    public boolean containsAll(Collection<?> c) {
> +        return wrapped.containsAll(c);
> +    }
> +
> +    @Override
> +    public boolean addAll(Collection<? extends Triple> c) {
> +        return wrapped.addAll(c);
> +    }
> +
> +    @Override
> +    public boolean retainAll(Collection<?> c) {
> +        return wrapped.retainAll(c);
> +    }
> +
> +    @Override
> +    public void clear() {
> +        wrapped.clear();
> +    }
> +
> +    private static class ListenerConfiguration {
> +
> +        private WeakReference<GraphListener> listenerRef;
> +        private FilterTriple filter;
> +
> +        private ListenerConfiguration(GraphListener listener,
> FilterTriple filter) {
> +            this.listenerRef = new WeakReference<GraphListener>(listener);
> +            this.filter = filter;
> +        }
> +
> +        /**
> +         * @return the listener
> +         */
> +        GraphListener getListener() {
> +            GraphListener listener = listenerRef.get();
> +            return listener;
> +        }
> +
> +        /**
> +         * @return the filter
> +         */
> +        FilterTriple getFilter() {
> +            return filter;
> +        }
> +    }
> +
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,85 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +
> +package org.apache.commons.rdf.impl.utils.debug;
> +
> +import java.util.concurrent.TimeUnit;
> +import java.util.concurrent.locks.Condition;
> +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
> +
> +/**
> + *
> + * @author mir
> + */
> +public class ReadLockDebug extends ReadLock {
> +
> +    ReentrantReadWriteLockTracker lock;
> +    StackTraceElement[] stackTrace;
> +
> +    ReadLock readLock;
> +    public ReadLockDebug(ReentrantReadWriteLockTracker lock) {
> +        super(lock);
> +        this.lock = lock;
> +        this.readLock = lock.realReadLock();
> +    }
> +
> +    @Override
> +    public void lock() {
> +        readLock.lock();
> +        lock.addLockedReadLock(this);
> +        stackTrace = Thread.currentThread().getStackTrace();
> +    }
> +
> +    @Override
> +    public void lockInterruptibly() throws InterruptedException {
> +        readLock.lockInterruptibly();
> +    }
> +
> +    @Override
> +    public Condition newCondition() {
> +        return readLock.newCondition();
> +    }
> +
> +    @Override
> +    public String toString() {
> +        return readLock.toString();
> +    }
> +
> +    @Override
> +    public boolean tryLock() {
> +        return readLock.tryLock();
> +    }
> +
> +    @Override
> +    public boolean tryLock(long timeout, TimeUnit unit) throws
> InterruptedException {
> +        return readLock.tryLock(timeout, unit);
> +    }
> +
> +    @Override
> +    public void unlock() {
> +        readLock.unlock();
> +        lock.removeReadLock(this);
> +        stackTrace = null;
> +    }
> +
> +    public StackTraceElement[] getStackTrace() {
> +        return stackTrace;
> +    }
> +
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,133 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +package org.apache.commons.rdf.impl.utils.debug;
> +
> +import java.util.Collection;
> +import java.util.Collections;
> +import java.util.HashSet;
> +import java.util.Set;
> +import java.util.concurrent.locks.Condition;
> +import java.util.concurrent.locks.ReentrantReadWriteLock;
> +
> +/**
> + *
> + * @author mir
> + */
> +public class ReentrantReadWriteLockTracker extends ReentrantReadWriteLock
> {
> +
> +
> +    private Set<ReadLockDebug> lockedReadLocks =
> Collections.synchronizedSet(new HashSet<ReadLockDebug>());
> +    private final WriteLockDebug writeLock = new WriteLockDebug(this);
> +    @Override
> +    protected Thread getOwner() {
> +        return super.getOwner();
> +    }
> +
> +    @Override
> +    protected Collection<Thread> getQueuedReaderThreads() {
> +        return super.getQueuedReaderThreads();
> +    }
> +
> +    @Override
> +    protected Collection<Thread> getQueuedThreads() {
> +        return super.getQueuedThreads();
> +    }
> +
> +    @Override
> +    protected Collection<Thread> getQueuedWriterThreads() {
> +        return super.getQueuedWriterThreads();
> +    }
> +
> +    @Override
> +    public int getReadHoldCount() {
> +        return super.getReadHoldCount();
> +    }
> +
> +    @Override
> +    public int getReadLockCount() {
> +        return super.getReadLockCount();
> +    }
> +
> +    @Override
> +    public int getWaitQueueLength(Condition condition) {
> +        return super.getWaitQueueLength(condition);
> +    }
> +
> +    @Override
> +    protected Collection<Thread> getWaitingThreads(Condition condition) {
> +        return super.getWaitingThreads(condition);
> +    }
> +
> +    @Override
> +    public int getWriteHoldCount() {
> +        return super.getWriteHoldCount();
> +    }
> +
> +    @Override
> +    public boolean hasWaiters(Condition condition) {
> +        return super.hasWaiters(condition);
> +    }
> +
> +    @Override
> +    public boolean isWriteLocked() {
> +        return super.isWriteLocked();
> +    }
> +
> +    @Override
> +    public boolean isWriteLockedByCurrentThread() {
> +        return super.isWriteLockedByCurrentThread();
> +    }
> +
> +    @Override
> +    public ReadLock readLock() {
> +        return new ReadLockDebug(this);
> +    }
> +
> +    ReadLock realReadLock() {
> +        return super.readLock();
> +    }
> +
> +    WriteLock realWriteLock() {
> +        return super.writeLock();
> +    }
> +
> +    @Override
> +    public String toString() {
> +        return super.toString();
> +    }
> +
> +    @Override
> +    public WriteLockDebug writeLock() {
> +        return writeLock;
> +    }
> +
> +    void addLockedReadLock(ReadLockDebug lock) {
> +        lockedReadLocks.add(lock);
> +    }
> +
> +    void removeReadLock(ReadLockDebug lock) {
> +        lockedReadLocks.remove(lock);
> +    }
> +
> +    public Set<ReadLockDebug> getLockedReadLocks() {
> +        return lockedReadLocks;
> +    }
> +
> +
> +}
>
> Added:
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> URL:
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java?rev=1659973&view=auto
>
> ==============================================================================
> ---
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> (added)
> +++
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> Sun Feb 15 18:41:15 2015
> @@ -0,0 +1,89 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + */
> +
> +package org.apache.commons.rdf.impl.utils.debug;
> +
> +import java.util.concurrent.TimeUnit;
> +import java.util.concurrent.locks.Condition;
> +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
> +
> +/**
> + *
> + * @author mir
> + */
> +public class WriteLockDebug extends WriteLock {
> +
> +    private ReentrantReadWriteLockTracker lock;
> +    private WriteLock writeLock;
> +    private StackTraceElement[] stackTrace;
> +
> +    public WriteLockDebug(ReentrantReadWriteLockTracker lock) {
> +        super(lock);
> +        this.lock = lock;
> +        this.writeLock = lock.realWriteLock();
> +    }
> +
> +    @Override
> +    public int getHoldCount() {
> +        return writeLock.getHoldCount();
> +    }
> +
> +    @Override
> +    public boolean isHeldByCurrentThread() {
> +        return writeLock.isHeldByCurrentThread();
> +    }
> +
> +    @Override
> +    public void lock() {
> +        writeLock.lock();
> +        stackTrace = Thread.currentThread().getStackTrace();
> +    }
> +
> +    @Override
> +    public void lockInterruptibly() throws InterruptedException {
> +        writeLock.lockInterruptibly();
> +    }
> +
> +    @Override
> +    public Condition newCondition() {
> +        return writeLock.newCondition();
> +    }
> +
> +    @Override
> +    public boolean tryLock() {
> +        return writeLock.tryLock();
> +    }
> +
> +    @Override
> +    public boolean tryLock(long timeout, TimeUnit unit) throws
> InterruptedException {
> +        return writeLock.tryLock(timeout, unit);
> +    }
> +
> +    @Override
> +    public void unlock() {
> +        writeLock.unlock();
> +        stackTrace = null;
> +    }
> +
> +    public StackTraceElement[] getStackTrace() {
> +        return stackTrace;
> +    }
> +
> +
> +}
>
>
>


-- 
http://people.apache.org/~britter/
http://www.systemoutprintln.de/
http://twitter.com/BenediktRitter
http://github.com/britter

Re: svn commit: r1659973 [1/3] - in /commons/sandbox/rdf/trunk: ./ api/src/main/java/org/apache/commons/rdf/ impl.sparql/ impl.sparql/src/ impl.sparql/src/main/ impl.sparql/src/main/java/ impl.sparql/src/main/java/org/ impl.sparql/src/main/java/org/apache/...

Posted by Andy Seaborne <an...@apache.org>.
On 19/02/15 16:05, Stian Soiland-Reyes wrote:
> Great we are on the same page :)
>
> I also think a SPARQL backend will be a reasonable way to push the API
> boundaries, so we can evaluate aspects relating to streaming, blank
> node identifiers, etc. for an implementation that has less direct
> control of its triples.
>
> It could also eventually serve as a useful last-resort bridge to
> connect non-JVM stores to the Commons RDF API - I guess if we get to
> that point it could be decided then if that actually outgrows the API
> and should become its own project.
>
> I would want to develop a couple of "application" scenarios to test
> the API from the client side (e.g. a simple N-triples parser and
> writer) - and they would also be on the edge of what is in scope of
> Commons RDF.
>
> Perhaps we need our own 'sandbox' playground within the Commons RDF
> incubator.. otherwise I would just do it as a bunch of personal GitHub
> projects, but that's not quite the Apache Way.

Experimentation is important and not limited to people "inside". 
Contributions can come from anyone.

	Andy

>
> On 19 February 2015 at 15:56, Reto Gmür <re...@apache.org> wrote:
>> Hi all,
>>
>> Sorry that I couldn't reply earlier.
>>
>> Stian is right, this is code that might become part of the incubating
>> project.
>>
>> It is not about having a non-trivial implementation but about a proof
>> of-concept implementation against a SPARQL Backend as a mean to evaluate
>> design decisions in the API.
>>
>> Cheers,
>> Reto
>>
>> On Thu, Feb 19, 2015 at 4:01 PM, Stian Soiland-Reyes <st...@apache.org>
>> wrote:
>>
>>> I am not speaking for Reto, but I imagined that since Reto has joined
>>> the CommonsRDF incubator proposal, then his sandbox-code would
>>> eventually turn into pull requests and branches on the incubator
>>> codebase so that we can evaluate each of the differences separately.
>>>
>>>
>>> On 19 February 2015 at 06:54, Benedikt Ritter <br...@apache.org> wrote:
>>>> 2015-02-17 7:04 GMT+01:00 Benedikt Ritter <br...@apache.org>:
>>>>
>>>>>
>>>>>
>>>>> 2015-02-17 0:13 GMT+01:00 Peter Ansell <an...@gmail.com>:
>>>>>
>>>>>> Hi Bernard,
>>>>>>
>>>>>> The Commons RDF project is not planning on including any non-trivial
>>>>>> implementations, to avoid bias towards any of the participating
>>>>>> platforms. Stian has written a trivial implementation and submitted it
>>>>>> to GitHub to provide a reference for our test harness, but it is never
>>>>>> planned to be used by anyone for non-trivial purposes.
>>>>>>
>>>>>> Reto is moving this code here unilaterally from Clerezza at this point
>>>>>> based on the ability of any Apache committer to send code into Apache
>>>>>> Commons.
>>>>>>
>>>>>> The code that will be sent to the incubator is still planned to be the
>>>>>> code that is in the GitHub repository at the time the incubator
>>>>>> request goes through.
>>>>>>
>>>>>
>>>>> This is still in the sandbox so I'm not too crazy about it. But
>>> creating a
>>>>> separate code base in the commons-rdf git repository doesn't sound like
>>> a
>>>>> good idea given the fact that github Commons RDF will eventually move to
>>>>> Apache Commons after incubation. What should haben with the code that
>>> is in
>>>>> the repository by that time?
>>>>>
>>>>> Reto, can you comment please?
>>>>>
>>>>
>>>> Reto, I'm still waiting for your comment.
>>>>
>>>>
>>>>>
>>>>> Regards,
>>>>> Benedikt
>>>>>
>>>>>
>>>>>>
>>>>>> Cheers,
>>>>>>
>>>>>> Peter
>>>>>>
>>>>>> On 16 February 2015 at 18:34, Benedikt Ritter <br...@apache.org>
>>> wrote:
>>>>>>> Hello Reto,
>>>>>>>
>>>>>>> how does this relate to github Commons RDF? Is this part of the code
>>>>>> base
>>>>>>> proposed for incubation?
>>>>>>>
>>>>>>> Regards,
>>>>>>> Benedikt
>>>>>>>
>>>>>>> 2015-02-15 19:41 GMT+01:00 <re...@apache.org>:
>>>>>>>
>>>>>>>> Author: reto
>>>>>>>> Date: Sun Feb 15 18:41:15 2015
>>>>>>>> New Revision: 1659973
>>>>>>>>
>>>>>>>> URL: http://svn.apache.org/r1659973
>>>>>>>> Log:
>>>>>>>> Started SPARQL Backed Implementation
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>      commons/sandbox/rdf/trunk/alerts.txt
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/   (with props)
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/main/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/main/java/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/main/resources/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/test/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/test/java/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/
>>>>>>>>
>>>>>>   commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/   (with props)
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/pom.xml
>>>>>>>>        - copied, changed from r1651181,
>>>>>> commons/sandbox/rdf/trunk/pom.xml
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/src/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/src/main/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/src/main/java/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/
>>>>>>>>
>>>>>>   commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphNotIsomorphicException.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GroupMappingIterator.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/HashMatching.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/MappingIterator.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/PermutationIterator.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/Utils.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashMap.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashSet.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntIterator.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntSet.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/package-info.java
>>>>>>>>        - copied, changed from r1651181,
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/src/main/java/org/apache/commons/rdf/package-info.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraph.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleMGraph.java
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/src/main/resources/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/src/test/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/src/test/java/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/
>>>>>>>>      commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/
>>>>>>>>
>>>>>>   commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/PlainLiteralImplTest.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraphTest.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TripleImplTest.java
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
>>>>>>>>      commons/sandbox/rdf/trunk/report.xml
>>>>>>>> Modified:
>>>>>>>>
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>>>>>>>>      commons/sandbox/rdf/trunk/pom.xml
>>>>>>>>
>>>>>>>> Added: commons/sandbox/rdf/trunk/alerts.txt
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/alerts.txt?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>>      (empty)
>>>>>>>>
>>>>>>>> Modified:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java?rev=1659973&r1=1659972&r2=1659973&view=diff
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>>>>>>>> (original)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -84,7 +84,8 @@ public interface Literal extends RdfTerm
>>>>>>>>
>>>>>>>>       /**
>>>>>>>>        * Returns the hash code of the lexical form plus the hash code
>>>>>> of the
>>>>>>>> -     * language, plush the hash code of the datatype
>>>>>>>> +     * datatype plus if the literal has a language the hash code of
>>>>>> the
>>>>>>>> +     * language.
>>>>>>>>        *
>>>>>>>>        * @return hash code
>>>>>>>>        */
>>>>>>>>
>>>>>>>> Propchange: commons/sandbox/rdf/trunk/impl.sparql/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ------------------------------------------------------------------------------
>>>>>>>> --- svn:ignore (added)
>>>>>>>> +++ svn:ignore Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1 @@
>>>>>>>> +target
>>>>>>>>
>>>>>>>> Added: commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/pom.xml?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> --- commons/sandbox/rdf/trunk/impl.sparql/pom.xml (added)
>>>>>>>> +++ commons/sandbox/rdf/trunk/impl.sparql/pom.xml Sun Feb 15
>>> 18:41:15
>>>>>> 2015
>>>>>>>> @@ -0,0 +1,52 @@
>>>>>>>> +<?xml version="1.0" encoding="UTF-8"?>
>>>>>>>> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>>>>>>>> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>>>>>>>> http://maven.apache.org/POM/4.0.0
>>>>>>>> http://maven.apache.org/xsd/maven-4.0.0.xsd">
>>>>>>>> +    <parent>
>>>>>>>> +        <groupId>org.apache.commons</groupId>
>>>>>>>> +        <artifactId>commons-parent</artifactId>
>>>>>>>> +        <version>37</version>
>>>>>>>> +        <relativePath />
>>>>>>>> +    </parent>
>>>>>>>> +    <modelVersion>4.0.0</modelVersion>
>>>>>>>> +    <groupId>commons-rdf</groupId>
>>>>>>>> +    <artifactId>commons-rdf-impl-sparql</artifactId>
>>>>>>>> +    <version>1.0.0-SNAPSHOT</version>
>>>>>>>> +    <packaging>jar</packaging>
>>>>>>>> +    <name>Apache Commons RDF SPARQL backed implementation.</name>
>>>>>>>> +    <description>An implementation of the rdf commons API backed
>>> by a
>>>>>>>> sparql
>>>>>>>> +        endpoint. STATUS: Incomplete, currecnt code only supports
>>>>>> reading
>>>>>>>> +        graphs and does not yet support BlankNodes.</description>
>>>>>>>> +    <properties>
>>>>>>>> +
>>>>>> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
>>>>>>>> +        <maven.compiler.source>1.7</maven.compiler.source>
>>>>>>>> +        <maven.compiler.target>1.7</maven.compiler.target>
>>>>>>>> +    </properties>
>>>>>>>> +    <dependencies>
>>>>>>>> +        <dependency>
>>>>>>>> +            <groupId>org.apache.httpcomponents</groupId>
>>>>>>>> +            <artifactId>httpclient</artifactId>
>>>>>>>> +            <version>4.4</version>
>>>>>>>> +        </dependency>
>>>>>>>> +        <dependency>
>>>>>>>> +            <groupId>commons-rdf</groupId>
>>>>>>>> +            <artifactId>commons-rdf-api</artifactId>
>>>>>>>> +            <version>0.1-SNAPSHOT</version>
>>>>>>>> +        </dependency>
>>>>>>>> +        <dependency>
>>>>>>>> +            <groupId>commons-rdf</groupId>
>>>>>>>> +            <artifactId>commons-rdf-impl-utils</artifactId>
>>>>>>>> +            <version>0.1-SNAPSHOT</version>
>>>>>>>> +        </dependency>
>>>>>>>> +        <dependency>
>>>>>>>> +            <groupId>junit</groupId>
>>>>>>>> +            <artifactId>junit</artifactId>
>>>>>>>> +            <version>4.12</version>
>>>>>>>> +            <scope>test</scope>
>>>>>>>> +        </dependency>
>>>>>>>> +        <dependency>
>>>>>>>> +            <groupId>org.apache.jena</groupId>
>>>>>>>> +            <artifactId>jena-fuseki</artifactId>
>>>>>>>> +            <version>1.1.1</version>
>>>>>>>> +            <scope>test</scope>
>>>>>>>> +        </dependency>
>>>>>>>> +    </dependencies>
>>>>>>>> +</project>
>>>>>>>> \ No newline at end of file
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,220 @@
>>>>>>>> +/*
>>>>>>>> + * To change this license header, choose License Headers in Project
>>>>>>>> Properties.
>>>>>>>> + * To change this template file, choose Tools | Templates
>>>>>>>> + * and open the template in the editor.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.sparql;
>>>>>>>> +
>>>>>>>> +import java.io.IOException;
>>>>>>>> +import java.io.InputStream;
>>>>>>>> +import java.io.UnsupportedEncodingException;
>>>>>>>> +import java.util.ArrayList;
>>>>>>>> +import java.util.Enumeration;
>>>>>>>> +import java.util.HashMap;
>>>>>>>> +import java.util.Hashtable;
>>>>>>>> +import java.util.List;
>>>>>>>> +import java.util.Map;
>>>>>>>> +import java.util.logging.Level;
>>>>>>>> +import java.util.logging.Logger;
>>>>>>>> +import org.apache.http.HttpEntity;
>>>>>>>> +import org.apache.http.NameValuePair;
>>>>>>>> +import org.apache.http.client.entity.UrlEncodedFormEntity;
>>>>>>>> +import org.apache.http.client.methods.CloseableHttpResponse;
>>>>>>>> +import org.apache.http.client.methods.HttpPost;
>>>>>>>> +import org.apache.http.impl.client.CloseableHttpClient;
>>>>>>>> +import org.apache.http.impl.client.HttpClients;
>>>>>>>> +import org.apache.http.message.BasicNameValuePair;
>>>>>>>> +import org.apache.http.util.EntityUtils;
>>>>>>>> +import javax.xml.parsers.*;
>>>>>>>> +import org.apache.commons.rdf.BlankNode;
>>>>>>>> +import org.apache.commons.rdf.BlankNodeOrIri;
>>>>>>>> +import org.apache.commons.rdf.Iri;
>>>>>>>> +import org.apache.commons.rdf.Language;
>>>>>>>> +import org.apache.commons.rdf.Literal;
>>>>>>>> +import org.apache.commons.rdf.RdfTerm;
>>>>>>>> +import org.apache.commons.rdf.Triple;
>>>>>>>> +import org.apache.commons.rdf.impl.utils.AbstractLiteral;
>>>>>>>> +import org.xml.sax.*;
>>>>>>>> +import org.xml.sax.helpers.*;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author developer
>>>>>>>> + */
>>>>>>>> +public class SparqlClient {
>>>>>>>> +
>>>>>>>> +    final String endpoint;
>>>>>>>> +
>>>>>>>> +    public SparqlClient(final String endpoint) {
>>>>>>>> +        this.endpoint = endpoint;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    List<Map<String, RdfTerm>> queryResultSet(final String query)
>>>>>> throws
>>>>>>>> IOException {
>>>>>>>> +        CloseableHttpClient httpclient =
>>> HttpClients.createDefault();
>>>>>>>> +        HttpPost httpPost = new HttpPost(endpoint);
>>>>>>>> +        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
>>>>>>>> +        nvps.add(new BasicNameValuePair("query", query));
>>>>>>>> +        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
>>>>>>>> +        CloseableHttpResponse response2 =
>>>>>> httpclient.execute(httpPost);
>>>>>>>> +
>>>>>>>> +        try {
>>>>>>>> +            HttpEntity entity2 = response2.getEntity();
>>>>>>>> +            InputStream in = entity2.getContent();
>>>>>>>> +            SAXParserFactory spf = SAXParserFactory.newInstance();
>>>>>>>> +            spf.setNamespaceAware(true);
>>>>>>>> +            SAXParser saxParser = spf.newSAXParser();
>>>>>>>> +            XMLReader xmlReader = saxParser.getXMLReader();
>>>>>>>> +            final SparqlsResultsHandler sparqlsResultsHandler = new
>>>>>>>> SparqlsResultsHandler();
>>>>>>>> +            xmlReader.setContentHandler(sparqlsResultsHandler);
>>>>>>>> +            xmlReader.parse(new InputSource(in));
>>>>>>>> +            /*
>>>>>>>> +             for (int ch = in.read(); ch != -1; ch = in.read()) {
>>>>>>>> +             System.out.print((char)ch);
>>>>>>>> +             }
>>>>>>>> +             */
>>>>>>>> +            // do something useful with the response body
>>>>>>>> +            // and ensure it is fully consumed
>>>>>>>> +            EntityUtils.consume(entity2);
>>>>>>>> +            return sparqlsResultsHandler.getResults();
>>>>>>>> +        } catch (ParserConfigurationException ex) {
>>>>>>>> +            throw new RuntimeException(ex);
>>>>>>>> +        } catch (SAXException ex) {
>>>>>>>> +            throw new RuntimeException(ex);
>>>>>>>> +        } finally {
>>>>>>>> +            response2.close();
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    final public static class SparqlsResultsHandler extends
>>>>>>>> DefaultHandler {
>>>>>>>> +
>>>>>>>> +        private String currentBindingName;
>>>>>>>> +        private Map<String, RdfTerm> currentResult = null;
>>>>>>>> +        private final List<Map<String, RdfTerm>> results = new
>>>>>>>> ArrayList<>();
>>>>>>>> +        private boolean readingValue;
>>>>>>>> +        private String value;
>>>>>>>> +        private Map<String, BlankNode> bNodeMap = new HashMap<>();
>>>>>>>> +        private static final Iri XSD_STRING = new Iri("
>>>>>>>> http://www.w3.org/2001/XMLSchema#string");
>>>>>>>> +
>>>>>>>> +        private RdfTerm getBNode(String value) {
>>>>>>>> +            if (!bNodeMap.containsKey(value)) {
>>>>>>>> +                bNodeMap.put(value, new BlankNode());
>>>>>>>> +            }
>>>>>>>> +            return bNodeMap.get(value);
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        private List<Map<String, RdfTerm>> getResults() {
>>>>>>>> +            return results;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        enum BindingType {
>>>>>>>> +
>>>>>>>> +            uri, bnode, literal;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        @Override
>>>>>>>> +        public void startDocument() throws SAXException {
>>>>>>>> +
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        @Override
>>>>>>>> +        public void startElement(String namespaceURI,
>>>>>>>> +                String localName,
>>>>>>>> +                String qName,
>>>>>>>> +                Attributes atts)
>>>>>>>> +                throws SAXException {
>>>>>>>> +            if ("http://www.w3.org/2005/sparql-results#
>>>>>> ".equals(namespaceURI))
>>>>>>>> {
>>>>>>>> +                if ("result".equals(localName)) {
>>>>>>>> +                    if (currentResult != null) {
>>>>>>>> +                        throw new SAXException("unexpected tag
>>>>>> <result>");
>>>>>>>> +                    }
>>>>>>>> +                    currentResult = new HashMap<>();
>>>>>>>> +                } else if ("binding".equals(localName)) {
>>>>>>>> +                    if (currentResult == null) {
>>>>>>>> +                        throw new SAXException("unexpected tag
>>>>>>>> <binding>");
>>>>>>>> +                    }
>>>>>>>> +                    currentBindingName = atts.getValue("name");
>>>>>>>> +                } else if ("uri".equals(localName) ||
>>>>>>>> "bnode".equals(localName) || "literal".equals(localName)) {
>>>>>>>> +                    if (readingValue) {
>>>>>>>> +                        throw new SAXException("unexpected tag <" +
>>>>>>>> localName + ">");
>>>>>>>> +                    }
>>>>>>>> +                    readingValue = true;
>>>>>>>> +                }
>>>>>>>> +            }
>>>>>>>> +
>>>>>>>> +            //System.out.println(namespaceURI);
>>>>>>>> +            //System.out.println(qName);
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        @Override
>>>>>>>> +        public void characters(char[] chars, int start, int length)
>>>>>>>> throws SAXException {
>>>>>>>> +            if (readingValue) {
>>>>>>>> +                value = new String(chars, start, length);
>>>>>>>> +                //System.err.println(value + start + ", " +
>>> length);
>>>>>>>> +            }
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        @Override
>>>>>>>> +        public void endElement(String namespaceURI,
>>>>>>>> +                String localName,
>>>>>>>> +                String qName)
>>>>>>>> +                throws SAXException {
>>>>>>>> +            if ("http://www.w3.org/2005/sparql-results#
>>>>>> ".equals(namespaceURI))
>>>>>>>> {
>>>>>>>> +                if ("result".equals(localName)) {
>>>>>>>> +                    results.add(currentResult);
>>>>>>>> +                    currentResult = null;
>>>>>>>> +                } else if ("binding".equals(localName)) {
>>>>>>>> +                    if (currentBindingName == null) {
>>>>>>>> +                        throw new SAXException("unexpected tag
>>>>>>>> </binding>");
>>>>>>>> +                    }
>>>>>>>> +                    currentBindingName = null;
>>>>>>>> +                } else {
>>>>>>>> +                    try {
>>>>>>>> +                        BindingType b =
>>>>>> BindingType.valueOf(localName);
>>>>>>>> +                        RdfTerm rdfTerm = null;
>>>>>>>> +                        switch (b) {
>>>>>>>> +                            case uri:
>>>>>>>> +                                rdfTerm = new Iri(value);
>>>>>>>> +                                break;
>>>>>>>> +                            case bnode:
>>>>>>>> +                                rdfTerm = getBNode(value);
>>>>>>>> +                                break;
>>>>>>>> +                            case literal:
>>>>>>>> +                                final String lf = value;
>>>>>>>> +                                rdfTerm = new AbstractLiteral() {
>>>>>>>> +
>>>>>>>> +                                    @Override
>>>>>>>> +                                    public String getLexicalForm()
>>> {
>>>>>>>> +                                        return lf;
>>>>>>>> +                                    }
>>>>>>>> +
>>>>>>>> +                                    @Override
>>>>>>>> +                                    public Iri getDataType() {
>>>>>>>> +                                        //TODO implement
>>>>>>>> +                                        return XSD_STRING;
>>>>>>>> +                                    }
>>>>>>>> +
>>>>>>>> +                                    @Override
>>>>>>>> +                                    public Language getLanguage() {
>>>>>>>> +                                        //TODO impl
>>>>>>>> +                                        return null;
>>>>>>>> +                                    }
>>>>>>>> +                                };
>>>>>>>> +                                break;
>>>>>>>> +                        }
>>>>>>>> +                        currentResult.put(currentBindingName,
>>>>>> rdfTerm);
>>>>>>>> +                        readingValue = false;
>>>>>>>> +                    } catch (IllegalArgumentException e) {
>>>>>>>> +                            //not uri|bnode|literal
>>>>>>>> +                    }
>>>>>>>> +                }
>>>>>>>> +            }
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        public void endDocument() throws SAXException {
>>>>>>>> +            //System.out.println("results: " + results.size());
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,121 @@
>>>>>>>> +/*
>>>>>>>> + * To change this license header, choose License Headers in Project
>>>>>>>> Properties.
>>>>>>>> + * To change this template file, choose Tools | Templates
>>>>>>>> + * and open the template in the editor.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.sparql;
>>>>>>>> +
>>>>>>>> +import java.io.IOException;
>>>>>>>> +import java.util.Iterator;
>>>>>>>> +import java.util.List;
>>>>>>>> +import java.util.Map;
>>>>>>>> +import org.apache.commons.rdf.BlankNode;
>>>>>>>> +import org.apache.commons.rdf.BlankNodeOrIri;
>>>>>>>> +import org.apache.commons.rdf.Iri;
>>>>>>>> +import org.apache.commons.rdf.Literal;
>>>>>>>> +import org.apache.commons.rdf.RdfTerm;
>>>>>>>> +import org.apache.commons.rdf.Triple;
>>>>>>>> +import org.apache.commons.rdf.impl.utils.AbstractGraph;
>>>>>>>> +import org.apache.commons.rdf.impl.utils.TripleImpl;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author reto
>>>>>>>> + */
>>>>>>>> +public class SparqlGraph extends AbstractGraph {
>>>>>>>> +
>>>>>>>> +    final SparqlClient sparqlClient;
>>>>>>>> +
>>>>>>>> +    /** Constructs a Graph representing the default graph at the
>>>>>> specified
>>>>>>>> +     * endpoint
>>>>>>>> +     */
>>>>>>>> +    public SparqlGraph(final String endpoint) {
>>>>>>>> +        sparqlClient = new SparqlClient(endpoint);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    protected Iterator<Triple> performFilter(final BlankNodeOrIri
>>>>>> subject,
>>>>>>>> +            final Iri predicate, final RdfTerm object) {
>>>>>>>> +        try {
>>>>>>>> +            final StringBuilder queryBuilder = new StringBuilder();
>>>>>>>> +            queryBuilder.append("SELECT * WHERE { ");
>>>>>>>> +            if (subject == null) {
>>>>>>>> +                queryBuilder.append("?s");
>>>>>>>> +            } else {
>>>>>>>> +                queryBuilder.append(asSparqlTerm(subject));
>>>>>>>> +            }
>>>>>>>> +            queryBuilder.append(' ');
>>>>>>>> +            if (predicate == null) {
>>>>>>>> +                queryBuilder.append("?p");
>>>>>>>> +            } else {
>>>>>>>> +                queryBuilder.append(asSparqlTerm(predicate));
>>>>>>>> +            }
>>>>>>>> +            queryBuilder.append(' ');
>>>>>>>> +            if (object == null) {
>>>>>>>> +                queryBuilder.append("?o");
>>>>>>>> +            } else {
>>>>>>>> +                queryBuilder.append(asSparqlTerm(object));
>>>>>>>> +            }
>>>>>>>> +            queryBuilder.append(" }");
>>>>>>>> +            List<Map<String, RdfTerm>> sparqlResults =
>>>>>>>> sparqlClient.queryResultSet(queryBuilder.toString());
>>>>>>>> +            final Iterator<Map<String, RdfTerm>> resultsIterator =
>>>>>>>> sparqlResults.iterator();
>>>>>>>> +            return new Iterator<Triple>() {
>>>>>>>> +
>>>>>>>> +                @Override
>>>>>>>> +                public boolean hasNext() {
>>>>>>>> +                    return resultsIterator.hasNext();
>>>>>>>> +                }
>>>>>>>> +
>>>>>>>> +                @Override
>>>>>>>> +                public Triple next() {
>>>>>>>> +                    Map<String, RdfTerm> result =
>>>>>> resultsIterator.next();
>>>>>>>> +                    return new TripleImpl(subject != null ?
>>> subject :
>>>>>>>> (BlankNodeOrIri)result.get("s"),
>>>>>>>> +                            predicate != null ? predicate :
>>>>>>>> (Iri)result.get("p"),
>>>>>>>> +                            object != null ? object :
>>>>>> result.get("o"));
>>>>>>>> +                }
>>>>>>>> +            };
>>>>>>>> +        } catch (IOException ex) {
>>>>>>>> +            throw new RuntimeException(ex);
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    protected int performSize() {
>>>>>>>> +        try {
>>>>>>>> +            return sparqlClient.queryResultSet("SELECT * WHERE {
>>> ?s ?p
>>>>>>>> ?o}").size();
>>>>>>>> +        } catch (IOException ex) {
>>>>>>>> +            throw new RuntimeException(ex);
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    private String asSparqlTerm(Iri iri) {
>>>>>>>> +        return "<"+iri.getUnicodeString()+">";
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    private String asSparqlTerm(Literal literal) {
>>>>>>>> +        //TODO langauge and datatype
>>>>>>>> +        return "\""+literal.getLexicalForm()+"\"";
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    private String asSparqlTerm(BlankNode bnode) {
>>>>>>>> +        //this requires adding additional clauses to the graph
>>> pattern
>>>>>>>> +        throw new UnsupportedOperationException("Not supported
>>> yet.");
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    private String asSparqlTerm(BlankNodeOrIri term) {
>>>>>>>> +        if (term instanceof Iri) {
>>>>>>>> +            return asSparqlTerm((Iri)term);
>>>>>>>> +        } else {
>>>>>>>> +            return asSparqlTerm((BlankNode)term);
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    private String asSparqlTerm(RdfTerm term) {
>>>>>>>> +        if (term instanceof BlankNodeOrIri) {
>>>>>>>> +            return asSparqlTerm((BlankNodeOrIri)term);
>>>>>>>> +        } else {
>>>>>>>> +            return asSparqlTerm((Literal)term);
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,106 @@
>>>>>>>> +/*
>>>>>>>> + * To change this license header, choose License Headers in Project
>>>>>>>> Properties.
>>>>>>>> + * To change this template file, choose Tools | Templates
>>>>>>>> + * and open the template in the editor.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.sparql;
>>>>>>>> +
>>>>>>>> +import com.hp.hpl.jena.query.DatasetAccessor;
>>>>>>>> +import com.hp.hpl.jena.query.DatasetAccessorFactory;
>>>>>>>> +import java.io.File;
>>>>>>>> +import java.io.IOException;
>>>>>>>> +import java.net.ServerSocket;
>>>>>>>> +import org.apache.jena.fuseki.EmbeddedFusekiServer;
>>>>>>>> +import com.hp.hpl.jena.rdf.model.Model;
>>>>>>>> +import com.hp.hpl.jena.rdf.model.ModelFactory;
>>>>>>>> +import java.io.InputStream;
>>>>>>>> +import java.util.HashSet;
>>>>>>>> +import java.util.Iterator;
>>>>>>>> +import java.util.Set;
>>>>>>>> +import org.apache.commons.rdf.Graph;
>>>>>>>> +import org.apache.commons.rdf.Iri;
>>>>>>>> +import org.apache.commons.rdf.Literal;
>>>>>>>> +import org.apache.commons.rdf.RdfTerm;
>>>>>>>> +import org.apache.commons.rdf.Triple;
>>>>>>>> +import org.apache.commons.rdf.impl.utils.PlainLiteralImpl;
>>>>>>>> +import org.junit.AfterClass;
>>>>>>>> +import org.junit.Assert;
>>>>>>>> +import org.junit.BeforeClass;
>>>>>>>> +import org.junit.Test;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author reto
>>>>>>>> + */
>>>>>>>> +public class SparqlGraphTest {
>>>>>>>> +
>>>>>>>> +    final static int serverPort = findFreePort();
>>>>>>>> +    static EmbeddedFusekiServer server;
>>>>>>>> +
>>>>>>>> +    @BeforeClass
>>>>>>>> +    public static void prepare() throws IOException {
>>>>>>>> +        final String serviceURI = "http://localhost:" +
>>> serverPort +
>>>>>>>> "/ds/data";
>>>>>>>> +        final DatasetAccessorFactory factory = new
>>>>>>>> DatasetAccessorFactory();
>>>>>>>> +        final DatasetAccessor accessor =
>>>>>> factory.createHTTP(serviceURI);
>>>>>>>> +        final InputStream in =
>>>>>>>> SparqlGraphTest.class.getResourceAsStream("grounded.ttl");
>>>>>>>> +        final Model m = ModelFactory.createDefaultModel();
>>>>>>>> +        String base = "http://example.org/";
>>>>>>>> +        m.read(in, base, "TURTLE");
>>>>>>>> +
>>>>>>>> +        final File dataSet = File.createTempFile("dataset",
>>> "fuseki");
>>>>>>>> +        dataSet.delete();
>>>>>>>> +        server = EmbeddedFusekiServer.memTDB(serverPort,
>>>>>>>> "/ds");//dataSet.getAbsolutePath());
>>>>>>>> +        server.start();
>>>>>>>> +        System.out.println("Started fuseki on port " + serverPort);
>>>>>>>> +        accessor.putModel(m);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @AfterClass
>>>>>>>> +    public static void cleanup() {
>>>>>>>> +        server.stop();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Test
>>>>>>>> +    public void graphSize() {
>>>>>>>> +        final Graph graph = new SparqlGraph("http://localhost:" +
>>>>>>>> serverPort + "/ds/query");
>>>>>>>> +        Assert.assertEquals("Graph not of the exepected size", 8,
>>>>>>>> graph.size());
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Test
>>>>>>>> +    public void filter1() {
>>>>>>>> +        final Graph graph = new SparqlGraph("http://localhost:" +
>>>>>>>> serverPort + "/ds/query");
>>>>>>>> +        final Iri spiderman = new Iri("
>>> http://example.org/#spiderman
>>>>>> ");
>>>>>>>> +        final Iri greenGoblin = new Iri("
>>>>>> http://example.org/#green-goblin
>>>>>>>> ");
>>>>>>>> +        final Iri enemyOf = new Iri("
>>>>>>>> http://www.perceive.net/schemas/relationship/enemyOf");
>>>>>>>> +        final Iri foafName = new Iri("
>>> http://xmlns.com/foaf/0.1/name
>>>>>> ");
>>>>>>>> +        {
>>>>>>>> +            final Iterator<Triple> iter = graph.filter(spiderman,
>>>>>> null,
>>>>>>>> greenGoblin);
>>>>>>>> +            Assert.assertTrue(iter.hasNext());
>>>>>>>> +            Assert.assertEquals(enemyOf,
>>> iter.next().getPredicate());
>>>>>>>> +            Assert.assertFalse(iter.hasNext());
>>>>>>>> +        }
>>>>>>>> +        {
>>>>>>>> +            final Iterator<Triple> iter = graph.filter(spiderman,
>>>>>>>> foafName, null);
>>>>>>>> +            Set<Literal> names = new HashSet<>();
>>>>>>>> +            for (int i = 0; i < 2; i++) {
>>>>>>>> +                Assert.assertTrue(iter.hasNext());
>>>>>>>> +                RdfTerm name = iter.next().getObject();
>>>>>>>> +                Assert.assertTrue(name instanceof Literal);
>>>>>>>> +                names.add((Literal)name);
>>>>>>>> +            }
>>>>>>>> +            Assert.assertFalse(iter.hasNext());
>>>>>>>> +            Assert.assertTrue(names.contains(new
>>>>>>>> PlainLiteralImpl("Spiderman")));
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    public static int findFreePort() {
>>>>>>>> +        int port = 0;
>>>>>>>> +        try (ServerSocket server = new ServerSocket(0);) {
>>>>>>>> +            port = server.getLocalPort();
>>>>>>>> +        } catch (Exception e) {
>>>>>>>> +            throw new RuntimeException("unable to find a free
>>> port");
>>>>>>>> +        }
>>>>>>>> +        return port;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,16 @@
>>>>>>>> +@base <http://example.org/> .
>>>>>>>> +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
>>>>>>>> +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
>>>>>>>> +@prefix foaf: <http://xmlns.com/foaf/0.1/> .
>>>>>>>> +@prefix rel: <http://www.perceive.net/schemas/relationship/> .
>>>>>>>> +
>>>>>>>> +<#green-goblin>
>>>>>>>> +    rel:enemyOf <#spiderman> ;
>>>>>>>> +    a foaf:Person ;    # in the context of the Marvel universe
>>>>>>>> +    foaf:name "Green Goblin" ;
>>>>>>>> +    foaf:age 128 .
>>>>>>>> +
>>>>>>>> +<#spiderman>
>>>>>>>> +    rel:enemyOf <#green-goblin> ;
>>>>>>>> +    a foaf:Person ;
>>>>>>>> +    foaf:name "Spiderman", "Человек-паук"@ru .
>>>>>>>> \ No newline at end of file
>>>>>>>>
>>>>>>>> Propchange: commons/sandbox/rdf/trunk/impl.utils/
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ------------------------------------------------------------------------------
>>>>>>>> --- svn:ignore (added)
>>>>>>>> +++ svn:ignore Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1 @@
>>>>>>>> +target
>>>>>>>>
>>>>>>>> Copied: commons/sandbox/rdf/trunk/impl.utils/pom.xml (from r1651181,
>>>>>>>> commons/sandbox/rdf/trunk/pom.xml)
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/pom.xml?p2=commons/sandbox/rdf/trunk/impl.utils/pom.xml&p1=commons/sandbox/rdf/trunk/pom.xml&r1=1651181&r2=1659973&rev=1659973&view=diff
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> --- commons/sandbox/rdf/trunk/pom.xml (original)
>>>>>>>> +++ commons/sandbox/rdf/trunk/impl.utils/pom.xml Sun Feb 15 18:41:15
>>>>>> 2015
>>>>>>>> @@ -22,13 +22,14 @@
>>>>>>>>       <parent>
>>>>>>>>           <groupId>org.apache.commons</groupId>
>>>>>>>>           <artifactId>commons-parent</artifactId>
>>>>>>>> -        <version>35</version>
>>>>>>>> +        <version>37</version>
>>>>>>>> +        <relativePath />
>>>>>>>>       </parent>
>>>>>>>>       <modelVersion>4.0.0</modelVersion>
>>>>>>>>       <groupId>commons-rdf</groupId>
>>>>>>>> -    <artifactId>commons-rdf</artifactId>
>>>>>>>> +    <artifactId>commons-rdf-impl-utils</artifactId>
>>>>>>>>       <version>0.1-SNAPSHOT</version>
>>>>>>>> -    <name>Apache Commons RDF</name>
>>>>>>>> +    <name>Apache Commons RDF Implementation Utils</name>
>>>>>>>>       <description>
>>>>>>>>           Apache Commons RDF provides an API modelling the RDF data
>>>>>> model
>>>>>>>> as defined by
>>>>>>>>           http://www.w3.org/TR/rdf11-concepts/
>>>>>>>> @@ -50,11 +51,22 @@
>>>>>>>>
>>>>>>>>       <dependencies>
>>>>>>>>           <dependency>
>>>>>>>> +            <groupId>commons-rdf</groupId>
>>>>>>>> +            <artifactId>commons-rdf-api</artifactId>
>>>>>>>> +            <version>0.1-SNAPSHOT</version>
>>>>>>>> +        </dependency>
>>>>>>>> +        <dependency>
>>>>>>>>               <groupId>junit</groupId>
>>>>>>>>               <artifactId>junit</artifactId>
>>>>>>>>               <version>4.12</version>
>>>>>>>>               <scope>test</scope>
>>>>>>>>           </dependency>
>>>>>>>> +        <dependency>
>>>>>>>> +            <groupId>org.slf4j</groupId>
>>>>>>>> +            <artifactId>slf4j-api</artifactId>
>>>>>>>> +            <version>1.7.7</version>
>>>>>>>> +            <type>jar</type>
>>>>>>>> +        </dependency>
>>>>>>>>       </dependencies>
>>>>>>>>
>>>>>>>>       <distributionManagement>
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,316 @@
>>>>>>>> +/*
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you under the Apache License, Version 2.0 (the
>>>>>>>> + * "License"); you may not use this file except in compliance
>>>>>>>> + * with the License.  You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *   http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>>>>>>> + * software distributed under the License is distributed on an
>>>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>> + * KIND, either express or implied.  See the License for the
>>>>>>>> + * specific language governing permissions and limitations
>>>>>>>> + * under the License.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.utils;
>>>>>>>> +
>>>>>>>> +import java.lang.ref.WeakReference;
>>>>>>>> +import java.util.AbstractCollection;
>>>>>>>> +import java.util.Collection;
>>>>>>>> +import java.util.Collections;
>>>>>>>> +import java.util.HashSet;
>>>>>>>> +import java.util.Iterator;
>>>>>>>> +
>>>>>>>> +import java.util.Set;
>>>>>>>> +import java.util.concurrent.locks.Lock;
>>>>>>>> +import java.util.concurrent.locks.ReadWriteLock;
>>>>>>>> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>>>>>>>> +import org.apache.commons.rdf.BlankNodeOrIri;
>>>>>>>> +import org.apache.commons.rdf.RdfTerm;
>>>>>>>> +import org.apache.commons.rdf.Triple;
>>>>>>>> +import org.apache.commons.rdf.Graph;
>>>>>>>> +import org.apache.commons.rdf.ImmutableGraph;
>>>>>>>> +import org.apache.commons.rdf.Iri;
>>>>>>>> +import org.apache.commons.rdf.WatchableGraph;
>>>>>>>> +import org.apache.commons.rdf.event.AddEvent;
>>>>>>>> +import org.apache.commons.rdf.event.FilterTriple;
>>>>>>>> +import org.apache.commons.rdf.event.GraphEvent;
>>>>>>>> +import org.apache.commons.rdf.event.GraphListener;
>>>>>>>> +import org.apache.commons.rdf.event.RemoveEvent;
>>>>>>>> +import
>>>>>>>>
>>> org.apache.commons.rdf.impl.utils.debug.ReentrantReadWriteLockTracker;
>>>>>>>> +import
>>> org.apache.commons.rdf.impl.utils.simple.SimpleImmutableGraph;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + * An abstract implementation of <code>Graph</code> implementing
>>>>>>>> + * <code>iterator</code> and <code>contains</code> calling
>>>>>>>> <code>filter</code>.
>>>>>>>> + *
>>>>>>>> + * @author reto
>>>>>>>> + */
>>>>>>>> +public abstract class AbstractGraph extends
>>> AbstractCollection<Triple>
>>>>>>>> +        implements Graph {
>>>>>>>> +
>>>>>>>> +
>>>>>>>> +    private static final String DEBUG_MODE = "rdfLocksDebugging";
>>>>>>>> +    private final ReadWriteLock lock;
>>>>>>>> +
>>>>>>>> +    private final Lock readLock;
>>>>>>>> +    private final Lock writeLock;
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * Constructs a LocalbleMGraph for an Graph.
>>>>>>>> +     *
>>>>>>>> +     * @param providedMGraph a non-lockable graph
>>>>>>>> +     */
>>>>>>>> +    public AbstractGraph() {
>>>>>>>> +        {
>>>>>>>> +            String debugMode = System.getProperty(DEBUG_MODE);
>>>>>>>> +            if (debugMode != null &&
>>>>>>>> debugMode.toLowerCase().equals("true")) {
>>>>>>>> +                lock = new ReentrantReadWriteLockTracker();
>>>>>>>> +            } else {
>>>>>>>> +                lock = new ReentrantReadWriteLock();
>>>>>>>> +            }
>>>>>>>> +        }
>>>>>>>> +        readLock = lock.readLock();
>>>>>>>> +        writeLock = lock.writeLock();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    public AbstractGraph(final ReadWriteLock lock) {
>>>>>>>> +        this.lock = lock;
>>>>>>>> +        readLock = lock.readLock();
>>>>>>>> +        writeLock = lock.writeLock();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public ReadWriteLock getLock() {
>>>>>>>> +        return lock;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public ImmutableGraph getImmutableGraph() {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performGetImmutableGraph();
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    public ImmutableGraph performGetImmutableGraph() {
>>>>>>>> +        return new SimpleImmutableGraph(this);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
>>>>>> predicate,
>>>>>>>> RdfTerm object) {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return new LockingIterator(performFilter(subject,
>>>>>> predicate,
>>>>>>>> object), lock);
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int size() {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performSize();
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean isEmpty() {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performIsEmpty();
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    @SuppressWarnings("element-type-mismatch")
>>>>>>>> +    public boolean contains(Object o) {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performContains(o);
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Iterator<Triple> iterator() {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return new LockingIterator(performIterator(), lock);
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Object[] toArray() {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performToArray();
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public <T> T[] toArray(T[] a) {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performToArray(a);
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean containsAll(Collection<?> c) {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performContainsAll(c);
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean add(Triple e) {
>>>>>>>> +        writeLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performAdd(e);
>>>>>>>> +        } finally {
>>>>>>>> +            writeLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean remove(Object o) {
>>>>>>>> +        writeLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performRemove(o);
>>>>>>>> +        } finally {
>>>>>>>> +            writeLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean addAll(Collection<? extends Triple> c) {
>>>>>>>> +        writeLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performAddAll(c);
>>>>>>>> +        } finally {
>>>>>>>> +            writeLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean removeAll(Collection<?> c) {
>>>>>>>> +        writeLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performRemoveAll(c);
>>>>>>>> +        } finally {
>>>>>>>> +            writeLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean retainAll(Collection<?> c) {
>>>>>>>> +        writeLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return performRetainAll(c);
>>>>>>>> +        } finally {
>>>>>>>> +            writeLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void clear() {
>>>>>>>> +        writeLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            performClear();
>>>>>>>> +        } finally {
>>>>>>>> +            writeLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean equals(Object obj) {
>>>>>>>> +        /*if (obj == null) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        if (obj == this) {
>>>>>>>> +            return true;
>>>>>>>> +        }
>>>>>>>> +        if (obj.getClass() != getClass()) {
>>>>>>>> +            return false;
>>>>>>>> +        }*/
>>>>>>>> +        return this == obj;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +
>>>>>>>> +    protected abstract Iterator<Triple>
>>> performFilter(BlankNodeOrIri
>>>>>>>> subject, Iri predicate, RdfTerm object);
>>>>>>>> +
>>>>>>>> +    protected abstract int performSize();
>>>>>>>> +
>>>>>>>> +    protected boolean performIsEmpty() {
>>>>>>>> +        return super.isEmpty();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected Object[] performToArray() {
>>>>>>>> +        return super.toArray();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected boolean performRemove(Object o) {
>>>>>>>> +        return super.remove(o);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected boolean performAddAll(Collection<? extends Triple>
>>> c) {
>>>>>>>> +        return super.addAll(c);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected boolean performRemoveAll(Collection<?> c) {
>>>>>>>> +        return super.removeAll(c);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected boolean performRetainAll(Collection<?> c) {
>>>>>>>> +        return super.retainAll(c);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected void performClear() {
>>>>>>>> +        super.clear();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected boolean performContains(Object o) {
>>>>>>>> +        return super.contains(o);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected Iterator<Triple> performIterator() {
>>>>>>>> +        return performFilter(null, null, null);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected boolean performContainsAll(Collection<?> c) {
>>>>>>>> +        return super.containsAll(c);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected <T> T[] performToArray(T[] a) {
>>>>>>>> +        return super.toArray(a);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    protected boolean performAdd(Triple e) {
>>>>>>>> +        return super.add(e);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,112 @@
>>>>>>>> +/*
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you under the Apache License, Version 2.0 (the
>>>>>>>> + * "License"); you may not use this file except in compliance
>>>>>>>> + * with the License.  You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *   http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>>>>>>> + * software distributed under the License is distributed on an
>>>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>> + * KIND, either express or implied.  See the License for the
>>>>>>>> + * specific language governing permissions and limitations
>>>>>>>> + * under the License.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.utils;
>>>>>>>> +
>>>>>>>> +import java.util.Collection;
>>>>>>>> +import java.util.Iterator;
>>>>>>>> +
>>>>>>>> +import org.apache.commons.rdf.BlankNode;
>>>>>>>> +import org.apache.commons.rdf.ImmutableGraph;
>>>>>>>> +import org.apache.commons.rdf.RdfTerm;
>>>>>>>> +import org.apache.commons.rdf.Triple;
>>>>>>>> +import
>>> org.apache.commons.rdf.impl.utils.graphmatching.GraphMatcher;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + * <code>AbstractGraph</code> is an abstract implementation of
>>>>>>>> <code>ImmutableGraph</code>
>>>>>>>> + * implementing the <code>equals</code> and the
>>> <code>hashCode</code>
>>>>>>>> methods.
>>>>>>>> + *
>>>>>>>> + * @author reto
>>>>>>>> + *
>>>>>>>> + */
>>>>>>>> +public abstract class AbstractImmutableGraph extends AbstractGraph
>>>>>>>> +        implements ImmutableGraph {
>>>>>>>> +
>>>>>>>> +    public final synchronized int hashCode() {
>>>>>>>> +        int result = 0;
>>>>>>>> +        for (Iterator<Triple> iter = iterator(); iter.hasNext();) {
>>>>>>>> +            result += getBlankNodeBlindHash(iter.next());
>>>>>>>> +        }
>>>>>>>> +        return result;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * @param triple
>>>>>>>> +     * @return hash without BNode hashes
>>>>>>>> +     */
>>>>>>>> +    private int getBlankNodeBlindHash(Triple triple) {
>>>>>>>> +        int hash = triple.getPredicate().hashCode();
>>>>>>>> +        RdfTerm subject = triple.getSubject();
>>>>>>>> +
>>>>>>>> +        if (!(subject instanceof BlankNode)) {
>>>>>>>> +            hash ^= subject.hashCode() >> 1;
>>>>>>>> +        }
>>>>>>>> +        RdfTerm object = triple.getObject();
>>>>>>>> +        if (!(object instanceof BlankNode)) {
>>>>>>>> +            hash ^= object.hashCode() << 1;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        return hash;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean add(Triple e) {
>>>>>>>> +        throw new UnsupportedOperationException("Graphs are not
>>>>>> mutable,
>>>>>>>> use Graph");
>>>>>>>> +
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean addAll(Collection<? extends Triple> c) {
>>>>>>>> +        throw new UnsupportedOperationException("Graphs are not
>>>>>> mutable,
>>>>>>>> use Graph");
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean remove(Object o) {
>>>>>>>> +        throw new UnsupportedOperationException("Graphs are not
>>>>>> mutable,
>>>>>>>> use Graph");
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean removeAll(Collection<?> c) {
>>>>>>>> +        throw new UnsupportedOperationException("Graphs are not
>>>>>> mutable,
>>>>>>>> use Graph");
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void clear() {
>>>>>>>> +        throw new UnsupportedOperationException("Graphs are not
>>>>>> mutable,
>>>>>>>> use Graph");
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public ImmutableGraph getImmutableGraph() {
>>>>>>>> +        return this;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean equals(Object obj) {
>>>>>>>> +        if (this == obj) {
>>>>>>>> +            return true;
>>>>>>>> +        }
>>>>>>>> +        if (!(obj instanceof ImmutableGraph)) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        if (hashCode() != obj.hashCode()) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        return GraphMatcher.getValidMapping(this, (ImmutableGraph)
>>>>>> obj)
>>>>>>>> != null;
>>>>>>>> +    }
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,61 @@
>>>>>>>> +/*
>>>>>>>> + * Copyright 2015 The Apache Software Foundation.
>>>>>>>> + *
>>>>>>>> + * Licensed under the Apache License, Version 2.0 (the "License");
>>>>>>>> + * you may not use this file except in compliance with the License.
>>>>>>>> + * You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>> software
>>>>>>>> + * distributed under the License is distributed on an "AS IS"
>>> BASIS,
>>>>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>>>>>>>> implied.
>>>>>>>> + * See the License for the specific language governing permissions
>>> and
>>>>>>>> + * limitations under the License.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.utils;
>>>>>>>> +
>>>>>>>> +import org.apache.commons.rdf.Literal;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author developer
>>>>>>>> + */
>>>>>>>> +public abstract class AbstractLiteral implements Literal {
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int hashCode() {
>>>>>>>> +        int result = 0;
>>>>>>>> +        if (getLanguage() != null) {
>>>>>>>> +            result = getLanguage().hashCode();
>>>>>>>> +        }
>>>>>>>> +        result += getLexicalForm().hashCode();
>>>>>>>> +        result += getDataType().hashCode();
>>>>>>>> +        return result;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean equals(Object obj) {
>>>>>>>> +        if (this == obj) {
>>>>>>>> +            return true;
>>>>>>>> +        }
>>>>>>>> +        if (obj instanceof Literal) {
>>>>>>>> +            Literal other = (Literal) obj;
>>>>>>>> +
>>>>>>>> +            if (getLanguage() == null) {
>>>>>>>> +                if (other.getLanguage() != null) {
>>>>>>>> +                    return false;
>>>>>>>> +                }
>>>>>>>> +            } else {
>>>>>>>> +                if (!getLanguage().equals(other.getLanguage())) {
>>>>>>>> +                    return false;
>>>>>>>> +                }
>>>>>>>> +            }
>>>>>>>> +            boolean res =
>>> getDataType().equals(other.getDataType()) &&
>>>>>>>> getLexicalForm().equals(other.getLexicalForm());
>>>>>>>> +            return res;
>>>>>>>> +        } else {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,112 @@
>>>>>>>> +/*
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you under the Apache License, Version 2.0 (the
>>>>>>>> + * "License"); you may not use this file except in compliance
>>>>>>>> + * with the License.  You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *   http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>>>>>>> + * software distributed under the License is distributed on an
>>>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>> + * KIND, either express or implied.  See the License for the
>>>>>>>> + * specific language governing permissions and limitations
>>>>>>>> + * under the License.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.utils;
>>>>>>>> +
>>>>>>>> +import java.lang.ref.WeakReference;
>>>>>>>> +import java.util.*;
>>>>>>>> +
>>>>>>>> +import org.apache.commons.rdf.event.GraphEvent;
>>>>>>>> +import org.apache.commons.rdf.event.GraphListener;
>>>>>>>> +import org.slf4j.Logger;
>>>>>>>> +import org.slf4j.LoggerFactory;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author reto
>>>>>>>> + */
>>>>>>>> +class DelayedNotificator {
>>>>>>>> +
>>>>>>>> +    private static final Logger log =
>>>>>>>> LoggerFactory.getLogger(DelayedNotificator.class);
>>>>>>>> +    private static Timer timer = new Timer("Event delivery
>>>>>> timer",true);
>>>>>>>> +
>>>>>>>> +    static class ListenerHolder {
>>>>>>>> +
>>>>>>>> +        long delay;
>>>>>>>> +        List<GraphEvent> events = null;
>>>>>>>> +        WeakReference<GraphListener> listenerRef;
>>>>>>>> +
>>>>>>>> +        public ListenerHolder(GraphListener listener, long delay) {
>>>>>>>> +            this.listenerRef = new
>>>>>> WeakReference<GraphListener>(listener);
>>>>>>>> +            this.delay = delay;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        private void registerEvent(GraphEvent event) {
>>>>>>>> +            synchronized (this) {
>>>>>>>> +                if (events == null) {
>>>>>>>> +                    events = new ArrayList<GraphEvent>();
>>>>>>>> +                    events.add(event);
>>>>>>>> +                    timer.schedule(new TimerTask() {
>>>>>>>> +
>>>>>>>> +                        @Override
>>>>>>>> +                        public void run() {
>>>>>>>> +                            List<GraphEvent> eventsLocal;
>>>>>>>> +                            synchronized (ListenerHolder.this) {
>>>>>>>> +                                eventsLocal = events;
>>>>>>>> +                                events = null;
>>>>>>>> +                            }
>>>>>>>> +                            GraphListener listener =
>>>>>> listenerRef.get();
>>>>>>>> +                            if (listener == null) {
>>>>>>>> +                                log.debug("Ignoring garbage
>>> collected
>>>>>>>> listener");
>>>>>>>> +                            } else {
>>>>>>>> +                                try {
>>>>>>>> +
>>>>>> listener.graphChanged(eventsLocal);
>>>>>>>> +                                } catch (Exception e) {
>>>>>>>> +                                    log.warn("Exception delivering
>>>>>>>> ImmutableGraph event", e);
>>>>>>>> +                                }
>>>>>>>> +                            }
>>>>>>>> +                        }
>>>>>>>> +                    }, delay);
>>>>>>>> +                } else {
>>>>>>>> +                    events.add(event);
>>>>>>>> +                }
>>>>>>>> +            }
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    private final Map<GraphListener, ListenerHolder> map =
>>>>>>>> Collections.synchronizedMap(
>>>>>>>> +            new WeakHashMap<GraphListener, ListenerHolder>());
>>>>>>>> +
>>>>>>>> +    void addDelayedListener(GraphListener listener, long delay) {
>>>>>>>> +        map.put(listener, new ListenerHolder(listener, delay));
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * removes a Listener, this doesn't prevent the listenerRef
>>> from
>>>>>>>> receiving
>>>>>>>> +     * events alreay scheduled.
>>>>>>>> +     *
>>>>>>>> +     * @param listenerRef
>>>>>>>> +     */
>>>>>>>> +    void removeDelayedListener(GraphListener listener) {
>>>>>>>> +        map.remove(listener);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * if the listenerRef has not been registered as delayed
>>>>>> listenerRef
>>>>>>>> te events is
>>>>>>>> +     * forwarded synchroneously
>>>>>>>> +     * @param event
>>>>>>>> +     */
>>>>>>>> +    void sendEventToListener(GraphListener listener, GraphEvent
>>>>>> event) {
>>>>>>>> +        ListenerHolder holder = map.get(listener);
>>>>>>>> +        if (holder == null) {
>>>>>>>> +
>>> listener.graphChanged(Collections.singletonList(event));
>>>>>>>> +        } else {
>>>>>>>> +            holder.registerEvent(event);
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,73 @@
>>>>>>>> +/*
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you under the Apache License, Version 2.0 (the
>>>>>>>> + * "License"); you may not use this file except in compliance
>>>>>>>> + * with the License.  You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *   http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>>>>>>> + * software distributed under the License is distributed on an
>>>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>> + * KIND, either express or implied.  See the License for the
>>>>>>>> + * specific language governing permissions and limitations
>>>>>>>> + * under the License.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.utils;
>>>>>>>> +
>>>>>>>> +import java.util.Iterator;
>>>>>>>> +import java.util.concurrent.locks.Lock;
>>>>>>>> +import java.util.concurrent.locks.ReadWriteLock;
>>>>>>>> +import org.apache.commons.rdf.Triple;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + * Wrapps an iterator<Triple> reading entering a read-lock on every
>>>>>>>> invocation
>>>>>>>> + * of hasNext and next
>>>>>>>> + * @author reto
>>>>>>>> + */
>>>>>>>> +class LockingIterator implements Iterator<Triple> {
>>>>>>>> +
>>>>>>>> +    private Iterator<Triple> base;
>>>>>>>> +    private Lock readLock;
>>>>>>>> +    private Lock writeLock;
>>>>>>>> +
>>>>>>>> +    public LockingIterator(Iterator<Triple> iterator, ReadWriteLock
>>>>>> lock)
>>>>>>>> {
>>>>>>>> +        base = iterator;
>>>>>>>> +        readLock = lock.readLock();
>>>>>>>> +        writeLock = lock.writeLock();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean hasNext() {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return base.hasNext();
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Triple next() {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            return base.next();
>>>>>>>> +        } finally {
>>>>>>>> +            readLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void remove() {
>>>>>>>> +        writeLock.lock();
>>>>>>>> +        try {
>>>>>>>> +            base.remove();
>>>>>>>> +        } finally {
>>>>>>>> +            writeLock.unlock();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,104 @@
>>>>>>>> +/*
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you under the Apache License, Version 2.0 (the
>>>>>>>> + * "License"); you may not use this file except in compliance
>>>>>>>> + * with the License.  You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *   http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>>>>>>> + * software distributed under the License is distributed on an
>>>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>> + * KIND, either express or implied.  See the License for the
>>>>>>>> + * specific language governing permissions and limitations
>>>>>>>> + * under the License.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.utils;
>>>>>>>> +
>>>>>>>> +import java.io.Serializable;
>>>>>>>> +import org.apache.commons.rdf.Iri;
>>>>>>>> +
>>>>>>>> +import org.apache.commons.rdf.Language;
>>>>>>>> +import org.apache.commons.rdf.Literal;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author reto
>>>>>>>> + */
>>>>>>>> +public class PlainLiteralImpl implements Literal, Serializable {
>>>>>>>> +
>>>>>>>> +    private String lexicalForm;
>>>>>>>> +    private Language language = null;
>>>>>>>> +
>>>>>>>> +    public PlainLiteralImpl(String value) {
>>>>>>>> +        if (value == null) {
>>>>>>>> +            throw new IllegalArgumentException("The literal string
>>>>>> cannot
>>>>>>>> be null");
>>>>>>>> +        }
>>>>>>>> +        this.lexicalForm = value;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    public PlainLiteralImpl(String value, Language language) {
>>>>>>>> +        if (value == null) {
>>>>>>>> +            throw new IllegalArgumentException("The literal string
>>>>>> cannot
>>>>>>>> be null");
>>>>>>>> +        }
>>>>>>>> +        this.lexicalForm = value;
>>>>>>>> +        this.language = language;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public String getLexicalForm() {
>>>>>>>> +        return lexicalForm;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean equals(Object otherObj) {
>>>>>>>> +        if (!(otherObj instanceof Literal)) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        Literal other = (Literal) otherObj;
>>>>>>>> +        if (!lexicalForm.equals(other.getLexicalForm())) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        if (language != null) {
>>>>>>>> +            return language.equals(other.getLanguage());
>>>>>>>> +        }
>>>>>>>> +        if (other.getLanguage() != null) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        return true;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int hashCode() {
>>>>>>>> +        int hash = lexicalForm.hashCode() + XSD_STRING_HASH;
>>>>>>>> +        if (language != null) {
>>>>>>>> +            hash += language.hashCode();
>>>>>>>> +        }
>>>>>>>> +        return hash;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Language getLanguage() {
>>>>>>>> +        return language;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public String toString() {
>>>>>>>> +        StringBuffer result = new StringBuffer();
>>>>>>>> +        result.append('\"').append(lexicalForm).append('\"');
>>>>>>>> +        if (language != null) {
>>>>>>>> +            result.append("@").append(language.toString());
>>>>>>>> +        }
>>>>>>>> +        return result.toString();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Iri getDataType() {
>>>>>>>> +        return XSD_STRING;
>>>>>>>> +    }
>>>>>>>> +    private static final Iri XSD_STRING = new Iri("
>>>>>>>> http://www.w3.org/2001/XMLSchema#string");
>>>>>>>> +    private static final int XSD_STRING_HASH =
>>> XSD_STRING.hashCode();
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,100 @@
>>>>>>>> +/*
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you under the Apache License, Version 2.0 (the
>>>>>>>> + * "License"); you may not use this file except in compliance
>>>>>>>> + * with the License.  You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *   http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>>>>>>> + * software distributed under the License is distributed on an
>>>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>> + * KIND, either express or implied.  See the License for the
>>>>>>>> + * specific language governing permissions and limitations
>>>>>>>> + * under the License.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.utils;
>>>>>>>> +
>>>>>>>> +import org.apache.commons.rdf.BlankNodeOrIri;
>>>>>>>> +import org.apache.commons.rdf.RdfTerm;
>>>>>>>> +import org.apache.commons.rdf.Triple;
>>>>>>>> +import org.apache.commons.rdf.Iri;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author reto
>>>>>>>> + */
>>>>>>>> +public class TripleImpl implements Triple {
>>>>>>>> +
>>>>>>>> +    private final BlankNodeOrIri subject;
>>>>>>>> +    private final Iri predicate;
>>>>>>>> +    private final RdfTerm object;
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * Creates a new <code>TripleImpl</code>.
>>>>>>>> +     *
>>>>>>>> +     * @param subject  the subject.
>>>>>>>> +     * @param predicate  the predicate.
>>>>>>>> +     * @param object  the object.
>>>>>>>> +     * @throws IllegalArgumentException  if an attribute is
>>>>>>>> <code>null</code>.
>>>>>>>> +     */
>>>>>>>> +    public TripleImpl(BlankNodeOrIri subject, Iri predicate,
>>> RdfTerm
>>>>>>>> object) {
>>>>>>>> +        if (subject == null) {
>>>>>>>> +            throw new IllegalArgumentException("Invalid subject:
>>>>>> null");
>>>>>>>> +        } else if (predicate == null) {
>>>>>>>> +            throw new IllegalArgumentException("Invalid predicate:
>>>>>> null");
>>>>>>>> +        } else if (object == null) {
>>>>>>>> +            throw new IllegalArgumentException("Invalid object:
>>>>>> null");
>>>>>>>> +        }
>>>>>>>> +        this.subject = subject;
>>>>>>>> +        this.predicate = predicate;
>>>>>>>> +        this.object = object;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean equals(Object obj) {
>>>>>>>> +        if (obj == null) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        if (!(obj instanceof Triple)) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        final Triple other = (Triple) obj;
>>>>>>>> +        if (!this.subject.equals(other.getSubject())) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        if (!this.predicate.equals(other.getPredicate())) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        if (!this.object.equals(other.getObject())) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        return true;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int hashCode() {
>>>>>>>> +        return (subject.hashCode() >> 1) ^ predicate.hashCode() ^
>>>>>>>> (object.hashCode() << 1);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public BlankNodeOrIri getSubject() {
>>>>>>>> +        return subject;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    public Iri getPredicate() {
>>>>>>>> +        return predicate;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    public RdfTerm getObject() {
>>>>>>>> +        return object;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public String toString() {
>>>>>>>> +        return subject + " " + predicate + " " + object + ".";
>>>>>>>> +    }
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,80 @@
>>>>>>>> +/*
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you under the Apache License, Version 2.0 (the
>>>>>>>> + * "License"); you may not use this file except in compliance
>>>>>>>> + * with the License.  You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *   http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>>>>>>> + * software distributed under the License is distributed on an
>>>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>> + * KIND, either express or implied.  See the License for the
>>>>>>>> + * specific language governing permissions and limitations
>>>>>>>> + * under the License.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.utils;
>>>>>>>> +
>>>>>>>> +import java.io.Serializable;
>>>>>>>> +
>>>>>>>> +import org.apache.commons.rdf.Iri;
>>>>>>>> +import org.apache.commons.rdf.Language;
>>>>>>>> +import org.apache.commons.rdf.Literal;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author reto
>>>>>>>> + */
>>>>>>>> +public class TypedLiteralImpl extends AbstractLiteral implements
>>>>>>>> Serializable {
>>>>>>>> +    private String lexicalForm;
>>>>>>>> +    private Iri dataType;
>>>>>>>> +    private int hashCode;
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * @param lexicalForm
>>>>>>>> +     * @param dataType
>>>>>>>> +     */
>>>>>>>> +    public TypedLiteralImpl(String lexicalForm, Iri dataType) {
>>>>>>>> +        this.lexicalForm = lexicalForm;
>>>>>>>> +        this.dataType = dataType;
>>>>>>>> +        this.hashCode = lexicalForm.hashCode()+dataType.hashCode();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    public Iri getDataType() {
>>>>>>>> +        return dataType;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /* (non-Javadoc)
>>>>>>>> +     * @see
>>> org.apache.clerezza.rdf.core.LiteralNode#getLexicalForm()
>>>>>>>> +     */
>>>>>>>> +    @Override
>>>>>>>> +    public String getLexicalForm() {
>>>>>>>> +        return lexicalForm;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int hashCode() {
>>>>>>>> +        return hashCode;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public String toString() {
>>>>>>>> +        StringBuffer result = new StringBuffer();
>>>>>>>> +        result.append('\"');
>>>>>>>> +        result.append(getLexicalForm());
>>>>>>>> +        result.append('\"');
>>>>>>>> +        result.append("^^");
>>>>>>>> +        result.append(getDataType());
>>>>>>>> +        return result.toString();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Language getLanguage() {
>>>>>>>> +        return null;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,289 @@
>>>>>>>> +/*
>>>>>>>> + * Copyright 2015 The Apache Software Foundation.
>>>>>>>> + *
>>>>>>>> + * Licensed under the Apache License, Version 2.0 (the "License");
>>>>>>>> + * you may not use this file except in compliance with the License.
>>>>>>>> + * You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>> software
>>>>>>>> + * distributed under the License is distributed on an "AS IS"
>>> BASIS,
>>>>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>>>>>>>> implied.
>>>>>>>> + * See the License for the specific language governing permissions
>>> and
>>>>>>>> + * limitations under the License.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.utils;
>>>>>>>> +
>>>>>>>> +import java.lang.ref.WeakReference;
>>>>>>>> +import java.util.Collection;
>>>>>>>> +import java.util.Collections;
>>>>>>>> +import java.util.HashSet;
>>>>>>>> +import java.util.Iterator;
>>>>>>>> +import java.util.Set;
>>>>>>>> +import java.util.concurrent.locks.ReadWriteLock;
>>>>>>>> +import org.apache.commons.rdf.BlankNodeOrIri;
>>>>>>>> +import org.apache.commons.rdf.Graph;
>>>>>>>> +import org.apache.commons.rdf.ImmutableGraph;
>>>>>>>> +import org.apache.commons.rdf.Iri;
>>>>>>>> +import org.apache.commons.rdf.RdfTerm;
>>>>>>>> +import org.apache.commons.rdf.Triple;
>>>>>>>> +import org.apache.commons.rdf.WatchableGraph;
>>>>>>>> +import org.apache.commons.rdf.event.AddEvent;
>>>>>>>> +import org.apache.commons.rdf.event.FilterTriple;
>>>>>>>> +import org.apache.commons.rdf.event.GraphEvent;
>>>>>>>> +import org.apache.commons.rdf.event.GraphListener;
>>>>>>>> +import org.apache.commons.rdf.event.RemoveEvent;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author developer
>>>>>>>> + */
>>>>>>>> +public class WatchableGraphWrapper implements WatchableGraph {
>>>>>>>> +
>>>>>>>> +    final Graph wrapped;
>>>>>>>> +
>>>>>>>> +    public WatchableGraphWrapper(Graph wrapped) {
>>>>>>>> +        this.wrapped = wrapped;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +
>>>>>>>> +    //all listeners
>>>>>>>> +    private final Set<ListenerConfiguration> listenerConfigs =
>>>>>>>> Collections.synchronizedSet(
>>>>>>>> +            new HashSet<ListenerConfiguration>());
>>>>>>>> +    private DelayedNotificator delayedNotificator = new
>>>>>>>> DelayedNotificator();
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Iterator<Triple> iterator() {
>>>>>>>> +        return filter(null, null, null);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean contains(Object o) {
>>>>>>>> +        if (!(o instanceof Triple)) {
>>>>>>>> +            return false;
>>>>>>>> +        }
>>>>>>>> +        Triple t = (Triple) o;
>>>>>>>> +        return filter(t.getSubject(), t.getPredicate(),
>>>>>>>> t.getObject()).hasNext();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
>>>>>> predicate,
>>>>>>>> +            RdfTerm object) {
>>>>>>>> +        final Iterator<Triple> baseIter = wrapped.filter(subject,
>>>>>>>> predicate, object);
>>>>>>>> +        return new Iterator<Triple>() {
>>>>>>>> +
>>>>>>>> +            Triple currentTriple = null;
>>>>>>>> +
>>>>>>>> +            @Override
>>>>>>>> +            public boolean hasNext() {
>>>>>>>> +                return baseIter.hasNext();
>>>>>>>> +            }
>>>>>>>> +
>>>>>>>> +            @Override
>>>>>>>> +            public Triple next() {
>>>>>>>> +                currentTriple = baseIter.next();
>>>>>>>> +                return currentTriple;
>>>>>>>> +            }
>>>>>>>> +
>>>>>>>> +            @Override
>>>>>>>> +            public void remove() {
>>>>>>>> +                baseIter.remove();
>>>>>>>> +                dispatchEvent(new
>>>>>> RemoveEvent(WatchableGraphWrapper.this,
>>>>>>>> currentTriple));
>>>>>>>> +            }
>>>>>>>> +        };
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean add(Triple triple) {
>>>>>>>> +        boolean success = performAdd(triple);
>>>>>>>> +        if (success) {
>>>>>>>> +            dispatchEvent(new AddEvent(this, triple));
>>>>>>>> +        }
>>>>>>>> +        return success;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * A subclass of <code>AbstractGraph</code> should override
>>>>>>>> +     * this method instead of <code>add</code> for Graph event
>>>>>> support to
>>>>>>>> be
>>>>>>>> +     * added.
>>>>>>>> +     *
>>>>>>>> +     * @param e The triple to be added to the triple collection
>>>>>>>> +     * @return
>>>>>>>> +     */
>>>>>>>> +    protected boolean performAdd(Triple e) {
>>>>>>>> +        return wrapped.add(e);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean remove(Object o) {
>>>>>>>> +        Triple triple = (Triple) o;
>>>>>>>> +        boolean success = performRemove(triple);
>>>>>>>> +        if (success) {
>>>>>>>> +            dispatchEvent(new RemoveEvent(this, triple));
>>>>>>>> +        }
>>>>>>>> +        return success;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean removeAll(Collection<?> c) {
>>>>>>>> +        boolean modified = false;
>>>>>>>> +        for (Iterator<? extends Object> it = c.iterator();
>>>>>> it.hasNext();)
>>>>>>>> {
>>>>>>>> +            Object object = it.next();
>>>>>>>> +            if (remove(object)) {
>>>>>>>> +                modified = true;
>>>>>>>> +            }
>>>>>>>> +        }
>>>>>>>> +        return modified;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * A subclass of <code>AbstractGraph</code> should override
>>>>>>>> +     * this method instead of <code>remove</code> for
>>> ImmutableGraph
>>>>>>>> event support to be
>>>>>>>> +     * added.
>>>>>>>> +     *
>>>>>>>> +     * @param o The triple to be removed from the triple collection
>>>>>>>> +     * @return
>>>>>>>> +     */
>>>>>>>> +    protected boolean performRemove(Triple triple) {
>>>>>>>> +        Iterator<Triple> e = filter(null, null, null);
>>>>>>>> +        while (e.hasNext()) {
>>>>>>>> +            if (triple.equals(e.next())) {
>>>>>>>> +                e.remove();
>>>>>>>> +                return true;
>>>>>>>> +            }
>>>>>>>> +        }
>>>>>>>> +        return false;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * Dispatches a <code>GraphEvent</code> to all registered
>>>>>> listeners
>>>>>>>> for which
>>>>>>>> +     * the specified <code>Triple</code> matches the
>>>>>>>> <code>FilterTriple</code>s
>>>>>>>> +     * of the listeners.
>>>>>>>> +     *
>>>>>>>> +     * @param triple The Triple that was modified
>>>>>>>> +     * @param type The type of modification
>>>>>>>> +     */
>>>>>>>> +    protected void dispatchEvent(GraphEvent event) {
>>>>>>>> +        synchronized(listenerConfigs) {
>>>>>>>> +            Iterator<ListenerConfiguration> iter =
>>>>>>>> listenerConfigs.iterator();
>>>>>>>> +            while (iter.hasNext()) {
>>>>>>>> +                ListenerConfiguration config = iter.next();
>>>>>>>> +                GraphListener registeredListener =
>>>>>> config.getListener();
>>>>>>>> +                if (registeredListener == null) {
>>>>>>>> +                    iter.remove();
>>>>>>>> +                    continue;
>>>>>>>> +                }
>>>>>>>> +                if (config.getFilter().match(event.getTriple())) {
>>>>>>>> +
>>>>>>>> delayedNotificator.sendEventToListener(registeredListener, event);
>>>>>>>> +                }
>>>>>>>> +            }
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void addGraphListener(GraphListener listener,
>>> FilterTriple
>>>>>>>> filter) {
>>>>>>>> +        addGraphListener(listener, filter, 0);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void addGraphListener(GraphListener listener,
>>> FilterTriple
>>>>>>>> filter,
>>>>>>>> +            long delay) {
>>>>>>>> +        listenerConfigs.add(new ListenerConfiguration(listener,
>>>>>> filter));
>>>>>>>> +        if (delay > 0) {
>>>>>>>> +            delayedNotificator.addDelayedListener(listener, delay);
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void removeGraphListener(GraphListener listener) {
>>>>>>>> +        synchronized(listenerConfigs) {
>>>>>>>> +            Iterator<ListenerConfiguration> iter =
>>>>>>>> listenerConfigs.iterator();
>>>>>>>> +            while (iter.hasNext()) {
>>>>>>>> +                ListenerConfiguration listenerConfig = iter.next();
>>>>>>>> +                GraphListener registeredListener =
>>>>>>>> listenerConfig.getListener();
>>>>>>>> +                if ((registeredListener == null) ||
>>>>>>>> (registeredListener.equals(listener))) {
>>>>>>>> +                    iter.remove();
>>>>>>>> +                }
>>>>>>>> +            }
>>>>>>>> +        }
>>>>>>>> +        delayedNotificator.removeDelayedListener(listener);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public ImmutableGraph getImmutableGraph() {
>>>>>>>> +        throw new UnsupportedOperationException("Not supported
>>> yet.");
>>>>>>>> //To change body of generated methods, choose Tools | Templates.
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public ReadWriteLock getLock() {
>>>>>>>> +        return wrapped.getLock();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int size() {
>>>>>>>> +        return wrapped.size();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean isEmpty() {
>>>>>>>> +        return wrapped.isEmpty();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Object[] toArray() {
>>>>>>>> +        return wrapped.toArray();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public <T> T[] toArray(T[] a) {
>>>>>>>> +        return wrapped.toArray(a);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean containsAll(Collection<?> c) {
>>>>>>>> +        return wrapped.containsAll(c);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean addAll(Collection<? extends Triple> c) {
>>>>>>>> +        return wrapped.addAll(c);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean retainAll(Collection<?> c) {
>>>>>>>> +        return wrapped.retainAll(c);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void clear() {
>>>>>>>> +        wrapped.clear();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    private static class ListenerConfiguration {
>>>>>>>> +
>>>>>>>> +        private WeakReference<GraphListener> listenerRef;
>>>>>>>> +        private FilterTriple filter;
>>>>>>>> +
>>>>>>>> +        private ListenerConfiguration(GraphListener listener,
>>>>>>>> FilterTriple filter) {
>>>>>>>> +            this.listenerRef = new
>>>>>> WeakReference<GraphListener>(listener);
>>>>>>>> +            this.filter = filter;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        /**
>>>>>>>> +         * @return the listener
>>>>>>>> +         */
>>>>>>>> +        GraphListener getListener() {
>>>>>>>> +            GraphListener listener = listenerRef.get();
>>>>>>>> +            return listener;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        /**
>>>>>>>> +         * @return the filter
>>>>>>>> +         */
>>>>>>>> +        FilterTriple getFilter() {
>>>>>>>> +            return filter;
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,85 @@
>>>>>>>> +/*
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you under the Apache License, Version 2.0 (the
>>>>>>>> + * "License"); you may not use this file except in compliance
>>>>>>>> + * with the License.  You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *   http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>>>>>>> + * software distributed under the License is distributed on an
>>>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>> + * KIND, either express or implied.  See the License for the
>>>>>>>> + * specific language governing permissions and limitations
>>>>>>>> + * under the License.
>>>>>>>> + */
>>>>>>>> +
>>>>>>>> +package org.apache.commons.rdf.impl.utils.debug;
>>>>>>>> +
>>>>>>>> +import java.util.concurrent.TimeUnit;
>>>>>>>> +import java.util.concurrent.locks.Condition;
>>>>>>>> +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author mir
>>>>>>>> + */
>>>>>>>> +public class ReadLockDebug extends ReadLock {
>>>>>>>> +
>>>>>>>> +    ReentrantReadWriteLockTracker lock;
>>>>>>>> +    StackTraceElement[] stackTrace;
>>>>>>>> +
>>>>>>>> +    ReadLock readLock;
>>>>>>>> +    public ReadLockDebug(ReentrantReadWriteLockTracker lock) {
>>>>>>>> +        super(lock);
>>>>>>>> +        this.lock = lock;
>>>>>>>> +        this.readLock = lock.realReadLock();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void lock() {
>>>>>>>> +        readLock.lock();
>>>>>>>> +        lock.addLockedReadLock(this);
>>>>>>>> +        stackTrace = Thread.currentThread().getStackTrace();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void lockInterruptibly() throws InterruptedException {
>>>>>>>> +        readLock.lockInterruptibly();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Condition newCondition() {
>>>>>>>> +        return readLock.newCondition();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public String toString() {
>>>>>>>> +        return readLock.toString();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean tryLock() {
>>>>>>>> +        return readLock.tryLock();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean tryLock(long timeout, TimeUnit unit) throws
>>>>>>>> InterruptedException {
>>>>>>>> +        return readLock.tryLock(timeout, unit);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void unlock() {
>>>>>>>> +        readLock.unlock();
>>>>>>>> +        lock.removeReadLock(this);
>>>>>>>> +        stackTrace = null;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    public StackTraceElement[] getStackTrace() {
>>>>>>>> +        return stackTrace;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,133 @@
>>>>>>>> +/*
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you under the Apache License, Version 2.0 (the
>>>>>>>> + * "License"); you may not use this file except in compliance
>>>>>>>> + * with the License.  You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *   http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>>>>>>> + * software distributed under the License is distributed on an
>>>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>> + * KIND, either express or implied.  See the License for the
>>>>>>>> + * specific language governing permissions and limitations
>>>>>>>> + * under the License.
>>>>>>>> + */
>>>>>>>> +package org.apache.commons.rdf.impl.utils.debug;
>>>>>>>> +
>>>>>>>> +import java.util.Collection;
>>>>>>>> +import java.util.Collections;
>>>>>>>> +import java.util.HashSet;
>>>>>>>> +import java.util.Set;
>>>>>>>> +import java.util.concurrent.locks.Condition;
>>>>>>>> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author mir
>>>>>>>> + */
>>>>>>>> +public class ReentrantReadWriteLockTracker extends
>>>>>> ReentrantReadWriteLock
>>>>>>>> {
>>>>>>>> +
>>>>>>>> +
>>>>>>>> +    private Set<ReadLockDebug> lockedReadLocks =
>>>>>>>> Collections.synchronizedSet(new HashSet<ReadLockDebug>());
>>>>>>>> +    private final WriteLockDebug writeLock = new
>>> WriteLockDebug(this);
>>>>>>>> +    @Override
>>>>>>>> +    protected Thread getOwner() {
>>>>>>>> +        return super.getOwner();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    protected Collection<Thread> getQueuedReaderThreads() {
>>>>>>>> +        return super.getQueuedReaderThreads();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    protected Collection<Thread> getQueuedThreads() {
>>>>>>>> +        return super.getQueuedThreads();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    protected Collection<Thread> getQueuedWriterThreads() {
>>>>>>>> +        return super.getQueuedWriterThreads();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int getReadHoldCount() {
>>>>>>>> +        return super.getReadHoldCount();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int getReadLockCount() {
>>>>>>>> +        return super.getReadLockCount();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int getWaitQueueLength(Condition condition) {
>>>>>>>> +        return super.getWaitQueueLength(condition);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    protected Collection<Thread> getWaitingThreads(Condition
>>>>>> condition) {
>>>>>>>> +        return super.getWaitingThreads(condition);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int getWriteHoldCount() {
>>>>>>>> +        return super.getWriteHoldCount();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean hasWaiters(Condition condition) {
>>>>>>>> +        return super.hasWaiters(condition);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean isWriteLocked() {
>>>>>>>> +        return super.isWriteLocked();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean isWriteLockedByCurrentThread() {
>>>>>>>> +        return super.isWriteLockedByCurrentThread();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public ReadLock readLock() {
>>>>>>>> +        return new ReadLockDebug(this);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    ReadLock realReadLock() {
>>>>>>>> +        return super.readLock();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    WriteLock realWriteLock() {
>>>>>>>> +        return super.writeLock();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public String toString() {
>>>>>>>> +        return super.toString();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public WriteLockDebug writeLock() {
>>>>>>>> +        return writeLock;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    void addLockedReadLock(ReadLockDebug lock) {
>>>>>>>> +        lockedReadLocks.add(lock);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    void removeReadLock(ReadLockDebug lock) {
>>>>>>>> +        lockedReadLocks.remove(lock);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    public Set<ReadLockDebug> getLockedReadLocks() {
>>>>>>>> +        return lockedReadLocks;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>> Added:
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>>>>>>>> URL:
>>>>>>>>
>>>>>>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java?rev=1659973&view=auto
>>>>>>>>
>>>>>>>>
>>>>>>
>>> ==============================================================================
>>>>>>>> ---
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>>>>>>>> (added)
>>>>>>>> +++
>>>>>>>>
>>>>>>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>>>>>>>> Sun Feb 15 18:41:15 2015
>>>>>>>> @@ -0,0 +1,89 @@
>>>>>>>> +/*
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you under the Apache License, Version 2.0 (the
>>>>>>>> + * "License"); you may not use this file except in compliance
>>>>>>>> + * with the License.  You may obtain a copy of the License at
>>>>>>>> + *
>>>>>>>> + *   http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>> + *
>>>>>>>> + * Unless required by applicable law or agreed to in writing,
>>>>>>>> + * software distributed under the License is distributed on an
>>>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>> + * KIND, either express or implied.  See the License for the
>>>>>>>> + * specific language governing permissions and limitations
>>>>>>>> + * under the License.
>>>>>>>> + */
>>>>>>>> +
>>>>>>>> +package org.apache.commons.rdf.impl.utils.debug;
>>>>>>>> +
>>>>>>>> +import java.util.concurrent.TimeUnit;
>>>>>>>> +import java.util.concurrent.locks.Condition;
>>>>>>>> +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + *
>>>>>>>> + * @author mir
>>>>>>>> + */
>>>>>>>> +public class WriteLockDebug extends WriteLock {
>>>>>>>> +
>>>>>>>> +    private ReentrantReadWriteLockTracker lock;
>>>>>>>> +    private WriteLock writeLock;
>>>>>>>> +    private StackTraceElement[] stackTrace;
>>>>>>>> +
>>>>>>>> +    public WriteLockDebug(ReentrantReadWriteLockTracker lock) {
>>>>>>>> +        super(lock);
>>>>>>>> +        this.lock = lock;
>>>>>>>> +        this.writeLock = lock.realWriteLock();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public int getHoldCount() {
>>>>>>>> +        return writeLock.getHoldCount();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean isHeldByCurrentThread() {
>>>>>>>> +        return writeLock.isHeldByCurrentThread();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void lock() {
>>>>>>>> +        writeLock.lock();
>>>>>>>> +        stackTrace = Thread.currentThread().getStackTrace();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void lockInterruptibly() throws InterruptedException {
>>>>>>>> +        writeLock.lockInterruptibly();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public Condition newCondition() {
>>>>>>>> +        return writeLock.newCondition();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean tryLock() {
>>>>>>>> +        return writeLock.tryLock();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public boolean tryLock(long timeout, TimeUnit unit) throws
>>>>>>>> InterruptedException {
>>>>>>>> +        return writeLock.tryLock(timeout, unit);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>> +    public void unlock() {
>>>>>>>> +        writeLock.unlock();
>>>>>>>> +        stackTrace = null;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    public StackTraceElement[] getStackTrace() {
>>>>>>>> +        return stackTrace;
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +
>>>>>>>> +}
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> http://people.apache.org/~britter/
>>>>>>> http://www.systemoutprintln.de/
>>>>>>> http://twitter.com/BenediktRitter
>>>>>>> http://github.com/britter
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>>>>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> http://people.apache.org/~britter/
>>>>> http://www.systemoutprintln.de/
>>>>> http://twitter.com/BenediktRitter
>>>>> http://github.com/britter
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> http://people.apache.org/~britter/
>>>> http://www.systemoutprintln.de/
>>>> http://twitter.com/BenediktRitter
>>>> http://github.com/britter
>>>
>>>
>>>
>>> --
>>> Stian Soiland-Reyes
>>> Apache Taverna (incubating)
>>> http://orcid.org/0000-0001-9842-9718
>>>
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: svn commit: r1659973 [1/3] - in /commons/sandbox/rdf/trunk: ./ api/src/main/java/org/apache/commons/rdf/ impl.sparql/ impl.sparql/src/ impl.sparql/src/main/ impl.sparql/src/main/java/ impl.sparql/src/main/java/org/ impl.sparql/src/main/java/org/apache/...

Posted by Stian Soiland-Reyes <st...@apache.org>.
Great we are on the same page :)

I also think a SPARQL backend will be a reasonable way to push the API
boundaries, so we can evaluate aspects relating to streaming, blank
node identifiers, etc. for an implementation that has less direct
control of its triples.

It could also eventually serve as a useful last-resort bridge to
connect non-JVM stores to the Commons RDF API - I guess if we get to
that point it could be decided then if that actually outgrows the API
and should become its own project.

I would want to develop a couple of "application" scenarios to test
the API from the client side (e.g. a simple N-triples parser and
writer) - and they would also be on the edge of what is in scope of
Commons RDF.

Perhaps we need our own 'sandbox' playground within the Commons RDF
incubator.. otherwise I would just do it as a bunch of personal GitHub
projects, but that's not quite the Apache Way.

On 19 February 2015 at 15:56, Reto Gmür <re...@apache.org> wrote:
> Hi all,
>
> Sorry that I couldn't reply earlier.
>
> Stian is right, this is code that might become part of the incubating
> project.
>
> It is not about having a non-trivial implementation but about a proof
> of-concept implementation against a SPARQL Backend as a mean to evaluate
> design decisions in the API.
>
> Cheers,
> Reto
>
> On Thu, Feb 19, 2015 at 4:01 PM, Stian Soiland-Reyes <st...@apache.org>
> wrote:
>
>> I am not speaking for Reto, but I imagined that since Reto has joined
>> the CommonsRDF incubator proposal, then his sandbox-code would
>> eventually turn into pull requests and branches on the incubator
>> codebase so that we can evaluate each of the differences separately.
>>
>>
>> On 19 February 2015 at 06:54, Benedikt Ritter <br...@apache.org> wrote:
>> > 2015-02-17 7:04 GMT+01:00 Benedikt Ritter <br...@apache.org>:
>> >
>> >>
>> >>
>> >> 2015-02-17 0:13 GMT+01:00 Peter Ansell <an...@gmail.com>:
>> >>
>> >>> Hi Bernard,
>> >>>
>> >>> The Commons RDF project is not planning on including any non-trivial
>> >>> implementations, to avoid bias towards any of the participating
>> >>> platforms. Stian has written a trivial implementation and submitted it
>> >>> to GitHub to provide a reference for our test harness, but it is never
>> >>> planned to be used by anyone for non-trivial purposes.
>> >>>
>> >>> Reto is moving this code here unilaterally from Clerezza at this point
>> >>> based on the ability of any Apache committer to send code into Apache
>> >>> Commons.
>> >>>
>> >>> The code that will be sent to the incubator is still planned to be the
>> >>> code that is in the GitHub repository at the time the incubator
>> >>> request goes through.
>> >>>
>> >>
>> >> This is still in the sandbox so I'm not too crazy about it. But
>> creating a
>> >> separate code base in the commons-rdf git repository doesn't sound like
>> a
>> >> good idea given the fact that github Commons RDF will eventually move to
>> >> Apache Commons after incubation. What should haben with the code that
>> is in
>> >> the repository by that time?
>> >>
>> >> Reto, can you comment please?
>> >>
>> >
>> > Reto, I'm still waiting for your comment.
>> >
>> >
>> >>
>> >> Regards,
>> >> Benedikt
>> >>
>> >>
>> >>>
>> >>> Cheers,
>> >>>
>> >>> Peter
>> >>>
>> >>> On 16 February 2015 at 18:34, Benedikt Ritter <br...@apache.org>
>> wrote:
>> >>> > Hello Reto,
>> >>> >
>> >>> > how does this relate to github Commons RDF? Is this part of the code
>> >>> base
>> >>> > proposed for incubation?
>> >>> >
>> >>> > Regards,
>> >>> > Benedikt
>> >>> >
>> >>> > 2015-02-15 19:41 GMT+01:00 <re...@apache.org>:
>> >>> >
>> >>> >> Author: reto
>> >>> >> Date: Sun Feb 15 18:41:15 2015
>> >>> >> New Revision: 1659973
>> >>> >>
>> >>> >> URL: http://svn.apache.org/r1659973
>> >>> >> Log:
>> >>> >> Started SPARQL Backed Implementation
>> >>> >>
>> >>> >> Added:
>> >>> >>     commons/sandbox/rdf/trunk/alerts.txt
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/   (with props)
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/resources/
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/
>> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/
>> >>> >>
>> >>>  commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/   (with props)
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/pom.xml
>> >>> >>       - copied, changed from r1651181,
>> >>> commons/sandbox/rdf/trunk/pom.xml
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/
>> >>> >>
>> >>>  commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphNotIsomorphicException.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GroupMappingIterator.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/HashMatching.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/MappingIterator.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/PermutationIterator.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/Utils.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashMap.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashSet.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntIterator.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntSet.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/package-info.java
>> >>> >>       - copied, changed from r1651181,
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/src/main/java/org/apache/commons/rdf/package-info.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraph.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleMGraph.java
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/resources/
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/
>> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/
>> >>> >>
>> >>>  commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/PlainLiteralImplTest.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraphTest.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TripleImplTest.java
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
>> >>> >>     commons/sandbox/rdf/trunk/report.xml
>> >>> >> Modified:
>> >>> >>
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> >>> >>     commons/sandbox/rdf/trunk/pom.xml
>> >>> >>
>> >>> >> Added: commons/sandbox/rdf/trunk/alerts.txt
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/alerts.txt?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >>     (empty)
>> >>> >>
>> >>> >> Modified:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java?rev=1659973&r1=1659972&r2=1659973&view=diff
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> >>> >> (original)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -84,7 +84,8 @@ public interface Literal extends RdfTerm
>> >>> >>
>> >>> >>      /**
>> >>> >>       * Returns the hash code of the lexical form plus the hash code
>> >>> of the
>> >>> >> -     * language, plush the hash code of the datatype
>> >>> >> +     * datatype plus if the literal has a language the hash code of
>> >>> the
>> >>> >> +     * language.
>> >>> >>       *
>> >>> >>       * @return hash code
>> >>> >>       */
>> >>> >>
>> >>> >> Propchange: commons/sandbox/rdf/trunk/impl.sparql/
>> >>> >>
>> >>> >>
>> >>>
>> ------------------------------------------------------------------------------
>> >>> >> --- svn:ignore (added)
>> >>> >> +++ svn:ignore Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1 @@
>> >>> >> +target
>> >>> >>
>> >>> >> Added: commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/pom.xml?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> --- commons/sandbox/rdf/trunk/impl.sparql/pom.xml (added)
>> >>> >> +++ commons/sandbox/rdf/trunk/impl.sparql/pom.xml Sun Feb 15
>> 18:41:15
>> >>> 2015
>> >>> >> @@ -0,0 +1,52 @@
>> >>> >> +<?xml version="1.0" encoding="UTF-8"?>
>> >>> >> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>> >>> >> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>> >>> >> http://maven.apache.org/POM/4.0.0
>> >>> >> http://maven.apache.org/xsd/maven-4.0.0.xsd">
>> >>> >> +    <parent>
>> >>> >> +        <groupId>org.apache.commons</groupId>
>> >>> >> +        <artifactId>commons-parent</artifactId>
>> >>> >> +        <version>37</version>
>> >>> >> +        <relativePath />
>> >>> >> +    </parent>
>> >>> >> +    <modelVersion>4.0.0</modelVersion>
>> >>> >> +    <groupId>commons-rdf</groupId>
>> >>> >> +    <artifactId>commons-rdf-impl-sparql</artifactId>
>> >>> >> +    <version>1.0.0-SNAPSHOT</version>
>> >>> >> +    <packaging>jar</packaging>
>> >>> >> +    <name>Apache Commons RDF SPARQL backed implementation.</name>
>> >>> >> +    <description>An implementation of the rdf commons API backed
>> by a
>> >>> >> sparql
>> >>> >> +        endpoint. STATUS: Incomplete, currecnt code only supports
>> >>> reading
>> >>> >> +        graphs and does not yet support BlankNodes.</description>
>> >>> >> +    <properties>
>> >>> >> +
>> >>> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
>> >>> >> +        <maven.compiler.source>1.7</maven.compiler.source>
>> >>> >> +        <maven.compiler.target>1.7</maven.compiler.target>
>> >>> >> +    </properties>
>> >>> >> +    <dependencies>
>> >>> >> +        <dependency>
>> >>> >> +            <groupId>org.apache.httpcomponents</groupId>
>> >>> >> +            <artifactId>httpclient</artifactId>
>> >>> >> +            <version>4.4</version>
>> >>> >> +        </dependency>
>> >>> >> +        <dependency>
>> >>> >> +            <groupId>commons-rdf</groupId>
>> >>> >> +            <artifactId>commons-rdf-api</artifactId>
>> >>> >> +            <version>0.1-SNAPSHOT</version>
>> >>> >> +        </dependency>
>> >>> >> +        <dependency>
>> >>> >> +            <groupId>commons-rdf</groupId>
>> >>> >> +            <artifactId>commons-rdf-impl-utils</artifactId>
>> >>> >> +            <version>0.1-SNAPSHOT</version>
>> >>> >> +        </dependency>
>> >>> >> +        <dependency>
>> >>> >> +            <groupId>junit</groupId>
>> >>> >> +            <artifactId>junit</artifactId>
>> >>> >> +            <version>4.12</version>
>> >>> >> +            <scope>test</scope>
>> >>> >> +        </dependency>
>> >>> >> +        <dependency>
>> >>> >> +            <groupId>org.apache.jena</groupId>
>> >>> >> +            <artifactId>jena-fuseki</artifactId>
>> >>> >> +            <version>1.1.1</version>
>> >>> >> +            <scope>test</scope>
>> >>> >> +        </dependency>
>> >>> >> +    </dependencies>
>> >>> >> +</project>
>> >>> >> \ No newline at end of file
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,220 @@
>> >>> >> +/*
>> >>> >> + * To change this license header, choose License Headers in Project
>> >>> >> Properties.
>> >>> >> + * To change this template file, choose Tools | Templates
>> >>> >> + * and open the template in the editor.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.sparql;
>> >>> >> +
>> >>> >> +import java.io.IOException;
>> >>> >> +import java.io.InputStream;
>> >>> >> +import java.io.UnsupportedEncodingException;
>> >>> >> +import java.util.ArrayList;
>> >>> >> +import java.util.Enumeration;
>> >>> >> +import java.util.HashMap;
>> >>> >> +import java.util.Hashtable;
>> >>> >> +import java.util.List;
>> >>> >> +import java.util.Map;
>> >>> >> +import java.util.logging.Level;
>> >>> >> +import java.util.logging.Logger;
>> >>> >> +import org.apache.http.HttpEntity;
>> >>> >> +import org.apache.http.NameValuePair;
>> >>> >> +import org.apache.http.client.entity.UrlEncodedFormEntity;
>> >>> >> +import org.apache.http.client.methods.CloseableHttpResponse;
>> >>> >> +import org.apache.http.client.methods.HttpPost;
>> >>> >> +import org.apache.http.impl.client.CloseableHttpClient;
>> >>> >> +import org.apache.http.impl.client.HttpClients;
>> >>> >> +import org.apache.http.message.BasicNameValuePair;
>> >>> >> +import org.apache.http.util.EntityUtils;
>> >>> >> +import javax.xml.parsers.*;
>> >>> >> +import org.apache.commons.rdf.BlankNode;
>> >>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>> >>> >> +import org.apache.commons.rdf.Iri;
>> >>> >> +import org.apache.commons.rdf.Language;
>> >>> >> +import org.apache.commons.rdf.Literal;
>> >>> >> +import org.apache.commons.rdf.RdfTerm;
>> >>> >> +import org.apache.commons.rdf.Triple;
>> >>> >> +import org.apache.commons.rdf.impl.utils.AbstractLiteral;
>> >>> >> +import org.xml.sax.*;
>> >>> >> +import org.xml.sax.helpers.*;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author developer
>> >>> >> + */
>> >>> >> +public class SparqlClient {
>> >>> >> +
>> >>> >> +    final String endpoint;
>> >>> >> +
>> >>> >> +    public SparqlClient(final String endpoint) {
>> >>> >> +        this.endpoint = endpoint;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    List<Map<String, RdfTerm>> queryResultSet(final String query)
>> >>> throws
>> >>> >> IOException {
>> >>> >> +        CloseableHttpClient httpclient =
>> HttpClients.createDefault();
>> >>> >> +        HttpPost httpPost = new HttpPost(endpoint);
>> >>> >> +        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
>> >>> >> +        nvps.add(new BasicNameValuePair("query", query));
>> >>> >> +        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
>> >>> >> +        CloseableHttpResponse response2 =
>> >>> httpclient.execute(httpPost);
>> >>> >> +
>> >>> >> +        try {
>> >>> >> +            HttpEntity entity2 = response2.getEntity();
>> >>> >> +            InputStream in = entity2.getContent();
>> >>> >> +            SAXParserFactory spf = SAXParserFactory.newInstance();
>> >>> >> +            spf.setNamespaceAware(true);
>> >>> >> +            SAXParser saxParser = spf.newSAXParser();
>> >>> >> +            XMLReader xmlReader = saxParser.getXMLReader();
>> >>> >> +            final SparqlsResultsHandler sparqlsResultsHandler = new
>> >>> >> SparqlsResultsHandler();
>> >>> >> +            xmlReader.setContentHandler(sparqlsResultsHandler);
>> >>> >> +            xmlReader.parse(new InputSource(in));
>> >>> >> +            /*
>> >>> >> +             for (int ch = in.read(); ch != -1; ch = in.read()) {
>> >>> >> +             System.out.print((char)ch);
>> >>> >> +             }
>> >>> >> +             */
>> >>> >> +            // do something useful with the response body
>> >>> >> +            // and ensure it is fully consumed
>> >>> >> +            EntityUtils.consume(entity2);
>> >>> >> +            return sparqlsResultsHandler.getResults();
>> >>> >> +        } catch (ParserConfigurationException ex) {
>> >>> >> +            throw new RuntimeException(ex);
>> >>> >> +        } catch (SAXException ex) {
>> >>> >> +            throw new RuntimeException(ex);
>> >>> >> +        } finally {
>> >>> >> +            response2.close();
>> >>> >> +        }
>> >>> >> +
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    final public static class SparqlsResultsHandler extends
>> >>> >> DefaultHandler {
>> >>> >> +
>> >>> >> +        private String currentBindingName;
>> >>> >> +        private Map<String, RdfTerm> currentResult = null;
>> >>> >> +        private final List<Map<String, RdfTerm>> results = new
>> >>> >> ArrayList<>();
>> >>> >> +        private boolean readingValue;
>> >>> >> +        private String value;
>> >>> >> +        private Map<String, BlankNode> bNodeMap = new HashMap<>();
>> >>> >> +        private static final Iri XSD_STRING = new Iri("
>> >>> >> http://www.w3.org/2001/XMLSchema#string");
>> >>> >> +
>> >>> >> +        private RdfTerm getBNode(String value) {
>> >>> >> +            if (!bNodeMap.containsKey(value)) {
>> >>> >> +                bNodeMap.put(value, new BlankNode());
>> >>> >> +            }
>> >>> >> +            return bNodeMap.get(value);
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        private List<Map<String, RdfTerm>> getResults() {
>> >>> >> +            return results;
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        enum BindingType {
>> >>> >> +
>> >>> >> +            uri, bnode, literal;
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        @Override
>> >>> >> +        public void startDocument() throws SAXException {
>> >>> >> +
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        @Override
>> >>> >> +        public void startElement(String namespaceURI,
>> >>> >> +                String localName,
>> >>> >> +                String qName,
>> >>> >> +                Attributes atts)
>> >>> >> +                throws SAXException {
>> >>> >> +            if ("http://www.w3.org/2005/sparql-results#
>> >>> ".equals(namespaceURI))
>> >>> >> {
>> >>> >> +                if ("result".equals(localName)) {
>> >>> >> +                    if (currentResult != null) {
>> >>> >> +                        throw new SAXException("unexpected tag
>> >>> <result>");
>> >>> >> +                    }
>> >>> >> +                    currentResult = new HashMap<>();
>> >>> >> +                } else if ("binding".equals(localName)) {
>> >>> >> +                    if (currentResult == null) {
>> >>> >> +                        throw new SAXException("unexpected tag
>> >>> >> <binding>");
>> >>> >> +                    }
>> >>> >> +                    currentBindingName = atts.getValue("name");
>> >>> >> +                } else if ("uri".equals(localName) ||
>> >>> >> "bnode".equals(localName) || "literal".equals(localName)) {
>> >>> >> +                    if (readingValue) {
>> >>> >> +                        throw new SAXException("unexpected tag <" +
>> >>> >> localName + ">");
>> >>> >> +                    }
>> >>> >> +                    readingValue = true;
>> >>> >> +                }
>> >>> >> +            }
>> >>> >> +
>> >>> >> +            //System.out.println(namespaceURI);
>> >>> >> +            //System.out.println(qName);
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        @Override
>> >>> >> +        public void characters(char[] chars, int start, int length)
>> >>> >> throws SAXException {
>> >>> >> +            if (readingValue) {
>> >>> >> +                value = new String(chars, start, length);
>> >>> >> +                //System.err.println(value + start + ", " +
>> length);
>> >>> >> +            }
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        @Override
>> >>> >> +        public void endElement(String namespaceURI,
>> >>> >> +                String localName,
>> >>> >> +                String qName)
>> >>> >> +                throws SAXException {
>> >>> >> +            if ("http://www.w3.org/2005/sparql-results#
>> >>> ".equals(namespaceURI))
>> >>> >> {
>> >>> >> +                if ("result".equals(localName)) {
>> >>> >> +                    results.add(currentResult);
>> >>> >> +                    currentResult = null;
>> >>> >> +                } else if ("binding".equals(localName)) {
>> >>> >> +                    if (currentBindingName == null) {
>> >>> >> +                        throw new SAXException("unexpected tag
>> >>> >> </binding>");
>> >>> >> +                    }
>> >>> >> +                    currentBindingName = null;
>> >>> >> +                } else {
>> >>> >> +                    try {
>> >>> >> +                        BindingType b =
>> >>> BindingType.valueOf(localName);
>> >>> >> +                        RdfTerm rdfTerm = null;
>> >>> >> +                        switch (b) {
>> >>> >> +                            case uri:
>> >>> >> +                                rdfTerm = new Iri(value);
>> >>> >> +                                break;
>> >>> >> +                            case bnode:
>> >>> >> +                                rdfTerm = getBNode(value);
>> >>> >> +                                break;
>> >>> >> +                            case literal:
>> >>> >> +                                final String lf = value;
>> >>> >> +                                rdfTerm = new AbstractLiteral() {
>> >>> >> +
>> >>> >> +                                    @Override
>> >>> >> +                                    public String getLexicalForm()
>> {
>> >>> >> +                                        return lf;
>> >>> >> +                                    }
>> >>> >> +
>> >>> >> +                                    @Override
>> >>> >> +                                    public Iri getDataType() {
>> >>> >> +                                        //TODO implement
>> >>> >> +                                        return XSD_STRING;
>> >>> >> +                                    }
>> >>> >> +
>> >>> >> +                                    @Override
>> >>> >> +                                    public Language getLanguage() {
>> >>> >> +                                        //TODO impl
>> >>> >> +                                        return null;
>> >>> >> +                                    }
>> >>> >> +                                };
>> >>> >> +                                break;
>> >>> >> +                        }
>> >>> >> +                        currentResult.put(currentBindingName,
>> >>> rdfTerm);
>> >>> >> +                        readingValue = false;
>> >>> >> +                    } catch (IllegalArgumentException e) {
>> >>> >> +                            //not uri|bnode|literal
>> >>> >> +                    }
>> >>> >> +                }
>> >>> >> +            }
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        public void endDocument() throws SAXException {
>> >>> >> +            //System.out.println("results: " + results.size());
>> >>> >> +        }
>> >>> >> +
>> >>> >> +    }
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,121 @@
>> >>> >> +/*
>> >>> >> + * To change this license header, choose License Headers in Project
>> >>> >> Properties.
>> >>> >> + * To change this template file, choose Tools | Templates
>> >>> >> + * and open the template in the editor.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.sparql;
>> >>> >> +
>> >>> >> +import java.io.IOException;
>> >>> >> +import java.util.Iterator;
>> >>> >> +import java.util.List;
>> >>> >> +import java.util.Map;
>> >>> >> +import org.apache.commons.rdf.BlankNode;
>> >>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>> >>> >> +import org.apache.commons.rdf.Iri;
>> >>> >> +import org.apache.commons.rdf.Literal;
>> >>> >> +import org.apache.commons.rdf.RdfTerm;
>> >>> >> +import org.apache.commons.rdf.Triple;
>> >>> >> +import org.apache.commons.rdf.impl.utils.AbstractGraph;
>> >>> >> +import org.apache.commons.rdf.impl.utils.TripleImpl;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author reto
>> >>> >> + */
>> >>> >> +public class SparqlGraph extends AbstractGraph {
>> >>> >> +
>> >>> >> +    final SparqlClient sparqlClient;
>> >>> >> +
>> >>> >> +    /** Constructs a Graph representing the default graph at the
>> >>> specified
>> >>> >> +     * endpoint
>> >>> >> +     */
>> >>> >> +    public SparqlGraph(final String endpoint) {
>> >>> >> +        sparqlClient = new SparqlClient(endpoint);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    protected Iterator<Triple> performFilter(final BlankNodeOrIri
>> >>> subject,
>> >>> >> +            final Iri predicate, final RdfTerm object) {
>> >>> >> +        try {
>> >>> >> +            final StringBuilder queryBuilder = new StringBuilder();
>> >>> >> +            queryBuilder.append("SELECT * WHERE { ");
>> >>> >> +            if (subject == null) {
>> >>> >> +                queryBuilder.append("?s");
>> >>> >> +            } else {
>> >>> >> +                queryBuilder.append(asSparqlTerm(subject));
>> >>> >> +            }
>> >>> >> +            queryBuilder.append(' ');
>> >>> >> +            if (predicate == null) {
>> >>> >> +                queryBuilder.append("?p");
>> >>> >> +            } else {
>> >>> >> +                queryBuilder.append(asSparqlTerm(predicate));
>> >>> >> +            }
>> >>> >> +            queryBuilder.append(' ');
>> >>> >> +            if (object == null) {
>> >>> >> +                queryBuilder.append("?o");
>> >>> >> +            } else {
>> >>> >> +                queryBuilder.append(asSparqlTerm(object));
>> >>> >> +            }
>> >>> >> +            queryBuilder.append(" }");
>> >>> >> +            List<Map<String, RdfTerm>> sparqlResults =
>> >>> >> sparqlClient.queryResultSet(queryBuilder.toString());
>> >>> >> +            final Iterator<Map<String, RdfTerm>> resultsIterator =
>> >>> >> sparqlResults.iterator();
>> >>> >> +            return new Iterator<Triple>() {
>> >>> >> +
>> >>> >> +                @Override
>> >>> >> +                public boolean hasNext() {
>> >>> >> +                    return resultsIterator.hasNext();
>> >>> >> +                }
>> >>> >> +
>> >>> >> +                @Override
>> >>> >> +                public Triple next() {
>> >>> >> +                    Map<String, RdfTerm> result =
>> >>> resultsIterator.next();
>> >>> >> +                    return new TripleImpl(subject != null ?
>> subject :
>> >>> >> (BlankNodeOrIri)result.get("s"),
>> >>> >> +                            predicate != null ? predicate :
>> >>> >> (Iri)result.get("p"),
>> >>> >> +                            object != null ? object :
>> >>> result.get("o"));
>> >>> >> +                }
>> >>> >> +            };
>> >>> >> +        } catch (IOException ex) {
>> >>> >> +            throw new RuntimeException(ex);
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    protected int performSize() {
>> >>> >> +        try {
>> >>> >> +            return sparqlClient.queryResultSet("SELECT * WHERE {
>> ?s ?p
>> >>> >> ?o}").size();
>> >>> >> +        } catch (IOException ex) {
>> >>> >> +            throw new RuntimeException(ex);
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    private String asSparqlTerm(Iri iri) {
>> >>> >> +        return "<"+iri.getUnicodeString()+">";
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    private String asSparqlTerm(Literal literal) {
>> >>> >> +        //TODO langauge and datatype
>> >>> >> +        return "\""+literal.getLexicalForm()+"\"";
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    private String asSparqlTerm(BlankNode bnode) {
>> >>> >> +        //this requires adding additional clauses to the graph
>> pattern
>> >>> >> +        throw new UnsupportedOperationException("Not supported
>> yet.");
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    private String asSparqlTerm(BlankNodeOrIri term) {
>> >>> >> +        if (term instanceof Iri) {
>> >>> >> +            return asSparqlTerm((Iri)term);
>> >>> >> +        } else {
>> >>> >> +            return asSparqlTerm((BlankNode)term);
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    private String asSparqlTerm(RdfTerm term) {
>> >>> >> +        if (term instanceof BlankNodeOrIri) {
>> >>> >> +            return asSparqlTerm((BlankNodeOrIri)term);
>> >>> >> +        } else {
>> >>> >> +            return asSparqlTerm((Literal)term);
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,106 @@
>> >>> >> +/*
>> >>> >> + * To change this license header, choose License Headers in Project
>> >>> >> Properties.
>> >>> >> + * To change this template file, choose Tools | Templates
>> >>> >> + * and open the template in the editor.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.sparql;
>> >>> >> +
>> >>> >> +import com.hp.hpl.jena.query.DatasetAccessor;
>> >>> >> +import com.hp.hpl.jena.query.DatasetAccessorFactory;
>> >>> >> +import java.io.File;
>> >>> >> +import java.io.IOException;
>> >>> >> +import java.net.ServerSocket;
>> >>> >> +import org.apache.jena.fuseki.EmbeddedFusekiServer;
>> >>> >> +import com.hp.hpl.jena.rdf.model.Model;
>> >>> >> +import com.hp.hpl.jena.rdf.model.ModelFactory;
>> >>> >> +import java.io.InputStream;
>> >>> >> +import java.util.HashSet;
>> >>> >> +import java.util.Iterator;
>> >>> >> +import java.util.Set;
>> >>> >> +import org.apache.commons.rdf.Graph;
>> >>> >> +import org.apache.commons.rdf.Iri;
>> >>> >> +import org.apache.commons.rdf.Literal;
>> >>> >> +import org.apache.commons.rdf.RdfTerm;
>> >>> >> +import org.apache.commons.rdf.Triple;
>> >>> >> +import org.apache.commons.rdf.impl.utils.PlainLiteralImpl;
>> >>> >> +import org.junit.AfterClass;
>> >>> >> +import org.junit.Assert;
>> >>> >> +import org.junit.BeforeClass;
>> >>> >> +import org.junit.Test;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author reto
>> >>> >> + */
>> >>> >> +public class SparqlGraphTest {
>> >>> >> +
>> >>> >> +    final static int serverPort = findFreePort();
>> >>> >> +    static EmbeddedFusekiServer server;
>> >>> >> +
>> >>> >> +    @BeforeClass
>> >>> >> +    public static void prepare() throws IOException {
>> >>> >> +        final String serviceURI = "http://localhost:" +
>> serverPort +
>> >>> >> "/ds/data";
>> >>> >> +        final DatasetAccessorFactory factory = new
>> >>> >> DatasetAccessorFactory();
>> >>> >> +        final DatasetAccessor accessor =
>> >>> factory.createHTTP(serviceURI);
>> >>> >> +        final InputStream in =
>> >>> >> SparqlGraphTest.class.getResourceAsStream("grounded.ttl");
>> >>> >> +        final Model m = ModelFactory.createDefaultModel();
>> >>> >> +        String base = "http://example.org/";
>> >>> >> +        m.read(in, base, "TURTLE");
>> >>> >> +
>> >>> >> +        final File dataSet = File.createTempFile("dataset",
>> "fuseki");
>> >>> >> +        dataSet.delete();
>> >>> >> +        server = EmbeddedFusekiServer.memTDB(serverPort,
>> >>> >> "/ds");//dataSet.getAbsolutePath());
>> >>> >> +        server.start();
>> >>> >> +        System.out.println("Started fuseki on port " + serverPort);
>> >>> >> +        accessor.putModel(m);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @AfterClass
>> >>> >> +    public static void cleanup() {
>> >>> >> +        server.stop();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Test
>> >>> >> +    public void graphSize() {
>> >>> >> +        final Graph graph = new SparqlGraph("http://localhost:" +
>> >>> >> serverPort + "/ds/query");
>> >>> >> +        Assert.assertEquals("Graph not of the exepected size", 8,
>> >>> >> graph.size());
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Test
>> >>> >> +    public void filter1() {
>> >>> >> +        final Graph graph = new SparqlGraph("http://localhost:" +
>> >>> >> serverPort + "/ds/query");
>> >>> >> +        final Iri spiderman = new Iri("
>> http://example.org/#spiderman
>> >>> ");
>> >>> >> +        final Iri greenGoblin = new Iri("
>> >>> http://example.org/#green-goblin
>> >>> >> ");
>> >>> >> +        final Iri enemyOf = new Iri("
>> >>> >> http://www.perceive.net/schemas/relationship/enemyOf");
>> >>> >> +        final Iri foafName = new Iri("
>> http://xmlns.com/foaf/0.1/name
>> >>> ");
>> >>> >> +        {
>> >>> >> +            final Iterator<Triple> iter = graph.filter(spiderman,
>> >>> null,
>> >>> >> greenGoblin);
>> >>> >> +            Assert.assertTrue(iter.hasNext());
>> >>> >> +            Assert.assertEquals(enemyOf,
>> iter.next().getPredicate());
>> >>> >> +            Assert.assertFalse(iter.hasNext());
>> >>> >> +        }
>> >>> >> +        {
>> >>> >> +            final Iterator<Triple> iter = graph.filter(spiderman,
>> >>> >> foafName, null);
>> >>> >> +            Set<Literal> names = new HashSet<>();
>> >>> >> +            for (int i = 0; i < 2; i++) {
>> >>> >> +                Assert.assertTrue(iter.hasNext());
>> >>> >> +                RdfTerm name = iter.next().getObject();
>> >>> >> +                Assert.assertTrue(name instanceof Literal);
>> >>> >> +                names.add((Literal)name);
>> >>> >> +            }
>> >>> >> +            Assert.assertFalse(iter.hasNext());
>> >>> >> +            Assert.assertTrue(names.contains(new
>> >>> >> PlainLiteralImpl("Spiderman")));
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    public static int findFreePort() {
>> >>> >> +        int port = 0;
>> >>> >> +        try (ServerSocket server = new ServerSocket(0);) {
>> >>> >> +            port = server.getLocalPort();
>> >>> >> +        } catch (Exception e) {
>> >>> >> +            throw new RuntimeException("unable to find a free
>> port");
>> >>> >> +        }
>> >>> >> +        return port;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,16 @@
>> >>> >> +@base <http://example.org/> .
>> >>> >> +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
>> >>> >> +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
>> >>> >> +@prefix foaf: <http://xmlns.com/foaf/0.1/> .
>> >>> >> +@prefix rel: <http://www.perceive.net/schemas/relationship/> .
>> >>> >> +
>> >>> >> +<#green-goblin>
>> >>> >> +    rel:enemyOf <#spiderman> ;
>> >>> >> +    a foaf:Person ;    # in the context of the Marvel universe
>> >>> >> +    foaf:name "Green Goblin" ;
>> >>> >> +    foaf:age 128 .
>> >>> >> +
>> >>> >> +<#spiderman>
>> >>> >> +    rel:enemyOf <#green-goblin> ;
>> >>> >> +    a foaf:Person ;
>> >>> >> +    foaf:name "Spiderman", "Человек-паук"@ru .
>> >>> >> \ No newline at end of file
>> >>> >>
>> >>> >> Propchange: commons/sandbox/rdf/trunk/impl.utils/
>> >>> >>
>> >>> >>
>> >>>
>> ------------------------------------------------------------------------------
>> >>> >> --- svn:ignore (added)
>> >>> >> +++ svn:ignore Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1 @@
>> >>> >> +target
>> >>> >>
>> >>> >> Copied: commons/sandbox/rdf/trunk/impl.utils/pom.xml (from r1651181,
>> >>> >> commons/sandbox/rdf/trunk/pom.xml)
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/pom.xml?p2=commons/sandbox/rdf/trunk/impl.utils/pom.xml&p1=commons/sandbox/rdf/trunk/pom.xml&r1=1651181&r2=1659973&rev=1659973&view=diff
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> --- commons/sandbox/rdf/trunk/pom.xml (original)
>> >>> >> +++ commons/sandbox/rdf/trunk/impl.utils/pom.xml Sun Feb 15 18:41:15
>> >>> 2015
>> >>> >> @@ -22,13 +22,14 @@
>> >>> >>      <parent>
>> >>> >>          <groupId>org.apache.commons</groupId>
>> >>> >>          <artifactId>commons-parent</artifactId>
>> >>> >> -        <version>35</version>
>> >>> >> +        <version>37</version>
>> >>> >> +        <relativePath />
>> >>> >>      </parent>
>> >>> >>      <modelVersion>4.0.0</modelVersion>
>> >>> >>      <groupId>commons-rdf</groupId>
>> >>> >> -    <artifactId>commons-rdf</artifactId>
>> >>> >> +    <artifactId>commons-rdf-impl-utils</artifactId>
>> >>> >>      <version>0.1-SNAPSHOT</version>
>> >>> >> -    <name>Apache Commons RDF</name>
>> >>> >> +    <name>Apache Commons RDF Implementation Utils</name>
>> >>> >>      <description>
>> >>> >>          Apache Commons RDF provides an API modelling the RDF data
>> >>> model
>> >>> >> as defined by
>> >>> >>          http://www.w3.org/TR/rdf11-concepts/
>> >>> >> @@ -50,11 +51,22 @@
>> >>> >>
>> >>> >>      <dependencies>
>> >>> >>          <dependency>
>> >>> >> +            <groupId>commons-rdf</groupId>
>> >>> >> +            <artifactId>commons-rdf-api</artifactId>
>> >>> >> +            <version>0.1-SNAPSHOT</version>
>> >>> >> +        </dependency>
>> >>> >> +        <dependency>
>> >>> >>              <groupId>junit</groupId>
>> >>> >>              <artifactId>junit</artifactId>
>> >>> >>              <version>4.12</version>
>> >>> >>              <scope>test</scope>
>> >>> >>          </dependency>
>> >>> >> +        <dependency>
>> >>> >> +            <groupId>org.slf4j</groupId>
>> >>> >> +            <artifactId>slf4j-api</artifactId>
>> >>> >> +            <version>1.7.7</version>
>> >>> >> +            <type>jar</type>
>> >>> >> +        </dependency>
>> >>> >>      </dependencies>
>> >>> >>
>> >>> >>      <distributionManagement>
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,316 @@
>> >>> >> +/*
>> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >>> >> + * or more contributor license agreements.  See the NOTICE file
>> >>> >> + * distributed with this work for additional information
>> >>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >>> >> + * to you under the Apache License, Version 2.0 (the
>> >>> >> + * "License"); you may not use this file except in compliance
>> >>> >> + * with the License.  You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> >>> >> + * software distributed under the License is distributed on an
>> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >>> >> + * KIND, either express or implied.  See the License for the
>> >>> >> + * specific language governing permissions and limitations
>> >>> >> + * under the License.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.utils;
>> >>> >> +
>> >>> >> +import java.lang.ref.WeakReference;
>> >>> >> +import java.util.AbstractCollection;
>> >>> >> +import java.util.Collection;
>> >>> >> +import java.util.Collections;
>> >>> >> +import java.util.HashSet;
>> >>> >> +import java.util.Iterator;
>> >>> >> +
>> >>> >> +import java.util.Set;
>> >>> >> +import java.util.concurrent.locks.Lock;
>> >>> >> +import java.util.concurrent.locks.ReadWriteLock;
>> >>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>> >>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>> >>> >> +import org.apache.commons.rdf.RdfTerm;
>> >>> >> +import org.apache.commons.rdf.Triple;
>> >>> >> +import org.apache.commons.rdf.Graph;
>> >>> >> +import org.apache.commons.rdf.ImmutableGraph;
>> >>> >> +import org.apache.commons.rdf.Iri;
>> >>> >> +import org.apache.commons.rdf.WatchableGraph;
>> >>> >> +import org.apache.commons.rdf.event.AddEvent;
>> >>> >> +import org.apache.commons.rdf.event.FilterTriple;
>> >>> >> +import org.apache.commons.rdf.event.GraphEvent;
>> >>> >> +import org.apache.commons.rdf.event.GraphListener;
>> >>> >> +import org.apache.commons.rdf.event.RemoveEvent;
>> >>> >> +import
>> >>> >>
>> org.apache.commons.rdf.impl.utils.debug.ReentrantReadWriteLockTracker;
>> >>> >> +import
>> org.apache.commons.rdf.impl.utils.simple.SimpleImmutableGraph;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + * An abstract implementation of <code>Graph</code> implementing
>> >>> >> + * <code>iterator</code> and <code>contains</code> calling
>> >>> >> <code>filter</code>.
>> >>> >> + *
>> >>> >> + * @author reto
>> >>> >> + */
>> >>> >> +public abstract class AbstractGraph extends
>> AbstractCollection<Triple>
>> >>> >> +        implements Graph {
>> >>> >> +
>> >>> >> +
>> >>> >> +    private static final String DEBUG_MODE = "rdfLocksDebugging";
>> >>> >> +    private final ReadWriteLock lock;
>> >>> >> +
>> >>> >> +    private final Lock readLock;
>> >>> >> +    private final Lock writeLock;
>> >>> >> +
>> >>> >> +    /**
>> >>> >> +     * Constructs a LocalbleMGraph for an Graph.
>> >>> >> +     *
>> >>> >> +     * @param providedMGraph a non-lockable graph
>> >>> >> +     */
>> >>> >> +    public AbstractGraph() {
>> >>> >> +        {
>> >>> >> +            String debugMode = System.getProperty(DEBUG_MODE);
>> >>> >> +            if (debugMode != null &&
>> >>> >> debugMode.toLowerCase().equals("true")) {
>> >>> >> +                lock = new ReentrantReadWriteLockTracker();
>> >>> >> +            } else {
>> >>> >> +                lock = new ReentrantReadWriteLock();
>> >>> >> +            }
>> >>> >> +        }
>> >>> >> +        readLock = lock.readLock();
>> >>> >> +        writeLock = lock.writeLock();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    public AbstractGraph(final ReadWriteLock lock) {
>> >>> >> +        this.lock = lock;
>> >>> >> +        readLock = lock.readLock();
>> >>> >> +        writeLock = lock.writeLock();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public ReadWriteLock getLock() {
>> >>> >> +        return lock;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public ImmutableGraph getImmutableGraph() {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performGetImmutableGraph();
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    public ImmutableGraph performGetImmutableGraph() {
>> >>> >> +        return new SimpleImmutableGraph(this);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
>> >>> predicate,
>> >>> >> RdfTerm object) {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return new LockingIterator(performFilter(subject,
>> >>> predicate,
>> >>> >> object), lock);
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int size() {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performSize();
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean isEmpty() {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performIsEmpty();
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    @SuppressWarnings("element-type-mismatch")
>> >>> >> +    public boolean contains(Object o) {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performContains(o);
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Iterator<Triple> iterator() {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return new LockingIterator(performIterator(), lock);
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Object[] toArray() {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performToArray();
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public <T> T[] toArray(T[] a) {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performToArray(a);
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean containsAll(Collection<?> c) {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performContainsAll(c);
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean add(Triple e) {
>> >>> >> +        writeLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performAdd(e);
>> >>> >> +        } finally {
>> >>> >> +            writeLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean remove(Object o) {
>> >>> >> +        writeLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performRemove(o);
>> >>> >> +        } finally {
>> >>> >> +            writeLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean addAll(Collection<? extends Triple> c) {
>> >>> >> +        writeLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performAddAll(c);
>> >>> >> +        } finally {
>> >>> >> +            writeLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean removeAll(Collection<?> c) {
>> >>> >> +        writeLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performRemoveAll(c);
>> >>> >> +        } finally {
>> >>> >> +            writeLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean retainAll(Collection<?> c) {
>> >>> >> +        writeLock.lock();
>> >>> >> +        try {
>> >>> >> +            return performRetainAll(c);
>> >>> >> +        } finally {
>> >>> >> +            writeLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void clear() {
>> >>> >> +        writeLock.lock();
>> >>> >> +        try {
>> >>> >> +            performClear();
>> >>> >> +        } finally {
>> >>> >> +            writeLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean equals(Object obj) {
>> >>> >> +        /*if (obj == null) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        if (obj == this) {
>> >>> >> +            return true;
>> >>> >> +        }
>> >>> >> +        if (obj.getClass() != getClass()) {
>> >>> >> +            return false;
>> >>> >> +        }*/
>> >>> >> +        return this == obj;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +
>> >>> >> +    protected abstract Iterator<Triple>
>> performFilter(BlankNodeOrIri
>> >>> >> subject, Iri predicate, RdfTerm object);
>> >>> >> +
>> >>> >> +    protected abstract int performSize();
>> >>> >> +
>> >>> >> +    protected boolean performIsEmpty() {
>> >>> >> +        return super.isEmpty();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected Object[] performToArray() {
>> >>> >> +        return super.toArray();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected boolean performRemove(Object o) {
>> >>> >> +        return super.remove(o);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected boolean performAddAll(Collection<? extends Triple>
>> c) {
>> >>> >> +        return super.addAll(c);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected boolean performRemoveAll(Collection<?> c) {
>> >>> >> +        return super.removeAll(c);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected boolean performRetainAll(Collection<?> c) {
>> >>> >> +        return super.retainAll(c);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected void performClear() {
>> >>> >> +        super.clear();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected boolean performContains(Object o) {
>> >>> >> +        return super.contains(o);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected Iterator<Triple> performIterator() {
>> >>> >> +        return performFilter(null, null, null);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected boolean performContainsAll(Collection<?> c) {
>> >>> >> +        return super.containsAll(c);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected <T> T[] performToArray(T[] a) {
>> >>> >> +        return super.toArray(a);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    protected boolean performAdd(Triple e) {
>> >>> >> +        return super.add(e);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,112 @@
>> >>> >> +/*
>> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >>> >> + * or more contributor license agreements.  See the NOTICE file
>> >>> >> + * distributed with this work for additional information
>> >>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >>> >> + * to you under the Apache License, Version 2.0 (the
>> >>> >> + * "License"); you may not use this file except in compliance
>> >>> >> + * with the License.  You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> >>> >> + * software distributed under the License is distributed on an
>> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >>> >> + * KIND, either express or implied.  See the License for the
>> >>> >> + * specific language governing permissions and limitations
>> >>> >> + * under the License.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.utils;
>> >>> >> +
>> >>> >> +import java.util.Collection;
>> >>> >> +import java.util.Iterator;
>> >>> >> +
>> >>> >> +import org.apache.commons.rdf.BlankNode;
>> >>> >> +import org.apache.commons.rdf.ImmutableGraph;
>> >>> >> +import org.apache.commons.rdf.RdfTerm;
>> >>> >> +import org.apache.commons.rdf.Triple;
>> >>> >> +import
>> org.apache.commons.rdf.impl.utils.graphmatching.GraphMatcher;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + * <code>AbstractGraph</code> is an abstract implementation of
>> >>> >> <code>ImmutableGraph</code>
>> >>> >> + * implementing the <code>equals</code> and the
>> <code>hashCode</code>
>> >>> >> methods.
>> >>> >> + *
>> >>> >> + * @author reto
>> >>> >> + *
>> >>> >> + */
>> >>> >> +public abstract class AbstractImmutableGraph extends AbstractGraph
>> >>> >> +        implements ImmutableGraph {
>> >>> >> +
>> >>> >> +    public final synchronized int hashCode() {
>> >>> >> +        int result = 0;
>> >>> >> +        for (Iterator<Triple> iter = iterator(); iter.hasNext();) {
>> >>> >> +            result += getBlankNodeBlindHash(iter.next());
>> >>> >> +        }
>> >>> >> +        return result;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    /**
>> >>> >> +     * @param triple
>> >>> >> +     * @return hash without BNode hashes
>> >>> >> +     */
>> >>> >> +    private int getBlankNodeBlindHash(Triple triple) {
>> >>> >> +        int hash = triple.getPredicate().hashCode();
>> >>> >> +        RdfTerm subject = triple.getSubject();
>> >>> >> +
>> >>> >> +        if (!(subject instanceof BlankNode)) {
>> >>> >> +            hash ^= subject.hashCode() >> 1;
>> >>> >> +        }
>> >>> >> +        RdfTerm object = triple.getObject();
>> >>> >> +        if (!(object instanceof BlankNode)) {
>> >>> >> +            hash ^= object.hashCode() << 1;
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        return hash;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean add(Triple e) {
>> >>> >> +        throw new UnsupportedOperationException("Graphs are not
>> >>> mutable,
>> >>> >> use Graph");
>> >>> >> +
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean addAll(Collection<? extends Triple> c) {
>> >>> >> +        throw new UnsupportedOperationException("Graphs are not
>> >>> mutable,
>> >>> >> use Graph");
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean remove(Object o) {
>> >>> >> +        throw new UnsupportedOperationException("Graphs are not
>> >>> mutable,
>> >>> >> use Graph");
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean removeAll(Collection<?> c) {
>> >>> >> +        throw new UnsupportedOperationException("Graphs are not
>> >>> mutable,
>> >>> >> use Graph");
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void clear() {
>> >>> >> +        throw new UnsupportedOperationException("Graphs are not
>> >>> mutable,
>> >>> >> use Graph");
>> >>> >> +    }
>> >>> >> +
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public ImmutableGraph getImmutableGraph() {
>> >>> >> +        return this;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean equals(Object obj) {
>> >>> >> +        if (this == obj) {
>> >>> >> +            return true;
>> >>> >> +        }
>> >>> >> +        if (!(obj instanceof ImmutableGraph)) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        if (hashCode() != obj.hashCode()) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        return GraphMatcher.getValidMapping(this, (ImmutableGraph)
>> >>> obj)
>> >>> >> != null;
>> >>> >> +    }
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,61 @@
>> >>> >> +/*
>> >>> >> + * Copyright 2015 The Apache Software Foundation.
>> >>> >> + *
>> >>> >> + * Licensed under the Apache License, Version 2.0 (the "License");
>> >>> >> + * you may not use this file except in compliance with the License.
>> >>> >> + * You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *      http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> software
>> >>> >> + * distributed under the License is distributed on an "AS IS"
>> BASIS,
>> >>> >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> >>> >> implied.
>> >>> >> + * See the License for the specific language governing permissions
>> and
>> >>> >> + * limitations under the License.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.utils;
>> >>> >> +
>> >>> >> +import org.apache.commons.rdf.Literal;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author developer
>> >>> >> + */
>> >>> >> +public abstract class AbstractLiteral implements Literal {
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int hashCode() {
>> >>> >> +        int result = 0;
>> >>> >> +        if (getLanguage() != null) {
>> >>> >> +            result = getLanguage().hashCode();
>> >>> >> +        }
>> >>> >> +        result += getLexicalForm().hashCode();
>> >>> >> +        result += getDataType().hashCode();
>> >>> >> +        return result;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean equals(Object obj) {
>> >>> >> +        if (this == obj) {
>> >>> >> +            return true;
>> >>> >> +        }
>> >>> >> +        if (obj instanceof Literal) {
>> >>> >> +            Literal other = (Literal) obj;
>> >>> >> +
>> >>> >> +            if (getLanguage() == null) {
>> >>> >> +                if (other.getLanguage() != null) {
>> >>> >> +                    return false;
>> >>> >> +                }
>> >>> >> +            } else {
>> >>> >> +                if (!getLanguage().equals(other.getLanguage())) {
>> >>> >> +                    return false;
>> >>> >> +                }
>> >>> >> +            }
>> >>> >> +            boolean res =
>> getDataType().equals(other.getDataType()) &&
>> >>> >> getLexicalForm().equals(other.getLexicalForm());
>> >>> >> +            return res;
>> >>> >> +        } else {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,112 @@
>> >>> >> +/*
>> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >>> >> + * or more contributor license agreements.  See the NOTICE file
>> >>> >> + * distributed with this work for additional information
>> >>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >>> >> + * to you under the Apache License, Version 2.0 (the
>> >>> >> + * "License"); you may not use this file except in compliance
>> >>> >> + * with the License.  You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> >>> >> + * software distributed under the License is distributed on an
>> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >>> >> + * KIND, either express or implied.  See the License for the
>> >>> >> + * specific language governing permissions and limitations
>> >>> >> + * under the License.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.utils;
>> >>> >> +
>> >>> >> +import java.lang.ref.WeakReference;
>> >>> >> +import java.util.*;
>> >>> >> +
>> >>> >> +import org.apache.commons.rdf.event.GraphEvent;
>> >>> >> +import org.apache.commons.rdf.event.GraphListener;
>> >>> >> +import org.slf4j.Logger;
>> >>> >> +import org.slf4j.LoggerFactory;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author reto
>> >>> >> + */
>> >>> >> +class DelayedNotificator {
>> >>> >> +
>> >>> >> +    private static final Logger log =
>> >>> >> LoggerFactory.getLogger(DelayedNotificator.class);
>> >>> >> +    private static Timer timer = new Timer("Event delivery
>> >>> timer",true);
>> >>> >> +
>> >>> >> +    static class ListenerHolder {
>> >>> >> +
>> >>> >> +        long delay;
>> >>> >> +        List<GraphEvent> events = null;
>> >>> >> +        WeakReference<GraphListener> listenerRef;
>> >>> >> +
>> >>> >> +        public ListenerHolder(GraphListener listener, long delay) {
>> >>> >> +            this.listenerRef = new
>> >>> WeakReference<GraphListener>(listener);
>> >>> >> +            this.delay = delay;
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        private void registerEvent(GraphEvent event) {
>> >>> >> +            synchronized (this) {
>> >>> >> +                if (events == null) {
>> >>> >> +                    events = new ArrayList<GraphEvent>();
>> >>> >> +                    events.add(event);
>> >>> >> +                    timer.schedule(new TimerTask() {
>> >>> >> +
>> >>> >> +                        @Override
>> >>> >> +                        public void run() {
>> >>> >> +                            List<GraphEvent> eventsLocal;
>> >>> >> +                            synchronized (ListenerHolder.this) {
>> >>> >> +                                eventsLocal = events;
>> >>> >> +                                events = null;
>> >>> >> +                            }
>> >>> >> +                            GraphListener listener =
>> >>> listenerRef.get();
>> >>> >> +                            if (listener == null) {
>> >>> >> +                                log.debug("Ignoring garbage
>> collected
>> >>> >> listener");
>> >>> >> +                            } else {
>> >>> >> +                                try {
>> >>> >> +
>> >>> listener.graphChanged(eventsLocal);
>> >>> >> +                                } catch (Exception e) {
>> >>> >> +                                    log.warn("Exception delivering
>> >>> >> ImmutableGraph event", e);
>> >>> >> +                                }
>> >>> >> +                            }
>> >>> >> +                        }
>> >>> >> +                    }, delay);
>> >>> >> +                } else {
>> >>> >> +                    events.add(event);
>> >>> >> +                }
>> >>> >> +            }
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    private final Map<GraphListener, ListenerHolder> map =
>> >>> >> Collections.synchronizedMap(
>> >>> >> +            new WeakHashMap<GraphListener, ListenerHolder>());
>> >>> >> +
>> >>> >> +    void addDelayedListener(GraphListener listener, long delay) {
>> >>> >> +        map.put(listener, new ListenerHolder(listener, delay));
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    /**
>> >>> >> +     * removes a Listener, this doesn't prevent the listenerRef
>> from
>> >>> >> receiving
>> >>> >> +     * events alreay scheduled.
>> >>> >> +     *
>> >>> >> +     * @param listenerRef
>> >>> >> +     */
>> >>> >> +    void removeDelayedListener(GraphListener listener) {
>> >>> >> +        map.remove(listener);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    /**
>> >>> >> +     * if the listenerRef has not been registered as delayed
>> >>> listenerRef
>> >>> >> te events is
>> >>> >> +     * forwarded synchroneously
>> >>> >> +     * @param event
>> >>> >> +     */
>> >>> >> +    void sendEventToListener(GraphListener listener, GraphEvent
>> >>> event) {
>> >>> >> +        ListenerHolder holder = map.get(listener);
>> >>> >> +        if (holder == null) {
>> >>> >> +
>> listener.graphChanged(Collections.singletonList(event));
>> >>> >> +        } else {
>> >>> >> +            holder.registerEvent(event);
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,73 @@
>> >>> >> +/*
>> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >>> >> + * or more contributor license agreements.  See the NOTICE file
>> >>> >> + * distributed with this work for additional information
>> >>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >>> >> + * to you under the Apache License, Version 2.0 (the
>> >>> >> + * "License"); you may not use this file except in compliance
>> >>> >> + * with the License.  You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> >>> >> + * software distributed under the License is distributed on an
>> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >>> >> + * KIND, either express or implied.  See the License for the
>> >>> >> + * specific language governing permissions and limitations
>> >>> >> + * under the License.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.utils;
>> >>> >> +
>> >>> >> +import java.util.Iterator;
>> >>> >> +import java.util.concurrent.locks.Lock;
>> >>> >> +import java.util.concurrent.locks.ReadWriteLock;
>> >>> >> +import org.apache.commons.rdf.Triple;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + * Wrapps an iterator<Triple> reading entering a read-lock on every
>> >>> >> invocation
>> >>> >> + * of hasNext and next
>> >>> >> + * @author reto
>> >>> >> + */
>> >>> >> +class LockingIterator implements Iterator<Triple> {
>> >>> >> +
>> >>> >> +    private Iterator<Triple> base;
>> >>> >> +    private Lock readLock;
>> >>> >> +    private Lock writeLock;
>> >>> >> +
>> >>> >> +    public LockingIterator(Iterator<Triple> iterator, ReadWriteLock
>> >>> lock)
>> >>> >> {
>> >>> >> +        base = iterator;
>> >>> >> +        readLock = lock.readLock();
>> >>> >> +        writeLock = lock.writeLock();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean hasNext() {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return base.hasNext();
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Triple next() {
>> >>> >> +        readLock.lock();
>> >>> >> +        try {
>> >>> >> +            return base.next();
>> >>> >> +        } finally {
>> >>> >> +            readLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void remove() {
>> >>> >> +        writeLock.lock();
>> >>> >> +        try {
>> >>> >> +            base.remove();
>> >>> >> +        } finally {
>> >>> >> +            writeLock.unlock();
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,104 @@
>> >>> >> +/*
>> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >>> >> + * or more contributor license agreements.  See the NOTICE file
>> >>> >> + * distributed with this work for additional information
>> >>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >>> >> + * to you under the Apache License, Version 2.0 (the
>> >>> >> + * "License"); you may not use this file except in compliance
>> >>> >> + * with the License.  You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> >>> >> + * software distributed under the License is distributed on an
>> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >>> >> + * KIND, either express or implied.  See the License for the
>> >>> >> + * specific language governing permissions and limitations
>> >>> >> + * under the License.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.utils;
>> >>> >> +
>> >>> >> +import java.io.Serializable;
>> >>> >> +import org.apache.commons.rdf.Iri;
>> >>> >> +
>> >>> >> +import org.apache.commons.rdf.Language;
>> >>> >> +import org.apache.commons.rdf.Literal;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author reto
>> >>> >> + */
>> >>> >> +public class PlainLiteralImpl implements Literal, Serializable {
>> >>> >> +
>> >>> >> +    private String lexicalForm;
>> >>> >> +    private Language language = null;
>> >>> >> +
>> >>> >> +    public PlainLiteralImpl(String value) {
>> >>> >> +        if (value == null) {
>> >>> >> +            throw new IllegalArgumentException("The literal string
>> >>> cannot
>> >>> >> be null");
>> >>> >> +        }
>> >>> >> +        this.lexicalForm = value;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    public PlainLiteralImpl(String value, Language language) {
>> >>> >> +        if (value == null) {
>> >>> >> +            throw new IllegalArgumentException("The literal string
>> >>> cannot
>> >>> >> be null");
>> >>> >> +        }
>> >>> >> +        this.lexicalForm = value;
>> >>> >> +        this.language = language;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public String getLexicalForm() {
>> >>> >> +        return lexicalForm;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean equals(Object otherObj) {
>> >>> >> +        if (!(otherObj instanceof Literal)) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        Literal other = (Literal) otherObj;
>> >>> >> +        if (!lexicalForm.equals(other.getLexicalForm())) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        if (language != null) {
>> >>> >> +            return language.equals(other.getLanguage());
>> >>> >> +        }
>> >>> >> +        if (other.getLanguage() != null) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        return true;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int hashCode() {
>> >>> >> +        int hash = lexicalForm.hashCode() + XSD_STRING_HASH;
>> >>> >> +        if (language != null) {
>> >>> >> +            hash += language.hashCode();
>> >>> >> +        }
>> >>> >> +        return hash;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Language getLanguage() {
>> >>> >> +        return language;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public String toString() {
>> >>> >> +        StringBuffer result = new StringBuffer();
>> >>> >> +        result.append('\"').append(lexicalForm).append('\"');
>> >>> >> +        if (language != null) {
>> >>> >> +            result.append("@").append(language.toString());
>> >>> >> +        }
>> >>> >> +        return result.toString();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Iri getDataType() {
>> >>> >> +        return XSD_STRING;
>> >>> >> +    }
>> >>> >> +    private static final Iri XSD_STRING = new Iri("
>> >>> >> http://www.w3.org/2001/XMLSchema#string");
>> >>> >> +    private static final int XSD_STRING_HASH =
>> XSD_STRING.hashCode();
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,100 @@
>> >>> >> +/*
>> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >>> >> + * or more contributor license agreements.  See the NOTICE file
>> >>> >> + * distributed with this work for additional information
>> >>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >>> >> + * to you under the Apache License, Version 2.0 (the
>> >>> >> + * "License"); you may not use this file except in compliance
>> >>> >> + * with the License.  You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> >>> >> + * software distributed under the License is distributed on an
>> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >>> >> + * KIND, either express or implied.  See the License for the
>> >>> >> + * specific language governing permissions and limitations
>> >>> >> + * under the License.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.utils;
>> >>> >> +
>> >>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>> >>> >> +import org.apache.commons.rdf.RdfTerm;
>> >>> >> +import org.apache.commons.rdf.Triple;
>> >>> >> +import org.apache.commons.rdf.Iri;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author reto
>> >>> >> + */
>> >>> >> +public class TripleImpl implements Triple {
>> >>> >> +
>> >>> >> +    private final BlankNodeOrIri subject;
>> >>> >> +    private final Iri predicate;
>> >>> >> +    private final RdfTerm object;
>> >>> >> +
>> >>> >> +    /**
>> >>> >> +     * Creates a new <code>TripleImpl</code>.
>> >>> >> +     *
>> >>> >> +     * @param subject  the subject.
>> >>> >> +     * @param predicate  the predicate.
>> >>> >> +     * @param object  the object.
>> >>> >> +     * @throws IllegalArgumentException  if an attribute is
>> >>> >> <code>null</code>.
>> >>> >> +     */
>> >>> >> +    public TripleImpl(BlankNodeOrIri subject, Iri predicate,
>> RdfTerm
>> >>> >> object) {
>> >>> >> +        if (subject == null) {
>> >>> >> +            throw new IllegalArgumentException("Invalid subject:
>> >>> null");
>> >>> >> +        } else if (predicate == null) {
>> >>> >> +            throw new IllegalArgumentException("Invalid predicate:
>> >>> null");
>> >>> >> +        } else if (object == null) {
>> >>> >> +            throw new IllegalArgumentException("Invalid object:
>> >>> null");
>> >>> >> +        }
>> >>> >> +        this.subject = subject;
>> >>> >> +        this.predicate = predicate;
>> >>> >> +        this.object = object;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean equals(Object obj) {
>> >>> >> +        if (obj == null) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        if (!(obj instanceof Triple)) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        final Triple other = (Triple) obj;
>> >>> >> +        if (!this.subject.equals(other.getSubject())) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        if (!this.predicate.equals(other.getPredicate())) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        if (!this.object.equals(other.getObject())) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        return true;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int hashCode() {
>> >>> >> +        return (subject.hashCode() >> 1) ^ predicate.hashCode() ^
>> >>> >> (object.hashCode() << 1);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public BlankNodeOrIri getSubject() {
>> >>> >> +        return subject;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    public Iri getPredicate() {
>> >>> >> +        return predicate;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    public RdfTerm getObject() {
>> >>> >> +        return object;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public String toString() {
>> >>> >> +        return subject + " " + predicate + " " + object + ".";
>> >>> >> +    }
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,80 @@
>> >>> >> +/*
>> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >>> >> + * or more contributor license agreements.  See the NOTICE file
>> >>> >> + * distributed with this work for additional information
>> >>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >>> >> + * to you under the Apache License, Version 2.0 (the
>> >>> >> + * "License"); you may not use this file except in compliance
>> >>> >> + * with the License.  You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> >>> >> + * software distributed under the License is distributed on an
>> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >>> >> + * KIND, either express or implied.  See the License for the
>> >>> >> + * specific language governing permissions and limitations
>> >>> >> + * under the License.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.utils;
>> >>> >> +
>> >>> >> +import java.io.Serializable;
>> >>> >> +
>> >>> >> +import org.apache.commons.rdf.Iri;
>> >>> >> +import org.apache.commons.rdf.Language;
>> >>> >> +import org.apache.commons.rdf.Literal;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author reto
>> >>> >> + */
>> >>> >> +public class TypedLiteralImpl extends AbstractLiteral implements
>> >>> >> Serializable {
>> >>> >> +    private String lexicalForm;
>> >>> >> +    private Iri dataType;
>> >>> >> +    private int hashCode;
>> >>> >> +
>> >>> >> +    /**
>> >>> >> +     * @param lexicalForm
>> >>> >> +     * @param dataType
>> >>> >> +     */
>> >>> >> +    public TypedLiteralImpl(String lexicalForm, Iri dataType) {
>> >>> >> +        this.lexicalForm = lexicalForm;
>> >>> >> +        this.dataType = dataType;
>> >>> >> +        this.hashCode = lexicalForm.hashCode()+dataType.hashCode();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    public Iri getDataType() {
>> >>> >> +        return dataType;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    /* (non-Javadoc)
>> >>> >> +     * @see
>> org.apache.clerezza.rdf.core.LiteralNode#getLexicalForm()
>> >>> >> +     */
>> >>> >> +    @Override
>> >>> >> +    public String getLexicalForm() {
>> >>> >> +        return lexicalForm;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int hashCode() {
>> >>> >> +        return hashCode;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public String toString() {
>> >>> >> +        StringBuffer result = new StringBuffer();
>> >>> >> +        result.append('\"');
>> >>> >> +        result.append(getLexicalForm());
>> >>> >> +        result.append('\"');
>> >>> >> +        result.append("^^");
>> >>> >> +        result.append(getDataType());
>> >>> >> +        return result.toString();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Language getLanguage() {
>> >>> >> +        return null;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,289 @@
>> >>> >> +/*
>> >>> >> + * Copyright 2015 The Apache Software Foundation.
>> >>> >> + *
>> >>> >> + * Licensed under the Apache License, Version 2.0 (the "License");
>> >>> >> + * you may not use this file except in compliance with the License.
>> >>> >> + * You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *      http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> software
>> >>> >> + * distributed under the License is distributed on an "AS IS"
>> BASIS,
>> >>> >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> >>> >> implied.
>> >>> >> + * See the License for the specific language governing permissions
>> and
>> >>> >> + * limitations under the License.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.utils;
>> >>> >> +
>> >>> >> +import java.lang.ref.WeakReference;
>> >>> >> +import java.util.Collection;
>> >>> >> +import java.util.Collections;
>> >>> >> +import java.util.HashSet;
>> >>> >> +import java.util.Iterator;
>> >>> >> +import java.util.Set;
>> >>> >> +import java.util.concurrent.locks.ReadWriteLock;
>> >>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>> >>> >> +import org.apache.commons.rdf.Graph;
>> >>> >> +import org.apache.commons.rdf.ImmutableGraph;
>> >>> >> +import org.apache.commons.rdf.Iri;
>> >>> >> +import org.apache.commons.rdf.RdfTerm;
>> >>> >> +import org.apache.commons.rdf.Triple;
>> >>> >> +import org.apache.commons.rdf.WatchableGraph;
>> >>> >> +import org.apache.commons.rdf.event.AddEvent;
>> >>> >> +import org.apache.commons.rdf.event.FilterTriple;
>> >>> >> +import org.apache.commons.rdf.event.GraphEvent;
>> >>> >> +import org.apache.commons.rdf.event.GraphListener;
>> >>> >> +import org.apache.commons.rdf.event.RemoveEvent;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author developer
>> >>> >> + */
>> >>> >> +public class WatchableGraphWrapper implements WatchableGraph {
>> >>> >> +
>> >>> >> +    final Graph wrapped;
>> >>> >> +
>> >>> >> +    public WatchableGraphWrapper(Graph wrapped) {
>> >>> >> +        this.wrapped = wrapped;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +
>> >>> >> +    //all listeners
>> >>> >> +    private final Set<ListenerConfiguration> listenerConfigs =
>> >>> >> Collections.synchronizedSet(
>> >>> >> +            new HashSet<ListenerConfiguration>());
>> >>> >> +    private DelayedNotificator delayedNotificator = new
>> >>> >> DelayedNotificator();
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Iterator<Triple> iterator() {
>> >>> >> +        return filter(null, null, null);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean contains(Object o) {
>> >>> >> +        if (!(o instanceof Triple)) {
>> >>> >> +            return false;
>> >>> >> +        }
>> >>> >> +        Triple t = (Triple) o;
>> >>> >> +        return filter(t.getSubject(), t.getPredicate(),
>> >>> >> t.getObject()).hasNext();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
>> >>> predicate,
>> >>> >> +            RdfTerm object) {
>> >>> >> +        final Iterator<Triple> baseIter = wrapped.filter(subject,
>> >>> >> predicate, object);
>> >>> >> +        return new Iterator<Triple>() {
>> >>> >> +
>> >>> >> +            Triple currentTriple = null;
>> >>> >> +
>> >>> >> +            @Override
>> >>> >> +            public boolean hasNext() {
>> >>> >> +                return baseIter.hasNext();
>> >>> >> +            }
>> >>> >> +
>> >>> >> +            @Override
>> >>> >> +            public Triple next() {
>> >>> >> +                currentTriple = baseIter.next();
>> >>> >> +                return currentTriple;
>> >>> >> +            }
>> >>> >> +
>> >>> >> +            @Override
>> >>> >> +            public void remove() {
>> >>> >> +                baseIter.remove();
>> >>> >> +                dispatchEvent(new
>> >>> RemoveEvent(WatchableGraphWrapper.this,
>> >>> >> currentTriple));
>> >>> >> +            }
>> >>> >> +        };
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean add(Triple triple) {
>> >>> >> +        boolean success = performAdd(triple);
>> >>> >> +        if (success) {
>> >>> >> +            dispatchEvent(new AddEvent(this, triple));
>> >>> >> +        }
>> >>> >> +        return success;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    /**
>> >>> >> +     * A subclass of <code>AbstractGraph</code> should override
>> >>> >> +     * this method instead of <code>add</code> for Graph event
>> >>> support to
>> >>> >> be
>> >>> >> +     * added.
>> >>> >> +     *
>> >>> >> +     * @param e The triple to be added to the triple collection
>> >>> >> +     * @return
>> >>> >> +     */
>> >>> >> +    protected boolean performAdd(Triple e) {
>> >>> >> +        return wrapped.add(e);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean remove(Object o) {
>> >>> >> +        Triple triple = (Triple) o;
>> >>> >> +        boolean success = performRemove(triple);
>> >>> >> +        if (success) {
>> >>> >> +            dispatchEvent(new RemoveEvent(this, triple));
>> >>> >> +        }
>> >>> >> +        return success;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean removeAll(Collection<?> c) {
>> >>> >> +        boolean modified = false;
>> >>> >> +        for (Iterator<? extends Object> it = c.iterator();
>> >>> it.hasNext();)
>> >>> >> {
>> >>> >> +            Object object = it.next();
>> >>> >> +            if (remove(object)) {
>> >>> >> +                modified = true;
>> >>> >> +            }
>> >>> >> +        }
>> >>> >> +        return modified;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    /**
>> >>> >> +     * A subclass of <code>AbstractGraph</code> should override
>> >>> >> +     * this method instead of <code>remove</code> for
>> ImmutableGraph
>> >>> >> event support to be
>> >>> >> +     * added.
>> >>> >> +     *
>> >>> >> +     * @param o The triple to be removed from the triple collection
>> >>> >> +     * @return
>> >>> >> +     */
>> >>> >> +    protected boolean performRemove(Triple triple) {
>> >>> >> +        Iterator<Triple> e = filter(null, null, null);
>> >>> >> +        while (e.hasNext()) {
>> >>> >> +            if (triple.equals(e.next())) {
>> >>> >> +                e.remove();
>> >>> >> +                return true;
>> >>> >> +            }
>> >>> >> +        }
>> >>> >> +        return false;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    /**
>> >>> >> +     * Dispatches a <code>GraphEvent</code> to all registered
>> >>> listeners
>> >>> >> for which
>> >>> >> +     * the specified <code>Triple</code> matches the
>> >>> >> <code>FilterTriple</code>s
>> >>> >> +     * of the listeners.
>> >>> >> +     *
>> >>> >> +     * @param triple The Triple that was modified
>> >>> >> +     * @param type The type of modification
>> >>> >> +     */
>> >>> >> +    protected void dispatchEvent(GraphEvent event) {
>> >>> >> +        synchronized(listenerConfigs) {
>> >>> >> +            Iterator<ListenerConfiguration> iter =
>> >>> >> listenerConfigs.iterator();
>> >>> >> +            while (iter.hasNext()) {
>> >>> >> +                ListenerConfiguration config = iter.next();
>> >>> >> +                GraphListener registeredListener =
>> >>> config.getListener();
>> >>> >> +                if (registeredListener == null) {
>> >>> >> +                    iter.remove();
>> >>> >> +                    continue;
>> >>> >> +                }
>> >>> >> +                if (config.getFilter().match(event.getTriple())) {
>> >>> >> +
>> >>> >> delayedNotificator.sendEventToListener(registeredListener, event);
>> >>> >> +                }
>> >>> >> +            }
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void addGraphListener(GraphListener listener,
>> FilterTriple
>> >>> >> filter) {
>> >>> >> +        addGraphListener(listener, filter, 0);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void addGraphListener(GraphListener listener,
>> FilterTriple
>> >>> >> filter,
>> >>> >> +            long delay) {
>> >>> >> +        listenerConfigs.add(new ListenerConfiguration(listener,
>> >>> filter));
>> >>> >> +        if (delay > 0) {
>> >>> >> +            delayedNotificator.addDelayedListener(listener, delay);
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void removeGraphListener(GraphListener listener) {
>> >>> >> +        synchronized(listenerConfigs) {
>> >>> >> +            Iterator<ListenerConfiguration> iter =
>> >>> >> listenerConfigs.iterator();
>> >>> >> +            while (iter.hasNext()) {
>> >>> >> +                ListenerConfiguration listenerConfig = iter.next();
>> >>> >> +                GraphListener registeredListener =
>> >>> >> listenerConfig.getListener();
>> >>> >> +                if ((registeredListener == null) ||
>> >>> >> (registeredListener.equals(listener))) {
>> >>> >> +                    iter.remove();
>> >>> >> +                }
>> >>> >> +            }
>> >>> >> +        }
>> >>> >> +        delayedNotificator.removeDelayedListener(listener);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public ImmutableGraph getImmutableGraph() {
>> >>> >> +        throw new UnsupportedOperationException("Not supported
>> yet.");
>> >>> >> //To change body of generated methods, choose Tools | Templates.
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public ReadWriteLock getLock() {
>> >>> >> +        return wrapped.getLock();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int size() {
>> >>> >> +        return wrapped.size();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean isEmpty() {
>> >>> >> +        return wrapped.isEmpty();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Object[] toArray() {
>> >>> >> +        return wrapped.toArray();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public <T> T[] toArray(T[] a) {
>> >>> >> +        return wrapped.toArray(a);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean containsAll(Collection<?> c) {
>> >>> >> +        return wrapped.containsAll(c);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean addAll(Collection<? extends Triple> c) {
>> >>> >> +        return wrapped.addAll(c);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean retainAll(Collection<?> c) {
>> >>> >> +        return wrapped.retainAll(c);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void clear() {
>> >>> >> +        wrapped.clear();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    private static class ListenerConfiguration {
>> >>> >> +
>> >>> >> +        private WeakReference<GraphListener> listenerRef;
>> >>> >> +        private FilterTriple filter;
>> >>> >> +
>> >>> >> +        private ListenerConfiguration(GraphListener listener,
>> >>> >> FilterTriple filter) {
>> >>> >> +            this.listenerRef = new
>> >>> WeakReference<GraphListener>(listener);
>> >>> >> +            this.filter = filter;
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        /**
>> >>> >> +         * @return the listener
>> >>> >> +         */
>> >>> >> +        GraphListener getListener() {
>> >>> >> +            GraphListener listener = listenerRef.get();
>> >>> >> +            return listener;
>> >>> >> +        }
>> >>> >> +
>> >>> >> +        /**
>> >>> >> +         * @return the filter
>> >>> >> +         */
>> >>> >> +        FilterTriple getFilter() {
>> >>> >> +            return filter;
>> >>> >> +        }
>> >>> >> +    }
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,85 @@
>> >>> >> +/*
>> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >>> >> + * or more contributor license agreements.  See the NOTICE file
>> >>> >> + * distributed with this work for additional information
>> >>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >>> >> + * to you under the Apache License, Version 2.0 (the
>> >>> >> + * "License"); you may not use this file except in compliance
>> >>> >> + * with the License.  You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> >>> >> + * software distributed under the License is distributed on an
>> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >>> >> + * KIND, either express or implied.  See the License for the
>> >>> >> + * specific language governing permissions and limitations
>> >>> >> + * under the License.
>> >>> >> + */
>> >>> >> +
>> >>> >> +package org.apache.commons.rdf.impl.utils.debug;
>> >>> >> +
>> >>> >> +import java.util.concurrent.TimeUnit;
>> >>> >> +import java.util.concurrent.locks.Condition;
>> >>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author mir
>> >>> >> + */
>> >>> >> +public class ReadLockDebug extends ReadLock {
>> >>> >> +
>> >>> >> +    ReentrantReadWriteLockTracker lock;
>> >>> >> +    StackTraceElement[] stackTrace;
>> >>> >> +
>> >>> >> +    ReadLock readLock;
>> >>> >> +    public ReadLockDebug(ReentrantReadWriteLockTracker lock) {
>> >>> >> +        super(lock);
>> >>> >> +        this.lock = lock;
>> >>> >> +        this.readLock = lock.realReadLock();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void lock() {
>> >>> >> +        readLock.lock();
>> >>> >> +        lock.addLockedReadLock(this);
>> >>> >> +        stackTrace = Thread.currentThread().getStackTrace();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void lockInterruptibly() throws InterruptedException {
>> >>> >> +        readLock.lockInterruptibly();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Condition newCondition() {
>> >>> >> +        return readLock.newCondition();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public String toString() {
>> >>> >> +        return readLock.toString();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean tryLock() {
>> >>> >> +        return readLock.tryLock();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean tryLock(long timeout, TimeUnit unit) throws
>> >>> >> InterruptedException {
>> >>> >> +        return readLock.tryLock(timeout, unit);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void unlock() {
>> >>> >> +        readLock.unlock();
>> >>> >> +        lock.removeReadLock(this);
>> >>> >> +        stackTrace = null;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    public StackTraceElement[] getStackTrace() {
>> >>> >> +        return stackTrace;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,133 @@
>> >>> >> +/*
>> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >>> >> + * or more contributor license agreements.  See the NOTICE file
>> >>> >> + * distributed with this work for additional information
>> >>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >>> >> + * to you under the Apache License, Version 2.0 (the
>> >>> >> + * "License"); you may not use this file except in compliance
>> >>> >> + * with the License.  You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> >>> >> + * software distributed under the License is distributed on an
>> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >>> >> + * KIND, either express or implied.  See the License for the
>> >>> >> + * specific language governing permissions and limitations
>> >>> >> + * under the License.
>> >>> >> + */
>> >>> >> +package org.apache.commons.rdf.impl.utils.debug;
>> >>> >> +
>> >>> >> +import java.util.Collection;
>> >>> >> +import java.util.Collections;
>> >>> >> +import java.util.HashSet;
>> >>> >> +import java.util.Set;
>> >>> >> +import java.util.concurrent.locks.Condition;
>> >>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author mir
>> >>> >> + */
>> >>> >> +public class ReentrantReadWriteLockTracker extends
>> >>> ReentrantReadWriteLock
>> >>> >> {
>> >>> >> +
>> >>> >> +
>> >>> >> +    private Set<ReadLockDebug> lockedReadLocks =
>> >>> >> Collections.synchronizedSet(new HashSet<ReadLockDebug>());
>> >>> >> +    private final WriteLockDebug writeLock = new
>> WriteLockDebug(this);
>> >>> >> +    @Override
>> >>> >> +    protected Thread getOwner() {
>> >>> >> +        return super.getOwner();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    protected Collection<Thread> getQueuedReaderThreads() {
>> >>> >> +        return super.getQueuedReaderThreads();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    protected Collection<Thread> getQueuedThreads() {
>> >>> >> +        return super.getQueuedThreads();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    protected Collection<Thread> getQueuedWriterThreads() {
>> >>> >> +        return super.getQueuedWriterThreads();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int getReadHoldCount() {
>> >>> >> +        return super.getReadHoldCount();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int getReadLockCount() {
>> >>> >> +        return super.getReadLockCount();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int getWaitQueueLength(Condition condition) {
>> >>> >> +        return super.getWaitQueueLength(condition);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    protected Collection<Thread> getWaitingThreads(Condition
>> >>> condition) {
>> >>> >> +        return super.getWaitingThreads(condition);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int getWriteHoldCount() {
>> >>> >> +        return super.getWriteHoldCount();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean hasWaiters(Condition condition) {
>> >>> >> +        return super.hasWaiters(condition);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean isWriteLocked() {
>> >>> >> +        return super.isWriteLocked();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean isWriteLockedByCurrentThread() {
>> >>> >> +        return super.isWriteLockedByCurrentThread();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public ReadLock readLock() {
>> >>> >> +        return new ReadLockDebug(this);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    ReadLock realReadLock() {
>> >>> >> +        return super.readLock();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    WriteLock realWriteLock() {
>> >>> >> +        return super.writeLock();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public String toString() {
>> >>> >> +        return super.toString();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public WriteLockDebug writeLock() {
>> >>> >> +        return writeLock;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    void addLockedReadLock(ReadLockDebug lock) {
>> >>> >> +        lockedReadLocks.add(lock);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    void removeReadLock(ReadLockDebug lock) {
>> >>> >> +        lockedReadLocks.remove(lock);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    public Set<ReadLockDebug> getLockedReadLocks() {
>> >>> >> +        return lockedReadLocks;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >> Added:
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> >>> >> URL:
>> >>> >>
>> >>>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java?rev=1659973&view=auto
>> >>> >>
>> >>> >>
>> >>>
>> ==============================================================================
>> >>> >> ---
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> >>> >> (added)
>> >>> >> +++
>> >>> >>
>> >>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> >>> >> Sun Feb 15 18:41:15 2015
>> >>> >> @@ -0,0 +1,89 @@
>> >>> >> +/*
>> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >>> >> + * or more contributor license agreements.  See the NOTICE file
>> >>> >> + * distributed with this work for additional information
>> >>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >>> >> + * to you under the Apache License, Version 2.0 (the
>> >>> >> + * "License"); you may not use this file except in compliance
>> >>> >> + * with the License.  You may obtain a copy of the License at
>> >>> >> + *
>> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >>> >> + *
>> >>> >> + * Unless required by applicable law or agreed to in writing,
>> >>> >> + * software distributed under the License is distributed on an
>> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >>> >> + * KIND, either express or implied.  See the License for the
>> >>> >> + * specific language governing permissions and limitations
>> >>> >> + * under the License.
>> >>> >> + */
>> >>> >> +
>> >>> >> +package org.apache.commons.rdf.impl.utils.debug;
>> >>> >> +
>> >>> >> +import java.util.concurrent.TimeUnit;
>> >>> >> +import java.util.concurrent.locks.Condition;
>> >>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
>> >>> >> +
>> >>> >> +/**
>> >>> >> + *
>> >>> >> + * @author mir
>> >>> >> + */
>> >>> >> +public class WriteLockDebug extends WriteLock {
>> >>> >> +
>> >>> >> +    private ReentrantReadWriteLockTracker lock;
>> >>> >> +    private WriteLock writeLock;
>> >>> >> +    private StackTraceElement[] stackTrace;
>> >>> >> +
>> >>> >> +    public WriteLockDebug(ReentrantReadWriteLockTracker lock) {
>> >>> >> +        super(lock);
>> >>> >> +        this.lock = lock;
>> >>> >> +        this.writeLock = lock.realWriteLock();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public int getHoldCount() {
>> >>> >> +        return writeLock.getHoldCount();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean isHeldByCurrentThread() {
>> >>> >> +        return writeLock.isHeldByCurrentThread();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void lock() {
>> >>> >> +        writeLock.lock();
>> >>> >> +        stackTrace = Thread.currentThread().getStackTrace();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void lockInterruptibly() throws InterruptedException {
>> >>> >> +        writeLock.lockInterruptibly();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public Condition newCondition() {
>> >>> >> +        return writeLock.newCondition();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean tryLock() {
>> >>> >> +        return writeLock.tryLock();
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public boolean tryLock(long timeout, TimeUnit unit) throws
>> >>> >> InterruptedException {
>> >>> >> +        return writeLock.tryLock(timeout, unit);
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    @Override
>> >>> >> +    public void unlock() {
>> >>> >> +        writeLock.unlock();
>> >>> >> +        stackTrace = null;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +    public StackTraceElement[] getStackTrace() {
>> >>> >> +        return stackTrace;
>> >>> >> +    }
>> >>> >> +
>> >>> >> +
>> >>> >> +}
>> >>> >>
>> >>> >>
>> >>> >>
>> >>> >
>> >>> >
>> >>> > --
>> >>> > http://people.apache.org/~britter/
>> >>> > http://www.systemoutprintln.de/
>> >>> > http://twitter.com/BenediktRitter
>> >>> > http://github.com/britter
>> >>>
>> >>> ---------------------------------------------------------------------
>> >>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>> >>> For additional commands, e-mail: dev-help@commons.apache.org
>> >>>
>> >>>
>> >>
>> >>
>> >> --
>> >> http://people.apache.org/~britter/
>> >> http://www.systemoutprintln.de/
>> >> http://twitter.com/BenediktRitter
>> >> http://github.com/britter
>> >>
>> >
>> >
>> >
>> > --
>> > http://people.apache.org/~britter/
>> > http://www.systemoutprintln.de/
>> > http://twitter.com/BenediktRitter
>> > http://github.com/britter
>>
>>
>>
>> --
>> Stian Soiland-Reyes
>> Apache Taverna (incubating)
>> http://orcid.org/0000-0001-9842-9718
>>



-- 
Stian Soiland-Reyes
Apache Taverna (incubating)
http://orcid.org/0000-0001-9842-9718

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: svn commit: r1659973 [1/3] - in /commons/sandbox/rdf/trunk: ./ api/src/main/java/org/apache/commons/rdf/ impl.sparql/ impl.sparql/src/ impl.sparql/src/main/ impl.sparql/src/main/java/ impl.sparql/src/main/java/org/ impl.sparql/src/main/java/org/apache/...

Posted by Reto Gmür <re...@apache.org>.
Hi all,

Sorry that I couldn't reply earlier.

Stian is right, this is code that might become part of the incubating
project.

It is not about having a non-trivial implementation but about a proof
of-concept implementation against a SPARQL Backend as a mean to evaluate
design decisions in the API.

Cheers,
Reto

On Thu, Feb 19, 2015 at 4:01 PM, Stian Soiland-Reyes <st...@apache.org>
wrote:

> I am not speaking for Reto, but I imagined that since Reto has joined
> the CommonsRDF incubator proposal, then his sandbox-code would
> eventually turn into pull requests and branches on the incubator
> codebase so that we can evaluate each of the differences separately.
>
>
> On 19 February 2015 at 06:54, Benedikt Ritter <br...@apache.org> wrote:
> > 2015-02-17 7:04 GMT+01:00 Benedikt Ritter <br...@apache.org>:
> >
> >>
> >>
> >> 2015-02-17 0:13 GMT+01:00 Peter Ansell <an...@gmail.com>:
> >>
> >>> Hi Bernard,
> >>>
> >>> The Commons RDF project is not planning on including any non-trivial
> >>> implementations, to avoid bias towards any of the participating
> >>> platforms. Stian has written a trivial implementation and submitted it
> >>> to GitHub to provide a reference for our test harness, but it is never
> >>> planned to be used by anyone for non-trivial purposes.
> >>>
> >>> Reto is moving this code here unilaterally from Clerezza at this point
> >>> based on the ability of any Apache committer to send code into Apache
> >>> Commons.
> >>>
> >>> The code that will be sent to the incubator is still planned to be the
> >>> code that is in the GitHub repository at the time the incubator
> >>> request goes through.
> >>>
> >>
> >> This is still in the sandbox so I'm not too crazy about it. But
> creating a
> >> separate code base in the commons-rdf git repository doesn't sound like
> a
> >> good idea given the fact that github Commons RDF will eventually move to
> >> Apache Commons after incubation. What should haben with the code that
> is in
> >> the repository by that time?
> >>
> >> Reto, can you comment please?
> >>
> >
> > Reto, I'm still waiting for your comment.
> >
> >
> >>
> >> Regards,
> >> Benedikt
> >>
> >>
> >>>
> >>> Cheers,
> >>>
> >>> Peter
> >>>
> >>> On 16 February 2015 at 18:34, Benedikt Ritter <br...@apache.org>
> wrote:
> >>> > Hello Reto,
> >>> >
> >>> > how does this relate to github Commons RDF? Is this part of the code
> >>> base
> >>> > proposed for incubation?
> >>> >
> >>> > Regards,
> >>> > Benedikt
> >>> >
> >>> > 2015-02-15 19:41 GMT+01:00 <re...@apache.org>:
> >>> >
> >>> >> Author: reto
> >>> >> Date: Sun Feb 15 18:41:15 2015
> >>> >> New Revision: 1659973
> >>> >>
> >>> >> URL: http://svn.apache.org/r1659973
> >>> >> Log:
> >>> >> Started SPARQL Backed Implementation
> >>> >>
> >>> >> Added:
> >>> >>     commons/sandbox/rdf/trunk/alerts.txt
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/   (with props)
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/pom.xml
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/resources/
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/
> >>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/
> >>> >>
> >>>  commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/   (with props)
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/pom.xml
> >>> >>       - copied, changed from r1651181,
> >>> commons/sandbox/rdf/trunk/pom.xml
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/
> >>> >>
> >>>  commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphNotIsomorphicException.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GroupMappingIterator.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/HashMatching.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/MappingIterator.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/PermutationIterator.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/Utils.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashMap.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashSet.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntIterator.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntSet.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/package-info.java
> >>> >>       - copied, changed from r1651181,
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/src/main/java/org/apache/commons/rdf/package-info.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraph.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleMGraph.java
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/resources/
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/
> >>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/
> >>> >>
> >>>  commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/PlainLiteralImplTest.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraphTest.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TripleImplTest.java
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
> >>> >>     commons/sandbox/rdf/trunk/report.xml
> >>> >> Modified:
> >>> >>
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> >>> >>     commons/sandbox/rdf/trunk/pom.xml
> >>> >>
> >>> >> Added: commons/sandbox/rdf/trunk/alerts.txt
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/alerts.txt?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >>     (empty)
> >>> >>
> >>> >> Modified:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java?rev=1659973&r1=1659972&r2=1659973&view=diff
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> >>> >> (original)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -84,7 +84,8 @@ public interface Literal extends RdfTerm
> >>> >>
> >>> >>      /**
> >>> >>       * Returns the hash code of the lexical form plus the hash code
> >>> of the
> >>> >> -     * language, plush the hash code of the datatype
> >>> >> +     * datatype plus if the literal has a language the hash code of
> >>> the
> >>> >> +     * language.
> >>> >>       *
> >>> >>       * @return hash code
> >>> >>       */
> >>> >>
> >>> >> Propchange: commons/sandbox/rdf/trunk/impl.sparql/
> >>> >>
> >>> >>
> >>>
> ------------------------------------------------------------------------------
> >>> >> --- svn:ignore (added)
> >>> >> +++ svn:ignore Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1 @@
> >>> >> +target
> >>> >>
> >>> >> Added: commons/sandbox/rdf/trunk/impl.sparql/pom.xml
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/pom.xml?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> --- commons/sandbox/rdf/trunk/impl.sparql/pom.xml (added)
> >>> >> +++ commons/sandbox/rdf/trunk/impl.sparql/pom.xml Sun Feb 15
> 18:41:15
> >>> 2015
> >>> >> @@ -0,0 +1,52 @@
> >>> >> +<?xml version="1.0" encoding="UTF-8"?>
> >>> >> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> >>> >> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
> >>> >> http://maven.apache.org/POM/4.0.0
> >>> >> http://maven.apache.org/xsd/maven-4.0.0.xsd">
> >>> >> +    <parent>
> >>> >> +        <groupId>org.apache.commons</groupId>
> >>> >> +        <artifactId>commons-parent</artifactId>
> >>> >> +        <version>37</version>
> >>> >> +        <relativePath />
> >>> >> +    </parent>
> >>> >> +    <modelVersion>4.0.0</modelVersion>
> >>> >> +    <groupId>commons-rdf</groupId>
> >>> >> +    <artifactId>commons-rdf-impl-sparql</artifactId>
> >>> >> +    <version>1.0.0-SNAPSHOT</version>
> >>> >> +    <packaging>jar</packaging>
> >>> >> +    <name>Apache Commons RDF SPARQL backed implementation.</name>
> >>> >> +    <description>An implementation of the rdf commons API backed
> by a
> >>> >> sparql
> >>> >> +        endpoint. STATUS: Incomplete, currecnt code only supports
> >>> reading
> >>> >> +        graphs and does not yet support BlankNodes.</description>
> >>> >> +    <properties>
> >>> >> +
> >>> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
> >>> >> +        <maven.compiler.source>1.7</maven.compiler.source>
> >>> >> +        <maven.compiler.target>1.7</maven.compiler.target>
> >>> >> +    </properties>
> >>> >> +    <dependencies>
> >>> >> +        <dependency>
> >>> >> +            <groupId>org.apache.httpcomponents</groupId>
> >>> >> +            <artifactId>httpclient</artifactId>
> >>> >> +            <version>4.4</version>
> >>> >> +        </dependency>
> >>> >> +        <dependency>
> >>> >> +            <groupId>commons-rdf</groupId>
> >>> >> +            <artifactId>commons-rdf-api</artifactId>
> >>> >> +            <version>0.1-SNAPSHOT</version>
> >>> >> +        </dependency>
> >>> >> +        <dependency>
> >>> >> +            <groupId>commons-rdf</groupId>
> >>> >> +            <artifactId>commons-rdf-impl-utils</artifactId>
> >>> >> +            <version>0.1-SNAPSHOT</version>
> >>> >> +        </dependency>
> >>> >> +        <dependency>
> >>> >> +            <groupId>junit</groupId>
> >>> >> +            <artifactId>junit</artifactId>
> >>> >> +            <version>4.12</version>
> >>> >> +            <scope>test</scope>
> >>> >> +        </dependency>
> >>> >> +        <dependency>
> >>> >> +            <groupId>org.apache.jena</groupId>
> >>> >> +            <artifactId>jena-fuseki</artifactId>
> >>> >> +            <version>1.1.1</version>
> >>> >> +            <scope>test</scope>
> >>> >> +        </dependency>
> >>> >> +    </dependencies>
> >>> >> +</project>
> >>> >> \ No newline at end of file
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,220 @@
> >>> >> +/*
> >>> >> + * To change this license header, choose License Headers in Project
> >>> >> Properties.
> >>> >> + * To change this template file, choose Tools | Templates
> >>> >> + * and open the template in the editor.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.sparql;
> >>> >> +
> >>> >> +import java.io.IOException;
> >>> >> +import java.io.InputStream;
> >>> >> +import java.io.UnsupportedEncodingException;
> >>> >> +import java.util.ArrayList;
> >>> >> +import java.util.Enumeration;
> >>> >> +import java.util.HashMap;
> >>> >> +import java.util.Hashtable;
> >>> >> +import java.util.List;
> >>> >> +import java.util.Map;
> >>> >> +import java.util.logging.Level;
> >>> >> +import java.util.logging.Logger;
> >>> >> +import org.apache.http.HttpEntity;
> >>> >> +import org.apache.http.NameValuePair;
> >>> >> +import org.apache.http.client.entity.UrlEncodedFormEntity;
> >>> >> +import org.apache.http.client.methods.CloseableHttpResponse;
> >>> >> +import org.apache.http.client.methods.HttpPost;
> >>> >> +import org.apache.http.impl.client.CloseableHttpClient;
> >>> >> +import org.apache.http.impl.client.HttpClients;
> >>> >> +import org.apache.http.message.BasicNameValuePair;
> >>> >> +import org.apache.http.util.EntityUtils;
> >>> >> +import javax.xml.parsers.*;
> >>> >> +import org.apache.commons.rdf.BlankNode;
> >>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
> >>> >> +import org.apache.commons.rdf.Iri;
> >>> >> +import org.apache.commons.rdf.Language;
> >>> >> +import org.apache.commons.rdf.Literal;
> >>> >> +import org.apache.commons.rdf.RdfTerm;
> >>> >> +import org.apache.commons.rdf.Triple;
> >>> >> +import org.apache.commons.rdf.impl.utils.AbstractLiteral;
> >>> >> +import org.xml.sax.*;
> >>> >> +import org.xml.sax.helpers.*;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author developer
> >>> >> + */
> >>> >> +public class SparqlClient {
> >>> >> +
> >>> >> +    final String endpoint;
> >>> >> +
> >>> >> +    public SparqlClient(final String endpoint) {
> >>> >> +        this.endpoint = endpoint;
> >>> >> +    }
> >>> >> +
> >>> >> +    List<Map<String, RdfTerm>> queryResultSet(final String query)
> >>> throws
> >>> >> IOException {
> >>> >> +        CloseableHttpClient httpclient =
> HttpClients.createDefault();
> >>> >> +        HttpPost httpPost = new HttpPost(endpoint);
> >>> >> +        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
> >>> >> +        nvps.add(new BasicNameValuePair("query", query));
> >>> >> +        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
> >>> >> +        CloseableHttpResponse response2 =
> >>> httpclient.execute(httpPost);
> >>> >> +
> >>> >> +        try {
> >>> >> +            HttpEntity entity2 = response2.getEntity();
> >>> >> +            InputStream in = entity2.getContent();
> >>> >> +            SAXParserFactory spf = SAXParserFactory.newInstance();
> >>> >> +            spf.setNamespaceAware(true);
> >>> >> +            SAXParser saxParser = spf.newSAXParser();
> >>> >> +            XMLReader xmlReader = saxParser.getXMLReader();
> >>> >> +            final SparqlsResultsHandler sparqlsResultsHandler = new
> >>> >> SparqlsResultsHandler();
> >>> >> +            xmlReader.setContentHandler(sparqlsResultsHandler);
> >>> >> +            xmlReader.parse(new InputSource(in));
> >>> >> +            /*
> >>> >> +             for (int ch = in.read(); ch != -1; ch = in.read()) {
> >>> >> +             System.out.print((char)ch);
> >>> >> +             }
> >>> >> +             */
> >>> >> +            // do something useful with the response body
> >>> >> +            // and ensure it is fully consumed
> >>> >> +            EntityUtils.consume(entity2);
> >>> >> +            return sparqlsResultsHandler.getResults();
> >>> >> +        } catch (ParserConfigurationException ex) {
> >>> >> +            throw new RuntimeException(ex);
> >>> >> +        } catch (SAXException ex) {
> >>> >> +            throw new RuntimeException(ex);
> >>> >> +        } finally {
> >>> >> +            response2.close();
> >>> >> +        }
> >>> >> +
> >>> >> +    }
> >>> >> +
> >>> >> +    final public static class SparqlsResultsHandler extends
> >>> >> DefaultHandler {
> >>> >> +
> >>> >> +        private String currentBindingName;
> >>> >> +        private Map<String, RdfTerm> currentResult = null;
> >>> >> +        private final List<Map<String, RdfTerm>> results = new
> >>> >> ArrayList<>();
> >>> >> +        private boolean readingValue;
> >>> >> +        private String value;
> >>> >> +        private Map<String, BlankNode> bNodeMap = new HashMap<>();
> >>> >> +        private static final Iri XSD_STRING = new Iri("
> >>> >> http://www.w3.org/2001/XMLSchema#string");
> >>> >> +
> >>> >> +        private RdfTerm getBNode(String value) {
> >>> >> +            if (!bNodeMap.containsKey(value)) {
> >>> >> +                bNodeMap.put(value, new BlankNode());
> >>> >> +            }
> >>> >> +            return bNodeMap.get(value);
> >>> >> +        }
> >>> >> +
> >>> >> +        private List<Map<String, RdfTerm>> getResults() {
> >>> >> +            return results;
> >>> >> +        }
> >>> >> +
> >>> >> +        enum BindingType {
> >>> >> +
> >>> >> +            uri, bnode, literal;
> >>> >> +        }
> >>> >> +
> >>> >> +        @Override
> >>> >> +        public void startDocument() throws SAXException {
> >>> >> +
> >>> >> +        }
> >>> >> +
> >>> >> +        @Override
> >>> >> +        public void startElement(String namespaceURI,
> >>> >> +                String localName,
> >>> >> +                String qName,
> >>> >> +                Attributes atts)
> >>> >> +                throws SAXException {
> >>> >> +            if ("http://www.w3.org/2005/sparql-results#
> >>> ".equals(namespaceURI))
> >>> >> {
> >>> >> +                if ("result".equals(localName)) {
> >>> >> +                    if (currentResult != null) {
> >>> >> +                        throw new SAXException("unexpected tag
> >>> <result>");
> >>> >> +                    }
> >>> >> +                    currentResult = new HashMap<>();
> >>> >> +                } else if ("binding".equals(localName)) {
> >>> >> +                    if (currentResult == null) {
> >>> >> +                        throw new SAXException("unexpected tag
> >>> >> <binding>");
> >>> >> +                    }
> >>> >> +                    currentBindingName = atts.getValue("name");
> >>> >> +                } else if ("uri".equals(localName) ||
> >>> >> "bnode".equals(localName) || "literal".equals(localName)) {
> >>> >> +                    if (readingValue) {
> >>> >> +                        throw new SAXException("unexpected tag <" +
> >>> >> localName + ">");
> >>> >> +                    }
> >>> >> +                    readingValue = true;
> >>> >> +                }
> >>> >> +            }
> >>> >> +
> >>> >> +            //System.out.println(namespaceURI);
> >>> >> +            //System.out.println(qName);
> >>> >> +        }
> >>> >> +
> >>> >> +        @Override
> >>> >> +        public void characters(char[] chars, int start, int length)
> >>> >> throws SAXException {
> >>> >> +            if (readingValue) {
> >>> >> +                value = new String(chars, start, length);
> >>> >> +                //System.err.println(value + start + ", " +
> length);
> >>> >> +            }
> >>> >> +        }
> >>> >> +
> >>> >> +        @Override
> >>> >> +        public void endElement(String namespaceURI,
> >>> >> +                String localName,
> >>> >> +                String qName)
> >>> >> +                throws SAXException {
> >>> >> +            if ("http://www.w3.org/2005/sparql-results#
> >>> ".equals(namespaceURI))
> >>> >> {
> >>> >> +                if ("result".equals(localName)) {
> >>> >> +                    results.add(currentResult);
> >>> >> +                    currentResult = null;
> >>> >> +                } else if ("binding".equals(localName)) {
> >>> >> +                    if (currentBindingName == null) {
> >>> >> +                        throw new SAXException("unexpected tag
> >>> >> </binding>");
> >>> >> +                    }
> >>> >> +                    currentBindingName = null;
> >>> >> +                } else {
> >>> >> +                    try {
> >>> >> +                        BindingType b =
> >>> BindingType.valueOf(localName);
> >>> >> +                        RdfTerm rdfTerm = null;
> >>> >> +                        switch (b) {
> >>> >> +                            case uri:
> >>> >> +                                rdfTerm = new Iri(value);
> >>> >> +                                break;
> >>> >> +                            case bnode:
> >>> >> +                                rdfTerm = getBNode(value);
> >>> >> +                                break;
> >>> >> +                            case literal:
> >>> >> +                                final String lf = value;
> >>> >> +                                rdfTerm = new AbstractLiteral() {
> >>> >> +
> >>> >> +                                    @Override
> >>> >> +                                    public String getLexicalForm()
> {
> >>> >> +                                        return lf;
> >>> >> +                                    }
> >>> >> +
> >>> >> +                                    @Override
> >>> >> +                                    public Iri getDataType() {
> >>> >> +                                        //TODO implement
> >>> >> +                                        return XSD_STRING;
> >>> >> +                                    }
> >>> >> +
> >>> >> +                                    @Override
> >>> >> +                                    public Language getLanguage() {
> >>> >> +                                        //TODO impl
> >>> >> +                                        return null;
> >>> >> +                                    }
> >>> >> +                                };
> >>> >> +                                break;
> >>> >> +                        }
> >>> >> +                        currentResult.put(currentBindingName,
> >>> rdfTerm);
> >>> >> +                        readingValue = false;
> >>> >> +                    } catch (IllegalArgumentException e) {
> >>> >> +                            //not uri|bnode|literal
> >>> >> +                    }
> >>> >> +                }
> >>> >> +            }
> >>> >> +        }
> >>> >> +
> >>> >> +        public void endDocument() throws SAXException {
> >>> >> +            //System.out.println("results: " + results.size());
> >>> >> +        }
> >>> >> +
> >>> >> +    }
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,121 @@
> >>> >> +/*
> >>> >> + * To change this license header, choose License Headers in Project
> >>> >> Properties.
> >>> >> + * To change this template file, choose Tools | Templates
> >>> >> + * and open the template in the editor.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.sparql;
> >>> >> +
> >>> >> +import java.io.IOException;
> >>> >> +import java.util.Iterator;
> >>> >> +import java.util.List;
> >>> >> +import java.util.Map;
> >>> >> +import org.apache.commons.rdf.BlankNode;
> >>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
> >>> >> +import org.apache.commons.rdf.Iri;
> >>> >> +import org.apache.commons.rdf.Literal;
> >>> >> +import org.apache.commons.rdf.RdfTerm;
> >>> >> +import org.apache.commons.rdf.Triple;
> >>> >> +import org.apache.commons.rdf.impl.utils.AbstractGraph;
> >>> >> +import org.apache.commons.rdf.impl.utils.TripleImpl;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author reto
> >>> >> + */
> >>> >> +public class SparqlGraph extends AbstractGraph {
> >>> >> +
> >>> >> +    final SparqlClient sparqlClient;
> >>> >> +
> >>> >> +    /** Constructs a Graph representing the default graph at the
> >>> specified
> >>> >> +     * endpoint
> >>> >> +     */
> >>> >> +    public SparqlGraph(final String endpoint) {
> >>> >> +        sparqlClient = new SparqlClient(endpoint);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    protected Iterator<Triple> performFilter(final BlankNodeOrIri
> >>> subject,
> >>> >> +            final Iri predicate, final RdfTerm object) {
> >>> >> +        try {
> >>> >> +            final StringBuilder queryBuilder = new StringBuilder();
> >>> >> +            queryBuilder.append("SELECT * WHERE { ");
> >>> >> +            if (subject == null) {
> >>> >> +                queryBuilder.append("?s");
> >>> >> +            } else {
> >>> >> +                queryBuilder.append(asSparqlTerm(subject));
> >>> >> +            }
> >>> >> +            queryBuilder.append(' ');
> >>> >> +            if (predicate == null) {
> >>> >> +                queryBuilder.append("?p");
> >>> >> +            } else {
> >>> >> +                queryBuilder.append(asSparqlTerm(predicate));
> >>> >> +            }
> >>> >> +            queryBuilder.append(' ');
> >>> >> +            if (object == null) {
> >>> >> +                queryBuilder.append("?o");
> >>> >> +            } else {
> >>> >> +                queryBuilder.append(asSparqlTerm(object));
> >>> >> +            }
> >>> >> +            queryBuilder.append(" }");
> >>> >> +            List<Map<String, RdfTerm>> sparqlResults =
> >>> >> sparqlClient.queryResultSet(queryBuilder.toString());
> >>> >> +            final Iterator<Map<String, RdfTerm>> resultsIterator =
> >>> >> sparqlResults.iterator();
> >>> >> +            return new Iterator<Triple>() {
> >>> >> +
> >>> >> +                @Override
> >>> >> +                public boolean hasNext() {
> >>> >> +                    return resultsIterator.hasNext();
> >>> >> +                }
> >>> >> +
> >>> >> +                @Override
> >>> >> +                public Triple next() {
> >>> >> +                    Map<String, RdfTerm> result =
> >>> resultsIterator.next();
> >>> >> +                    return new TripleImpl(subject != null ?
> subject :
> >>> >> (BlankNodeOrIri)result.get("s"),
> >>> >> +                            predicate != null ? predicate :
> >>> >> (Iri)result.get("p"),
> >>> >> +                            object != null ? object :
> >>> result.get("o"));
> >>> >> +                }
> >>> >> +            };
> >>> >> +        } catch (IOException ex) {
> >>> >> +            throw new RuntimeException(ex);
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    protected int performSize() {
> >>> >> +        try {
> >>> >> +            return sparqlClient.queryResultSet("SELECT * WHERE {
> ?s ?p
> >>> >> ?o}").size();
> >>> >> +        } catch (IOException ex) {
> >>> >> +            throw new RuntimeException(ex);
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    private String asSparqlTerm(Iri iri) {
> >>> >> +        return "<"+iri.getUnicodeString()+">";
> >>> >> +    }
> >>> >> +
> >>> >> +    private String asSparqlTerm(Literal literal) {
> >>> >> +        //TODO langauge and datatype
> >>> >> +        return "\""+literal.getLexicalForm()+"\"";
> >>> >> +    }
> >>> >> +
> >>> >> +    private String asSparqlTerm(BlankNode bnode) {
> >>> >> +        //this requires adding additional clauses to the graph
> pattern
> >>> >> +        throw new UnsupportedOperationException("Not supported
> yet.");
> >>> >> +    }
> >>> >> +
> >>> >> +    private String asSparqlTerm(BlankNodeOrIri term) {
> >>> >> +        if (term instanceof Iri) {
> >>> >> +            return asSparqlTerm((Iri)term);
> >>> >> +        } else {
> >>> >> +            return asSparqlTerm((BlankNode)term);
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    private String asSparqlTerm(RdfTerm term) {
> >>> >> +        if (term instanceof BlankNodeOrIri) {
> >>> >> +            return asSparqlTerm((BlankNodeOrIri)term);
> >>> >> +        } else {
> >>> >> +            return asSparqlTerm((Literal)term);
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,106 @@
> >>> >> +/*
> >>> >> + * To change this license header, choose License Headers in Project
> >>> >> Properties.
> >>> >> + * To change this template file, choose Tools | Templates
> >>> >> + * and open the template in the editor.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.sparql;
> >>> >> +
> >>> >> +import com.hp.hpl.jena.query.DatasetAccessor;
> >>> >> +import com.hp.hpl.jena.query.DatasetAccessorFactory;
> >>> >> +import java.io.File;
> >>> >> +import java.io.IOException;
> >>> >> +import java.net.ServerSocket;
> >>> >> +import org.apache.jena.fuseki.EmbeddedFusekiServer;
> >>> >> +import com.hp.hpl.jena.rdf.model.Model;
> >>> >> +import com.hp.hpl.jena.rdf.model.ModelFactory;
> >>> >> +import java.io.InputStream;
> >>> >> +import java.util.HashSet;
> >>> >> +import java.util.Iterator;
> >>> >> +import java.util.Set;
> >>> >> +import org.apache.commons.rdf.Graph;
> >>> >> +import org.apache.commons.rdf.Iri;
> >>> >> +import org.apache.commons.rdf.Literal;
> >>> >> +import org.apache.commons.rdf.RdfTerm;
> >>> >> +import org.apache.commons.rdf.Triple;
> >>> >> +import org.apache.commons.rdf.impl.utils.PlainLiteralImpl;
> >>> >> +import org.junit.AfterClass;
> >>> >> +import org.junit.Assert;
> >>> >> +import org.junit.BeforeClass;
> >>> >> +import org.junit.Test;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author reto
> >>> >> + */
> >>> >> +public class SparqlGraphTest {
> >>> >> +
> >>> >> +    final static int serverPort = findFreePort();
> >>> >> +    static EmbeddedFusekiServer server;
> >>> >> +
> >>> >> +    @BeforeClass
> >>> >> +    public static void prepare() throws IOException {
> >>> >> +        final String serviceURI = "http://localhost:" +
> serverPort +
> >>> >> "/ds/data";
> >>> >> +        final DatasetAccessorFactory factory = new
> >>> >> DatasetAccessorFactory();
> >>> >> +        final DatasetAccessor accessor =
> >>> factory.createHTTP(serviceURI);
> >>> >> +        final InputStream in =
> >>> >> SparqlGraphTest.class.getResourceAsStream("grounded.ttl");
> >>> >> +        final Model m = ModelFactory.createDefaultModel();
> >>> >> +        String base = "http://example.org/";
> >>> >> +        m.read(in, base, "TURTLE");
> >>> >> +
> >>> >> +        final File dataSet = File.createTempFile("dataset",
> "fuseki");
> >>> >> +        dataSet.delete();
> >>> >> +        server = EmbeddedFusekiServer.memTDB(serverPort,
> >>> >> "/ds");//dataSet.getAbsolutePath());
> >>> >> +        server.start();
> >>> >> +        System.out.println("Started fuseki on port " + serverPort);
> >>> >> +        accessor.putModel(m);
> >>> >> +    }
> >>> >> +
> >>> >> +    @AfterClass
> >>> >> +    public static void cleanup() {
> >>> >> +        server.stop();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Test
> >>> >> +    public void graphSize() {
> >>> >> +        final Graph graph = new SparqlGraph("http://localhost:" +
> >>> >> serverPort + "/ds/query");
> >>> >> +        Assert.assertEquals("Graph not of the exepected size", 8,
> >>> >> graph.size());
> >>> >> +    }
> >>> >> +
> >>> >> +    @Test
> >>> >> +    public void filter1() {
> >>> >> +        final Graph graph = new SparqlGraph("http://localhost:" +
> >>> >> serverPort + "/ds/query");
> >>> >> +        final Iri spiderman = new Iri("
> http://example.org/#spiderman
> >>> ");
> >>> >> +        final Iri greenGoblin = new Iri("
> >>> http://example.org/#green-goblin
> >>> >> ");
> >>> >> +        final Iri enemyOf = new Iri("
> >>> >> http://www.perceive.net/schemas/relationship/enemyOf");
> >>> >> +        final Iri foafName = new Iri("
> http://xmlns.com/foaf/0.1/name
> >>> ");
> >>> >> +        {
> >>> >> +            final Iterator<Triple> iter = graph.filter(spiderman,
> >>> null,
> >>> >> greenGoblin);
> >>> >> +            Assert.assertTrue(iter.hasNext());
> >>> >> +            Assert.assertEquals(enemyOf,
> iter.next().getPredicate());
> >>> >> +            Assert.assertFalse(iter.hasNext());
> >>> >> +        }
> >>> >> +        {
> >>> >> +            final Iterator<Triple> iter = graph.filter(spiderman,
> >>> >> foafName, null);
> >>> >> +            Set<Literal> names = new HashSet<>();
> >>> >> +            for (int i = 0; i < 2; i++) {
> >>> >> +                Assert.assertTrue(iter.hasNext());
> >>> >> +                RdfTerm name = iter.next().getObject();
> >>> >> +                Assert.assertTrue(name instanceof Literal);
> >>> >> +                names.add((Literal)name);
> >>> >> +            }
> >>> >> +            Assert.assertFalse(iter.hasNext());
> >>> >> +            Assert.assertTrue(names.contains(new
> >>> >> PlainLiteralImpl("Spiderman")));
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    public static int findFreePort() {
> >>> >> +        int port = 0;
> >>> >> +        try (ServerSocket server = new ServerSocket(0);) {
> >>> >> +            port = server.getLocalPort();
> >>> >> +        } catch (Exception e) {
> >>> >> +            throw new RuntimeException("unable to find a free
> port");
> >>> >> +        }
> >>> >> +        return port;
> >>> >> +    }
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,16 @@
> >>> >> +@base <http://example.org/> .
> >>> >> +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
> >>> >> +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
> >>> >> +@prefix foaf: <http://xmlns.com/foaf/0.1/> .
> >>> >> +@prefix rel: <http://www.perceive.net/schemas/relationship/> .
> >>> >> +
> >>> >> +<#green-goblin>
> >>> >> +    rel:enemyOf <#spiderman> ;
> >>> >> +    a foaf:Person ;    # in the context of the Marvel universe
> >>> >> +    foaf:name "Green Goblin" ;
> >>> >> +    foaf:age 128 .
> >>> >> +
> >>> >> +<#spiderman>
> >>> >> +    rel:enemyOf <#green-goblin> ;
> >>> >> +    a foaf:Person ;
> >>> >> +    foaf:name "Spiderman", "Человек-паук"@ru .
> >>> >> \ No newline at end of file
> >>> >>
> >>> >> Propchange: commons/sandbox/rdf/trunk/impl.utils/
> >>> >>
> >>> >>
> >>>
> ------------------------------------------------------------------------------
> >>> >> --- svn:ignore (added)
> >>> >> +++ svn:ignore Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1 @@
> >>> >> +target
> >>> >>
> >>> >> Copied: commons/sandbox/rdf/trunk/impl.utils/pom.xml (from r1651181,
> >>> >> commons/sandbox/rdf/trunk/pom.xml)
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/pom.xml?p2=commons/sandbox/rdf/trunk/impl.utils/pom.xml&p1=commons/sandbox/rdf/trunk/pom.xml&r1=1651181&r2=1659973&rev=1659973&view=diff
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> --- commons/sandbox/rdf/trunk/pom.xml (original)
> >>> >> +++ commons/sandbox/rdf/trunk/impl.utils/pom.xml Sun Feb 15 18:41:15
> >>> 2015
> >>> >> @@ -22,13 +22,14 @@
> >>> >>      <parent>
> >>> >>          <groupId>org.apache.commons</groupId>
> >>> >>          <artifactId>commons-parent</artifactId>
> >>> >> -        <version>35</version>
> >>> >> +        <version>37</version>
> >>> >> +        <relativePath />
> >>> >>      </parent>
> >>> >>      <modelVersion>4.0.0</modelVersion>
> >>> >>      <groupId>commons-rdf</groupId>
> >>> >> -    <artifactId>commons-rdf</artifactId>
> >>> >> +    <artifactId>commons-rdf-impl-utils</artifactId>
> >>> >>      <version>0.1-SNAPSHOT</version>
> >>> >> -    <name>Apache Commons RDF</name>
> >>> >> +    <name>Apache Commons RDF Implementation Utils</name>
> >>> >>      <description>
> >>> >>          Apache Commons RDF provides an API modelling the RDF data
> >>> model
> >>> >> as defined by
> >>> >>          http://www.w3.org/TR/rdf11-concepts/
> >>> >> @@ -50,11 +51,22 @@
> >>> >>
> >>> >>      <dependencies>
> >>> >>          <dependency>
> >>> >> +            <groupId>commons-rdf</groupId>
> >>> >> +            <artifactId>commons-rdf-api</artifactId>
> >>> >> +            <version>0.1-SNAPSHOT</version>
> >>> >> +        </dependency>
> >>> >> +        <dependency>
> >>> >>              <groupId>junit</groupId>
> >>> >>              <artifactId>junit</artifactId>
> >>> >>              <version>4.12</version>
> >>> >>              <scope>test</scope>
> >>> >>          </dependency>
> >>> >> +        <dependency>
> >>> >> +            <groupId>org.slf4j</groupId>
> >>> >> +            <artifactId>slf4j-api</artifactId>
> >>> >> +            <version>1.7.7</version>
> >>> >> +            <type>jar</type>
> >>> >> +        </dependency>
> >>> >>      </dependencies>
> >>> >>
> >>> >>      <distributionManagement>
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,316 @@
> >>> >> +/*
> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >>> >> + * or more contributor license agreements.  See the NOTICE file
> >>> >> + * distributed with this work for additional information
> >>> >> + * regarding copyright ownership.  The ASF licenses this file
> >>> >> + * to you under the Apache License, Version 2.0 (the
> >>> >> + * "License"); you may not use this file except in compliance
> >>> >> + * with the License.  You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> >>> >> + * software distributed under the License is distributed on an
> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>> >> + * KIND, either express or implied.  See the License for the
> >>> >> + * specific language governing permissions and limitations
> >>> >> + * under the License.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.utils;
> >>> >> +
> >>> >> +import java.lang.ref.WeakReference;
> >>> >> +import java.util.AbstractCollection;
> >>> >> +import java.util.Collection;
> >>> >> +import java.util.Collections;
> >>> >> +import java.util.HashSet;
> >>> >> +import java.util.Iterator;
> >>> >> +
> >>> >> +import java.util.Set;
> >>> >> +import java.util.concurrent.locks.Lock;
> >>> >> +import java.util.concurrent.locks.ReadWriteLock;
> >>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock;
> >>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
> >>> >> +import org.apache.commons.rdf.RdfTerm;
> >>> >> +import org.apache.commons.rdf.Triple;
> >>> >> +import org.apache.commons.rdf.Graph;
> >>> >> +import org.apache.commons.rdf.ImmutableGraph;
> >>> >> +import org.apache.commons.rdf.Iri;
> >>> >> +import org.apache.commons.rdf.WatchableGraph;
> >>> >> +import org.apache.commons.rdf.event.AddEvent;
> >>> >> +import org.apache.commons.rdf.event.FilterTriple;
> >>> >> +import org.apache.commons.rdf.event.GraphEvent;
> >>> >> +import org.apache.commons.rdf.event.GraphListener;
> >>> >> +import org.apache.commons.rdf.event.RemoveEvent;
> >>> >> +import
> >>> >>
> org.apache.commons.rdf.impl.utils.debug.ReentrantReadWriteLockTracker;
> >>> >> +import
> org.apache.commons.rdf.impl.utils.simple.SimpleImmutableGraph;
> >>> >> +
> >>> >> +/**
> >>> >> + * An abstract implementation of <code>Graph</code> implementing
> >>> >> + * <code>iterator</code> and <code>contains</code> calling
> >>> >> <code>filter</code>.
> >>> >> + *
> >>> >> + * @author reto
> >>> >> + */
> >>> >> +public abstract class AbstractGraph extends
> AbstractCollection<Triple>
> >>> >> +        implements Graph {
> >>> >> +
> >>> >> +
> >>> >> +    private static final String DEBUG_MODE = "rdfLocksDebugging";
> >>> >> +    private final ReadWriteLock lock;
> >>> >> +
> >>> >> +    private final Lock readLock;
> >>> >> +    private final Lock writeLock;
> >>> >> +
> >>> >> +    /**
> >>> >> +     * Constructs a LocalbleMGraph for an Graph.
> >>> >> +     *
> >>> >> +     * @param providedMGraph a non-lockable graph
> >>> >> +     */
> >>> >> +    public AbstractGraph() {
> >>> >> +        {
> >>> >> +            String debugMode = System.getProperty(DEBUG_MODE);
> >>> >> +            if (debugMode != null &&
> >>> >> debugMode.toLowerCase().equals("true")) {
> >>> >> +                lock = new ReentrantReadWriteLockTracker();
> >>> >> +            } else {
> >>> >> +                lock = new ReentrantReadWriteLock();
> >>> >> +            }
> >>> >> +        }
> >>> >> +        readLock = lock.readLock();
> >>> >> +        writeLock = lock.writeLock();
> >>> >> +    }
> >>> >> +
> >>> >> +    public AbstractGraph(final ReadWriteLock lock) {
> >>> >> +        this.lock = lock;
> >>> >> +        readLock = lock.readLock();
> >>> >> +        writeLock = lock.writeLock();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public ReadWriteLock getLock() {
> >>> >> +        return lock;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public ImmutableGraph getImmutableGraph() {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return performGetImmutableGraph();
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    public ImmutableGraph performGetImmutableGraph() {
> >>> >> +        return new SimpleImmutableGraph(this);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
> >>> predicate,
> >>> >> RdfTerm object) {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return new LockingIterator(performFilter(subject,
> >>> predicate,
> >>> >> object), lock);
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int size() {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return performSize();
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean isEmpty() {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return performIsEmpty();
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    @SuppressWarnings("element-type-mismatch")
> >>> >> +    public boolean contains(Object o) {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return performContains(o);
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Iterator<Triple> iterator() {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return new LockingIterator(performIterator(), lock);
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Object[] toArray() {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return performToArray();
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public <T> T[] toArray(T[] a) {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return performToArray(a);
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean containsAll(Collection<?> c) {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return performContainsAll(c);
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean add(Triple e) {
> >>> >> +        writeLock.lock();
> >>> >> +        try {
> >>> >> +            return performAdd(e);
> >>> >> +        } finally {
> >>> >> +            writeLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean remove(Object o) {
> >>> >> +        writeLock.lock();
> >>> >> +        try {
> >>> >> +            return performRemove(o);
> >>> >> +        } finally {
> >>> >> +            writeLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean addAll(Collection<? extends Triple> c) {
> >>> >> +        writeLock.lock();
> >>> >> +        try {
> >>> >> +            return performAddAll(c);
> >>> >> +        } finally {
> >>> >> +            writeLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean removeAll(Collection<?> c) {
> >>> >> +        writeLock.lock();
> >>> >> +        try {
> >>> >> +            return performRemoveAll(c);
> >>> >> +        } finally {
> >>> >> +            writeLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean retainAll(Collection<?> c) {
> >>> >> +        writeLock.lock();
> >>> >> +        try {
> >>> >> +            return performRetainAll(c);
> >>> >> +        } finally {
> >>> >> +            writeLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void clear() {
> >>> >> +        writeLock.lock();
> >>> >> +        try {
> >>> >> +            performClear();
> >>> >> +        } finally {
> >>> >> +            writeLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean equals(Object obj) {
> >>> >> +        /*if (obj == null) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        if (obj == this) {
> >>> >> +            return true;
> >>> >> +        }
> >>> >> +        if (obj.getClass() != getClass()) {
> >>> >> +            return false;
> >>> >> +        }*/
> >>> >> +        return this == obj;
> >>> >> +    }
> >>> >> +
> >>> >> +
> >>> >> +    protected abstract Iterator<Triple>
> performFilter(BlankNodeOrIri
> >>> >> subject, Iri predicate, RdfTerm object);
> >>> >> +
> >>> >> +    protected abstract int performSize();
> >>> >> +
> >>> >> +    protected boolean performIsEmpty() {
> >>> >> +        return super.isEmpty();
> >>> >> +    }
> >>> >> +
> >>> >> +    protected Object[] performToArray() {
> >>> >> +        return super.toArray();
> >>> >> +    }
> >>> >> +
> >>> >> +    protected boolean performRemove(Object o) {
> >>> >> +        return super.remove(o);
> >>> >> +    }
> >>> >> +
> >>> >> +    protected boolean performAddAll(Collection<? extends Triple>
> c) {
> >>> >> +        return super.addAll(c);
> >>> >> +    }
> >>> >> +
> >>> >> +    protected boolean performRemoveAll(Collection<?> c) {
> >>> >> +        return super.removeAll(c);
> >>> >> +    }
> >>> >> +
> >>> >> +    protected boolean performRetainAll(Collection<?> c) {
> >>> >> +        return super.retainAll(c);
> >>> >> +    }
> >>> >> +
> >>> >> +    protected void performClear() {
> >>> >> +        super.clear();
> >>> >> +    }
> >>> >> +
> >>> >> +    protected boolean performContains(Object o) {
> >>> >> +        return super.contains(o);
> >>> >> +    }
> >>> >> +
> >>> >> +    protected Iterator<Triple> performIterator() {
> >>> >> +        return performFilter(null, null, null);
> >>> >> +    }
> >>> >> +
> >>> >> +    protected boolean performContainsAll(Collection<?> c) {
> >>> >> +        return super.containsAll(c);
> >>> >> +    }
> >>> >> +
> >>> >> +    protected <T> T[] performToArray(T[] a) {
> >>> >> +        return super.toArray(a);
> >>> >> +    }
> >>> >> +
> >>> >> +    protected boolean performAdd(Triple e) {
> >>> >> +        return super.add(e);
> >>> >> +    }
> >>> >> +
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,112 @@
> >>> >> +/*
> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >>> >> + * or more contributor license agreements.  See the NOTICE file
> >>> >> + * distributed with this work for additional information
> >>> >> + * regarding copyright ownership.  The ASF licenses this file
> >>> >> + * to you under the Apache License, Version 2.0 (the
> >>> >> + * "License"); you may not use this file except in compliance
> >>> >> + * with the License.  You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> >>> >> + * software distributed under the License is distributed on an
> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>> >> + * KIND, either express or implied.  See the License for the
> >>> >> + * specific language governing permissions and limitations
> >>> >> + * under the License.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.utils;
> >>> >> +
> >>> >> +import java.util.Collection;
> >>> >> +import java.util.Iterator;
> >>> >> +
> >>> >> +import org.apache.commons.rdf.BlankNode;
> >>> >> +import org.apache.commons.rdf.ImmutableGraph;
> >>> >> +import org.apache.commons.rdf.RdfTerm;
> >>> >> +import org.apache.commons.rdf.Triple;
> >>> >> +import
> org.apache.commons.rdf.impl.utils.graphmatching.GraphMatcher;
> >>> >> +
> >>> >> +/**
> >>> >> + * <code>AbstractGraph</code> is an abstract implementation of
> >>> >> <code>ImmutableGraph</code>
> >>> >> + * implementing the <code>equals</code> and the
> <code>hashCode</code>
> >>> >> methods.
> >>> >> + *
> >>> >> + * @author reto
> >>> >> + *
> >>> >> + */
> >>> >> +public abstract class AbstractImmutableGraph extends AbstractGraph
> >>> >> +        implements ImmutableGraph {
> >>> >> +
> >>> >> +    public final synchronized int hashCode() {
> >>> >> +        int result = 0;
> >>> >> +        for (Iterator<Triple> iter = iterator(); iter.hasNext();) {
> >>> >> +            result += getBlankNodeBlindHash(iter.next());
> >>> >> +        }
> >>> >> +        return result;
> >>> >> +    }
> >>> >> +
> >>> >> +    /**
> >>> >> +     * @param triple
> >>> >> +     * @return hash without BNode hashes
> >>> >> +     */
> >>> >> +    private int getBlankNodeBlindHash(Triple triple) {
> >>> >> +        int hash = triple.getPredicate().hashCode();
> >>> >> +        RdfTerm subject = triple.getSubject();
> >>> >> +
> >>> >> +        if (!(subject instanceof BlankNode)) {
> >>> >> +            hash ^= subject.hashCode() >> 1;
> >>> >> +        }
> >>> >> +        RdfTerm object = triple.getObject();
> >>> >> +        if (!(object instanceof BlankNode)) {
> >>> >> +            hash ^= object.hashCode() << 1;
> >>> >> +        }
> >>> >> +
> >>> >> +        return hash;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean add(Triple e) {
> >>> >> +        throw new UnsupportedOperationException("Graphs are not
> >>> mutable,
> >>> >> use Graph");
> >>> >> +
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean addAll(Collection<? extends Triple> c) {
> >>> >> +        throw new UnsupportedOperationException("Graphs are not
> >>> mutable,
> >>> >> use Graph");
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean remove(Object o) {
> >>> >> +        throw new UnsupportedOperationException("Graphs are not
> >>> mutable,
> >>> >> use Graph");
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean removeAll(Collection<?> c) {
> >>> >> +        throw new UnsupportedOperationException("Graphs are not
> >>> mutable,
> >>> >> use Graph");
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void clear() {
> >>> >> +        throw new UnsupportedOperationException("Graphs are not
> >>> mutable,
> >>> >> use Graph");
> >>> >> +    }
> >>> >> +
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public ImmutableGraph getImmutableGraph() {
> >>> >> +        return this;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean equals(Object obj) {
> >>> >> +        if (this == obj) {
> >>> >> +            return true;
> >>> >> +        }
> >>> >> +        if (!(obj instanceof ImmutableGraph)) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        if (hashCode() != obj.hashCode()) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        return GraphMatcher.getValidMapping(this, (ImmutableGraph)
> >>> obj)
> >>> >> != null;
> >>> >> +    }
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,61 @@
> >>> >> +/*
> >>> >> + * Copyright 2015 The Apache Software Foundation.
> >>> >> + *
> >>> >> + * Licensed under the Apache License, Version 2.0 (the "License");
> >>> >> + * you may not use this file except in compliance with the License.
> >>> >> + * You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *      http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> software
> >>> >> + * distributed under the License is distributed on an "AS IS"
> BASIS,
> >>> >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> >>> >> implied.
> >>> >> + * See the License for the specific language governing permissions
> and
> >>> >> + * limitations under the License.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.utils;
> >>> >> +
> >>> >> +import org.apache.commons.rdf.Literal;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author developer
> >>> >> + */
> >>> >> +public abstract class AbstractLiteral implements Literal {
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int hashCode() {
> >>> >> +        int result = 0;
> >>> >> +        if (getLanguage() != null) {
> >>> >> +            result = getLanguage().hashCode();
> >>> >> +        }
> >>> >> +        result += getLexicalForm().hashCode();
> >>> >> +        result += getDataType().hashCode();
> >>> >> +        return result;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean equals(Object obj) {
> >>> >> +        if (this == obj) {
> >>> >> +            return true;
> >>> >> +        }
> >>> >> +        if (obj instanceof Literal) {
> >>> >> +            Literal other = (Literal) obj;
> >>> >> +
> >>> >> +            if (getLanguage() == null) {
> >>> >> +                if (other.getLanguage() != null) {
> >>> >> +                    return false;
> >>> >> +                }
> >>> >> +            } else {
> >>> >> +                if (!getLanguage().equals(other.getLanguage())) {
> >>> >> +                    return false;
> >>> >> +                }
> >>> >> +            }
> >>> >> +            boolean res =
> getDataType().equals(other.getDataType()) &&
> >>> >> getLexicalForm().equals(other.getLexicalForm());
> >>> >> +            return res;
> >>> >> +        } else {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,112 @@
> >>> >> +/*
> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >>> >> + * or more contributor license agreements.  See the NOTICE file
> >>> >> + * distributed with this work for additional information
> >>> >> + * regarding copyright ownership.  The ASF licenses this file
> >>> >> + * to you under the Apache License, Version 2.0 (the
> >>> >> + * "License"); you may not use this file except in compliance
> >>> >> + * with the License.  You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> >>> >> + * software distributed under the License is distributed on an
> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>> >> + * KIND, either express or implied.  See the License for the
> >>> >> + * specific language governing permissions and limitations
> >>> >> + * under the License.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.utils;
> >>> >> +
> >>> >> +import java.lang.ref.WeakReference;
> >>> >> +import java.util.*;
> >>> >> +
> >>> >> +import org.apache.commons.rdf.event.GraphEvent;
> >>> >> +import org.apache.commons.rdf.event.GraphListener;
> >>> >> +import org.slf4j.Logger;
> >>> >> +import org.slf4j.LoggerFactory;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author reto
> >>> >> + */
> >>> >> +class DelayedNotificator {
> >>> >> +
> >>> >> +    private static final Logger log =
> >>> >> LoggerFactory.getLogger(DelayedNotificator.class);
> >>> >> +    private static Timer timer = new Timer("Event delivery
> >>> timer",true);
> >>> >> +
> >>> >> +    static class ListenerHolder {
> >>> >> +
> >>> >> +        long delay;
> >>> >> +        List<GraphEvent> events = null;
> >>> >> +        WeakReference<GraphListener> listenerRef;
> >>> >> +
> >>> >> +        public ListenerHolder(GraphListener listener, long delay) {
> >>> >> +            this.listenerRef = new
> >>> WeakReference<GraphListener>(listener);
> >>> >> +            this.delay = delay;
> >>> >> +        }
> >>> >> +
> >>> >> +        private void registerEvent(GraphEvent event) {
> >>> >> +            synchronized (this) {
> >>> >> +                if (events == null) {
> >>> >> +                    events = new ArrayList<GraphEvent>();
> >>> >> +                    events.add(event);
> >>> >> +                    timer.schedule(new TimerTask() {
> >>> >> +
> >>> >> +                        @Override
> >>> >> +                        public void run() {
> >>> >> +                            List<GraphEvent> eventsLocal;
> >>> >> +                            synchronized (ListenerHolder.this) {
> >>> >> +                                eventsLocal = events;
> >>> >> +                                events = null;
> >>> >> +                            }
> >>> >> +                            GraphListener listener =
> >>> listenerRef.get();
> >>> >> +                            if (listener == null) {
> >>> >> +                                log.debug("Ignoring garbage
> collected
> >>> >> listener");
> >>> >> +                            } else {
> >>> >> +                                try {
> >>> >> +
> >>> listener.graphChanged(eventsLocal);
> >>> >> +                                } catch (Exception e) {
> >>> >> +                                    log.warn("Exception delivering
> >>> >> ImmutableGraph event", e);
> >>> >> +                                }
> >>> >> +                            }
> >>> >> +                        }
> >>> >> +                    }, delay);
> >>> >> +                } else {
> >>> >> +                    events.add(event);
> >>> >> +                }
> >>> >> +            }
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    private final Map<GraphListener, ListenerHolder> map =
> >>> >> Collections.synchronizedMap(
> >>> >> +            new WeakHashMap<GraphListener, ListenerHolder>());
> >>> >> +
> >>> >> +    void addDelayedListener(GraphListener listener, long delay) {
> >>> >> +        map.put(listener, new ListenerHolder(listener, delay));
> >>> >> +    }
> >>> >> +
> >>> >> +    /**
> >>> >> +     * removes a Listener, this doesn't prevent the listenerRef
> from
> >>> >> receiving
> >>> >> +     * events alreay scheduled.
> >>> >> +     *
> >>> >> +     * @param listenerRef
> >>> >> +     */
> >>> >> +    void removeDelayedListener(GraphListener listener) {
> >>> >> +        map.remove(listener);
> >>> >> +    }
> >>> >> +
> >>> >> +    /**
> >>> >> +     * if the listenerRef has not been registered as delayed
> >>> listenerRef
> >>> >> te events is
> >>> >> +     * forwarded synchroneously
> >>> >> +     * @param event
> >>> >> +     */
> >>> >> +    void sendEventToListener(GraphListener listener, GraphEvent
> >>> event) {
> >>> >> +        ListenerHolder holder = map.get(listener);
> >>> >> +        if (holder == null) {
> >>> >> +
> listener.graphChanged(Collections.singletonList(event));
> >>> >> +        } else {
> >>> >> +            holder.registerEvent(event);
> >>> >> +        }
> >>> >> +    }
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,73 @@
> >>> >> +/*
> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >>> >> + * or more contributor license agreements.  See the NOTICE file
> >>> >> + * distributed with this work for additional information
> >>> >> + * regarding copyright ownership.  The ASF licenses this file
> >>> >> + * to you under the Apache License, Version 2.0 (the
> >>> >> + * "License"); you may not use this file except in compliance
> >>> >> + * with the License.  You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> >>> >> + * software distributed under the License is distributed on an
> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>> >> + * KIND, either express or implied.  See the License for the
> >>> >> + * specific language governing permissions and limitations
> >>> >> + * under the License.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.utils;
> >>> >> +
> >>> >> +import java.util.Iterator;
> >>> >> +import java.util.concurrent.locks.Lock;
> >>> >> +import java.util.concurrent.locks.ReadWriteLock;
> >>> >> +import org.apache.commons.rdf.Triple;
> >>> >> +
> >>> >> +/**
> >>> >> + * Wrapps an iterator<Triple> reading entering a read-lock on every
> >>> >> invocation
> >>> >> + * of hasNext and next
> >>> >> + * @author reto
> >>> >> + */
> >>> >> +class LockingIterator implements Iterator<Triple> {
> >>> >> +
> >>> >> +    private Iterator<Triple> base;
> >>> >> +    private Lock readLock;
> >>> >> +    private Lock writeLock;
> >>> >> +
> >>> >> +    public LockingIterator(Iterator<Triple> iterator, ReadWriteLock
> >>> lock)
> >>> >> {
> >>> >> +        base = iterator;
> >>> >> +        readLock = lock.readLock();
> >>> >> +        writeLock = lock.writeLock();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean hasNext() {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return base.hasNext();
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Triple next() {
> >>> >> +        readLock.lock();
> >>> >> +        try {
> >>> >> +            return base.next();
> >>> >> +        } finally {
> >>> >> +            readLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void remove() {
> >>> >> +        writeLock.lock();
> >>> >> +        try {
> >>> >> +            base.remove();
> >>> >> +        } finally {
> >>> >> +            writeLock.unlock();
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,104 @@
> >>> >> +/*
> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >>> >> + * or more contributor license agreements.  See the NOTICE file
> >>> >> + * distributed with this work for additional information
> >>> >> + * regarding copyright ownership.  The ASF licenses this file
> >>> >> + * to you under the Apache License, Version 2.0 (the
> >>> >> + * "License"); you may not use this file except in compliance
> >>> >> + * with the License.  You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> >>> >> + * software distributed under the License is distributed on an
> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>> >> + * KIND, either express or implied.  See the License for the
> >>> >> + * specific language governing permissions and limitations
> >>> >> + * under the License.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.utils;
> >>> >> +
> >>> >> +import java.io.Serializable;
> >>> >> +import org.apache.commons.rdf.Iri;
> >>> >> +
> >>> >> +import org.apache.commons.rdf.Language;
> >>> >> +import org.apache.commons.rdf.Literal;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author reto
> >>> >> + */
> >>> >> +public class PlainLiteralImpl implements Literal, Serializable {
> >>> >> +
> >>> >> +    private String lexicalForm;
> >>> >> +    private Language language = null;
> >>> >> +
> >>> >> +    public PlainLiteralImpl(String value) {
> >>> >> +        if (value == null) {
> >>> >> +            throw new IllegalArgumentException("The literal string
> >>> cannot
> >>> >> be null");
> >>> >> +        }
> >>> >> +        this.lexicalForm = value;
> >>> >> +    }
> >>> >> +
> >>> >> +    public PlainLiteralImpl(String value, Language language) {
> >>> >> +        if (value == null) {
> >>> >> +            throw new IllegalArgumentException("The literal string
> >>> cannot
> >>> >> be null");
> >>> >> +        }
> >>> >> +        this.lexicalForm = value;
> >>> >> +        this.language = language;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public String getLexicalForm() {
> >>> >> +        return lexicalForm;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean equals(Object otherObj) {
> >>> >> +        if (!(otherObj instanceof Literal)) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        Literal other = (Literal) otherObj;
> >>> >> +        if (!lexicalForm.equals(other.getLexicalForm())) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        if (language != null) {
> >>> >> +            return language.equals(other.getLanguage());
> >>> >> +        }
> >>> >> +        if (other.getLanguage() != null) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        return true;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int hashCode() {
> >>> >> +        int hash = lexicalForm.hashCode() + XSD_STRING_HASH;
> >>> >> +        if (language != null) {
> >>> >> +            hash += language.hashCode();
> >>> >> +        }
> >>> >> +        return hash;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Language getLanguage() {
> >>> >> +        return language;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public String toString() {
> >>> >> +        StringBuffer result = new StringBuffer();
> >>> >> +        result.append('\"').append(lexicalForm).append('\"');
> >>> >> +        if (language != null) {
> >>> >> +            result.append("@").append(language.toString());
> >>> >> +        }
> >>> >> +        return result.toString();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Iri getDataType() {
> >>> >> +        return XSD_STRING;
> >>> >> +    }
> >>> >> +    private static final Iri XSD_STRING = new Iri("
> >>> >> http://www.w3.org/2001/XMLSchema#string");
> >>> >> +    private static final int XSD_STRING_HASH =
> XSD_STRING.hashCode();
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,100 @@
> >>> >> +/*
> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >>> >> + * or more contributor license agreements.  See the NOTICE file
> >>> >> + * distributed with this work for additional information
> >>> >> + * regarding copyright ownership.  The ASF licenses this file
> >>> >> + * to you under the Apache License, Version 2.0 (the
> >>> >> + * "License"); you may not use this file except in compliance
> >>> >> + * with the License.  You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> >>> >> + * software distributed under the License is distributed on an
> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>> >> + * KIND, either express or implied.  See the License for the
> >>> >> + * specific language governing permissions and limitations
> >>> >> + * under the License.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.utils;
> >>> >> +
> >>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
> >>> >> +import org.apache.commons.rdf.RdfTerm;
> >>> >> +import org.apache.commons.rdf.Triple;
> >>> >> +import org.apache.commons.rdf.Iri;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author reto
> >>> >> + */
> >>> >> +public class TripleImpl implements Triple {
> >>> >> +
> >>> >> +    private final BlankNodeOrIri subject;
> >>> >> +    private final Iri predicate;
> >>> >> +    private final RdfTerm object;
> >>> >> +
> >>> >> +    /**
> >>> >> +     * Creates a new <code>TripleImpl</code>.
> >>> >> +     *
> >>> >> +     * @param subject  the subject.
> >>> >> +     * @param predicate  the predicate.
> >>> >> +     * @param object  the object.
> >>> >> +     * @throws IllegalArgumentException  if an attribute is
> >>> >> <code>null</code>.
> >>> >> +     */
> >>> >> +    public TripleImpl(BlankNodeOrIri subject, Iri predicate,
> RdfTerm
> >>> >> object) {
> >>> >> +        if (subject == null) {
> >>> >> +            throw new IllegalArgumentException("Invalid subject:
> >>> null");
> >>> >> +        } else if (predicate == null) {
> >>> >> +            throw new IllegalArgumentException("Invalid predicate:
> >>> null");
> >>> >> +        } else if (object == null) {
> >>> >> +            throw new IllegalArgumentException("Invalid object:
> >>> null");
> >>> >> +        }
> >>> >> +        this.subject = subject;
> >>> >> +        this.predicate = predicate;
> >>> >> +        this.object = object;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean equals(Object obj) {
> >>> >> +        if (obj == null) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        if (!(obj instanceof Triple)) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        final Triple other = (Triple) obj;
> >>> >> +        if (!this.subject.equals(other.getSubject())) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        if (!this.predicate.equals(other.getPredicate())) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        if (!this.object.equals(other.getObject())) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        return true;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int hashCode() {
> >>> >> +        return (subject.hashCode() >> 1) ^ predicate.hashCode() ^
> >>> >> (object.hashCode() << 1);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public BlankNodeOrIri getSubject() {
> >>> >> +        return subject;
> >>> >> +    }
> >>> >> +
> >>> >> +    public Iri getPredicate() {
> >>> >> +        return predicate;
> >>> >> +    }
> >>> >> +
> >>> >> +    public RdfTerm getObject() {
> >>> >> +        return object;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public String toString() {
> >>> >> +        return subject + " " + predicate + " " + object + ".";
> >>> >> +    }
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,80 @@
> >>> >> +/*
> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >>> >> + * or more contributor license agreements.  See the NOTICE file
> >>> >> + * distributed with this work for additional information
> >>> >> + * regarding copyright ownership.  The ASF licenses this file
> >>> >> + * to you under the Apache License, Version 2.0 (the
> >>> >> + * "License"); you may not use this file except in compliance
> >>> >> + * with the License.  You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> >>> >> + * software distributed under the License is distributed on an
> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>> >> + * KIND, either express or implied.  See the License for the
> >>> >> + * specific language governing permissions and limitations
> >>> >> + * under the License.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.utils;
> >>> >> +
> >>> >> +import java.io.Serializable;
> >>> >> +
> >>> >> +import org.apache.commons.rdf.Iri;
> >>> >> +import org.apache.commons.rdf.Language;
> >>> >> +import org.apache.commons.rdf.Literal;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author reto
> >>> >> + */
> >>> >> +public class TypedLiteralImpl extends AbstractLiteral implements
> >>> >> Serializable {
> >>> >> +    private String lexicalForm;
> >>> >> +    private Iri dataType;
> >>> >> +    private int hashCode;
> >>> >> +
> >>> >> +    /**
> >>> >> +     * @param lexicalForm
> >>> >> +     * @param dataType
> >>> >> +     */
> >>> >> +    public TypedLiteralImpl(String lexicalForm, Iri dataType) {
> >>> >> +        this.lexicalForm = lexicalForm;
> >>> >> +        this.dataType = dataType;
> >>> >> +        this.hashCode = lexicalForm.hashCode()+dataType.hashCode();
> >>> >> +    }
> >>> >> +
> >>> >> +    public Iri getDataType() {
> >>> >> +        return dataType;
> >>> >> +    }
> >>> >> +
> >>> >> +    /* (non-Javadoc)
> >>> >> +     * @see
> org.apache.clerezza.rdf.core.LiteralNode#getLexicalForm()
> >>> >> +     */
> >>> >> +    @Override
> >>> >> +    public String getLexicalForm() {
> >>> >> +        return lexicalForm;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int hashCode() {
> >>> >> +        return hashCode;
> >>> >> +    }
> >>> >> +
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public String toString() {
> >>> >> +        StringBuffer result = new StringBuffer();
> >>> >> +        result.append('\"');
> >>> >> +        result.append(getLexicalForm());
> >>> >> +        result.append('\"');
> >>> >> +        result.append("^^");
> >>> >> +        result.append(getDataType());
> >>> >> +        return result.toString();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Language getLanguage() {
> >>> >> +        return null;
> >>> >> +    }
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,289 @@
> >>> >> +/*
> >>> >> + * Copyright 2015 The Apache Software Foundation.
> >>> >> + *
> >>> >> + * Licensed under the Apache License, Version 2.0 (the "License");
> >>> >> + * you may not use this file except in compliance with the License.
> >>> >> + * You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *      http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> software
> >>> >> + * distributed under the License is distributed on an "AS IS"
> BASIS,
> >>> >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> >>> >> implied.
> >>> >> + * See the License for the specific language governing permissions
> and
> >>> >> + * limitations under the License.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.utils;
> >>> >> +
> >>> >> +import java.lang.ref.WeakReference;
> >>> >> +import java.util.Collection;
> >>> >> +import java.util.Collections;
> >>> >> +import java.util.HashSet;
> >>> >> +import java.util.Iterator;
> >>> >> +import java.util.Set;
> >>> >> +import java.util.concurrent.locks.ReadWriteLock;
> >>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
> >>> >> +import org.apache.commons.rdf.Graph;
> >>> >> +import org.apache.commons.rdf.ImmutableGraph;
> >>> >> +import org.apache.commons.rdf.Iri;
> >>> >> +import org.apache.commons.rdf.RdfTerm;
> >>> >> +import org.apache.commons.rdf.Triple;
> >>> >> +import org.apache.commons.rdf.WatchableGraph;
> >>> >> +import org.apache.commons.rdf.event.AddEvent;
> >>> >> +import org.apache.commons.rdf.event.FilterTriple;
> >>> >> +import org.apache.commons.rdf.event.GraphEvent;
> >>> >> +import org.apache.commons.rdf.event.GraphListener;
> >>> >> +import org.apache.commons.rdf.event.RemoveEvent;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author developer
> >>> >> + */
> >>> >> +public class WatchableGraphWrapper implements WatchableGraph {
> >>> >> +
> >>> >> +    final Graph wrapped;
> >>> >> +
> >>> >> +    public WatchableGraphWrapper(Graph wrapped) {
> >>> >> +        this.wrapped = wrapped;
> >>> >> +    }
> >>> >> +
> >>> >> +
> >>> >> +    //all listeners
> >>> >> +    private final Set<ListenerConfiguration> listenerConfigs =
> >>> >> Collections.synchronizedSet(
> >>> >> +            new HashSet<ListenerConfiguration>());
> >>> >> +    private DelayedNotificator delayedNotificator = new
> >>> >> DelayedNotificator();
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Iterator<Triple> iterator() {
> >>> >> +        return filter(null, null, null);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean contains(Object o) {
> >>> >> +        if (!(o instanceof Triple)) {
> >>> >> +            return false;
> >>> >> +        }
> >>> >> +        Triple t = (Triple) o;
> >>> >> +        return filter(t.getSubject(), t.getPredicate(),
> >>> >> t.getObject()).hasNext();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
> >>> predicate,
> >>> >> +            RdfTerm object) {
> >>> >> +        final Iterator<Triple> baseIter = wrapped.filter(subject,
> >>> >> predicate, object);
> >>> >> +        return new Iterator<Triple>() {
> >>> >> +
> >>> >> +            Triple currentTriple = null;
> >>> >> +
> >>> >> +            @Override
> >>> >> +            public boolean hasNext() {
> >>> >> +                return baseIter.hasNext();
> >>> >> +            }
> >>> >> +
> >>> >> +            @Override
> >>> >> +            public Triple next() {
> >>> >> +                currentTriple = baseIter.next();
> >>> >> +                return currentTriple;
> >>> >> +            }
> >>> >> +
> >>> >> +            @Override
> >>> >> +            public void remove() {
> >>> >> +                baseIter.remove();
> >>> >> +                dispatchEvent(new
> >>> RemoveEvent(WatchableGraphWrapper.this,
> >>> >> currentTriple));
> >>> >> +            }
> >>> >> +        };
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean add(Triple triple) {
> >>> >> +        boolean success = performAdd(triple);
> >>> >> +        if (success) {
> >>> >> +            dispatchEvent(new AddEvent(this, triple));
> >>> >> +        }
> >>> >> +        return success;
> >>> >> +    }
> >>> >> +
> >>> >> +    /**
> >>> >> +     * A subclass of <code>AbstractGraph</code> should override
> >>> >> +     * this method instead of <code>add</code> for Graph event
> >>> support to
> >>> >> be
> >>> >> +     * added.
> >>> >> +     *
> >>> >> +     * @param e The triple to be added to the triple collection
> >>> >> +     * @return
> >>> >> +     */
> >>> >> +    protected boolean performAdd(Triple e) {
> >>> >> +        return wrapped.add(e);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean remove(Object o) {
> >>> >> +        Triple triple = (Triple) o;
> >>> >> +        boolean success = performRemove(triple);
> >>> >> +        if (success) {
> >>> >> +            dispatchEvent(new RemoveEvent(this, triple));
> >>> >> +        }
> >>> >> +        return success;
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean removeAll(Collection<?> c) {
> >>> >> +        boolean modified = false;
> >>> >> +        for (Iterator<? extends Object> it = c.iterator();
> >>> it.hasNext();)
> >>> >> {
> >>> >> +            Object object = it.next();
> >>> >> +            if (remove(object)) {
> >>> >> +                modified = true;
> >>> >> +            }
> >>> >> +        }
> >>> >> +        return modified;
> >>> >> +    }
> >>> >> +
> >>> >> +    /**
> >>> >> +     * A subclass of <code>AbstractGraph</code> should override
> >>> >> +     * this method instead of <code>remove</code> for
> ImmutableGraph
> >>> >> event support to be
> >>> >> +     * added.
> >>> >> +     *
> >>> >> +     * @param o The triple to be removed from the triple collection
> >>> >> +     * @return
> >>> >> +     */
> >>> >> +    protected boolean performRemove(Triple triple) {
> >>> >> +        Iterator<Triple> e = filter(null, null, null);
> >>> >> +        while (e.hasNext()) {
> >>> >> +            if (triple.equals(e.next())) {
> >>> >> +                e.remove();
> >>> >> +                return true;
> >>> >> +            }
> >>> >> +        }
> >>> >> +        return false;
> >>> >> +    }
> >>> >> +
> >>> >> +    /**
> >>> >> +     * Dispatches a <code>GraphEvent</code> to all registered
> >>> listeners
> >>> >> for which
> >>> >> +     * the specified <code>Triple</code> matches the
> >>> >> <code>FilterTriple</code>s
> >>> >> +     * of the listeners.
> >>> >> +     *
> >>> >> +     * @param triple The Triple that was modified
> >>> >> +     * @param type The type of modification
> >>> >> +     */
> >>> >> +    protected void dispatchEvent(GraphEvent event) {
> >>> >> +        synchronized(listenerConfigs) {
> >>> >> +            Iterator<ListenerConfiguration> iter =
> >>> >> listenerConfigs.iterator();
> >>> >> +            while (iter.hasNext()) {
> >>> >> +                ListenerConfiguration config = iter.next();
> >>> >> +                GraphListener registeredListener =
> >>> config.getListener();
> >>> >> +                if (registeredListener == null) {
> >>> >> +                    iter.remove();
> >>> >> +                    continue;
> >>> >> +                }
> >>> >> +                if (config.getFilter().match(event.getTriple())) {
> >>> >> +
> >>> >> delayedNotificator.sendEventToListener(registeredListener, event);
> >>> >> +                }
> >>> >> +            }
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void addGraphListener(GraphListener listener,
> FilterTriple
> >>> >> filter) {
> >>> >> +        addGraphListener(listener, filter, 0);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void addGraphListener(GraphListener listener,
> FilterTriple
> >>> >> filter,
> >>> >> +            long delay) {
> >>> >> +        listenerConfigs.add(new ListenerConfiguration(listener,
> >>> filter));
> >>> >> +        if (delay > 0) {
> >>> >> +            delayedNotificator.addDelayedListener(listener, delay);
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void removeGraphListener(GraphListener listener) {
> >>> >> +        synchronized(listenerConfigs) {
> >>> >> +            Iterator<ListenerConfiguration> iter =
> >>> >> listenerConfigs.iterator();
> >>> >> +            while (iter.hasNext()) {
> >>> >> +                ListenerConfiguration listenerConfig = iter.next();
> >>> >> +                GraphListener registeredListener =
> >>> >> listenerConfig.getListener();
> >>> >> +                if ((registeredListener == null) ||
> >>> >> (registeredListener.equals(listener))) {
> >>> >> +                    iter.remove();
> >>> >> +                }
> >>> >> +            }
> >>> >> +        }
> >>> >> +        delayedNotificator.removeDelayedListener(listener);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public ImmutableGraph getImmutableGraph() {
> >>> >> +        throw new UnsupportedOperationException("Not supported
> yet.");
> >>> >> //To change body of generated methods, choose Tools | Templates.
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public ReadWriteLock getLock() {
> >>> >> +        return wrapped.getLock();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int size() {
> >>> >> +        return wrapped.size();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean isEmpty() {
> >>> >> +        return wrapped.isEmpty();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Object[] toArray() {
> >>> >> +        return wrapped.toArray();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public <T> T[] toArray(T[] a) {
> >>> >> +        return wrapped.toArray(a);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean containsAll(Collection<?> c) {
> >>> >> +        return wrapped.containsAll(c);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean addAll(Collection<? extends Triple> c) {
> >>> >> +        return wrapped.addAll(c);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean retainAll(Collection<?> c) {
> >>> >> +        return wrapped.retainAll(c);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void clear() {
> >>> >> +        wrapped.clear();
> >>> >> +    }
> >>> >> +
> >>> >> +    private static class ListenerConfiguration {
> >>> >> +
> >>> >> +        private WeakReference<GraphListener> listenerRef;
> >>> >> +        private FilterTriple filter;
> >>> >> +
> >>> >> +        private ListenerConfiguration(GraphListener listener,
> >>> >> FilterTriple filter) {
> >>> >> +            this.listenerRef = new
> >>> WeakReference<GraphListener>(listener);
> >>> >> +            this.filter = filter;
> >>> >> +        }
> >>> >> +
> >>> >> +        /**
> >>> >> +         * @return the listener
> >>> >> +         */
> >>> >> +        GraphListener getListener() {
> >>> >> +            GraphListener listener = listenerRef.get();
> >>> >> +            return listener;
> >>> >> +        }
> >>> >> +
> >>> >> +        /**
> >>> >> +         * @return the filter
> >>> >> +         */
> >>> >> +        FilterTriple getFilter() {
> >>> >> +            return filter;
> >>> >> +        }
> >>> >> +    }
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,85 @@
> >>> >> +/*
> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >>> >> + * or more contributor license agreements.  See the NOTICE file
> >>> >> + * distributed with this work for additional information
> >>> >> + * regarding copyright ownership.  The ASF licenses this file
> >>> >> + * to you under the Apache License, Version 2.0 (the
> >>> >> + * "License"); you may not use this file except in compliance
> >>> >> + * with the License.  You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> >>> >> + * software distributed under the License is distributed on an
> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>> >> + * KIND, either express or implied.  See the License for the
> >>> >> + * specific language governing permissions and limitations
> >>> >> + * under the License.
> >>> >> + */
> >>> >> +
> >>> >> +package org.apache.commons.rdf.impl.utils.debug;
> >>> >> +
> >>> >> +import java.util.concurrent.TimeUnit;
> >>> >> +import java.util.concurrent.locks.Condition;
> >>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author mir
> >>> >> + */
> >>> >> +public class ReadLockDebug extends ReadLock {
> >>> >> +
> >>> >> +    ReentrantReadWriteLockTracker lock;
> >>> >> +    StackTraceElement[] stackTrace;
> >>> >> +
> >>> >> +    ReadLock readLock;
> >>> >> +    public ReadLockDebug(ReentrantReadWriteLockTracker lock) {
> >>> >> +        super(lock);
> >>> >> +        this.lock = lock;
> >>> >> +        this.readLock = lock.realReadLock();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void lock() {
> >>> >> +        readLock.lock();
> >>> >> +        lock.addLockedReadLock(this);
> >>> >> +        stackTrace = Thread.currentThread().getStackTrace();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void lockInterruptibly() throws InterruptedException {
> >>> >> +        readLock.lockInterruptibly();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Condition newCondition() {
> >>> >> +        return readLock.newCondition();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public String toString() {
> >>> >> +        return readLock.toString();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean tryLock() {
> >>> >> +        return readLock.tryLock();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean tryLock(long timeout, TimeUnit unit) throws
> >>> >> InterruptedException {
> >>> >> +        return readLock.tryLock(timeout, unit);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void unlock() {
> >>> >> +        readLock.unlock();
> >>> >> +        lock.removeReadLock(this);
> >>> >> +        stackTrace = null;
> >>> >> +    }
> >>> >> +
> >>> >> +    public StackTraceElement[] getStackTrace() {
> >>> >> +        return stackTrace;
> >>> >> +    }
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,133 @@
> >>> >> +/*
> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >>> >> + * or more contributor license agreements.  See the NOTICE file
> >>> >> + * distributed with this work for additional information
> >>> >> + * regarding copyright ownership.  The ASF licenses this file
> >>> >> + * to you under the Apache License, Version 2.0 (the
> >>> >> + * "License"); you may not use this file except in compliance
> >>> >> + * with the License.  You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> >>> >> + * software distributed under the License is distributed on an
> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>> >> + * KIND, either express or implied.  See the License for the
> >>> >> + * specific language governing permissions and limitations
> >>> >> + * under the License.
> >>> >> + */
> >>> >> +package org.apache.commons.rdf.impl.utils.debug;
> >>> >> +
> >>> >> +import java.util.Collection;
> >>> >> +import java.util.Collections;
> >>> >> +import java.util.HashSet;
> >>> >> +import java.util.Set;
> >>> >> +import java.util.concurrent.locks.Condition;
> >>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author mir
> >>> >> + */
> >>> >> +public class ReentrantReadWriteLockTracker extends
> >>> ReentrantReadWriteLock
> >>> >> {
> >>> >> +
> >>> >> +
> >>> >> +    private Set<ReadLockDebug> lockedReadLocks =
> >>> >> Collections.synchronizedSet(new HashSet<ReadLockDebug>());
> >>> >> +    private final WriteLockDebug writeLock = new
> WriteLockDebug(this);
> >>> >> +    @Override
> >>> >> +    protected Thread getOwner() {
> >>> >> +        return super.getOwner();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    protected Collection<Thread> getQueuedReaderThreads() {
> >>> >> +        return super.getQueuedReaderThreads();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    protected Collection<Thread> getQueuedThreads() {
> >>> >> +        return super.getQueuedThreads();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    protected Collection<Thread> getQueuedWriterThreads() {
> >>> >> +        return super.getQueuedWriterThreads();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int getReadHoldCount() {
> >>> >> +        return super.getReadHoldCount();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int getReadLockCount() {
> >>> >> +        return super.getReadLockCount();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int getWaitQueueLength(Condition condition) {
> >>> >> +        return super.getWaitQueueLength(condition);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    protected Collection<Thread> getWaitingThreads(Condition
> >>> condition) {
> >>> >> +        return super.getWaitingThreads(condition);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int getWriteHoldCount() {
> >>> >> +        return super.getWriteHoldCount();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean hasWaiters(Condition condition) {
> >>> >> +        return super.hasWaiters(condition);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean isWriteLocked() {
> >>> >> +        return super.isWriteLocked();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean isWriteLockedByCurrentThread() {
> >>> >> +        return super.isWriteLockedByCurrentThread();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public ReadLock readLock() {
> >>> >> +        return new ReadLockDebug(this);
> >>> >> +    }
> >>> >> +
> >>> >> +    ReadLock realReadLock() {
> >>> >> +        return super.readLock();
> >>> >> +    }
> >>> >> +
> >>> >> +    WriteLock realWriteLock() {
> >>> >> +        return super.writeLock();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public String toString() {
> >>> >> +        return super.toString();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public WriteLockDebug writeLock() {
> >>> >> +        return writeLock;
> >>> >> +    }
> >>> >> +
> >>> >> +    void addLockedReadLock(ReadLockDebug lock) {
> >>> >> +        lockedReadLocks.add(lock);
> >>> >> +    }
> >>> >> +
> >>> >> +    void removeReadLock(ReadLockDebug lock) {
> >>> >> +        lockedReadLocks.remove(lock);
> >>> >> +    }
> >>> >> +
> >>> >> +    public Set<ReadLockDebug> getLockedReadLocks() {
> >>> >> +        return lockedReadLocks;
> >>> >> +    }
> >>> >> +
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >> Added:
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> >>> >> URL:
> >>> >>
> >>>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java?rev=1659973&view=auto
> >>> >>
> >>> >>
> >>>
> ==============================================================================
> >>> >> ---
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> >>> >> (added)
> >>> >> +++
> >>> >>
> >>>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> >>> >> Sun Feb 15 18:41:15 2015
> >>> >> @@ -0,0 +1,89 @@
> >>> >> +/*
> >>> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >>> >> + * or more contributor license agreements.  See the NOTICE file
> >>> >> + * distributed with this work for additional information
> >>> >> + * regarding copyright ownership.  The ASF licenses this file
> >>> >> + * to you under the Apache License, Version 2.0 (the
> >>> >> + * "License"); you may not use this file except in compliance
> >>> >> + * with the License.  You may obtain a copy of the License at
> >>> >> + *
> >>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>> >> + *
> >>> >> + * Unless required by applicable law or agreed to in writing,
> >>> >> + * software distributed under the License is distributed on an
> >>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>> >> + * KIND, either express or implied.  See the License for the
> >>> >> + * specific language governing permissions and limitations
> >>> >> + * under the License.
> >>> >> + */
> >>> >> +
> >>> >> +package org.apache.commons.rdf.impl.utils.debug;
> >>> >> +
> >>> >> +import java.util.concurrent.TimeUnit;
> >>> >> +import java.util.concurrent.locks.Condition;
> >>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
> >>> >> +
> >>> >> +/**
> >>> >> + *
> >>> >> + * @author mir
> >>> >> + */
> >>> >> +public class WriteLockDebug extends WriteLock {
> >>> >> +
> >>> >> +    private ReentrantReadWriteLockTracker lock;
> >>> >> +    private WriteLock writeLock;
> >>> >> +    private StackTraceElement[] stackTrace;
> >>> >> +
> >>> >> +    public WriteLockDebug(ReentrantReadWriteLockTracker lock) {
> >>> >> +        super(lock);
> >>> >> +        this.lock = lock;
> >>> >> +        this.writeLock = lock.realWriteLock();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public int getHoldCount() {
> >>> >> +        return writeLock.getHoldCount();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean isHeldByCurrentThread() {
> >>> >> +        return writeLock.isHeldByCurrentThread();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void lock() {
> >>> >> +        writeLock.lock();
> >>> >> +        stackTrace = Thread.currentThread().getStackTrace();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void lockInterruptibly() throws InterruptedException {
> >>> >> +        writeLock.lockInterruptibly();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public Condition newCondition() {
> >>> >> +        return writeLock.newCondition();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean tryLock() {
> >>> >> +        return writeLock.tryLock();
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public boolean tryLock(long timeout, TimeUnit unit) throws
> >>> >> InterruptedException {
> >>> >> +        return writeLock.tryLock(timeout, unit);
> >>> >> +    }
> >>> >> +
> >>> >> +    @Override
> >>> >> +    public void unlock() {
> >>> >> +        writeLock.unlock();
> >>> >> +        stackTrace = null;
> >>> >> +    }
> >>> >> +
> >>> >> +    public StackTraceElement[] getStackTrace() {
> >>> >> +        return stackTrace;
> >>> >> +    }
> >>> >> +
> >>> >> +
> >>> >> +}
> >>> >>
> >>> >>
> >>> >>
> >>> >
> >>> >
> >>> > --
> >>> > http://people.apache.org/~britter/
> >>> > http://www.systemoutprintln.de/
> >>> > http://twitter.com/BenediktRitter
> >>> > http://github.com/britter
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> >>> For additional commands, e-mail: dev-help@commons.apache.org
> >>>
> >>>
> >>
> >>
> >> --
> >> http://people.apache.org/~britter/
> >> http://www.systemoutprintln.de/
> >> http://twitter.com/BenediktRitter
> >> http://github.com/britter
> >>
> >
> >
> >
> > --
> > http://people.apache.org/~britter/
> > http://www.systemoutprintln.de/
> > http://twitter.com/BenediktRitter
> > http://github.com/britter
>
>
>
> --
> Stian Soiland-Reyes
> Apache Taverna (incubating)
> http://orcid.org/0000-0001-9842-9718
>

Re: svn commit: r1659973 [1/3] - in /commons/sandbox/rdf/trunk: ./ api/src/main/java/org/apache/commons/rdf/ impl.sparql/ impl.sparql/src/ impl.sparql/src/main/ impl.sparql/src/main/java/ impl.sparql/src/main/java/org/ impl.sparql/src/main/java/org/apache/...

Posted by Stian Soiland-Reyes <st...@apache.org>.
I am not speaking for Reto, but I imagined that since Reto has joined
the CommonsRDF incubator proposal, then his sandbox-code would
eventually turn into pull requests and branches on the incubator
codebase so that we can evaluate each of the differences separately.


On 19 February 2015 at 06:54, Benedikt Ritter <br...@apache.org> wrote:
> 2015-02-17 7:04 GMT+01:00 Benedikt Ritter <br...@apache.org>:
>
>>
>>
>> 2015-02-17 0:13 GMT+01:00 Peter Ansell <an...@gmail.com>:
>>
>>> Hi Bernard,
>>>
>>> The Commons RDF project is not planning on including any non-trivial
>>> implementations, to avoid bias towards any of the participating
>>> platforms. Stian has written a trivial implementation and submitted it
>>> to GitHub to provide a reference for our test harness, but it is never
>>> planned to be used by anyone for non-trivial purposes.
>>>
>>> Reto is moving this code here unilaterally from Clerezza at this point
>>> based on the ability of any Apache committer to send code into Apache
>>> Commons.
>>>
>>> The code that will be sent to the incubator is still planned to be the
>>> code that is in the GitHub repository at the time the incubator
>>> request goes through.
>>>
>>
>> This is still in the sandbox so I'm not too crazy about it. But creating a
>> separate code base in the commons-rdf git repository doesn't sound like a
>> good idea given the fact that github Commons RDF will eventually move to
>> Apache Commons after incubation. What should haben with the code that is in
>> the repository by that time?
>>
>> Reto, can you comment please?
>>
>
> Reto, I'm still waiting for your comment.
>
>
>>
>> Regards,
>> Benedikt
>>
>>
>>>
>>> Cheers,
>>>
>>> Peter
>>>
>>> On 16 February 2015 at 18:34, Benedikt Ritter <br...@apache.org> wrote:
>>> > Hello Reto,
>>> >
>>> > how does this relate to github Commons RDF? Is this part of the code
>>> base
>>> > proposed for incubation?
>>> >
>>> > Regards,
>>> > Benedikt
>>> >
>>> > 2015-02-15 19:41 GMT+01:00 <re...@apache.org>:
>>> >
>>> >> Author: reto
>>> >> Date: Sun Feb 15 18:41:15 2015
>>> >> New Revision: 1659973
>>> >>
>>> >> URL: http://svn.apache.org/r1659973
>>> >> Log:
>>> >> Started SPARQL Backed Implementation
>>> >>
>>> >> Added:
>>> >>     commons/sandbox/rdf/trunk/alerts.txt
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/   (with props)
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/
>>> >>
>>>  commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/resources/
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/
>>> >>
>>>  commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/
>>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/
>>> >>
>>>  commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>>> >>     commons/sandbox/rdf/trunk/impl.utils/   (with props)
>>> >>     commons/sandbox/rdf/trunk/impl.utils/pom.xml
>>> >>       - copied, changed from r1651181,
>>> commons/sandbox/rdf/trunk/pom.xml
>>> >>     commons/sandbox/rdf/trunk/impl.utils/src/
>>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/
>>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/
>>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/
>>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/
>>> >>
>>>  commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphNotIsomorphicException.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GroupMappingIterator.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/HashMatching.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/MappingIterator.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/PermutationIterator.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/Utils.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashMap.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashSet.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntIterator.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntSet.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/package-info.java
>>> >>       - copied, changed from r1651181,
>>> >>
>>> commons/sandbox/rdf/trunk/src/main/java/org/apache/commons/rdf/package-info.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraph.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleMGraph.java
>>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/resources/
>>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/
>>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/
>>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/
>>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/
>>> >>
>>>  commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/PlainLiteralImplTest.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraphTest.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TripleImplTest.java
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
>>> >>     commons/sandbox/rdf/trunk/report.xml
>>> >> Modified:
>>> >>
>>> >>
>>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>>> >>     commons/sandbox/rdf/trunk/pom.xml
>>> >>
>>> >> Added: commons/sandbox/rdf/trunk/alerts.txt
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/alerts.txt?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >>     (empty)
>>> >>
>>> >> Modified:
>>> >>
>>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java?rev=1659973&r1=1659972&r2=1659973&view=diff
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>>> >> (original)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -84,7 +84,8 @@ public interface Literal extends RdfTerm
>>> >>
>>> >>      /**
>>> >>       * Returns the hash code of the lexical form plus the hash code
>>> of the
>>> >> -     * language, plush the hash code of the datatype
>>> >> +     * datatype plus if the literal has a language the hash code of
>>> the
>>> >> +     * language.
>>> >>       *
>>> >>       * @return hash code
>>> >>       */
>>> >>
>>> >> Propchange: commons/sandbox/rdf/trunk/impl.sparql/
>>> >>
>>> >>
>>> ------------------------------------------------------------------------------
>>> >> --- svn:ignore (added)
>>> >> +++ svn:ignore Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1 @@
>>> >> +target
>>> >>
>>> >> Added: commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/pom.xml?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> --- commons/sandbox/rdf/trunk/impl.sparql/pom.xml (added)
>>> >> +++ commons/sandbox/rdf/trunk/impl.sparql/pom.xml Sun Feb 15 18:41:15
>>> 2015
>>> >> @@ -0,0 +1,52 @@
>>> >> +<?xml version="1.0" encoding="UTF-8"?>
>>> >> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>>> >> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>>> >> http://maven.apache.org/POM/4.0.0
>>> >> http://maven.apache.org/xsd/maven-4.0.0.xsd">
>>> >> +    <parent>
>>> >> +        <groupId>org.apache.commons</groupId>
>>> >> +        <artifactId>commons-parent</artifactId>
>>> >> +        <version>37</version>
>>> >> +        <relativePath />
>>> >> +    </parent>
>>> >> +    <modelVersion>4.0.0</modelVersion>
>>> >> +    <groupId>commons-rdf</groupId>
>>> >> +    <artifactId>commons-rdf-impl-sparql</artifactId>
>>> >> +    <version>1.0.0-SNAPSHOT</version>
>>> >> +    <packaging>jar</packaging>
>>> >> +    <name>Apache Commons RDF SPARQL backed implementation.</name>
>>> >> +    <description>An implementation of the rdf commons API backed by a
>>> >> sparql
>>> >> +        endpoint. STATUS: Incomplete, currecnt code only supports
>>> reading
>>> >> +        graphs and does not yet support BlankNodes.</description>
>>> >> +    <properties>
>>> >> +
>>> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
>>> >> +        <maven.compiler.source>1.7</maven.compiler.source>
>>> >> +        <maven.compiler.target>1.7</maven.compiler.target>
>>> >> +    </properties>
>>> >> +    <dependencies>
>>> >> +        <dependency>
>>> >> +            <groupId>org.apache.httpcomponents</groupId>
>>> >> +            <artifactId>httpclient</artifactId>
>>> >> +            <version>4.4</version>
>>> >> +        </dependency>
>>> >> +        <dependency>
>>> >> +            <groupId>commons-rdf</groupId>
>>> >> +            <artifactId>commons-rdf-api</artifactId>
>>> >> +            <version>0.1-SNAPSHOT</version>
>>> >> +        </dependency>
>>> >> +        <dependency>
>>> >> +            <groupId>commons-rdf</groupId>
>>> >> +            <artifactId>commons-rdf-impl-utils</artifactId>
>>> >> +            <version>0.1-SNAPSHOT</version>
>>> >> +        </dependency>
>>> >> +        <dependency>
>>> >> +            <groupId>junit</groupId>
>>> >> +            <artifactId>junit</artifactId>
>>> >> +            <version>4.12</version>
>>> >> +            <scope>test</scope>
>>> >> +        </dependency>
>>> >> +        <dependency>
>>> >> +            <groupId>org.apache.jena</groupId>
>>> >> +            <artifactId>jena-fuseki</artifactId>
>>> >> +            <version>1.1.1</version>
>>> >> +            <scope>test</scope>
>>> >> +        </dependency>
>>> >> +    </dependencies>
>>> >> +</project>
>>> >> \ No newline at end of file
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,220 @@
>>> >> +/*
>>> >> + * To change this license header, choose License Headers in Project
>>> >> Properties.
>>> >> + * To change this template file, choose Tools | Templates
>>> >> + * and open the template in the editor.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.sparql;
>>> >> +
>>> >> +import java.io.IOException;
>>> >> +import java.io.InputStream;
>>> >> +import java.io.UnsupportedEncodingException;
>>> >> +import java.util.ArrayList;
>>> >> +import java.util.Enumeration;
>>> >> +import java.util.HashMap;
>>> >> +import java.util.Hashtable;
>>> >> +import java.util.List;
>>> >> +import java.util.Map;
>>> >> +import java.util.logging.Level;
>>> >> +import java.util.logging.Logger;
>>> >> +import org.apache.http.HttpEntity;
>>> >> +import org.apache.http.NameValuePair;
>>> >> +import org.apache.http.client.entity.UrlEncodedFormEntity;
>>> >> +import org.apache.http.client.methods.CloseableHttpResponse;
>>> >> +import org.apache.http.client.methods.HttpPost;
>>> >> +import org.apache.http.impl.client.CloseableHttpClient;
>>> >> +import org.apache.http.impl.client.HttpClients;
>>> >> +import org.apache.http.message.BasicNameValuePair;
>>> >> +import org.apache.http.util.EntityUtils;
>>> >> +import javax.xml.parsers.*;
>>> >> +import org.apache.commons.rdf.BlankNode;
>>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>>> >> +import org.apache.commons.rdf.Iri;
>>> >> +import org.apache.commons.rdf.Language;
>>> >> +import org.apache.commons.rdf.Literal;
>>> >> +import org.apache.commons.rdf.RdfTerm;
>>> >> +import org.apache.commons.rdf.Triple;
>>> >> +import org.apache.commons.rdf.impl.utils.AbstractLiteral;
>>> >> +import org.xml.sax.*;
>>> >> +import org.xml.sax.helpers.*;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author developer
>>> >> + */
>>> >> +public class SparqlClient {
>>> >> +
>>> >> +    final String endpoint;
>>> >> +
>>> >> +    public SparqlClient(final String endpoint) {
>>> >> +        this.endpoint = endpoint;
>>> >> +    }
>>> >> +
>>> >> +    List<Map<String, RdfTerm>> queryResultSet(final String query)
>>> throws
>>> >> IOException {
>>> >> +        CloseableHttpClient httpclient = HttpClients.createDefault();
>>> >> +        HttpPost httpPost = new HttpPost(endpoint);
>>> >> +        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
>>> >> +        nvps.add(new BasicNameValuePair("query", query));
>>> >> +        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
>>> >> +        CloseableHttpResponse response2 =
>>> httpclient.execute(httpPost);
>>> >> +
>>> >> +        try {
>>> >> +            HttpEntity entity2 = response2.getEntity();
>>> >> +            InputStream in = entity2.getContent();
>>> >> +            SAXParserFactory spf = SAXParserFactory.newInstance();
>>> >> +            spf.setNamespaceAware(true);
>>> >> +            SAXParser saxParser = spf.newSAXParser();
>>> >> +            XMLReader xmlReader = saxParser.getXMLReader();
>>> >> +            final SparqlsResultsHandler sparqlsResultsHandler = new
>>> >> SparqlsResultsHandler();
>>> >> +            xmlReader.setContentHandler(sparqlsResultsHandler);
>>> >> +            xmlReader.parse(new InputSource(in));
>>> >> +            /*
>>> >> +             for (int ch = in.read(); ch != -1; ch = in.read()) {
>>> >> +             System.out.print((char)ch);
>>> >> +             }
>>> >> +             */
>>> >> +            // do something useful with the response body
>>> >> +            // and ensure it is fully consumed
>>> >> +            EntityUtils.consume(entity2);
>>> >> +            return sparqlsResultsHandler.getResults();
>>> >> +        } catch (ParserConfigurationException ex) {
>>> >> +            throw new RuntimeException(ex);
>>> >> +        } catch (SAXException ex) {
>>> >> +            throw new RuntimeException(ex);
>>> >> +        } finally {
>>> >> +            response2.close();
>>> >> +        }
>>> >> +
>>> >> +    }
>>> >> +
>>> >> +    final public static class SparqlsResultsHandler extends
>>> >> DefaultHandler {
>>> >> +
>>> >> +        private String currentBindingName;
>>> >> +        private Map<String, RdfTerm> currentResult = null;
>>> >> +        private final List<Map<String, RdfTerm>> results = new
>>> >> ArrayList<>();
>>> >> +        private boolean readingValue;
>>> >> +        private String value;
>>> >> +        private Map<String, BlankNode> bNodeMap = new HashMap<>();
>>> >> +        private static final Iri XSD_STRING = new Iri("
>>> >> http://www.w3.org/2001/XMLSchema#string");
>>> >> +
>>> >> +        private RdfTerm getBNode(String value) {
>>> >> +            if (!bNodeMap.containsKey(value)) {
>>> >> +                bNodeMap.put(value, new BlankNode());
>>> >> +            }
>>> >> +            return bNodeMap.get(value);
>>> >> +        }
>>> >> +
>>> >> +        private List<Map<String, RdfTerm>> getResults() {
>>> >> +            return results;
>>> >> +        }
>>> >> +
>>> >> +        enum BindingType {
>>> >> +
>>> >> +            uri, bnode, literal;
>>> >> +        }
>>> >> +
>>> >> +        @Override
>>> >> +        public void startDocument() throws SAXException {
>>> >> +
>>> >> +        }
>>> >> +
>>> >> +        @Override
>>> >> +        public void startElement(String namespaceURI,
>>> >> +                String localName,
>>> >> +                String qName,
>>> >> +                Attributes atts)
>>> >> +                throws SAXException {
>>> >> +            if ("http://www.w3.org/2005/sparql-results#
>>> ".equals(namespaceURI))
>>> >> {
>>> >> +                if ("result".equals(localName)) {
>>> >> +                    if (currentResult != null) {
>>> >> +                        throw new SAXException("unexpected tag
>>> <result>");
>>> >> +                    }
>>> >> +                    currentResult = new HashMap<>();
>>> >> +                } else if ("binding".equals(localName)) {
>>> >> +                    if (currentResult == null) {
>>> >> +                        throw new SAXException("unexpected tag
>>> >> <binding>");
>>> >> +                    }
>>> >> +                    currentBindingName = atts.getValue("name");
>>> >> +                } else if ("uri".equals(localName) ||
>>> >> "bnode".equals(localName) || "literal".equals(localName)) {
>>> >> +                    if (readingValue) {
>>> >> +                        throw new SAXException("unexpected tag <" +
>>> >> localName + ">");
>>> >> +                    }
>>> >> +                    readingValue = true;
>>> >> +                }
>>> >> +            }
>>> >> +
>>> >> +            //System.out.println(namespaceURI);
>>> >> +            //System.out.println(qName);
>>> >> +        }
>>> >> +
>>> >> +        @Override
>>> >> +        public void characters(char[] chars, int start, int length)
>>> >> throws SAXException {
>>> >> +            if (readingValue) {
>>> >> +                value = new String(chars, start, length);
>>> >> +                //System.err.println(value + start + ", " + length);
>>> >> +            }
>>> >> +        }
>>> >> +
>>> >> +        @Override
>>> >> +        public void endElement(String namespaceURI,
>>> >> +                String localName,
>>> >> +                String qName)
>>> >> +                throws SAXException {
>>> >> +            if ("http://www.w3.org/2005/sparql-results#
>>> ".equals(namespaceURI))
>>> >> {
>>> >> +                if ("result".equals(localName)) {
>>> >> +                    results.add(currentResult);
>>> >> +                    currentResult = null;
>>> >> +                } else if ("binding".equals(localName)) {
>>> >> +                    if (currentBindingName == null) {
>>> >> +                        throw new SAXException("unexpected tag
>>> >> </binding>");
>>> >> +                    }
>>> >> +                    currentBindingName = null;
>>> >> +                } else {
>>> >> +                    try {
>>> >> +                        BindingType b =
>>> BindingType.valueOf(localName);
>>> >> +                        RdfTerm rdfTerm = null;
>>> >> +                        switch (b) {
>>> >> +                            case uri:
>>> >> +                                rdfTerm = new Iri(value);
>>> >> +                                break;
>>> >> +                            case bnode:
>>> >> +                                rdfTerm = getBNode(value);
>>> >> +                                break;
>>> >> +                            case literal:
>>> >> +                                final String lf = value;
>>> >> +                                rdfTerm = new AbstractLiteral() {
>>> >> +
>>> >> +                                    @Override
>>> >> +                                    public String getLexicalForm() {
>>> >> +                                        return lf;
>>> >> +                                    }
>>> >> +
>>> >> +                                    @Override
>>> >> +                                    public Iri getDataType() {
>>> >> +                                        //TODO implement
>>> >> +                                        return XSD_STRING;
>>> >> +                                    }
>>> >> +
>>> >> +                                    @Override
>>> >> +                                    public Language getLanguage() {
>>> >> +                                        //TODO impl
>>> >> +                                        return null;
>>> >> +                                    }
>>> >> +                                };
>>> >> +                                break;
>>> >> +                        }
>>> >> +                        currentResult.put(currentBindingName,
>>> rdfTerm);
>>> >> +                        readingValue = false;
>>> >> +                    } catch (IllegalArgumentException e) {
>>> >> +                            //not uri|bnode|literal
>>> >> +                    }
>>> >> +                }
>>> >> +            }
>>> >> +        }
>>> >> +
>>> >> +        public void endDocument() throws SAXException {
>>> >> +            //System.out.println("results: " + results.size());
>>> >> +        }
>>> >> +
>>> >> +    }
>>> >> +
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,121 @@
>>> >> +/*
>>> >> + * To change this license header, choose License Headers in Project
>>> >> Properties.
>>> >> + * To change this template file, choose Tools | Templates
>>> >> + * and open the template in the editor.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.sparql;
>>> >> +
>>> >> +import java.io.IOException;
>>> >> +import java.util.Iterator;
>>> >> +import java.util.List;
>>> >> +import java.util.Map;
>>> >> +import org.apache.commons.rdf.BlankNode;
>>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>>> >> +import org.apache.commons.rdf.Iri;
>>> >> +import org.apache.commons.rdf.Literal;
>>> >> +import org.apache.commons.rdf.RdfTerm;
>>> >> +import org.apache.commons.rdf.Triple;
>>> >> +import org.apache.commons.rdf.impl.utils.AbstractGraph;
>>> >> +import org.apache.commons.rdf.impl.utils.TripleImpl;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author reto
>>> >> + */
>>> >> +public class SparqlGraph extends AbstractGraph {
>>> >> +
>>> >> +    final SparqlClient sparqlClient;
>>> >> +
>>> >> +    /** Constructs a Graph representing the default graph at the
>>> specified
>>> >> +     * endpoint
>>> >> +     */
>>> >> +    public SparqlGraph(final String endpoint) {
>>> >> +        sparqlClient = new SparqlClient(endpoint);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    protected Iterator<Triple> performFilter(final BlankNodeOrIri
>>> subject,
>>> >> +            final Iri predicate, final RdfTerm object) {
>>> >> +        try {
>>> >> +            final StringBuilder queryBuilder = new StringBuilder();
>>> >> +            queryBuilder.append("SELECT * WHERE { ");
>>> >> +            if (subject == null) {
>>> >> +                queryBuilder.append("?s");
>>> >> +            } else {
>>> >> +                queryBuilder.append(asSparqlTerm(subject));
>>> >> +            }
>>> >> +            queryBuilder.append(' ');
>>> >> +            if (predicate == null) {
>>> >> +                queryBuilder.append("?p");
>>> >> +            } else {
>>> >> +                queryBuilder.append(asSparqlTerm(predicate));
>>> >> +            }
>>> >> +            queryBuilder.append(' ');
>>> >> +            if (object == null) {
>>> >> +                queryBuilder.append("?o");
>>> >> +            } else {
>>> >> +                queryBuilder.append(asSparqlTerm(object));
>>> >> +            }
>>> >> +            queryBuilder.append(" }");
>>> >> +            List<Map<String, RdfTerm>> sparqlResults =
>>> >> sparqlClient.queryResultSet(queryBuilder.toString());
>>> >> +            final Iterator<Map<String, RdfTerm>> resultsIterator =
>>> >> sparqlResults.iterator();
>>> >> +            return new Iterator<Triple>() {
>>> >> +
>>> >> +                @Override
>>> >> +                public boolean hasNext() {
>>> >> +                    return resultsIterator.hasNext();
>>> >> +                }
>>> >> +
>>> >> +                @Override
>>> >> +                public Triple next() {
>>> >> +                    Map<String, RdfTerm> result =
>>> resultsIterator.next();
>>> >> +                    return new TripleImpl(subject != null ? subject :
>>> >> (BlankNodeOrIri)result.get("s"),
>>> >> +                            predicate != null ? predicate :
>>> >> (Iri)result.get("p"),
>>> >> +                            object != null ? object :
>>> result.get("o"));
>>> >> +                }
>>> >> +            };
>>> >> +        } catch (IOException ex) {
>>> >> +            throw new RuntimeException(ex);
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    protected int performSize() {
>>> >> +        try {
>>> >> +            return sparqlClient.queryResultSet("SELECT * WHERE { ?s ?p
>>> >> ?o}").size();
>>> >> +        } catch (IOException ex) {
>>> >> +            throw new RuntimeException(ex);
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    private String asSparqlTerm(Iri iri) {
>>> >> +        return "<"+iri.getUnicodeString()+">";
>>> >> +    }
>>> >> +
>>> >> +    private String asSparqlTerm(Literal literal) {
>>> >> +        //TODO langauge and datatype
>>> >> +        return "\""+literal.getLexicalForm()+"\"";
>>> >> +    }
>>> >> +
>>> >> +    private String asSparqlTerm(BlankNode bnode) {
>>> >> +        //this requires adding additional clauses to the graph pattern
>>> >> +        throw new UnsupportedOperationException("Not supported yet.");
>>> >> +    }
>>> >> +
>>> >> +    private String asSparqlTerm(BlankNodeOrIri term) {
>>> >> +        if (term instanceof Iri) {
>>> >> +            return asSparqlTerm((Iri)term);
>>> >> +        } else {
>>> >> +            return asSparqlTerm((BlankNode)term);
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    private String asSparqlTerm(RdfTerm term) {
>>> >> +        if (term instanceof BlankNodeOrIri) {
>>> >> +            return asSparqlTerm((BlankNodeOrIri)term);
>>> >> +        } else {
>>> >> +            return asSparqlTerm((Literal)term);
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,106 @@
>>> >> +/*
>>> >> + * To change this license header, choose License Headers in Project
>>> >> Properties.
>>> >> + * To change this template file, choose Tools | Templates
>>> >> + * and open the template in the editor.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.sparql;
>>> >> +
>>> >> +import com.hp.hpl.jena.query.DatasetAccessor;
>>> >> +import com.hp.hpl.jena.query.DatasetAccessorFactory;
>>> >> +import java.io.File;
>>> >> +import java.io.IOException;
>>> >> +import java.net.ServerSocket;
>>> >> +import org.apache.jena.fuseki.EmbeddedFusekiServer;
>>> >> +import com.hp.hpl.jena.rdf.model.Model;
>>> >> +import com.hp.hpl.jena.rdf.model.ModelFactory;
>>> >> +import java.io.InputStream;
>>> >> +import java.util.HashSet;
>>> >> +import java.util.Iterator;
>>> >> +import java.util.Set;
>>> >> +import org.apache.commons.rdf.Graph;
>>> >> +import org.apache.commons.rdf.Iri;
>>> >> +import org.apache.commons.rdf.Literal;
>>> >> +import org.apache.commons.rdf.RdfTerm;
>>> >> +import org.apache.commons.rdf.Triple;
>>> >> +import org.apache.commons.rdf.impl.utils.PlainLiteralImpl;
>>> >> +import org.junit.AfterClass;
>>> >> +import org.junit.Assert;
>>> >> +import org.junit.BeforeClass;
>>> >> +import org.junit.Test;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author reto
>>> >> + */
>>> >> +public class SparqlGraphTest {
>>> >> +
>>> >> +    final static int serverPort = findFreePort();
>>> >> +    static EmbeddedFusekiServer server;
>>> >> +
>>> >> +    @BeforeClass
>>> >> +    public static void prepare() throws IOException {
>>> >> +        final String serviceURI = "http://localhost:" + serverPort +
>>> >> "/ds/data";
>>> >> +        final DatasetAccessorFactory factory = new
>>> >> DatasetAccessorFactory();
>>> >> +        final DatasetAccessor accessor =
>>> factory.createHTTP(serviceURI);
>>> >> +        final InputStream in =
>>> >> SparqlGraphTest.class.getResourceAsStream("grounded.ttl");
>>> >> +        final Model m = ModelFactory.createDefaultModel();
>>> >> +        String base = "http://example.org/";
>>> >> +        m.read(in, base, "TURTLE");
>>> >> +
>>> >> +        final File dataSet = File.createTempFile("dataset", "fuseki");
>>> >> +        dataSet.delete();
>>> >> +        server = EmbeddedFusekiServer.memTDB(serverPort,
>>> >> "/ds");//dataSet.getAbsolutePath());
>>> >> +        server.start();
>>> >> +        System.out.println("Started fuseki on port " + serverPort);
>>> >> +        accessor.putModel(m);
>>> >> +    }
>>> >> +
>>> >> +    @AfterClass
>>> >> +    public static void cleanup() {
>>> >> +        server.stop();
>>> >> +    }
>>> >> +
>>> >> +    @Test
>>> >> +    public void graphSize() {
>>> >> +        final Graph graph = new SparqlGraph("http://localhost:" +
>>> >> serverPort + "/ds/query");
>>> >> +        Assert.assertEquals("Graph not of the exepected size", 8,
>>> >> graph.size());
>>> >> +    }
>>> >> +
>>> >> +    @Test
>>> >> +    public void filter1() {
>>> >> +        final Graph graph = new SparqlGraph("http://localhost:" +
>>> >> serverPort + "/ds/query");
>>> >> +        final Iri spiderman = new Iri("http://example.org/#spiderman
>>> ");
>>> >> +        final Iri greenGoblin = new Iri("
>>> http://example.org/#green-goblin
>>> >> ");
>>> >> +        final Iri enemyOf = new Iri("
>>> >> http://www.perceive.net/schemas/relationship/enemyOf");
>>> >> +        final Iri foafName = new Iri("http://xmlns.com/foaf/0.1/name
>>> ");
>>> >> +        {
>>> >> +            final Iterator<Triple> iter = graph.filter(spiderman,
>>> null,
>>> >> greenGoblin);
>>> >> +            Assert.assertTrue(iter.hasNext());
>>> >> +            Assert.assertEquals(enemyOf, iter.next().getPredicate());
>>> >> +            Assert.assertFalse(iter.hasNext());
>>> >> +        }
>>> >> +        {
>>> >> +            final Iterator<Triple> iter = graph.filter(spiderman,
>>> >> foafName, null);
>>> >> +            Set<Literal> names = new HashSet<>();
>>> >> +            for (int i = 0; i < 2; i++) {
>>> >> +                Assert.assertTrue(iter.hasNext());
>>> >> +                RdfTerm name = iter.next().getObject();
>>> >> +                Assert.assertTrue(name instanceof Literal);
>>> >> +                names.add((Literal)name);
>>> >> +            }
>>> >> +            Assert.assertFalse(iter.hasNext());
>>> >> +            Assert.assertTrue(names.contains(new
>>> >> PlainLiteralImpl("Spiderman")));
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    public static int findFreePort() {
>>> >> +        int port = 0;
>>> >> +        try (ServerSocket server = new ServerSocket(0);) {
>>> >> +            port = server.getLocalPort();
>>> >> +        } catch (Exception e) {
>>> >> +            throw new RuntimeException("unable to find a free port");
>>> >> +        }
>>> >> +        return port;
>>> >> +    }
>>> >> +
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,16 @@
>>> >> +@base <http://example.org/> .
>>> >> +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
>>> >> +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
>>> >> +@prefix foaf: <http://xmlns.com/foaf/0.1/> .
>>> >> +@prefix rel: <http://www.perceive.net/schemas/relationship/> .
>>> >> +
>>> >> +<#green-goblin>
>>> >> +    rel:enemyOf <#spiderman> ;
>>> >> +    a foaf:Person ;    # in the context of the Marvel universe
>>> >> +    foaf:name "Green Goblin" ;
>>> >> +    foaf:age 128 .
>>> >> +
>>> >> +<#spiderman>
>>> >> +    rel:enemyOf <#green-goblin> ;
>>> >> +    a foaf:Person ;
>>> >> +    foaf:name "Spiderman", "Человек-паук"@ru .
>>> >> \ No newline at end of file
>>> >>
>>> >> Propchange: commons/sandbox/rdf/trunk/impl.utils/
>>> >>
>>> >>
>>> ------------------------------------------------------------------------------
>>> >> --- svn:ignore (added)
>>> >> +++ svn:ignore Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1 @@
>>> >> +target
>>> >>
>>> >> Copied: commons/sandbox/rdf/trunk/impl.utils/pom.xml (from r1651181,
>>> >> commons/sandbox/rdf/trunk/pom.xml)
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/pom.xml?p2=commons/sandbox/rdf/trunk/impl.utils/pom.xml&p1=commons/sandbox/rdf/trunk/pom.xml&r1=1651181&r2=1659973&rev=1659973&view=diff
>>> >>
>>> >>
>>> ==============================================================================
>>> >> --- commons/sandbox/rdf/trunk/pom.xml (original)
>>> >> +++ commons/sandbox/rdf/trunk/impl.utils/pom.xml Sun Feb 15 18:41:15
>>> 2015
>>> >> @@ -22,13 +22,14 @@
>>> >>      <parent>
>>> >>          <groupId>org.apache.commons</groupId>
>>> >>          <artifactId>commons-parent</artifactId>
>>> >> -        <version>35</version>
>>> >> +        <version>37</version>
>>> >> +        <relativePath />
>>> >>      </parent>
>>> >>      <modelVersion>4.0.0</modelVersion>
>>> >>      <groupId>commons-rdf</groupId>
>>> >> -    <artifactId>commons-rdf</artifactId>
>>> >> +    <artifactId>commons-rdf-impl-utils</artifactId>
>>> >>      <version>0.1-SNAPSHOT</version>
>>> >> -    <name>Apache Commons RDF</name>
>>> >> +    <name>Apache Commons RDF Implementation Utils</name>
>>> >>      <description>
>>> >>          Apache Commons RDF provides an API modelling the RDF data
>>> model
>>> >> as defined by
>>> >>          http://www.w3.org/TR/rdf11-concepts/
>>> >> @@ -50,11 +51,22 @@
>>> >>
>>> >>      <dependencies>
>>> >>          <dependency>
>>> >> +            <groupId>commons-rdf</groupId>
>>> >> +            <artifactId>commons-rdf-api</artifactId>
>>> >> +            <version>0.1-SNAPSHOT</version>
>>> >> +        </dependency>
>>> >> +        <dependency>
>>> >>              <groupId>junit</groupId>
>>> >>              <artifactId>junit</artifactId>
>>> >>              <version>4.12</version>
>>> >>              <scope>test</scope>
>>> >>          </dependency>
>>> >> +        <dependency>
>>> >> +            <groupId>org.slf4j</groupId>
>>> >> +            <artifactId>slf4j-api</artifactId>
>>> >> +            <version>1.7.7</version>
>>> >> +            <type>jar</type>
>>> >> +        </dependency>
>>> >>      </dependencies>
>>> >>
>>> >>      <distributionManagement>
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,316 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements.  See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership.  The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License.  You may obtain a copy of the License at
>>> >> + *
>>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied.  See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.utils;
>>> >> +
>>> >> +import java.lang.ref.WeakReference;
>>> >> +import java.util.AbstractCollection;
>>> >> +import java.util.Collection;
>>> >> +import java.util.Collections;
>>> >> +import java.util.HashSet;
>>> >> +import java.util.Iterator;
>>> >> +
>>> >> +import java.util.Set;
>>> >> +import java.util.concurrent.locks.Lock;
>>> >> +import java.util.concurrent.locks.ReadWriteLock;
>>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>>> >> +import org.apache.commons.rdf.RdfTerm;
>>> >> +import org.apache.commons.rdf.Triple;
>>> >> +import org.apache.commons.rdf.Graph;
>>> >> +import org.apache.commons.rdf.ImmutableGraph;
>>> >> +import org.apache.commons.rdf.Iri;
>>> >> +import org.apache.commons.rdf.WatchableGraph;
>>> >> +import org.apache.commons.rdf.event.AddEvent;
>>> >> +import org.apache.commons.rdf.event.FilterTriple;
>>> >> +import org.apache.commons.rdf.event.GraphEvent;
>>> >> +import org.apache.commons.rdf.event.GraphListener;
>>> >> +import org.apache.commons.rdf.event.RemoveEvent;
>>> >> +import
>>> >> org.apache.commons.rdf.impl.utils.debug.ReentrantReadWriteLockTracker;
>>> >> +import org.apache.commons.rdf.impl.utils.simple.SimpleImmutableGraph;
>>> >> +
>>> >> +/**
>>> >> + * An abstract implementation of <code>Graph</code> implementing
>>> >> + * <code>iterator</code> and <code>contains</code> calling
>>> >> <code>filter</code>.
>>> >> + *
>>> >> + * @author reto
>>> >> + */
>>> >> +public abstract class AbstractGraph extends AbstractCollection<Triple>
>>> >> +        implements Graph {
>>> >> +
>>> >> +
>>> >> +    private static final String DEBUG_MODE = "rdfLocksDebugging";
>>> >> +    private final ReadWriteLock lock;
>>> >> +
>>> >> +    private final Lock readLock;
>>> >> +    private final Lock writeLock;
>>> >> +
>>> >> +    /**
>>> >> +     * Constructs a LocalbleMGraph for an Graph.
>>> >> +     *
>>> >> +     * @param providedMGraph a non-lockable graph
>>> >> +     */
>>> >> +    public AbstractGraph() {
>>> >> +        {
>>> >> +            String debugMode = System.getProperty(DEBUG_MODE);
>>> >> +            if (debugMode != null &&
>>> >> debugMode.toLowerCase().equals("true")) {
>>> >> +                lock = new ReentrantReadWriteLockTracker();
>>> >> +            } else {
>>> >> +                lock = new ReentrantReadWriteLock();
>>> >> +            }
>>> >> +        }
>>> >> +        readLock = lock.readLock();
>>> >> +        writeLock = lock.writeLock();
>>> >> +    }
>>> >> +
>>> >> +    public AbstractGraph(final ReadWriteLock lock) {
>>> >> +        this.lock = lock;
>>> >> +        readLock = lock.readLock();
>>> >> +        writeLock = lock.writeLock();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public ReadWriteLock getLock() {
>>> >> +        return lock;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public ImmutableGraph getImmutableGraph() {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return performGetImmutableGraph();
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    public ImmutableGraph performGetImmutableGraph() {
>>> >> +        return new SimpleImmutableGraph(this);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
>>> predicate,
>>> >> RdfTerm object) {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return new LockingIterator(performFilter(subject,
>>> predicate,
>>> >> object), lock);
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public int size() {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return performSize();
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean isEmpty() {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return performIsEmpty();
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    @SuppressWarnings("element-type-mismatch")
>>> >> +    public boolean contains(Object o) {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return performContains(o);
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Iterator<Triple> iterator() {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return new LockingIterator(performIterator(), lock);
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Object[] toArray() {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return performToArray();
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public <T> T[] toArray(T[] a) {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return performToArray(a);
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean containsAll(Collection<?> c) {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return performContainsAll(c);
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean add(Triple e) {
>>> >> +        writeLock.lock();
>>> >> +        try {
>>> >> +            return performAdd(e);
>>> >> +        } finally {
>>> >> +            writeLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean remove(Object o) {
>>> >> +        writeLock.lock();
>>> >> +        try {
>>> >> +            return performRemove(o);
>>> >> +        } finally {
>>> >> +            writeLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean addAll(Collection<? extends Triple> c) {
>>> >> +        writeLock.lock();
>>> >> +        try {
>>> >> +            return performAddAll(c);
>>> >> +        } finally {
>>> >> +            writeLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean removeAll(Collection<?> c) {
>>> >> +        writeLock.lock();
>>> >> +        try {
>>> >> +            return performRemoveAll(c);
>>> >> +        } finally {
>>> >> +            writeLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean retainAll(Collection<?> c) {
>>> >> +        writeLock.lock();
>>> >> +        try {
>>> >> +            return performRetainAll(c);
>>> >> +        } finally {
>>> >> +            writeLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void clear() {
>>> >> +        writeLock.lock();
>>> >> +        try {
>>> >> +            performClear();
>>> >> +        } finally {
>>> >> +            writeLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean equals(Object obj) {
>>> >> +        /*if (obj == null) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        if (obj == this) {
>>> >> +            return true;
>>> >> +        }
>>> >> +        if (obj.getClass() != getClass()) {
>>> >> +            return false;
>>> >> +        }*/
>>> >> +        return this == obj;
>>> >> +    }
>>> >> +
>>> >> +
>>> >> +    protected abstract Iterator<Triple> performFilter(BlankNodeOrIri
>>> >> subject, Iri predicate, RdfTerm object);
>>> >> +
>>> >> +    protected abstract int performSize();
>>> >> +
>>> >> +    protected boolean performIsEmpty() {
>>> >> +        return super.isEmpty();
>>> >> +    }
>>> >> +
>>> >> +    protected Object[] performToArray() {
>>> >> +        return super.toArray();
>>> >> +    }
>>> >> +
>>> >> +    protected boolean performRemove(Object o) {
>>> >> +        return super.remove(o);
>>> >> +    }
>>> >> +
>>> >> +    protected boolean performAddAll(Collection<? extends Triple> c) {
>>> >> +        return super.addAll(c);
>>> >> +    }
>>> >> +
>>> >> +    protected boolean performRemoveAll(Collection<?> c) {
>>> >> +        return super.removeAll(c);
>>> >> +    }
>>> >> +
>>> >> +    protected boolean performRetainAll(Collection<?> c) {
>>> >> +        return super.retainAll(c);
>>> >> +    }
>>> >> +
>>> >> +    protected void performClear() {
>>> >> +        super.clear();
>>> >> +    }
>>> >> +
>>> >> +    protected boolean performContains(Object o) {
>>> >> +        return super.contains(o);
>>> >> +    }
>>> >> +
>>> >> +    protected Iterator<Triple> performIterator() {
>>> >> +        return performFilter(null, null, null);
>>> >> +    }
>>> >> +
>>> >> +    protected boolean performContainsAll(Collection<?> c) {
>>> >> +        return super.containsAll(c);
>>> >> +    }
>>> >> +
>>> >> +    protected <T> T[] performToArray(T[] a) {
>>> >> +        return super.toArray(a);
>>> >> +    }
>>> >> +
>>> >> +    protected boolean performAdd(Triple e) {
>>> >> +        return super.add(e);
>>> >> +    }
>>> >> +
>>> >> +
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,112 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements.  See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership.  The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License.  You may obtain a copy of the License at
>>> >> + *
>>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied.  See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.utils;
>>> >> +
>>> >> +import java.util.Collection;
>>> >> +import java.util.Iterator;
>>> >> +
>>> >> +import org.apache.commons.rdf.BlankNode;
>>> >> +import org.apache.commons.rdf.ImmutableGraph;
>>> >> +import org.apache.commons.rdf.RdfTerm;
>>> >> +import org.apache.commons.rdf.Triple;
>>> >> +import org.apache.commons.rdf.impl.utils.graphmatching.GraphMatcher;
>>> >> +
>>> >> +/**
>>> >> + * <code>AbstractGraph</code> is an abstract implementation of
>>> >> <code>ImmutableGraph</code>
>>> >> + * implementing the <code>equals</code> and the <code>hashCode</code>
>>> >> methods.
>>> >> + *
>>> >> + * @author reto
>>> >> + *
>>> >> + */
>>> >> +public abstract class AbstractImmutableGraph extends AbstractGraph
>>> >> +        implements ImmutableGraph {
>>> >> +
>>> >> +    public final synchronized int hashCode() {
>>> >> +        int result = 0;
>>> >> +        for (Iterator<Triple> iter = iterator(); iter.hasNext();) {
>>> >> +            result += getBlankNodeBlindHash(iter.next());
>>> >> +        }
>>> >> +        return result;
>>> >> +    }
>>> >> +
>>> >> +    /**
>>> >> +     * @param triple
>>> >> +     * @return hash without BNode hashes
>>> >> +     */
>>> >> +    private int getBlankNodeBlindHash(Triple triple) {
>>> >> +        int hash = triple.getPredicate().hashCode();
>>> >> +        RdfTerm subject = triple.getSubject();
>>> >> +
>>> >> +        if (!(subject instanceof BlankNode)) {
>>> >> +            hash ^= subject.hashCode() >> 1;
>>> >> +        }
>>> >> +        RdfTerm object = triple.getObject();
>>> >> +        if (!(object instanceof BlankNode)) {
>>> >> +            hash ^= object.hashCode() << 1;
>>> >> +        }
>>> >> +
>>> >> +        return hash;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean add(Triple e) {
>>> >> +        throw new UnsupportedOperationException("Graphs are not
>>> mutable,
>>> >> use Graph");
>>> >> +
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean addAll(Collection<? extends Triple> c) {
>>> >> +        throw new UnsupportedOperationException("Graphs are not
>>> mutable,
>>> >> use Graph");
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean remove(Object o) {
>>> >> +        throw new UnsupportedOperationException("Graphs are not
>>> mutable,
>>> >> use Graph");
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean removeAll(Collection<?> c) {
>>> >> +        throw new UnsupportedOperationException("Graphs are not
>>> mutable,
>>> >> use Graph");
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void clear() {
>>> >> +        throw new UnsupportedOperationException("Graphs are not
>>> mutable,
>>> >> use Graph");
>>> >> +    }
>>> >> +
>>> >> +
>>> >> +    @Override
>>> >> +    public ImmutableGraph getImmutableGraph() {
>>> >> +        return this;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean equals(Object obj) {
>>> >> +        if (this == obj) {
>>> >> +            return true;
>>> >> +        }
>>> >> +        if (!(obj instanceof ImmutableGraph)) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        if (hashCode() != obj.hashCode()) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        return GraphMatcher.getValidMapping(this, (ImmutableGraph)
>>> obj)
>>> >> != null;
>>> >> +    }
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,61 @@
>>> >> +/*
>>> >> + * Copyright 2015 The Apache Software Foundation.
>>> >> + *
>>> >> + * Licensed under the Apache License, Version 2.0 (the "License");
>>> >> + * you may not use this file except in compliance with the License.
>>> >> + * You may obtain a copy of the License at
>>> >> + *
>>> >> + *      http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing, software
>>> >> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>>> >> implied.
>>> >> + * See the License for the specific language governing permissions and
>>> >> + * limitations under the License.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.utils;
>>> >> +
>>> >> +import org.apache.commons.rdf.Literal;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author developer
>>> >> + */
>>> >> +public abstract class AbstractLiteral implements Literal {
>>> >> +
>>> >> +    @Override
>>> >> +    public int hashCode() {
>>> >> +        int result = 0;
>>> >> +        if (getLanguage() != null) {
>>> >> +            result = getLanguage().hashCode();
>>> >> +        }
>>> >> +        result += getLexicalForm().hashCode();
>>> >> +        result += getDataType().hashCode();
>>> >> +        return result;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean equals(Object obj) {
>>> >> +        if (this == obj) {
>>> >> +            return true;
>>> >> +        }
>>> >> +        if (obj instanceof Literal) {
>>> >> +            Literal other = (Literal) obj;
>>> >> +
>>> >> +            if (getLanguage() == null) {
>>> >> +                if (other.getLanguage() != null) {
>>> >> +                    return false;
>>> >> +                }
>>> >> +            } else {
>>> >> +                if (!getLanguage().equals(other.getLanguage())) {
>>> >> +                    return false;
>>> >> +                }
>>> >> +            }
>>> >> +            boolean res = getDataType().equals(other.getDataType()) &&
>>> >> getLexicalForm().equals(other.getLexicalForm());
>>> >> +            return res;
>>> >> +        } else {
>>> >> +            return false;
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,112 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements.  See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership.  The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License.  You may obtain a copy of the License at
>>> >> + *
>>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied.  See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.utils;
>>> >> +
>>> >> +import java.lang.ref.WeakReference;
>>> >> +import java.util.*;
>>> >> +
>>> >> +import org.apache.commons.rdf.event.GraphEvent;
>>> >> +import org.apache.commons.rdf.event.GraphListener;
>>> >> +import org.slf4j.Logger;
>>> >> +import org.slf4j.LoggerFactory;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author reto
>>> >> + */
>>> >> +class DelayedNotificator {
>>> >> +
>>> >> +    private static final Logger log =
>>> >> LoggerFactory.getLogger(DelayedNotificator.class);
>>> >> +    private static Timer timer = new Timer("Event delivery
>>> timer",true);
>>> >> +
>>> >> +    static class ListenerHolder {
>>> >> +
>>> >> +        long delay;
>>> >> +        List<GraphEvent> events = null;
>>> >> +        WeakReference<GraphListener> listenerRef;
>>> >> +
>>> >> +        public ListenerHolder(GraphListener listener, long delay) {
>>> >> +            this.listenerRef = new
>>> WeakReference<GraphListener>(listener);
>>> >> +            this.delay = delay;
>>> >> +        }
>>> >> +
>>> >> +        private void registerEvent(GraphEvent event) {
>>> >> +            synchronized (this) {
>>> >> +                if (events == null) {
>>> >> +                    events = new ArrayList<GraphEvent>();
>>> >> +                    events.add(event);
>>> >> +                    timer.schedule(new TimerTask() {
>>> >> +
>>> >> +                        @Override
>>> >> +                        public void run() {
>>> >> +                            List<GraphEvent> eventsLocal;
>>> >> +                            synchronized (ListenerHolder.this) {
>>> >> +                                eventsLocal = events;
>>> >> +                                events = null;
>>> >> +                            }
>>> >> +                            GraphListener listener =
>>> listenerRef.get();
>>> >> +                            if (listener == null) {
>>> >> +                                log.debug("Ignoring garbage collected
>>> >> listener");
>>> >> +                            } else {
>>> >> +                                try {
>>> >> +
>>> listener.graphChanged(eventsLocal);
>>> >> +                                } catch (Exception e) {
>>> >> +                                    log.warn("Exception delivering
>>> >> ImmutableGraph event", e);
>>> >> +                                }
>>> >> +                            }
>>> >> +                        }
>>> >> +                    }, delay);
>>> >> +                } else {
>>> >> +                    events.add(event);
>>> >> +                }
>>> >> +            }
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    private final Map<GraphListener, ListenerHolder> map =
>>> >> Collections.synchronizedMap(
>>> >> +            new WeakHashMap<GraphListener, ListenerHolder>());
>>> >> +
>>> >> +    void addDelayedListener(GraphListener listener, long delay) {
>>> >> +        map.put(listener, new ListenerHolder(listener, delay));
>>> >> +    }
>>> >> +
>>> >> +    /**
>>> >> +     * removes a Listener, this doesn't prevent the listenerRef from
>>> >> receiving
>>> >> +     * events alreay scheduled.
>>> >> +     *
>>> >> +     * @param listenerRef
>>> >> +     */
>>> >> +    void removeDelayedListener(GraphListener listener) {
>>> >> +        map.remove(listener);
>>> >> +    }
>>> >> +
>>> >> +    /**
>>> >> +     * if the listenerRef has not been registered as delayed
>>> listenerRef
>>> >> te events is
>>> >> +     * forwarded synchroneously
>>> >> +     * @param event
>>> >> +     */
>>> >> +    void sendEventToListener(GraphListener listener, GraphEvent
>>> event) {
>>> >> +        ListenerHolder holder = map.get(listener);
>>> >> +        if (holder == null) {
>>> >> +            listener.graphChanged(Collections.singletonList(event));
>>> >> +        } else {
>>> >> +            holder.registerEvent(event);
>>> >> +        }
>>> >> +    }
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,73 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements.  See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership.  The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License.  You may obtain a copy of the License at
>>> >> + *
>>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied.  See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.utils;
>>> >> +
>>> >> +import java.util.Iterator;
>>> >> +import java.util.concurrent.locks.Lock;
>>> >> +import java.util.concurrent.locks.ReadWriteLock;
>>> >> +import org.apache.commons.rdf.Triple;
>>> >> +
>>> >> +/**
>>> >> + * Wrapps an iterator<Triple> reading entering a read-lock on every
>>> >> invocation
>>> >> + * of hasNext and next
>>> >> + * @author reto
>>> >> + */
>>> >> +class LockingIterator implements Iterator<Triple> {
>>> >> +
>>> >> +    private Iterator<Triple> base;
>>> >> +    private Lock readLock;
>>> >> +    private Lock writeLock;
>>> >> +
>>> >> +    public LockingIterator(Iterator<Triple> iterator, ReadWriteLock
>>> lock)
>>> >> {
>>> >> +        base = iterator;
>>> >> +        readLock = lock.readLock();
>>> >> +        writeLock = lock.writeLock();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean hasNext() {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return base.hasNext();
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Triple next() {
>>> >> +        readLock.lock();
>>> >> +        try {
>>> >> +            return base.next();
>>> >> +        } finally {
>>> >> +            readLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void remove() {
>>> >> +        writeLock.lock();
>>> >> +        try {
>>> >> +            base.remove();
>>> >> +        } finally {
>>> >> +            writeLock.unlock();
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,104 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements.  See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership.  The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License.  You may obtain a copy of the License at
>>> >> + *
>>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied.  See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.utils;
>>> >> +
>>> >> +import java.io.Serializable;
>>> >> +import org.apache.commons.rdf.Iri;
>>> >> +
>>> >> +import org.apache.commons.rdf.Language;
>>> >> +import org.apache.commons.rdf.Literal;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author reto
>>> >> + */
>>> >> +public class PlainLiteralImpl implements Literal, Serializable {
>>> >> +
>>> >> +    private String lexicalForm;
>>> >> +    private Language language = null;
>>> >> +
>>> >> +    public PlainLiteralImpl(String value) {
>>> >> +        if (value == null) {
>>> >> +            throw new IllegalArgumentException("The literal string
>>> cannot
>>> >> be null");
>>> >> +        }
>>> >> +        this.lexicalForm = value;
>>> >> +    }
>>> >> +
>>> >> +    public PlainLiteralImpl(String value, Language language) {
>>> >> +        if (value == null) {
>>> >> +            throw new IllegalArgumentException("The literal string
>>> cannot
>>> >> be null");
>>> >> +        }
>>> >> +        this.lexicalForm = value;
>>> >> +        this.language = language;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public String getLexicalForm() {
>>> >> +        return lexicalForm;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean equals(Object otherObj) {
>>> >> +        if (!(otherObj instanceof Literal)) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        Literal other = (Literal) otherObj;
>>> >> +        if (!lexicalForm.equals(other.getLexicalForm())) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        if (language != null) {
>>> >> +            return language.equals(other.getLanguage());
>>> >> +        }
>>> >> +        if (other.getLanguage() != null) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        return true;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public int hashCode() {
>>> >> +        int hash = lexicalForm.hashCode() + XSD_STRING_HASH;
>>> >> +        if (language != null) {
>>> >> +            hash += language.hashCode();
>>> >> +        }
>>> >> +        return hash;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Language getLanguage() {
>>> >> +        return language;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public String toString() {
>>> >> +        StringBuffer result = new StringBuffer();
>>> >> +        result.append('\"').append(lexicalForm).append('\"');
>>> >> +        if (language != null) {
>>> >> +            result.append("@").append(language.toString());
>>> >> +        }
>>> >> +        return result.toString();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Iri getDataType() {
>>> >> +        return XSD_STRING;
>>> >> +    }
>>> >> +    private static final Iri XSD_STRING = new Iri("
>>> >> http://www.w3.org/2001/XMLSchema#string");
>>> >> +    private static final int XSD_STRING_HASH = XSD_STRING.hashCode();
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,100 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements.  See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership.  The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License.  You may obtain a copy of the License at
>>> >> + *
>>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied.  See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.utils;
>>> >> +
>>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>>> >> +import org.apache.commons.rdf.RdfTerm;
>>> >> +import org.apache.commons.rdf.Triple;
>>> >> +import org.apache.commons.rdf.Iri;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author reto
>>> >> + */
>>> >> +public class TripleImpl implements Triple {
>>> >> +
>>> >> +    private final BlankNodeOrIri subject;
>>> >> +    private final Iri predicate;
>>> >> +    private final RdfTerm object;
>>> >> +
>>> >> +    /**
>>> >> +     * Creates a new <code>TripleImpl</code>.
>>> >> +     *
>>> >> +     * @param subject  the subject.
>>> >> +     * @param predicate  the predicate.
>>> >> +     * @param object  the object.
>>> >> +     * @throws IllegalArgumentException  if an attribute is
>>> >> <code>null</code>.
>>> >> +     */
>>> >> +    public TripleImpl(BlankNodeOrIri subject, Iri predicate, RdfTerm
>>> >> object) {
>>> >> +        if (subject == null) {
>>> >> +            throw new IllegalArgumentException("Invalid subject:
>>> null");
>>> >> +        } else if (predicate == null) {
>>> >> +            throw new IllegalArgumentException("Invalid predicate:
>>> null");
>>> >> +        } else if (object == null) {
>>> >> +            throw new IllegalArgumentException("Invalid object:
>>> null");
>>> >> +        }
>>> >> +        this.subject = subject;
>>> >> +        this.predicate = predicate;
>>> >> +        this.object = object;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean equals(Object obj) {
>>> >> +        if (obj == null) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        if (!(obj instanceof Triple)) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        final Triple other = (Triple) obj;
>>> >> +        if (!this.subject.equals(other.getSubject())) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        if (!this.predicate.equals(other.getPredicate())) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        if (!this.object.equals(other.getObject())) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        return true;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public int hashCode() {
>>> >> +        return (subject.hashCode() >> 1) ^ predicate.hashCode() ^
>>> >> (object.hashCode() << 1);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public BlankNodeOrIri getSubject() {
>>> >> +        return subject;
>>> >> +    }
>>> >> +
>>> >> +    public Iri getPredicate() {
>>> >> +        return predicate;
>>> >> +    }
>>> >> +
>>> >> +    public RdfTerm getObject() {
>>> >> +        return object;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public String toString() {
>>> >> +        return subject + " " + predicate + " " + object + ".";
>>> >> +    }
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,80 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements.  See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership.  The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License.  You may obtain a copy of the License at
>>> >> + *
>>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied.  See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.utils;
>>> >> +
>>> >> +import java.io.Serializable;
>>> >> +
>>> >> +import org.apache.commons.rdf.Iri;
>>> >> +import org.apache.commons.rdf.Language;
>>> >> +import org.apache.commons.rdf.Literal;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author reto
>>> >> + */
>>> >> +public class TypedLiteralImpl extends AbstractLiteral implements
>>> >> Serializable {
>>> >> +    private String lexicalForm;
>>> >> +    private Iri dataType;
>>> >> +    private int hashCode;
>>> >> +
>>> >> +    /**
>>> >> +     * @param lexicalForm
>>> >> +     * @param dataType
>>> >> +     */
>>> >> +    public TypedLiteralImpl(String lexicalForm, Iri dataType) {
>>> >> +        this.lexicalForm = lexicalForm;
>>> >> +        this.dataType = dataType;
>>> >> +        this.hashCode = lexicalForm.hashCode()+dataType.hashCode();
>>> >> +    }
>>> >> +
>>> >> +    public Iri getDataType() {
>>> >> +        return dataType;
>>> >> +    }
>>> >> +
>>> >> +    /* (non-Javadoc)
>>> >> +     * @see org.apache.clerezza.rdf.core.LiteralNode#getLexicalForm()
>>> >> +     */
>>> >> +    @Override
>>> >> +    public String getLexicalForm() {
>>> >> +        return lexicalForm;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public int hashCode() {
>>> >> +        return hashCode;
>>> >> +    }
>>> >> +
>>> >> +
>>> >> +    @Override
>>> >> +    public String toString() {
>>> >> +        StringBuffer result = new StringBuffer();
>>> >> +        result.append('\"');
>>> >> +        result.append(getLexicalForm());
>>> >> +        result.append('\"');
>>> >> +        result.append("^^");
>>> >> +        result.append(getDataType());
>>> >> +        return result.toString();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Language getLanguage() {
>>> >> +        return null;
>>> >> +    }
>>> >> +
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,289 @@
>>> >> +/*
>>> >> + * Copyright 2015 The Apache Software Foundation.
>>> >> + *
>>> >> + * Licensed under the Apache License, Version 2.0 (the "License");
>>> >> + * you may not use this file except in compliance with the License.
>>> >> + * You may obtain a copy of the License at
>>> >> + *
>>> >> + *      http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing, software
>>> >> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>>> >> implied.
>>> >> + * See the License for the specific language governing permissions and
>>> >> + * limitations under the License.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.utils;
>>> >> +
>>> >> +import java.lang.ref.WeakReference;
>>> >> +import java.util.Collection;
>>> >> +import java.util.Collections;
>>> >> +import java.util.HashSet;
>>> >> +import java.util.Iterator;
>>> >> +import java.util.Set;
>>> >> +import java.util.concurrent.locks.ReadWriteLock;
>>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>>> >> +import org.apache.commons.rdf.Graph;
>>> >> +import org.apache.commons.rdf.ImmutableGraph;
>>> >> +import org.apache.commons.rdf.Iri;
>>> >> +import org.apache.commons.rdf.RdfTerm;
>>> >> +import org.apache.commons.rdf.Triple;
>>> >> +import org.apache.commons.rdf.WatchableGraph;
>>> >> +import org.apache.commons.rdf.event.AddEvent;
>>> >> +import org.apache.commons.rdf.event.FilterTriple;
>>> >> +import org.apache.commons.rdf.event.GraphEvent;
>>> >> +import org.apache.commons.rdf.event.GraphListener;
>>> >> +import org.apache.commons.rdf.event.RemoveEvent;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author developer
>>> >> + */
>>> >> +public class WatchableGraphWrapper implements WatchableGraph {
>>> >> +
>>> >> +    final Graph wrapped;
>>> >> +
>>> >> +    public WatchableGraphWrapper(Graph wrapped) {
>>> >> +        this.wrapped = wrapped;
>>> >> +    }
>>> >> +
>>> >> +
>>> >> +    //all listeners
>>> >> +    private final Set<ListenerConfiguration> listenerConfigs =
>>> >> Collections.synchronizedSet(
>>> >> +            new HashSet<ListenerConfiguration>());
>>> >> +    private DelayedNotificator delayedNotificator = new
>>> >> DelayedNotificator();
>>> >> +
>>> >> +    @Override
>>> >> +    public Iterator<Triple> iterator() {
>>> >> +        return filter(null, null, null);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean contains(Object o) {
>>> >> +        if (!(o instanceof Triple)) {
>>> >> +            return false;
>>> >> +        }
>>> >> +        Triple t = (Triple) o;
>>> >> +        return filter(t.getSubject(), t.getPredicate(),
>>> >> t.getObject()).hasNext();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
>>> predicate,
>>> >> +            RdfTerm object) {
>>> >> +        final Iterator<Triple> baseIter = wrapped.filter(subject,
>>> >> predicate, object);
>>> >> +        return new Iterator<Triple>() {
>>> >> +
>>> >> +            Triple currentTriple = null;
>>> >> +
>>> >> +            @Override
>>> >> +            public boolean hasNext() {
>>> >> +                return baseIter.hasNext();
>>> >> +            }
>>> >> +
>>> >> +            @Override
>>> >> +            public Triple next() {
>>> >> +                currentTriple = baseIter.next();
>>> >> +                return currentTriple;
>>> >> +            }
>>> >> +
>>> >> +            @Override
>>> >> +            public void remove() {
>>> >> +                baseIter.remove();
>>> >> +                dispatchEvent(new
>>> RemoveEvent(WatchableGraphWrapper.this,
>>> >> currentTriple));
>>> >> +            }
>>> >> +        };
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean add(Triple triple) {
>>> >> +        boolean success = performAdd(triple);
>>> >> +        if (success) {
>>> >> +            dispatchEvent(new AddEvent(this, triple));
>>> >> +        }
>>> >> +        return success;
>>> >> +    }
>>> >> +
>>> >> +    /**
>>> >> +     * A subclass of <code>AbstractGraph</code> should override
>>> >> +     * this method instead of <code>add</code> for Graph event
>>> support to
>>> >> be
>>> >> +     * added.
>>> >> +     *
>>> >> +     * @param e The triple to be added to the triple collection
>>> >> +     * @return
>>> >> +     */
>>> >> +    protected boolean performAdd(Triple e) {
>>> >> +        return wrapped.add(e);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean remove(Object o) {
>>> >> +        Triple triple = (Triple) o;
>>> >> +        boolean success = performRemove(triple);
>>> >> +        if (success) {
>>> >> +            dispatchEvent(new RemoveEvent(this, triple));
>>> >> +        }
>>> >> +        return success;
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean removeAll(Collection<?> c) {
>>> >> +        boolean modified = false;
>>> >> +        for (Iterator<? extends Object> it = c.iterator();
>>> it.hasNext();)
>>> >> {
>>> >> +            Object object = it.next();
>>> >> +            if (remove(object)) {
>>> >> +                modified = true;
>>> >> +            }
>>> >> +        }
>>> >> +        return modified;
>>> >> +    }
>>> >> +
>>> >> +    /**
>>> >> +     * A subclass of <code>AbstractGraph</code> should override
>>> >> +     * this method instead of <code>remove</code> for ImmutableGraph
>>> >> event support to be
>>> >> +     * added.
>>> >> +     *
>>> >> +     * @param o The triple to be removed from the triple collection
>>> >> +     * @return
>>> >> +     */
>>> >> +    protected boolean performRemove(Triple triple) {
>>> >> +        Iterator<Triple> e = filter(null, null, null);
>>> >> +        while (e.hasNext()) {
>>> >> +            if (triple.equals(e.next())) {
>>> >> +                e.remove();
>>> >> +                return true;
>>> >> +            }
>>> >> +        }
>>> >> +        return false;
>>> >> +    }
>>> >> +
>>> >> +    /**
>>> >> +     * Dispatches a <code>GraphEvent</code> to all registered
>>> listeners
>>> >> for which
>>> >> +     * the specified <code>Triple</code> matches the
>>> >> <code>FilterTriple</code>s
>>> >> +     * of the listeners.
>>> >> +     *
>>> >> +     * @param triple The Triple that was modified
>>> >> +     * @param type The type of modification
>>> >> +     */
>>> >> +    protected void dispatchEvent(GraphEvent event) {
>>> >> +        synchronized(listenerConfigs) {
>>> >> +            Iterator<ListenerConfiguration> iter =
>>> >> listenerConfigs.iterator();
>>> >> +            while (iter.hasNext()) {
>>> >> +                ListenerConfiguration config = iter.next();
>>> >> +                GraphListener registeredListener =
>>> config.getListener();
>>> >> +                if (registeredListener == null) {
>>> >> +                    iter.remove();
>>> >> +                    continue;
>>> >> +                }
>>> >> +                if (config.getFilter().match(event.getTriple())) {
>>> >> +
>>> >> delayedNotificator.sendEventToListener(registeredListener, event);
>>> >> +                }
>>> >> +            }
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void addGraphListener(GraphListener listener, FilterTriple
>>> >> filter) {
>>> >> +        addGraphListener(listener, filter, 0);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void addGraphListener(GraphListener listener, FilterTriple
>>> >> filter,
>>> >> +            long delay) {
>>> >> +        listenerConfigs.add(new ListenerConfiguration(listener,
>>> filter));
>>> >> +        if (delay > 0) {
>>> >> +            delayedNotificator.addDelayedListener(listener, delay);
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void removeGraphListener(GraphListener listener) {
>>> >> +        synchronized(listenerConfigs) {
>>> >> +            Iterator<ListenerConfiguration> iter =
>>> >> listenerConfigs.iterator();
>>> >> +            while (iter.hasNext()) {
>>> >> +                ListenerConfiguration listenerConfig = iter.next();
>>> >> +                GraphListener registeredListener =
>>> >> listenerConfig.getListener();
>>> >> +                if ((registeredListener == null) ||
>>> >> (registeredListener.equals(listener))) {
>>> >> +                    iter.remove();
>>> >> +                }
>>> >> +            }
>>> >> +        }
>>> >> +        delayedNotificator.removeDelayedListener(listener);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public ImmutableGraph getImmutableGraph() {
>>> >> +        throw new UnsupportedOperationException("Not supported yet.");
>>> >> //To change body of generated methods, choose Tools | Templates.
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public ReadWriteLock getLock() {
>>> >> +        return wrapped.getLock();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public int size() {
>>> >> +        return wrapped.size();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean isEmpty() {
>>> >> +        return wrapped.isEmpty();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Object[] toArray() {
>>> >> +        return wrapped.toArray();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public <T> T[] toArray(T[] a) {
>>> >> +        return wrapped.toArray(a);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean containsAll(Collection<?> c) {
>>> >> +        return wrapped.containsAll(c);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean addAll(Collection<? extends Triple> c) {
>>> >> +        return wrapped.addAll(c);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean retainAll(Collection<?> c) {
>>> >> +        return wrapped.retainAll(c);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void clear() {
>>> >> +        wrapped.clear();
>>> >> +    }
>>> >> +
>>> >> +    private static class ListenerConfiguration {
>>> >> +
>>> >> +        private WeakReference<GraphListener> listenerRef;
>>> >> +        private FilterTriple filter;
>>> >> +
>>> >> +        private ListenerConfiguration(GraphListener listener,
>>> >> FilterTriple filter) {
>>> >> +            this.listenerRef = new
>>> WeakReference<GraphListener>(listener);
>>> >> +            this.filter = filter;
>>> >> +        }
>>> >> +
>>> >> +        /**
>>> >> +         * @return the listener
>>> >> +         */
>>> >> +        GraphListener getListener() {
>>> >> +            GraphListener listener = listenerRef.get();
>>> >> +            return listener;
>>> >> +        }
>>> >> +
>>> >> +        /**
>>> >> +         * @return the filter
>>> >> +         */
>>> >> +        FilterTriple getFilter() {
>>> >> +            return filter;
>>> >> +        }
>>> >> +    }
>>> >> +
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,85 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements.  See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership.  The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License.  You may obtain a copy of the License at
>>> >> + *
>>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied.  See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +
>>> >> +package org.apache.commons.rdf.impl.utils.debug;
>>> >> +
>>> >> +import java.util.concurrent.TimeUnit;
>>> >> +import java.util.concurrent.locks.Condition;
>>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author mir
>>> >> + */
>>> >> +public class ReadLockDebug extends ReadLock {
>>> >> +
>>> >> +    ReentrantReadWriteLockTracker lock;
>>> >> +    StackTraceElement[] stackTrace;
>>> >> +
>>> >> +    ReadLock readLock;
>>> >> +    public ReadLockDebug(ReentrantReadWriteLockTracker lock) {
>>> >> +        super(lock);
>>> >> +        this.lock = lock;
>>> >> +        this.readLock = lock.realReadLock();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void lock() {
>>> >> +        readLock.lock();
>>> >> +        lock.addLockedReadLock(this);
>>> >> +        stackTrace = Thread.currentThread().getStackTrace();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void lockInterruptibly() throws InterruptedException {
>>> >> +        readLock.lockInterruptibly();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Condition newCondition() {
>>> >> +        return readLock.newCondition();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public String toString() {
>>> >> +        return readLock.toString();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean tryLock() {
>>> >> +        return readLock.tryLock();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean tryLock(long timeout, TimeUnit unit) throws
>>> >> InterruptedException {
>>> >> +        return readLock.tryLock(timeout, unit);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void unlock() {
>>> >> +        readLock.unlock();
>>> >> +        lock.removeReadLock(this);
>>> >> +        stackTrace = null;
>>> >> +    }
>>> >> +
>>> >> +    public StackTraceElement[] getStackTrace() {
>>> >> +        return stackTrace;
>>> >> +    }
>>> >> +
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,133 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements.  See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership.  The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License.  You may obtain a copy of the License at
>>> >> + *
>>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied.  See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +package org.apache.commons.rdf.impl.utils.debug;
>>> >> +
>>> >> +import java.util.Collection;
>>> >> +import java.util.Collections;
>>> >> +import java.util.HashSet;
>>> >> +import java.util.Set;
>>> >> +import java.util.concurrent.locks.Condition;
>>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author mir
>>> >> + */
>>> >> +public class ReentrantReadWriteLockTracker extends
>>> ReentrantReadWriteLock
>>> >> {
>>> >> +
>>> >> +
>>> >> +    private Set<ReadLockDebug> lockedReadLocks =
>>> >> Collections.synchronizedSet(new HashSet<ReadLockDebug>());
>>> >> +    private final WriteLockDebug writeLock = new WriteLockDebug(this);
>>> >> +    @Override
>>> >> +    protected Thread getOwner() {
>>> >> +        return super.getOwner();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    protected Collection<Thread> getQueuedReaderThreads() {
>>> >> +        return super.getQueuedReaderThreads();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    protected Collection<Thread> getQueuedThreads() {
>>> >> +        return super.getQueuedThreads();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    protected Collection<Thread> getQueuedWriterThreads() {
>>> >> +        return super.getQueuedWriterThreads();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public int getReadHoldCount() {
>>> >> +        return super.getReadHoldCount();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public int getReadLockCount() {
>>> >> +        return super.getReadLockCount();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public int getWaitQueueLength(Condition condition) {
>>> >> +        return super.getWaitQueueLength(condition);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    protected Collection<Thread> getWaitingThreads(Condition
>>> condition) {
>>> >> +        return super.getWaitingThreads(condition);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public int getWriteHoldCount() {
>>> >> +        return super.getWriteHoldCount();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean hasWaiters(Condition condition) {
>>> >> +        return super.hasWaiters(condition);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean isWriteLocked() {
>>> >> +        return super.isWriteLocked();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean isWriteLockedByCurrentThread() {
>>> >> +        return super.isWriteLockedByCurrentThread();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public ReadLock readLock() {
>>> >> +        return new ReadLockDebug(this);
>>> >> +    }
>>> >> +
>>> >> +    ReadLock realReadLock() {
>>> >> +        return super.readLock();
>>> >> +    }
>>> >> +
>>> >> +    WriteLock realWriteLock() {
>>> >> +        return super.writeLock();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public String toString() {
>>> >> +        return super.toString();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public WriteLockDebug writeLock() {
>>> >> +        return writeLock;
>>> >> +    }
>>> >> +
>>> >> +    void addLockedReadLock(ReadLockDebug lock) {
>>> >> +        lockedReadLocks.add(lock);
>>> >> +    }
>>> >> +
>>> >> +    void removeReadLock(ReadLockDebug lock) {
>>> >> +        lockedReadLocks.remove(lock);
>>> >> +    }
>>> >> +
>>> >> +    public Set<ReadLockDebug> getLockedReadLocks() {
>>> >> +        return lockedReadLocks;
>>> >> +    }
>>> >> +
>>> >> +
>>> >> +}
>>> >>
>>> >> Added:
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>>> >> URL:
>>> >>
>>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java?rev=1659973&view=auto
>>> >>
>>> >>
>>> ==============================================================================
>>> >> ---
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>>> >> (added)
>>> >> +++
>>> >>
>>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>>> >> Sun Feb 15 18:41:15 2015
>>> >> @@ -0,0 +1,89 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements.  See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership.  The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License.  You may obtain a copy of the License at
>>> >> + *
>>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied.  See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +
>>> >> +package org.apache.commons.rdf.impl.utils.debug;
>>> >> +
>>> >> +import java.util.concurrent.TimeUnit;
>>> >> +import java.util.concurrent.locks.Condition;
>>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
>>> >> +
>>> >> +/**
>>> >> + *
>>> >> + * @author mir
>>> >> + */
>>> >> +public class WriteLockDebug extends WriteLock {
>>> >> +
>>> >> +    private ReentrantReadWriteLockTracker lock;
>>> >> +    private WriteLock writeLock;
>>> >> +    private StackTraceElement[] stackTrace;
>>> >> +
>>> >> +    public WriteLockDebug(ReentrantReadWriteLockTracker lock) {
>>> >> +        super(lock);
>>> >> +        this.lock = lock;
>>> >> +        this.writeLock = lock.realWriteLock();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public int getHoldCount() {
>>> >> +        return writeLock.getHoldCount();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean isHeldByCurrentThread() {
>>> >> +        return writeLock.isHeldByCurrentThread();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void lock() {
>>> >> +        writeLock.lock();
>>> >> +        stackTrace = Thread.currentThread().getStackTrace();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void lockInterruptibly() throws InterruptedException {
>>> >> +        writeLock.lockInterruptibly();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public Condition newCondition() {
>>> >> +        return writeLock.newCondition();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean tryLock() {
>>> >> +        return writeLock.tryLock();
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public boolean tryLock(long timeout, TimeUnit unit) throws
>>> >> InterruptedException {
>>> >> +        return writeLock.tryLock(timeout, unit);
>>> >> +    }
>>> >> +
>>> >> +    @Override
>>> >> +    public void unlock() {
>>> >> +        writeLock.unlock();
>>> >> +        stackTrace = null;
>>> >> +    }
>>> >> +
>>> >> +    public StackTraceElement[] getStackTrace() {
>>> >> +        return stackTrace;
>>> >> +    }
>>> >> +
>>> >> +
>>> >> +}
>>> >>
>>> >>
>>> >>
>>> >
>>> >
>>> > --
>>> > http://people.apache.org/~britter/
>>> > http://www.systemoutprintln.de/
>>> > http://twitter.com/BenediktRitter
>>> > http://github.com/britter
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>
>>>
>>
>>
>> --
>> http://people.apache.org/~britter/
>> http://www.systemoutprintln.de/
>> http://twitter.com/BenediktRitter
>> http://github.com/britter
>>
>
>
>
> --
> http://people.apache.org/~britter/
> http://www.systemoutprintln.de/
> http://twitter.com/BenediktRitter
> http://github.com/britter



-- 
Stian Soiland-Reyes
Apache Taverna (incubating)
http://orcid.org/0000-0001-9842-9718

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: svn commit: r1659973 [1/3] - in /commons/sandbox/rdf/trunk: ./ api/src/main/java/org/apache/commons/rdf/ impl.sparql/ impl.sparql/src/ impl.sparql/src/main/ impl.sparql/src/main/java/ impl.sparql/src/main/java/org/ impl.sparql/src/main/java/org/apache/...

Posted by Benedikt Ritter <br...@apache.org>.
2015-02-17 7:04 GMT+01:00 Benedikt Ritter <br...@apache.org>:

>
>
> 2015-02-17 0:13 GMT+01:00 Peter Ansell <an...@gmail.com>:
>
>> Hi Bernard,
>>
>> The Commons RDF project is not planning on including any non-trivial
>> implementations, to avoid bias towards any of the participating
>> platforms. Stian has written a trivial implementation and submitted it
>> to GitHub to provide a reference for our test harness, but it is never
>> planned to be used by anyone for non-trivial purposes.
>>
>> Reto is moving this code here unilaterally from Clerezza at this point
>> based on the ability of any Apache committer to send code into Apache
>> Commons.
>>
>> The code that will be sent to the incubator is still planned to be the
>> code that is in the GitHub repository at the time the incubator
>> request goes through.
>>
>
> This is still in the sandbox so I'm not too crazy about it. But creating a
> separate code base in the commons-rdf git repository doesn't sound like a
> good idea given the fact that github Commons RDF will eventually move to
> Apache Commons after incubation. What should haben with the code that is in
> the repository by that time?
>
> Reto, can you comment please?
>

Reto, I'm still waiting for your comment.


>
> Regards,
> Benedikt
>
>
>>
>> Cheers,
>>
>> Peter
>>
>> On 16 February 2015 at 18:34, Benedikt Ritter <br...@apache.org> wrote:
>> > Hello Reto,
>> >
>> > how does this relate to github Commons RDF? Is this part of the code
>> base
>> > proposed for incubation?
>> >
>> > Regards,
>> > Benedikt
>> >
>> > 2015-02-15 19:41 GMT+01:00 <re...@apache.org>:
>> >
>> >> Author: reto
>> >> Date: Sun Feb 15 18:41:15 2015
>> >> New Revision: 1659973
>> >>
>> >> URL: http://svn.apache.org/r1659973
>> >> Log:
>> >> Started SPARQL Backed Implementation
>> >>
>> >> Added:
>> >>     commons/sandbox/rdf/trunk/alerts.txt
>> >>     commons/sandbox/rdf/trunk/impl.sparql/   (with props)
>> >>     commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/
>> >>
>>  commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/resources/
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/
>> >>
>>  commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/
>> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/
>> >>
>>  commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> >>     commons/sandbox/rdf/trunk/impl.utils/   (with props)
>> >>     commons/sandbox/rdf/trunk/impl.utils/pom.xml
>> >>       - copied, changed from r1651181,
>> commons/sandbox/rdf/trunk/pom.xml
>> >>     commons/sandbox/rdf/trunk/impl.utils/src/
>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/
>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/
>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/
>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/
>> >>
>>  commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphNotIsomorphicException.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GroupMappingIterator.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/HashMatching.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/MappingIterator.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/PermutationIterator.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/Utils.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashMap.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashSet.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntIterator.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntSet.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/package-info.java
>> >>       - copied, changed from r1651181,
>> >>
>> commons/sandbox/rdf/trunk/src/main/java/org/apache/commons/rdf/package-info.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraph.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleMGraph.java
>> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/resources/
>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/
>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/
>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/
>> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/
>> >>
>>  commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/PlainLiteralImplTest.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraphTest.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TripleImplTest.java
>> >>
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
>> >>     commons/sandbox/rdf/trunk/report.xml
>> >> Modified:
>> >>
>> >>
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> >>     commons/sandbox/rdf/trunk/pom.xml
>> >>
>> >> Added: commons/sandbox/rdf/trunk/alerts.txt
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/alerts.txt?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >>     (empty)
>> >>
>> >> Modified:
>> >>
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java?rev=1659973&r1=1659972&r2=1659973&view=diff
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> >> (original)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -84,7 +84,8 @@ public interface Literal extends RdfTerm
>> >>
>> >>      /**
>> >>       * Returns the hash code of the lexical form plus the hash code
>> of the
>> >> -     * language, plush the hash code of the datatype
>> >> +     * datatype plus if the literal has a language the hash code of
>> the
>> >> +     * language.
>> >>       *
>> >>       * @return hash code
>> >>       */
>> >>
>> >> Propchange: commons/sandbox/rdf/trunk/impl.sparql/
>> >>
>> >>
>> ------------------------------------------------------------------------------
>> >> --- svn:ignore (added)
>> >> +++ svn:ignore Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1 @@
>> >> +target
>> >>
>> >> Added: commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/pom.xml?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> --- commons/sandbox/rdf/trunk/impl.sparql/pom.xml (added)
>> >> +++ commons/sandbox/rdf/trunk/impl.sparql/pom.xml Sun Feb 15 18:41:15
>> 2015
>> >> @@ -0,0 +1,52 @@
>> >> +<?xml version="1.0" encoding="UTF-8"?>
>> >> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>> >> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>> >> http://maven.apache.org/POM/4.0.0
>> >> http://maven.apache.org/xsd/maven-4.0.0.xsd">
>> >> +    <parent>
>> >> +        <groupId>org.apache.commons</groupId>
>> >> +        <artifactId>commons-parent</artifactId>
>> >> +        <version>37</version>
>> >> +        <relativePath />
>> >> +    </parent>
>> >> +    <modelVersion>4.0.0</modelVersion>
>> >> +    <groupId>commons-rdf</groupId>
>> >> +    <artifactId>commons-rdf-impl-sparql</artifactId>
>> >> +    <version>1.0.0-SNAPSHOT</version>
>> >> +    <packaging>jar</packaging>
>> >> +    <name>Apache Commons RDF SPARQL backed implementation.</name>
>> >> +    <description>An implementation of the rdf commons API backed by a
>> >> sparql
>> >> +        endpoint. STATUS: Incomplete, currecnt code only supports
>> reading
>> >> +        graphs and does not yet support BlankNodes.</description>
>> >> +    <properties>
>> >> +
>> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
>> >> +        <maven.compiler.source>1.7</maven.compiler.source>
>> >> +        <maven.compiler.target>1.7</maven.compiler.target>
>> >> +    </properties>
>> >> +    <dependencies>
>> >> +        <dependency>
>> >> +            <groupId>org.apache.httpcomponents</groupId>
>> >> +            <artifactId>httpclient</artifactId>
>> >> +            <version>4.4</version>
>> >> +        </dependency>
>> >> +        <dependency>
>> >> +            <groupId>commons-rdf</groupId>
>> >> +            <artifactId>commons-rdf-api</artifactId>
>> >> +            <version>0.1-SNAPSHOT</version>
>> >> +        </dependency>
>> >> +        <dependency>
>> >> +            <groupId>commons-rdf</groupId>
>> >> +            <artifactId>commons-rdf-impl-utils</artifactId>
>> >> +            <version>0.1-SNAPSHOT</version>
>> >> +        </dependency>
>> >> +        <dependency>
>> >> +            <groupId>junit</groupId>
>> >> +            <artifactId>junit</artifactId>
>> >> +            <version>4.12</version>
>> >> +            <scope>test</scope>
>> >> +        </dependency>
>> >> +        <dependency>
>> >> +            <groupId>org.apache.jena</groupId>
>> >> +            <artifactId>jena-fuseki</artifactId>
>> >> +            <version>1.1.1</version>
>> >> +            <scope>test</scope>
>> >> +        </dependency>
>> >> +    </dependencies>
>> >> +</project>
>> >> \ No newline at end of file
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,220 @@
>> >> +/*
>> >> + * To change this license header, choose License Headers in Project
>> >> Properties.
>> >> + * To change this template file, choose Tools | Templates
>> >> + * and open the template in the editor.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.sparql;
>> >> +
>> >> +import java.io.IOException;
>> >> +import java.io.InputStream;
>> >> +import java.io.UnsupportedEncodingException;
>> >> +import java.util.ArrayList;
>> >> +import java.util.Enumeration;
>> >> +import java.util.HashMap;
>> >> +import java.util.Hashtable;
>> >> +import java.util.List;
>> >> +import java.util.Map;
>> >> +import java.util.logging.Level;
>> >> +import java.util.logging.Logger;
>> >> +import org.apache.http.HttpEntity;
>> >> +import org.apache.http.NameValuePair;
>> >> +import org.apache.http.client.entity.UrlEncodedFormEntity;
>> >> +import org.apache.http.client.methods.CloseableHttpResponse;
>> >> +import org.apache.http.client.methods.HttpPost;
>> >> +import org.apache.http.impl.client.CloseableHttpClient;
>> >> +import org.apache.http.impl.client.HttpClients;
>> >> +import org.apache.http.message.BasicNameValuePair;
>> >> +import org.apache.http.util.EntityUtils;
>> >> +import javax.xml.parsers.*;
>> >> +import org.apache.commons.rdf.BlankNode;
>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>> >> +import org.apache.commons.rdf.Iri;
>> >> +import org.apache.commons.rdf.Language;
>> >> +import org.apache.commons.rdf.Literal;
>> >> +import org.apache.commons.rdf.RdfTerm;
>> >> +import org.apache.commons.rdf.Triple;
>> >> +import org.apache.commons.rdf.impl.utils.AbstractLiteral;
>> >> +import org.xml.sax.*;
>> >> +import org.xml.sax.helpers.*;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author developer
>> >> + */
>> >> +public class SparqlClient {
>> >> +
>> >> +    final String endpoint;
>> >> +
>> >> +    public SparqlClient(final String endpoint) {
>> >> +        this.endpoint = endpoint;
>> >> +    }
>> >> +
>> >> +    List<Map<String, RdfTerm>> queryResultSet(final String query)
>> throws
>> >> IOException {
>> >> +        CloseableHttpClient httpclient = HttpClients.createDefault();
>> >> +        HttpPost httpPost = new HttpPost(endpoint);
>> >> +        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
>> >> +        nvps.add(new BasicNameValuePair("query", query));
>> >> +        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
>> >> +        CloseableHttpResponse response2 =
>> httpclient.execute(httpPost);
>> >> +
>> >> +        try {
>> >> +            HttpEntity entity2 = response2.getEntity();
>> >> +            InputStream in = entity2.getContent();
>> >> +            SAXParserFactory spf = SAXParserFactory.newInstance();
>> >> +            spf.setNamespaceAware(true);
>> >> +            SAXParser saxParser = spf.newSAXParser();
>> >> +            XMLReader xmlReader = saxParser.getXMLReader();
>> >> +            final SparqlsResultsHandler sparqlsResultsHandler = new
>> >> SparqlsResultsHandler();
>> >> +            xmlReader.setContentHandler(sparqlsResultsHandler);
>> >> +            xmlReader.parse(new InputSource(in));
>> >> +            /*
>> >> +             for (int ch = in.read(); ch != -1; ch = in.read()) {
>> >> +             System.out.print((char)ch);
>> >> +             }
>> >> +             */
>> >> +            // do something useful with the response body
>> >> +            // and ensure it is fully consumed
>> >> +            EntityUtils.consume(entity2);
>> >> +            return sparqlsResultsHandler.getResults();
>> >> +        } catch (ParserConfigurationException ex) {
>> >> +            throw new RuntimeException(ex);
>> >> +        } catch (SAXException ex) {
>> >> +            throw new RuntimeException(ex);
>> >> +        } finally {
>> >> +            response2.close();
>> >> +        }
>> >> +
>> >> +    }
>> >> +
>> >> +    final public static class SparqlsResultsHandler extends
>> >> DefaultHandler {
>> >> +
>> >> +        private String currentBindingName;
>> >> +        private Map<String, RdfTerm> currentResult = null;
>> >> +        private final List<Map<String, RdfTerm>> results = new
>> >> ArrayList<>();
>> >> +        private boolean readingValue;
>> >> +        private String value;
>> >> +        private Map<String, BlankNode> bNodeMap = new HashMap<>();
>> >> +        private static final Iri XSD_STRING = new Iri("
>> >> http://www.w3.org/2001/XMLSchema#string");
>> >> +
>> >> +        private RdfTerm getBNode(String value) {
>> >> +            if (!bNodeMap.containsKey(value)) {
>> >> +                bNodeMap.put(value, new BlankNode());
>> >> +            }
>> >> +            return bNodeMap.get(value);
>> >> +        }
>> >> +
>> >> +        private List<Map<String, RdfTerm>> getResults() {
>> >> +            return results;
>> >> +        }
>> >> +
>> >> +        enum BindingType {
>> >> +
>> >> +            uri, bnode, literal;
>> >> +        }
>> >> +
>> >> +        @Override
>> >> +        public void startDocument() throws SAXException {
>> >> +
>> >> +        }
>> >> +
>> >> +        @Override
>> >> +        public void startElement(String namespaceURI,
>> >> +                String localName,
>> >> +                String qName,
>> >> +                Attributes atts)
>> >> +                throws SAXException {
>> >> +            if ("http://www.w3.org/2005/sparql-results#
>> ".equals(namespaceURI))
>> >> {
>> >> +                if ("result".equals(localName)) {
>> >> +                    if (currentResult != null) {
>> >> +                        throw new SAXException("unexpected tag
>> <result>");
>> >> +                    }
>> >> +                    currentResult = new HashMap<>();
>> >> +                } else if ("binding".equals(localName)) {
>> >> +                    if (currentResult == null) {
>> >> +                        throw new SAXException("unexpected tag
>> >> <binding>");
>> >> +                    }
>> >> +                    currentBindingName = atts.getValue("name");
>> >> +                } else if ("uri".equals(localName) ||
>> >> "bnode".equals(localName) || "literal".equals(localName)) {
>> >> +                    if (readingValue) {
>> >> +                        throw new SAXException("unexpected tag <" +
>> >> localName + ">");
>> >> +                    }
>> >> +                    readingValue = true;
>> >> +                }
>> >> +            }
>> >> +
>> >> +            //System.out.println(namespaceURI);
>> >> +            //System.out.println(qName);
>> >> +        }
>> >> +
>> >> +        @Override
>> >> +        public void characters(char[] chars, int start, int length)
>> >> throws SAXException {
>> >> +            if (readingValue) {
>> >> +                value = new String(chars, start, length);
>> >> +                //System.err.println(value + start + ", " + length);
>> >> +            }
>> >> +        }
>> >> +
>> >> +        @Override
>> >> +        public void endElement(String namespaceURI,
>> >> +                String localName,
>> >> +                String qName)
>> >> +                throws SAXException {
>> >> +            if ("http://www.w3.org/2005/sparql-results#
>> ".equals(namespaceURI))
>> >> {
>> >> +                if ("result".equals(localName)) {
>> >> +                    results.add(currentResult);
>> >> +                    currentResult = null;
>> >> +                } else if ("binding".equals(localName)) {
>> >> +                    if (currentBindingName == null) {
>> >> +                        throw new SAXException("unexpected tag
>> >> </binding>");
>> >> +                    }
>> >> +                    currentBindingName = null;
>> >> +                } else {
>> >> +                    try {
>> >> +                        BindingType b =
>> BindingType.valueOf(localName);
>> >> +                        RdfTerm rdfTerm = null;
>> >> +                        switch (b) {
>> >> +                            case uri:
>> >> +                                rdfTerm = new Iri(value);
>> >> +                                break;
>> >> +                            case bnode:
>> >> +                                rdfTerm = getBNode(value);
>> >> +                                break;
>> >> +                            case literal:
>> >> +                                final String lf = value;
>> >> +                                rdfTerm = new AbstractLiteral() {
>> >> +
>> >> +                                    @Override
>> >> +                                    public String getLexicalForm() {
>> >> +                                        return lf;
>> >> +                                    }
>> >> +
>> >> +                                    @Override
>> >> +                                    public Iri getDataType() {
>> >> +                                        //TODO implement
>> >> +                                        return XSD_STRING;
>> >> +                                    }
>> >> +
>> >> +                                    @Override
>> >> +                                    public Language getLanguage() {
>> >> +                                        //TODO impl
>> >> +                                        return null;
>> >> +                                    }
>> >> +                                };
>> >> +                                break;
>> >> +                        }
>> >> +                        currentResult.put(currentBindingName,
>> rdfTerm);
>> >> +                        readingValue = false;
>> >> +                    } catch (IllegalArgumentException e) {
>> >> +                            //not uri|bnode|literal
>> >> +                    }
>> >> +                }
>> >> +            }
>> >> +        }
>> >> +
>> >> +        public void endDocument() throws SAXException {
>> >> +            //System.out.println("results: " + results.size());
>> >> +        }
>> >> +
>> >> +    }
>> >> +
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,121 @@
>> >> +/*
>> >> + * To change this license header, choose License Headers in Project
>> >> Properties.
>> >> + * To change this template file, choose Tools | Templates
>> >> + * and open the template in the editor.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.sparql;
>> >> +
>> >> +import java.io.IOException;
>> >> +import java.util.Iterator;
>> >> +import java.util.List;
>> >> +import java.util.Map;
>> >> +import org.apache.commons.rdf.BlankNode;
>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>> >> +import org.apache.commons.rdf.Iri;
>> >> +import org.apache.commons.rdf.Literal;
>> >> +import org.apache.commons.rdf.RdfTerm;
>> >> +import org.apache.commons.rdf.Triple;
>> >> +import org.apache.commons.rdf.impl.utils.AbstractGraph;
>> >> +import org.apache.commons.rdf.impl.utils.TripleImpl;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author reto
>> >> + */
>> >> +public class SparqlGraph extends AbstractGraph {
>> >> +
>> >> +    final SparqlClient sparqlClient;
>> >> +
>> >> +    /** Constructs a Graph representing the default graph at the
>> specified
>> >> +     * endpoint
>> >> +     */
>> >> +    public SparqlGraph(final String endpoint) {
>> >> +        sparqlClient = new SparqlClient(endpoint);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    protected Iterator<Triple> performFilter(final BlankNodeOrIri
>> subject,
>> >> +            final Iri predicate, final RdfTerm object) {
>> >> +        try {
>> >> +            final StringBuilder queryBuilder = new StringBuilder();
>> >> +            queryBuilder.append("SELECT * WHERE { ");
>> >> +            if (subject == null) {
>> >> +                queryBuilder.append("?s");
>> >> +            } else {
>> >> +                queryBuilder.append(asSparqlTerm(subject));
>> >> +            }
>> >> +            queryBuilder.append(' ');
>> >> +            if (predicate == null) {
>> >> +                queryBuilder.append("?p");
>> >> +            } else {
>> >> +                queryBuilder.append(asSparqlTerm(predicate));
>> >> +            }
>> >> +            queryBuilder.append(' ');
>> >> +            if (object == null) {
>> >> +                queryBuilder.append("?o");
>> >> +            } else {
>> >> +                queryBuilder.append(asSparqlTerm(object));
>> >> +            }
>> >> +            queryBuilder.append(" }");
>> >> +            List<Map<String, RdfTerm>> sparqlResults =
>> >> sparqlClient.queryResultSet(queryBuilder.toString());
>> >> +            final Iterator<Map<String, RdfTerm>> resultsIterator =
>> >> sparqlResults.iterator();
>> >> +            return new Iterator<Triple>() {
>> >> +
>> >> +                @Override
>> >> +                public boolean hasNext() {
>> >> +                    return resultsIterator.hasNext();
>> >> +                }
>> >> +
>> >> +                @Override
>> >> +                public Triple next() {
>> >> +                    Map<String, RdfTerm> result =
>> resultsIterator.next();
>> >> +                    return new TripleImpl(subject != null ? subject :
>> >> (BlankNodeOrIri)result.get("s"),
>> >> +                            predicate != null ? predicate :
>> >> (Iri)result.get("p"),
>> >> +                            object != null ? object :
>> result.get("o"));
>> >> +                }
>> >> +            };
>> >> +        } catch (IOException ex) {
>> >> +            throw new RuntimeException(ex);
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    protected int performSize() {
>> >> +        try {
>> >> +            return sparqlClient.queryResultSet("SELECT * WHERE { ?s ?p
>> >> ?o}").size();
>> >> +        } catch (IOException ex) {
>> >> +            throw new RuntimeException(ex);
>> >> +        }
>> >> +    }
>> >> +
>> >> +    private String asSparqlTerm(Iri iri) {
>> >> +        return "<"+iri.getUnicodeString()+">";
>> >> +    }
>> >> +
>> >> +    private String asSparqlTerm(Literal literal) {
>> >> +        //TODO langauge and datatype
>> >> +        return "\""+literal.getLexicalForm()+"\"";
>> >> +    }
>> >> +
>> >> +    private String asSparqlTerm(BlankNode bnode) {
>> >> +        //this requires adding additional clauses to the graph pattern
>> >> +        throw new UnsupportedOperationException("Not supported yet.");
>> >> +    }
>> >> +
>> >> +    private String asSparqlTerm(BlankNodeOrIri term) {
>> >> +        if (term instanceof Iri) {
>> >> +            return asSparqlTerm((Iri)term);
>> >> +        } else {
>> >> +            return asSparqlTerm((BlankNode)term);
>> >> +        }
>> >> +    }
>> >> +
>> >> +    private String asSparqlTerm(RdfTerm term) {
>> >> +        if (term instanceof BlankNodeOrIri) {
>> >> +            return asSparqlTerm((BlankNodeOrIri)term);
>> >> +        } else {
>> >> +            return asSparqlTerm((Literal)term);
>> >> +        }
>> >> +    }
>> >> +
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,106 @@
>> >> +/*
>> >> + * To change this license header, choose License Headers in Project
>> >> Properties.
>> >> + * To change this template file, choose Tools | Templates
>> >> + * and open the template in the editor.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.sparql;
>> >> +
>> >> +import com.hp.hpl.jena.query.DatasetAccessor;
>> >> +import com.hp.hpl.jena.query.DatasetAccessorFactory;
>> >> +import java.io.File;
>> >> +import java.io.IOException;
>> >> +import java.net.ServerSocket;
>> >> +import org.apache.jena.fuseki.EmbeddedFusekiServer;
>> >> +import com.hp.hpl.jena.rdf.model.Model;
>> >> +import com.hp.hpl.jena.rdf.model.ModelFactory;
>> >> +import java.io.InputStream;
>> >> +import java.util.HashSet;
>> >> +import java.util.Iterator;
>> >> +import java.util.Set;
>> >> +import org.apache.commons.rdf.Graph;
>> >> +import org.apache.commons.rdf.Iri;
>> >> +import org.apache.commons.rdf.Literal;
>> >> +import org.apache.commons.rdf.RdfTerm;
>> >> +import org.apache.commons.rdf.Triple;
>> >> +import org.apache.commons.rdf.impl.utils.PlainLiteralImpl;
>> >> +import org.junit.AfterClass;
>> >> +import org.junit.Assert;
>> >> +import org.junit.BeforeClass;
>> >> +import org.junit.Test;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author reto
>> >> + */
>> >> +public class SparqlGraphTest {
>> >> +
>> >> +    final static int serverPort = findFreePort();
>> >> +    static EmbeddedFusekiServer server;
>> >> +
>> >> +    @BeforeClass
>> >> +    public static void prepare() throws IOException {
>> >> +        final String serviceURI = "http://localhost:" + serverPort +
>> >> "/ds/data";
>> >> +        final DatasetAccessorFactory factory = new
>> >> DatasetAccessorFactory();
>> >> +        final DatasetAccessor accessor =
>> factory.createHTTP(serviceURI);
>> >> +        final InputStream in =
>> >> SparqlGraphTest.class.getResourceAsStream("grounded.ttl");
>> >> +        final Model m = ModelFactory.createDefaultModel();
>> >> +        String base = "http://example.org/";
>> >> +        m.read(in, base, "TURTLE");
>> >> +
>> >> +        final File dataSet = File.createTempFile("dataset", "fuseki");
>> >> +        dataSet.delete();
>> >> +        server = EmbeddedFusekiServer.memTDB(serverPort,
>> >> "/ds");//dataSet.getAbsolutePath());
>> >> +        server.start();
>> >> +        System.out.println("Started fuseki on port " + serverPort);
>> >> +        accessor.putModel(m);
>> >> +    }
>> >> +
>> >> +    @AfterClass
>> >> +    public static void cleanup() {
>> >> +        server.stop();
>> >> +    }
>> >> +
>> >> +    @Test
>> >> +    public void graphSize() {
>> >> +        final Graph graph = new SparqlGraph("http://localhost:" +
>> >> serverPort + "/ds/query");
>> >> +        Assert.assertEquals("Graph not of the exepected size", 8,
>> >> graph.size());
>> >> +    }
>> >> +
>> >> +    @Test
>> >> +    public void filter1() {
>> >> +        final Graph graph = new SparqlGraph("http://localhost:" +
>> >> serverPort + "/ds/query");
>> >> +        final Iri spiderman = new Iri("http://example.org/#spiderman
>> ");
>> >> +        final Iri greenGoblin = new Iri("
>> http://example.org/#green-goblin
>> >> ");
>> >> +        final Iri enemyOf = new Iri("
>> >> http://www.perceive.net/schemas/relationship/enemyOf");
>> >> +        final Iri foafName = new Iri("http://xmlns.com/foaf/0.1/name
>> ");
>> >> +        {
>> >> +            final Iterator<Triple> iter = graph.filter(spiderman,
>> null,
>> >> greenGoblin);
>> >> +            Assert.assertTrue(iter.hasNext());
>> >> +            Assert.assertEquals(enemyOf, iter.next().getPredicate());
>> >> +            Assert.assertFalse(iter.hasNext());
>> >> +        }
>> >> +        {
>> >> +            final Iterator<Triple> iter = graph.filter(spiderman,
>> >> foafName, null);
>> >> +            Set<Literal> names = new HashSet<>();
>> >> +            for (int i = 0; i < 2; i++) {
>> >> +                Assert.assertTrue(iter.hasNext());
>> >> +                RdfTerm name = iter.next().getObject();
>> >> +                Assert.assertTrue(name instanceof Literal);
>> >> +                names.add((Literal)name);
>> >> +            }
>> >> +            Assert.assertFalse(iter.hasNext());
>> >> +            Assert.assertTrue(names.contains(new
>> >> PlainLiteralImpl("Spiderman")));
>> >> +        }
>> >> +    }
>> >> +
>> >> +    public static int findFreePort() {
>> >> +        int port = 0;
>> >> +        try (ServerSocket server = new ServerSocket(0);) {
>> >> +            port = server.getLocalPort();
>> >> +        } catch (Exception e) {
>> >> +            throw new RuntimeException("unable to find a free port");
>> >> +        }
>> >> +        return port;
>> >> +    }
>> >> +
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,16 @@
>> >> +@base <http://example.org/> .
>> >> +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
>> >> +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
>> >> +@prefix foaf: <http://xmlns.com/foaf/0.1/> .
>> >> +@prefix rel: <http://www.perceive.net/schemas/relationship/> .
>> >> +
>> >> +<#green-goblin>
>> >> +    rel:enemyOf <#spiderman> ;
>> >> +    a foaf:Person ;    # in the context of the Marvel universe
>> >> +    foaf:name "Green Goblin" ;
>> >> +    foaf:age 128 .
>> >> +
>> >> +<#spiderman>
>> >> +    rel:enemyOf <#green-goblin> ;
>> >> +    a foaf:Person ;
>> >> +    foaf:name "Spiderman", "Человек-паук"@ru .
>> >> \ No newline at end of file
>> >>
>> >> Propchange: commons/sandbox/rdf/trunk/impl.utils/
>> >>
>> >>
>> ------------------------------------------------------------------------------
>> >> --- svn:ignore (added)
>> >> +++ svn:ignore Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1 @@
>> >> +target
>> >>
>> >> Copied: commons/sandbox/rdf/trunk/impl.utils/pom.xml (from r1651181,
>> >> commons/sandbox/rdf/trunk/pom.xml)
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/pom.xml?p2=commons/sandbox/rdf/trunk/impl.utils/pom.xml&p1=commons/sandbox/rdf/trunk/pom.xml&r1=1651181&r2=1659973&rev=1659973&view=diff
>> >>
>> >>
>> ==============================================================================
>> >> --- commons/sandbox/rdf/trunk/pom.xml (original)
>> >> +++ commons/sandbox/rdf/trunk/impl.utils/pom.xml Sun Feb 15 18:41:15
>> 2015
>> >> @@ -22,13 +22,14 @@
>> >>      <parent>
>> >>          <groupId>org.apache.commons</groupId>
>> >>          <artifactId>commons-parent</artifactId>
>> >> -        <version>35</version>
>> >> +        <version>37</version>
>> >> +        <relativePath />
>> >>      </parent>
>> >>      <modelVersion>4.0.0</modelVersion>
>> >>      <groupId>commons-rdf</groupId>
>> >> -    <artifactId>commons-rdf</artifactId>
>> >> +    <artifactId>commons-rdf-impl-utils</artifactId>
>> >>      <version>0.1-SNAPSHOT</version>
>> >> -    <name>Apache Commons RDF</name>
>> >> +    <name>Apache Commons RDF Implementation Utils</name>
>> >>      <description>
>> >>          Apache Commons RDF provides an API modelling the RDF data
>> model
>> >> as defined by
>> >>          http://www.w3.org/TR/rdf11-concepts/
>> >> @@ -50,11 +51,22 @@
>> >>
>> >>      <dependencies>
>> >>          <dependency>
>> >> +            <groupId>commons-rdf</groupId>
>> >> +            <artifactId>commons-rdf-api</artifactId>
>> >> +            <version>0.1-SNAPSHOT</version>
>> >> +        </dependency>
>> >> +        <dependency>
>> >>              <groupId>junit</groupId>
>> >>              <artifactId>junit</artifactId>
>> >>              <version>4.12</version>
>> >>              <scope>test</scope>
>> >>          </dependency>
>> >> +        <dependency>
>> >> +            <groupId>org.slf4j</groupId>
>> >> +            <artifactId>slf4j-api</artifactId>
>> >> +            <version>1.7.7</version>
>> >> +            <type>jar</type>
>> >> +        </dependency>
>> >>      </dependencies>
>> >>
>> >>      <distributionManagement>
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,316 @@
>> >> +/*
>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >> + * or more contributor license agreements.  See the NOTICE file
>> >> + * distributed with this work for additional information
>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >> + * to you under the Apache License, Version 2.0 (the
>> >> + * "License"); you may not use this file except in compliance
>> >> + * with the License.  You may obtain a copy of the License at
>> >> + *
>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing,
>> >> + * software distributed under the License is distributed on an
>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >> + * KIND, either express or implied.  See the License for the
>> >> + * specific language governing permissions and limitations
>> >> + * under the License.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.utils;
>> >> +
>> >> +import java.lang.ref.WeakReference;
>> >> +import java.util.AbstractCollection;
>> >> +import java.util.Collection;
>> >> +import java.util.Collections;
>> >> +import java.util.HashSet;
>> >> +import java.util.Iterator;
>> >> +
>> >> +import java.util.Set;
>> >> +import java.util.concurrent.locks.Lock;
>> >> +import java.util.concurrent.locks.ReadWriteLock;
>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>> >> +import org.apache.commons.rdf.RdfTerm;
>> >> +import org.apache.commons.rdf.Triple;
>> >> +import org.apache.commons.rdf.Graph;
>> >> +import org.apache.commons.rdf.ImmutableGraph;
>> >> +import org.apache.commons.rdf.Iri;
>> >> +import org.apache.commons.rdf.WatchableGraph;
>> >> +import org.apache.commons.rdf.event.AddEvent;
>> >> +import org.apache.commons.rdf.event.FilterTriple;
>> >> +import org.apache.commons.rdf.event.GraphEvent;
>> >> +import org.apache.commons.rdf.event.GraphListener;
>> >> +import org.apache.commons.rdf.event.RemoveEvent;
>> >> +import
>> >> org.apache.commons.rdf.impl.utils.debug.ReentrantReadWriteLockTracker;
>> >> +import org.apache.commons.rdf.impl.utils.simple.SimpleImmutableGraph;
>> >> +
>> >> +/**
>> >> + * An abstract implementation of <code>Graph</code> implementing
>> >> + * <code>iterator</code> and <code>contains</code> calling
>> >> <code>filter</code>.
>> >> + *
>> >> + * @author reto
>> >> + */
>> >> +public abstract class AbstractGraph extends AbstractCollection<Triple>
>> >> +        implements Graph {
>> >> +
>> >> +
>> >> +    private static final String DEBUG_MODE = "rdfLocksDebugging";
>> >> +    private final ReadWriteLock lock;
>> >> +
>> >> +    private final Lock readLock;
>> >> +    private final Lock writeLock;
>> >> +
>> >> +    /**
>> >> +     * Constructs a LocalbleMGraph for an Graph.
>> >> +     *
>> >> +     * @param providedMGraph a non-lockable graph
>> >> +     */
>> >> +    public AbstractGraph() {
>> >> +        {
>> >> +            String debugMode = System.getProperty(DEBUG_MODE);
>> >> +            if (debugMode != null &&
>> >> debugMode.toLowerCase().equals("true")) {
>> >> +                lock = new ReentrantReadWriteLockTracker();
>> >> +            } else {
>> >> +                lock = new ReentrantReadWriteLock();
>> >> +            }
>> >> +        }
>> >> +        readLock = lock.readLock();
>> >> +        writeLock = lock.writeLock();
>> >> +    }
>> >> +
>> >> +    public AbstractGraph(final ReadWriteLock lock) {
>> >> +        this.lock = lock;
>> >> +        readLock = lock.readLock();
>> >> +        writeLock = lock.writeLock();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public ReadWriteLock getLock() {
>> >> +        return lock;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public ImmutableGraph getImmutableGraph() {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return performGetImmutableGraph();
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    public ImmutableGraph performGetImmutableGraph() {
>> >> +        return new SimpleImmutableGraph(this);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
>> predicate,
>> >> RdfTerm object) {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return new LockingIterator(performFilter(subject,
>> predicate,
>> >> object), lock);
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public int size() {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return performSize();
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean isEmpty() {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return performIsEmpty();
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    @SuppressWarnings("element-type-mismatch")
>> >> +    public boolean contains(Object o) {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return performContains(o);
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Iterator<Triple> iterator() {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return new LockingIterator(performIterator(), lock);
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Object[] toArray() {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return performToArray();
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public <T> T[] toArray(T[] a) {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return performToArray(a);
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean containsAll(Collection<?> c) {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return performContainsAll(c);
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean add(Triple e) {
>> >> +        writeLock.lock();
>> >> +        try {
>> >> +            return performAdd(e);
>> >> +        } finally {
>> >> +            writeLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean remove(Object o) {
>> >> +        writeLock.lock();
>> >> +        try {
>> >> +            return performRemove(o);
>> >> +        } finally {
>> >> +            writeLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean addAll(Collection<? extends Triple> c) {
>> >> +        writeLock.lock();
>> >> +        try {
>> >> +            return performAddAll(c);
>> >> +        } finally {
>> >> +            writeLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean removeAll(Collection<?> c) {
>> >> +        writeLock.lock();
>> >> +        try {
>> >> +            return performRemoveAll(c);
>> >> +        } finally {
>> >> +            writeLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean retainAll(Collection<?> c) {
>> >> +        writeLock.lock();
>> >> +        try {
>> >> +            return performRetainAll(c);
>> >> +        } finally {
>> >> +            writeLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void clear() {
>> >> +        writeLock.lock();
>> >> +        try {
>> >> +            performClear();
>> >> +        } finally {
>> >> +            writeLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +
>> >> +    @Override
>> >> +    public boolean equals(Object obj) {
>> >> +        /*if (obj == null) {
>> >> +            return false;
>> >> +        }
>> >> +        if (obj == this) {
>> >> +            return true;
>> >> +        }
>> >> +        if (obj.getClass() != getClass()) {
>> >> +            return false;
>> >> +        }*/
>> >> +        return this == obj;
>> >> +    }
>> >> +
>> >> +
>> >> +    protected abstract Iterator<Triple> performFilter(BlankNodeOrIri
>> >> subject, Iri predicate, RdfTerm object);
>> >> +
>> >> +    protected abstract int performSize();
>> >> +
>> >> +    protected boolean performIsEmpty() {
>> >> +        return super.isEmpty();
>> >> +    }
>> >> +
>> >> +    protected Object[] performToArray() {
>> >> +        return super.toArray();
>> >> +    }
>> >> +
>> >> +    protected boolean performRemove(Object o) {
>> >> +        return super.remove(o);
>> >> +    }
>> >> +
>> >> +    protected boolean performAddAll(Collection<? extends Triple> c) {
>> >> +        return super.addAll(c);
>> >> +    }
>> >> +
>> >> +    protected boolean performRemoveAll(Collection<?> c) {
>> >> +        return super.removeAll(c);
>> >> +    }
>> >> +
>> >> +    protected boolean performRetainAll(Collection<?> c) {
>> >> +        return super.retainAll(c);
>> >> +    }
>> >> +
>> >> +    protected void performClear() {
>> >> +        super.clear();
>> >> +    }
>> >> +
>> >> +    protected boolean performContains(Object o) {
>> >> +        return super.contains(o);
>> >> +    }
>> >> +
>> >> +    protected Iterator<Triple> performIterator() {
>> >> +        return performFilter(null, null, null);
>> >> +    }
>> >> +
>> >> +    protected boolean performContainsAll(Collection<?> c) {
>> >> +        return super.containsAll(c);
>> >> +    }
>> >> +
>> >> +    protected <T> T[] performToArray(T[] a) {
>> >> +        return super.toArray(a);
>> >> +    }
>> >> +
>> >> +    protected boolean performAdd(Triple e) {
>> >> +        return super.add(e);
>> >> +    }
>> >> +
>> >> +
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,112 @@
>> >> +/*
>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >> + * or more contributor license agreements.  See the NOTICE file
>> >> + * distributed with this work for additional information
>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >> + * to you under the Apache License, Version 2.0 (the
>> >> + * "License"); you may not use this file except in compliance
>> >> + * with the License.  You may obtain a copy of the License at
>> >> + *
>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing,
>> >> + * software distributed under the License is distributed on an
>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >> + * KIND, either express or implied.  See the License for the
>> >> + * specific language governing permissions and limitations
>> >> + * under the License.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.utils;
>> >> +
>> >> +import java.util.Collection;
>> >> +import java.util.Iterator;
>> >> +
>> >> +import org.apache.commons.rdf.BlankNode;
>> >> +import org.apache.commons.rdf.ImmutableGraph;
>> >> +import org.apache.commons.rdf.RdfTerm;
>> >> +import org.apache.commons.rdf.Triple;
>> >> +import org.apache.commons.rdf.impl.utils.graphmatching.GraphMatcher;
>> >> +
>> >> +/**
>> >> + * <code>AbstractGraph</code> is an abstract implementation of
>> >> <code>ImmutableGraph</code>
>> >> + * implementing the <code>equals</code> and the <code>hashCode</code>
>> >> methods.
>> >> + *
>> >> + * @author reto
>> >> + *
>> >> + */
>> >> +public abstract class AbstractImmutableGraph extends AbstractGraph
>> >> +        implements ImmutableGraph {
>> >> +
>> >> +    public final synchronized int hashCode() {
>> >> +        int result = 0;
>> >> +        for (Iterator<Triple> iter = iterator(); iter.hasNext();) {
>> >> +            result += getBlankNodeBlindHash(iter.next());
>> >> +        }
>> >> +        return result;
>> >> +    }
>> >> +
>> >> +    /**
>> >> +     * @param triple
>> >> +     * @return hash without BNode hashes
>> >> +     */
>> >> +    private int getBlankNodeBlindHash(Triple triple) {
>> >> +        int hash = triple.getPredicate().hashCode();
>> >> +        RdfTerm subject = triple.getSubject();
>> >> +
>> >> +        if (!(subject instanceof BlankNode)) {
>> >> +            hash ^= subject.hashCode() >> 1;
>> >> +        }
>> >> +        RdfTerm object = triple.getObject();
>> >> +        if (!(object instanceof BlankNode)) {
>> >> +            hash ^= object.hashCode() << 1;
>> >> +        }
>> >> +
>> >> +        return hash;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean add(Triple e) {
>> >> +        throw new UnsupportedOperationException("Graphs are not
>> mutable,
>> >> use Graph");
>> >> +
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean addAll(Collection<? extends Triple> c) {
>> >> +        throw new UnsupportedOperationException("Graphs are not
>> mutable,
>> >> use Graph");
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean remove(Object o) {
>> >> +        throw new UnsupportedOperationException("Graphs are not
>> mutable,
>> >> use Graph");
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean removeAll(Collection<?> c) {
>> >> +        throw new UnsupportedOperationException("Graphs are not
>> mutable,
>> >> use Graph");
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void clear() {
>> >> +        throw new UnsupportedOperationException("Graphs are not
>> mutable,
>> >> use Graph");
>> >> +    }
>> >> +
>> >> +
>> >> +    @Override
>> >> +    public ImmutableGraph getImmutableGraph() {
>> >> +        return this;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean equals(Object obj) {
>> >> +        if (this == obj) {
>> >> +            return true;
>> >> +        }
>> >> +        if (!(obj instanceof ImmutableGraph)) {
>> >> +            return false;
>> >> +        }
>> >> +        if (hashCode() != obj.hashCode()) {
>> >> +            return false;
>> >> +        }
>> >> +        return GraphMatcher.getValidMapping(this, (ImmutableGraph)
>> obj)
>> >> != null;
>> >> +    }
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,61 @@
>> >> +/*
>> >> + * Copyright 2015 The Apache Software Foundation.
>> >> + *
>> >> + * Licensed under the Apache License, Version 2.0 (the "License");
>> >> + * you may not use this file except in compliance with the License.
>> >> + * You may obtain a copy of the License at
>> >> + *
>> >> + *      http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing, software
>> >> + * distributed under the License is distributed on an "AS IS" BASIS,
>> >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> >> implied.
>> >> + * See the License for the specific language governing permissions and
>> >> + * limitations under the License.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.utils;
>> >> +
>> >> +import org.apache.commons.rdf.Literal;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author developer
>> >> + */
>> >> +public abstract class AbstractLiteral implements Literal {
>> >> +
>> >> +    @Override
>> >> +    public int hashCode() {
>> >> +        int result = 0;
>> >> +        if (getLanguage() != null) {
>> >> +            result = getLanguage().hashCode();
>> >> +        }
>> >> +        result += getLexicalForm().hashCode();
>> >> +        result += getDataType().hashCode();
>> >> +        return result;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean equals(Object obj) {
>> >> +        if (this == obj) {
>> >> +            return true;
>> >> +        }
>> >> +        if (obj instanceof Literal) {
>> >> +            Literal other = (Literal) obj;
>> >> +
>> >> +            if (getLanguage() == null) {
>> >> +                if (other.getLanguage() != null) {
>> >> +                    return false;
>> >> +                }
>> >> +            } else {
>> >> +                if (!getLanguage().equals(other.getLanguage())) {
>> >> +                    return false;
>> >> +                }
>> >> +            }
>> >> +            boolean res = getDataType().equals(other.getDataType()) &&
>> >> getLexicalForm().equals(other.getLexicalForm());
>> >> +            return res;
>> >> +        } else {
>> >> +            return false;
>> >> +        }
>> >> +    }
>> >> +
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,112 @@
>> >> +/*
>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >> + * or more contributor license agreements.  See the NOTICE file
>> >> + * distributed with this work for additional information
>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >> + * to you under the Apache License, Version 2.0 (the
>> >> + * "License"); you may not use this file except in compliance
>> >> + * with the License.  You may obtain a copy of the License at
>> >> + *
>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing,
>> >> + * software distributed under the License is distributed on an
>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >> + * KIND, either express or implied.  See the License for the
>> >> + * specific language governing permissions and limitations
>> >> + * under the License.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.utils;
>> >> +
>> >> +import java.lang.ref.WeakReference;
>> >> +import java.util.*;
>> >> +
>> >> +import org.apache.commons.rdf.event.GraphEvent;
>> >> +import org.apache.commons.rdf.event.GraphListener;
>> >> +import org.slf4j.Logger;
>> >> +import org.slf4j.LoggerFactory;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author reto
>> >> + */
>> >> +class DelayedNotificator {
>> >> +
>> >> +    private static final Logger log =
>> >> LoggerFactory.getLogger(DelayedNotificator.class);
>> >> +    private static Timer timer = new Timer("Event delivery
>> timer",true);
>> >> +
>> >> +    static class ListenerHolder {
>> >> +
>> >> +        long delay;
>> >> +        List<GraphEvent> events = null;
>> >> +        WeakReference<GraphListener> listenerRef;
>> >> +
>> >> +        public ListenerHolder(GraphListener listener, long delay) {
>> >> +            this.listenerRef = new
>> WeakReference<GraphListener>(listener);
>> >> +            this.delay = delay;
>> >> +        }
>> >> +
>> >> +        private void registerEvent(GraphEvent event) {
>> >> +            synchronized (this) {
>> >> +                if (events == null) {
>> >> +                    events = new ArrayList<GraphEvent>();
>> >> +                    events.add(event);
>> >> +                    timer.schedule(new TimerTask() {
>> >> +
>> >> +                        @Override
>> >> +                        public void run() {
>> >> +                            List<GraphEvent> eventsLocal;
>> >> +                            synchronized (ListenerHolder.this) {
>> >> +                                eventsLocal = events;
>> >> +                                events = null;
>> >> +                            }
>> >> +                            GraphListener listener =
>> listenerRef.get();
>> >> +                            if (listener == null) {
>> >> +                                log.debug("Ignoring garbage collected
>> >> listener");
>> >> +                            } else {
>> >> +                                try {
>> >> +
>> listener.graphChanged(eventsLocal);
>> >> +                                } catch (Exception e) {
>> >> +                                    log.warn("Exception delivering
>> >> ImmutableGraph event", e);
>> >> +                                }
>> >> +                            }
>> >> +                        }
>> >> +                    }, delay);
>> >> +                } else {
>> >> +                    events.add(event);
>> >> +                }
>> >> +            }
>> >> +        }
>> >> +    }
>> >> +
>> >> +    private final Map<GraphListener, ListenerHolder> map =
>> >> Collections.synchronizedMap(
>> >> +            new WeakHashMap<GraphListener, ListenerHolder>());
>> >> +
>> >> +    void addDelayedListener(GraphListener listener, long delay) {
>> >> +        map.put(listener, new ListenerHolder(listener, delay));
>> >> +    }
>> >> +
>> >> +    /**
>> >> +     * removes a Listener, this doesn't prevent the listenerRef from
>> >> receiving
>> >> +     * events alreay scheduled.
>> >> +     *
>> >> +     * @param listenerRef
>> >> +     */
>> >> +    void removeDelayedListener(GraphListener listener) {
>> >> +        map.remove(listener);
>> >> +    }
>> >> +
>> >> +    /**
>> >> +     * if the listenerRef has not been registered as delayed
>> listenerRef
>> >> te events is
>> >> +     * forwarded synchroneously
>> >> +     * @param event
>> >> +     */
>> >> +    void sendEventToListener(GraphListener listener, GraphEvent
>> event) {
>> >> +        ListenerHolder holder = map.get(listener);
>> >> +        if (holder == null) {
>> >> +            listener.graphChanged(Collections.singletonList(event));
>> >> +        } else {
>> >> +            holder.registerEvent(event);
>> >> +        }
>> >> +    }
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,73 @@
>> >> +/*
>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >> + * or more contributor license agreements.  See the NOTICE file
>> >> + * distributed with this work for additional information
>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >> + * to you under the Apache License, Version 2.0 (the
>> >> + * "License"); you may not use this file except in compliance
>> >> + * with the License.  You may obtain a copy of the License at
>> >> + *
>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing,
>> >> + * software distributed under the License is distributed on an
>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >> + * KIND, either express or implied.  See the License for the
>> >> + * specific language governing permissions and limitations
>> >> + * under the License.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.utils;
>> >> +
>> >> +import java.util.Iterator;
>> >> +import java.util.concurrent.locks.Lock;
>> >> +import java.util.concurrent.locks.ReadWriteLock;
>> >> +import org.apache.commons.rdf.Triple;
>> >> +
>> >> +/**
>> >> + * Wrapps an iterator<Triple> reading entering a read-lock on every
>> >> invocation
>> >> + * of hasNext and next
>> >> + * @author reto
>> >> + */
>> >> +class LockingIterator implements Iterator<Triple> {
>> >> +
>> >> +    private Iterator<Triple> base;
>> >> +    private Lock readLock;
>> >> +    private Lock writeLock;
>> >> +
>> >> +    public LockingIterator(Iterator<Triple> iterator, ReadWriteLock
>> lock)
>> >> {
>> >> +        base = iterator;
>> >> +        readLock = lock.readLock();
>> >> +        writeLock = lock.writeLock();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean hasNext() {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return base.hasNext();
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Triple next() {
>> >> +        readLock.lock();
>> >> +        try {
>> >> +            return base.next();
>> >> +        } finally {
>> >> +            readLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void remove() {
>> >> +        writeLock.lock();
>> >> +        try {
>> >> +            base.remove();
>> >> +        } finally {
>> >> +            writeLock.unlock();
>> >> +        }
>> >> +    }
>> >> +
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,104 @@
>> >> +/*
>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >> + * or more contributor license agreements.  See the NOTICE file
>> >> + * distributed with this work for additional information
>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >> + * to you under the Apache License, Version 2.0 (the
>> >> + * "License"); you may not use this file except in compliance
>> >> + * with the License.  You may obtain a copy of the License at
>> >> + *
>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing,
>> >> + * software distributed under the License is distributed on an
>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >> + * KIND, either express or implied.  See the License for the
>> >> + * specific language governing permissions and limitations
>> >> + * under the License.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.utils;
>> >> +
>> >> +import java.io.Serializable;
>> >> +import org.apache.commons.rdf.Iri;
>> >> +
>> >> +import org.apache.commons.rdf.Language;
>> >> +import org.apache.commons.rdf.Literal;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author reto
>> >> + */
>> >> +public class PlainLiteralImpl implements Literal, Serializable {
>> >> +
>> >> +    private String lexicalForm;
>> >> +    private Language language = null;
>> >> +
>> >> +    public PlainLiteralImpl(String value) {
>> >> +        if (value == null) {
>> >> +            throw new IllegalArgumentException("The literal string
>> cannot
>> >> be null");
>> >> +        }
>> >> +        this.lexicalForm = value;
>> >> +    }
>> >> +
>> >> +    public PlainLiteralImpl(String value, Language language) {
>> >> +        if (value == null) {
>> >> +            throw new IllegalArgumentException("The literal string
>> cannot
>> >> be null");
>> >> +        }
>> >> +        this.lexicalForm = value;
>> >> +        this.language = language;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public String getLexicalForm() {
>> >> +        return lexicalForm;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean equals(Object otherObj) {
>> >> +        if (!(otherObj instanceof Literal)) {
>> >> +            return false;
>> >> +        }
>> >> +        Literal other = (Literal) otherObj;
>> >> +        if (!lexicalForm.equals(other.getLexicalForm())) {
>> >> +            return false;
>> >> +        }
>> >> +        if (language != null) {
>> >> +            return language.equals(other.getLanguage());
>> >> +        }
>> >> +        if (other.getLanguage() != null) {
>> >> +            return false;
>> >> +        }
>> >> +        return true;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public int hashCode() {
>> >> +        int hash = lexicalForm.hashCode() + XSD_STRING_HASH;
>> >> +        if (language != null) {
>> >> +            hash += language.hashCode();
>> >> +        }
>> >> +        return hash;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Language getLanguage() {
>> >> +        return language;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public String toString() {
>> >> +        StringBuffer result = new StringBuffer();
>> >> +        result.append('\"').append(lexicalForm).append('\"');
>> >> +        if (language != null) {
>> >> +            result.append("@").append(language.toString());
>> >> +        }
>> >> +        return result.toString();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Iri getDataType() {
>> >> +        return XSD_STRING;
>> >> +    }
>> >> +    private static final Iri XSD_STRING = new Iri("
>> >> http://www.w3.org/2001/XMLSchema#string");
>> >> +    private static final int XSD_STRING_HASH = XSD_STRING.hashCode();
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,100 @@
>> >> +/*
>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >> + * or more contributor license agreements.  See the NOTICE file
>> >> + * distributed with this work for additional information
>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >> + * to you under the Apache License, Version 2.0 (the
>> >> + * "License"); you may not use this file except in compliance
>> >> + * with the License.  You may obtain a copy of the License at
>> >> + *
>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing,
>> >> + * software distributed under the License is distributed on an
>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >> + * KIND, either express or implied.  See the License for the
>> >> + * specific language governing permissions and limitations
>> >> + * under the License.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.utils;
>> >> +
>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>> >> +import org.apache.commons.rdf.RdfTerm;
>> >> +import org.apache.commons.rdf.Triple;
>> >> +import org.apache.commons.rdf.Iri;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author reto
>> >> + */
>> >> +public class TripleImpl implements Triple {
>> >> +
>> >> +    private final BlankNodeOrIri subject;
>> >> +    private final Iri predicate;
>> >> +    private final RdfTerm object;
>> >> +
>> >> +    /**
>> >> +     * Creates a new <code>TripleImpl</code>.
>> >> +     *
>> >> +     * @param subject  the subject.
>> >> +     * @param predicate  the predicate.
>> >> +     * @param object  the object.
>> >> +     * @throws IllegalArgumentException  if an attribute is
>> >> <code>null</code>.
>> >> +     */
>> >> +    public TripleImpl(BlankNodeOrIri subject, Iri predicate, RdfTerm
>> >> object) {
>> >> +        if (subject == null) {
>> >> +            throw new IllegalArgumentException("Invalid subject:
>> null");
>> >> +        } else if (predicate == null) {
>> >> +            throw new IllegalArgumentException("Invalid predicate:
>> null");
>> >> +        } else if (object == null) {
>> >> +            throw new IllegalArgumentException("Invalid object:
>> null");
>> >> +        }
>> >> +        this.subject = subject;
>> >> +        this.predicate = predicate;
>> >> +        this.object = object;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean equals(Object obj) {
>> >> +        if (obj == null) {
>> >> +            return false;
>> >> +        }
>> >> +        if (!(obj instanceof Triple)) {
>> >> +            return false;
>> >> +        }
>> >> +        final Triple other = (Triple) obj;
>> >> +        if (!this.subject.equals(other.getSubject())) {
>> >> +            return false;
>> >> +        }
>> >> +        if (!this.predicate.equals(other.getPredicate())) {
>> >> +            return false;
>> >> +        }
>> >> +        if (!this.object.equals(other.getObject())) {
>> >> +            return false;
>> >> +        }
>> >> +        return true;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public int hashCode() {
>> >> +        return (subject.hashCode() >> 1) ^ predicate.hashCode() ^
>> >> (object.hashCode() << 1);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public BlankNodeOrIri getSubject() {
>> >> +        return subject;
>> >> +    }
>> >> +
>> >> +    public Iri getPredicate() {
>> >> +        return predicate;
>> >> +    }
>> >> +
>> >> +    public RdfTerm getObject() {
>> >> +        return object;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public String toString() {
>> >> +        return subject + " " + predicate + " " + object + ".";
>> >> +    }
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,80 @@
>> >> +/*
>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >> + * or more contributor license agreements.  See the NOTICE file
>> >> + * distributed with this work for additional information
>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >> + * to you under the Apache License, Version 2.0 (the
>> >> + * "License"); you may not use this file except in compliance
>> >> + * with the License.  You may obtain a copy of the License at
>> >> + *
>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing,
>> >> + * software distributed under the License is distributed on an
>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >> + * KIND, either express or implied.  See the License for the
>> >> + * specific language governing permissions and limitations
>> >> + * under the License.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.utils;
>> >> +
>> >> +import java.io.Serializable;
>> >> +
>> >> +import org.apache.commons.rdf.Iri;
>> >> +import org.apache.commons.rdf.Language;
>> >> +import org.apache.commons.rdf.Literal;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author reto
>> >> + */
>> >> +public class TypedLiteralImpl extends AbstractLiteral implements
>> >> Serializable {
>> >> +    private String lexicalForm;
>> >> +    private Iri dataType;
>> >> +    private int hashCode;
>> >> +
>> >> +    /**
>> >> +     * @param lexicalForm
>> >> +     * @param dataType
>> >> +     */
>> >> +    public TypedLiteralImpl(String lexicalForm, Iri dataType) {
>> >> +        this.lexicalForm = lexicalForm;
>> >> +        this.dataType = dataType;
>> >> +        this.hashCode = lexicalForm.hashCode()+dataType.hashCode();
>> >> +    }
>> >> +
>> >> +    public Iri getDataType() {
>> >> +        return dataType;
>> >> +    }
>> >> +
>> >> +    /* (non-Javadoc)
>> >> +     * @see org.apache.clerezza.rdf.core.LiteralNode#getLexicalForm()
>> >> +     */
>> >> +    @Override
>> >> +    public String getLexicalForm() {
>> >> +        return lexicalForm;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public int hashCode() {
>> >> +        return hashCode;
>> >> +    }
>> >> +
>> >> +
>> >> +    @Override
>> >> +    public String toString() {
>> >> +        StringBuffer result = new StringBuffer();
>> >> +        result.append('\"');
>> >> +        result.append(getLexicalForm());
>> >> +        result.append('\"');
>> >> +        result.append("^^");
>> >> +        result.append(getDataType());
>> >> +        return result.toString();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Language getLanguage() {
>> >> +        return null;
>> >> +    }
>> >> +
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,289 @@
>> >> +/*
>> >> + * Copyright 2015 The Apache Software Foundation.
>> >> + *
>> >> + * Licensed under the Apache License, Version 2.0 (the "License");
>> >> + * you may not use this file except in compliance with the License.
>> >> + * You may obtain a copy of the License at
>> >> + *
>> >> + *      http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing, software
>> >> + * distributed under the License is distributed on an "AS IS" BASIS,
>> >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> >> implied.
>> >> + * See the License for the specific language governing permissions and
>> >> + * limitations under the License.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.utils;
>> >> +
>> >> +import java.lang.ref.WeakReference;
>> >> +import java.util.Collection;
>> >> +import java.util.Collections;
>> >> +import java.util.HashSet;
>> >> +import java.util.Iterator;
>> >> +import java.util.Set;
>> >> +import java.util.concurrent.locks.ReadWriteLock;
>> >> +import org.apache.commons.rdf.BlankNodeOrIri;
>> >> +import org.apache.commons.rdf.Graph;
>> >> +import org.apache.commons.rdf.ImmutableGraph;
>> >> +import org.apache.commons.rdf.Iri;
>> >> +import org.apache.commons.rdf.RdfTerm;
>> >> +import org.apache.commons.rdf.Triple;
>> >> +import org.apache.commons.rdf.WatchableGraph;
>> >> +import org.apache.commons.rdf.event.AddEvent;
>> >> +import org.apache.commons.rdf.event.FilterTriple;
>> >> +import org.apache.commons.rdf.event.GraphEvent;
>> >> +import org.apache.commons.rdf.event.GraphListener;
>> >> +import org.apache.commons.rdf.event.RemoveEvent;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author developer
>> >> + */
>> >> +public class WatchableGraphWrapper implements WatchableGraph {
>> >> +
>> >> +    final Graph wrapped;
>> >> +
>> >> +    public WatchableGraphWrapper(Graph wrapped) {
>> >> +        this.wrapped = wrapped;
>> >> +    }
>> >> +
>> >> +
>> >> +    //all listeners
>> >> +    private final Set<ListenerConfiguration> listenerConfigs =
>> >> Collections.synchronizedSet(
>> >> +            new HashSet<ListenerConfiguration>());
>> >> +    private DelayedNotificator delayedNotificator = new
>> >> DelayedNotificator();
>> >> +
>> >> +    @Override
>> >> +    public Iterator<Triple> iterator() {
>> >> +        return filter(null, null, null);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean contains(Object o) {
>> >> +        if (!(o instanceof Triple)) {
>> >> +            return false;
>> >> +        }
>> >> +        Triple t = (Triple) o;
>> >> +        return filter(t.getSubject(), t.getPredicate(),
>> >> t.getObject()).hasNext();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
>> predicate,
>> >> +            RdfTerm object) {
>> >> +        final Iterator<Triple> baseIter = wrapped.filter(subject,
>> >> predicate, object);
>> >> +        return new Iterator<Triple>() {
>> >> +
>> >> +            Triple currentTriple = null;
>> >> +
>> >> +            @Override
>> >> +            public boolean hasNext() {
>> >> +                return baseIter.hasNext();
>> >> +            }
>> >> +
>> >> +            @Override
>> >> +            public Triple next() {
>> >> +                currentTriple = baseIter.next();
>> >> +                return currentTriple;
>> >> +            }
>> >> +
>> >> +            @Override
>> >> +            public void remove() {
>> >> +                baseIter.remove();
>> >> +                dispatchEvent(new
>> RemoveEvent(WatchableGraphWrapper.this,
>> >> currentTriple));
>> >> +            }
>> >> +        };
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean add(Triple triple) {
>> >> +        boolean success = performAdd(triple);
>> >> +        if (success) {
>> >> +            dispatchEvent(new AddEvent(this, triple));
>> >> +        }
>> >> +        return success;
>> >> +    }
>> >> +
>> >> +    /**
>> >> +     * A subclass of <code>AbstractGraph</code> should override
>> >> +     * this method instead of <code>add</code> for Graph event
>> support to
>> >> be
>> >> +     * added.
>> >> +     *
>> >> +     * @param e The triple to be added to the triple collection
>> >> +     * @return
>> >> +     */
>> >> +    protected boolean performAdd(Triple e) {
>> >> +        return wrapped.add(e);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean remove(Object o) {
>> >> +        Triple triple = (Triple) o;
>> >> +        boolean success = performRemove(triple);
>> >> +        if (success) {
>> >> +            dispatchEvent(new RemoveEvent(this, triple));
>> >> +        }
>> >> +        return success;
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean removeAll(Collection<?> c) {
>> >> +        boolean modified = false;
>> >> +        for (Iterator<? extends Object> it = c.iterator();
>> it.hasNext();)
>> >> {
>> >> +            Object object = it.next();
>> >> +            if (remove(object)) {
>> >> +                modified = true;
>> >> +            }
>> >> +        }
>> >> +        return modified;
>> >> +    }
>> >> +
>> >> +    /**
>> >> +     * A subclass of <code>AbstractGraph</code> should override
>> >> +     * this method instead of <code>remove</code> for ImmutableGraph
>> >> event support to be
>> >> +     * added.
>> >> +     *
>> >> +     * @param o The triple to be removed from the triple collection
>> >> +     * @return
>> >> +     */
>> >> +    protected boolean performRemove(Triple triple) {
>> >> +        Iterator<Triple> e = filter(null, null, null);
>> >> +        while (e.hasNext()) {
>> >> +            if (triple.equals(e.next())) {
>> >> +                e.remove();
>> >> +                return true;
>> >> +            }
>> >> +        }
>> >> +        return false;
>> >> +    }
>> >> +
>> >> +    /**
>> >> +     * Dispatches a <code>GraphEvent</code> to all registered
>> listeners
>> >> for which
>> >> +     * the specified <code>Triple</code> matches the
>> >> <code>FilterTriple</code>s
>> >> +     * of the listeners.
>> >> +     *
>> >> +     * @param triple The Triple that was modified
>> >> +     * @param type The type of modification
>> >> +     */
>> >> +    protected void dispatchEvent(GraphEvent event) {
>> >> +        synchronized(listenerConfigs) {
>> >> +            Iterator<ListenerConfiguration> iter =
>> >> listenerConfigs.iterator();
>> >> +            while (iter.hasNext()) {
>> >> +                ListenerConfiguration config = iter.next();
>> >> +                GraphListener registeredListener =
>> config.getListener();
>> >> +                if (registeredListener == null) {
>> >> +                    iter.remove();
>> >> +                    continue;
>> >> +                }
>> >> +                if (config.getFilter().match(event.getTriple())) {
>> >> +
>> >> delayedNotificator.sendEventToListener(registeredListener, event);
>> >> +                }
>> >> +            }
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void addGraphListener(GraphListener listener, FilterTriple
>> >> filter) {
>> >> +        addGraphListener(listener, filter, 0);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void addGraphListener(GraphListener listener, FilterTriple
>> >> filter,
>> >> +            long delay) {
>> >> +        listenerConfigs.add(new ListenerConfiguration(listener,
>> filter));
>> >> +        if (delay > 0) {
>> >> +            delayedNotificator.addDelayedListener(listener, delay);
>> >> +        }
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void removeGraphListener(GraphListener listener) {
>> >> +        synchronized(listenerConfigs) {
>> >> +            Iterator<ListenerConfiguration> iter =
>> >> listenerConfigs.iterator();
>> >> +            while (iter.hasNext()) {
>> >> +                ListenerConfiguration listenerConfig = iter.next();
>> >> +                GraphListener registeredListener =
>> >> listenerConfig.getListener();
>> >> +                if ((registeredListener == null) ||
>> >> (registeredListener.equals(listener))) {
>> >> +                    iter.remove();
>> >> +                }
>> >> +            }
>> >> +        }
>> >> +        delayedNotificator.removeDelayedListener(listener);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public ImmutableGraph getImmutableGraph() {
>> >> +        throw new UnsupportedOperationException("Not supported yet.");
>> >> //To change body of generated methods, choose Tools | Templates.
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public ReadWriteLock getLock() {
>> >> +        return wrapped.getLock();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public int size() {
>> >> +        return wrapped.size();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean isEmpty() {
>> >> +        return wrapped.isEmpty();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Object[] toArray() {
>> >> +        return wrapped.toArray();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public <T> T[] toArray(T[] a) {
>> >> +        return wrapped.toArray(a);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean containsAll(Collection<?> c) {
>> >> +        return wrapped.containsAll(c);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean addAll(Collection<? extends Triple> c) {
>> >> +        return wrapped.addAll(c);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean retainAll(Collection<?> c) {
>> >> +        return wrapped.retainAll(c);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void clear() {
>> >> +        wrapped.clear();
>> >> +    }
>> >> +
>> >> +    private static class ListenerConfiguration {
>> >> +
>> >> +        private WeakReference<GraphListener> listenerRef;
>> >> +        private FilterTriple filter;
>> >> +
>> >> +        private ListenerConfiguration(GraphListener listener,
>> >> FilterTriple filter) {
>> >> +            this.listenerRef = new
>> WeakReference<GraphListener>(listener);
>> >> +            this.filter = filter;
>> >> +        }
>> >> +
>> >> +        /**
>> >> +         * @return the listener
>> >> +         */
>> >> +        GraphListener getListener() {
>> >> +            GraphListener listener = listenerRef.get();
>> >> +            return listener;
>> >> +        }
>> >> +
>> >> +        /**
>> >> +         * @return the filter
>> >> +         */
>> >> +        FilterTriple getFilter() {
>> >> +            return filter;
>> >> +        }
>> >> +    }
>> >> +
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,85 @@
>> >> +/*
>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >> + * or more contributor license agreements.  See the NOTICE file
>> >> + * distributed with this work for additional information
>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >> + * to you under the Apache License, Version 2.0 (the
>> >> + * "License"); you may not use this file except in compliance
>> >> + * with the License.  You may obtain a copy of the License at
>> >> + *
>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing,
>> >> + * software distributed under the License is distributed on an
>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >> + * KIND, either express or implied.  See the License for the
>> >> + * specific language governing permissions and limitations
>> >> + * under the License.
>> >> + */
>> >> +
>> >> +package org.apache.commons.rdf.impl.utils.debug;
>> >> +
>> >> +import java.util.concurrent.TimeUnit;
>> >> +import java.util.concurrent.locks.Condition;
>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author mir
>> >> + */
>> >> +public class ReadLockDebug extends ReadLock {
>> >> +
>> >> +    ReentrantReadWriteLockTracker lock;
>> >> +    StackTraceElement[] stackTrace;
>> >> +
>> >> +    ReadLock readLock;
>> >> +    public ReadLockDebug(ReentrantReadWriteLockTracker lock) {
>> >> +        super(lock);
>> >> +        this.lock = lock;
>> >> +        this.readLock = lock.realReadLock();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void lock() {
>> >> +        readLock.lock();
>> >> +        lock.addLockedReadLock(this);
>> >> +        stackTrace = Thread.currentThread().getStackTrace();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void lockInterruptibly() throws InterruptedException {
>> >> +        readLock.lockInterruptibly();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Condition newCondition() {
>> >> +        return readLock.newCondition();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public String toString() {
>> >> +        return readLock.toString();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean tryLock() {
>> >> +        return readLock.tryLock();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean tryLock(long timeout, TimeUnit unit) throws
>> >> InterruptedException {
>> >> +        return readLock.tryLock(timeout, unit);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void unlock() {
>> >> +        readLock.unlock();
>> >> +        lock.removeReadLock(this);
>> >> +        stackTrace = null;
>> >> +    }
>> >> +
>> >> +    public StackTraceElement[] getStackTrace() {
>> >> +        return stackTrace;
>> >> +    }
>> >> +
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,133 @@
>> >> +/*
>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >> + * or more contributor license agreements.  See the NOTICE file
>> >> + * distributed with this work for additional information
>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >> + * to you under the Apache License, Version 2.0 (the
>> >> + * "License"); you may not use this file except in compliance
>> >> + * with the License.  You may obtain a copy of the License at
>> >> + *
>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing,
>> >> + * software distributed under the License is distributed on an
>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >> + * KIND, either express or implied.  See the License for the
>> >> + * specific language governing permissions and limitations
>> >> + * under the License.
>> >> + */
>> >> +package org.apache.commons.rdf.impl.utils.debug;
>> >> +
>> >> +import java.util.Collection;
>> >> +import java.util.Collections;
>> >> +import java.util.HashSet;
>> >> +import java.util.Set;
>> >> +import java.util.concurrent.locks.Condition;
>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author mir
>> >> + */
>> >> +public class ReentrantReadWriteLockTracker extends
>> ReentrantReadWriteLock
>> >> {
>> >> +
>> >> +
>> >> +    private Set<ReadLockDebug> lockedReadLocks =
>> >> Collections.synchronizedSet(new HashSet<ReadLockDebug>());
>> >> +    private final WriteLockDebug writeLock = new WriteLockDebug(this);
>> >> +    @Override
>> >> +    protected Thread getOwner() {
>> >> +        return super.getOwner();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    protected Collection<Thread> getQueuedReaderThreads() {
>> >> +        return super.getQueuedReaderThreads();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    protected Collection<Thread> getQueuedThreads() {
>> >> +        return super.getQueuedThreads();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    protected Collection<Thread> getQueuedWriterThreads() {
>> >> +        return super.getQueuedWriterThreads();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public int getReadHoldCount() {
>> >> +        return super.getReadHoldCount();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public int getReadLockCount() {
>> >> +        return super.getReadLockCount();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public int getWaitQueueLength(Condition condition) {
>> >> +        return super.getWaitQueueLength(condition);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    protected Collection<Thread> getWaitingThreads(Condition
>> condition) {
>> >> +        return super.getWaitingThreads(condition);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public int getWriteHoldCount() {
>> >> +        return super.getWriteHoldCount();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean hasWaiters(Condition condition) {
>> >> +        return super.hasWaiters(condition);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean isWriteLocked() {
>> >> +        return super.isWriteLocked();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean isWriteLockedByCurrentThread() {
>> >> +        return super.isWriteLockedByCurrentThread();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public ReadLock readLock() {
>> >> +        return new ReadLockDebug(this);
>> >> +    }
>> >> +
>> >> +    ReadLock realReadLock() {
>> >> +        return super.readLock();
>> >> +    }
>> >> +
>> >> +    WriteLock realWriteLock() {
>> >> +        return super.writeLock();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public String toString() {
>> >> +        return super.toString();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public WriteLockDebug writeLock() {
>> >> +        return writeLock;
>> >> +    }
>> >> +
>> >> +    void addLockedReadLock(ReadLockDebug lock) {
>> >> +        lockedReadLocks.add(lock);
>> >> +    }
>> >> +
>> >> +    void removeReadLock(ReadLockDebug lock) {
>> >> +        lockedReadLocks.remove(lock);
>> >> +    }
>> >> +
>> >> +    public Set<ReadLockDebug> getLockedReadLocks() {
>> >> +        return lockedReadLocks;
>> >> +    }
>> >> +
>> >> +
>> >> +}
>> >>
>> >> Added:
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> >> URL:
>> >>
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java?rev=1659973&view=auto
>> >>
>> >>
>> ==============================================================================
>> >> ---
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> >> (added)
>> >> +++
>> >>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> >> Sun Feb 15 18:41:15 2015
>> >> @@ -0,0 +1,89 @@
>> >> +/*
>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>> >> + * or more contributor license agreements.  See the NOTICE file
>> >> + * distributed with this work for additional information
>> >> + * regarding copyright ownership.  The ASF licenses this file
>> >> + * to you under the Apache License, Version 2.0 (the
>> >> + * "License"); you may not use this file except in compliance
>> >> + * with the License.  You may obtain a copy of the License at
>> >> + *
>> >> + *   http://www.apache.org/licenses/LICENSE-2.0
>> >> + *
>> >> + * Unless required by applicable law or agreed to in writing,
>> >> + * software distributed under the License is distributed on an
>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> >> + * KIND, either express or implied.  See the License for the
>> >> + * specific language governing permissions and limitations
>> >> + * under the License.
>> >> + */
>> >> +
>> >> +package org.apache.commons.rdf.impl.utils.debug;
>> >> +
>> >> +import java.util.concurrent.TimeUnit;
>> >> +import java.util.concurrent.locks.Condition;
>> >> +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
>> >> +
>> >> +/**
>> >> + *
>> >> + * @author mir
>> >> + */
>> >> +public class WriteLockDebug extends WriteLock {
>> >> +
>> >> +    private ReentrantReadWriteLockTracker lock;
>> >> +    private WriteLock writeLock;
>> >> +    private StackTraceElement[] stackTrace;
>> >> +
>> >> +    public WriteLockDebug(ReentrantReadWriteLockTracker lock) {
>> >> +        super(lock);
>> >> +        this.lock = lock;
>> >> +        this.writeLock = lock.realWriteLock();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public int getHoldCount() {
>> >> +        return writeLock.getHoldCount();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean isHeldByCurrentThread() {
>> >> +        return writeLock.isHeldByCurrentThread();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void lock() {
>> >> +        writeLock.lock();
>> >> +        stackTrace = Thread.currentThread().getStackTrace();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void lockInterruptibly() throws InterruptedException {
>> >> +        writeLock.lockInterruptibly();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public Condition newCondition() {
>> >> +        return writeLock.newCondition();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean tryLock() {
>> >> +        return writeLock.tryLock();
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public boolean tryLock(long timeout, TimeUnit unit) throws
>> >> InterruptedException {
>> >> +        return writeLock.tryLock(timeout, unit);
>> >> +    }
>> >> +
>> >> +    @Override
>> >> +    public void unlock() {
>> >> +        writeLock.unlock();
>> >> +        stackTrace = null;
>> >> +    }
>> >> +
>> >> +    public StackTraceElement[] getStackTrace() {
>> >> +        return stackTrace;
>> >> +    }
>> >> +
>> >> +
>> >> +}
>> >>
>> >>
>> >>
>> >
>> >
>> > --
>> > http://people.apache.org/~britter/
>> > http://www.systemoutprintln.de/
>> > http://twitter.com/BenediktRitter
>> > http://github.com/britter
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>> For additional commands, e-mail: dev-help@commons.apache.org
>>
>>
>
>
> --
> http://people.apache.org/~britter/
> http://www.systemoutprintln.de/
> http://twitter.com/BenediktRitter
> http://github.com/britter
>



-- 
http://people.apache.org/~britter/
http://www.systemoutprintln.de/
http://twitter.com/BenediktRitter
http://github.com/britter

Re: svn commit: r1659973 [1/3] - in /commons/sandbox/rdf/trunk: ./ api/src/main/java/org/apache/commons/rdf/ impl.sparql/ impl.sparql/src/ impl.sparql/src/main/ impl.sparql/src/main/java/ impl.sparql/src/main/java/org/ impl.sparql/src/main/java/org/apache/...

Posted by Benedikt Ritter <br...@apache.org>.
2015-02-17 0:13 GMT+01:00 Peter Ansell <an...@gmail.com>:

> Hi Bernard,
>
> The Commons RDF project is not planning on including any non-trivial
> implementations, to avoid bias towards any of the participating
> platforms. Stian has written a trivial implementation and submitted it
> to GitHub to provide a reference for our test harness, but it is never
> planned to be used by anyone for non-trivial purposes.
>
> Reto is moving this code here unilaterally from Clerezza at this point
> based on the ability of any Apache committer to send code into Apache
> Commons.
>
> The code that will be sent to the incubator is still planned to be the
> code that is in the GitHub repository at the time the incubator
> request goes through.
>

This is still in the sandbox so I'm not too crazy about it. But creating a
separate code base in the commons-rdf git repository doesn't sound like a
good idea given the fact that github Commons RDF will eventually move to
Apache Commons after incubation. What should haben with the code that is in
the repository by that time?

Reto, can you comment please?

Regards,
Benedikt


>
> Cheers,
>
> Peter
>
> On 16 February 2015 at 18:34, Benedikt Ritter <br...@apache.org> wrote:
> > Hello Reto,
> >
> > how does this relate to github Commons RDF? Is this part of the code base
> > proposed for incubation?
> >
> > Regards,
> > Benedikt
> >
> > 2015-02-15 19:41 GMT+01:00 <re...@apache.org>:
> >
> >> Author: reto
> >> Date: Sun Feb 15 18:41:15 2015
> >> New Revision: 1659973
> >>
> >> URL: http://svn.apache.org/r1659973
> >> Log:
> >> Started SPARQL Backed Implementation
> >>
> >> Added:
> >>     commons/sandbox/rdf/trunk/alerts.txt
> >>     commons/sandbox/rdf/trunk/impl.sparql/   (with props)
> >>     commons/sandbox/rdf/trunk/impl.sparql/pom.xml
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/
> >>
>  commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/main/resources/
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/
> >>
>  commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/
> >>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> >>     commons/sandbox/rdf/trunk/impl.utils/   (with props)
> >>     commons/sandbox/rdf/trunk/impl.utils/pom.xml
> >>       - copied, changed from r1651181, commons/sandbox/rdf/trunk/pom.xml
> >>     commons/sandbox/rdf/trunk/impl.utils/src/
> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/
> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/
> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/
> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/
> >>
>  commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphNotIsomorphicException.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GroupMappingIterator.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/HashMatching.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/MappingIterator.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/PermutationIterator.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/Utils.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashMap.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashSet.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntIterator.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntSet.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/package-info.java
> >>       - copied, changed from r1651181,
> >>
> commons/sandbox/rdf/trunk/src/main/java/org/apache/commons/rdf/package-info.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraph.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleMGraph.java
> >>     commons/sandbox/rdf/trunk/impl.utils/src/main/resources/
> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/
> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/
> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/
> >>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/
> >>
>  commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/PlainLiteralImplTest.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraphTest.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TripleImplTest.java
> >>
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
> >>     commons/sandbox/rdf/trunk/report.xml
> >> Modified:
> >>
> >>
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> >>     commons/sandbox/rdf/trunk/pom.xml
> >>
> >> Added: commons/sandbox/rdf/trunk/alerts.txt
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/alerts.txt?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >>     (empty)
> >>
> >> Modified:
> >>
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java?rev=1659973&r1=1659972&r2=1659973&view=diff
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> >> (original)
> >> +++
> >>
> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -84,7 +84,8 @@ public interface Literal extends RdfTerm
> >>
> >>      /**
> >>       * Returns the hash code of the lexical form plus the hash code of
> the
> >> -     * language, plush the hash code of the datatype
> >> +     * datatype plus if the literal has a language the hash code of the
> >> +     * language.
> >>       *
> >>       * @return hash code
> >>       */
> >>
> >> Propchange: commons/sandbox/rdf/trunk/impl.sparql/
> >>
> >>
> ------------------------------------------------------------------------------
> >> --- svn:ignore (added)
> >> +++ svn:ignore Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1 @@
> >> +target
> >>
> >> Added: commons/sandbox/rdf/trunk/impl.sparql/pom.xml
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/pom.xml?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> --- commons/sandbox/rdf/trunk/impl.sparql/pom.xml (added)
> >> +++ commons/sandbox/rdf/trunk/impl.sparql/pom.xml Sun Feb 15 18:41:15
> 2015
> >> @@ -0,0 +1,52 @@
> >> +<?xml version="1.0" encoding="UTF-8"?>
> >> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> >> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
> >> http://maven.apache.org/POM/4.0.0
> >> http://maven.apache.org/xsd/maven-4.0.0.xsd">
> >> +    <parent>
> >> +        <groupId>org.apache.commons</groupId>
> >> +        <artifactId>commons-parent</artifactId>
> >> +        <version>37</version>
> >> +        <relativePath />
> >> +    </parent>
> >> +    <modelVersion>4.0.0</modelVersion>
> >> +    <groupId>commons-rdf</groupId>
> >> +    <artifactId>commons-rdf-impl-sparql</artifactId>
> >> +    <version>1.0.0-SNAPSHOT</version>
> >> +    <packaging>jar</packaging>
> >> +    <name>Apache Commons RDF SPARQL backed implementation.</name>
> >> +    <description>An implementation of the rdf commons API backed by a
> >> sparql
> >> +        endpoint. STATUS: Incomplete, currecnt code only supports
> reading
> >> +        graphs and does not yet support BlankNodes.</description>
> >> +    <properties>
> >> +
> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
> >> +        <maven.compiler.source>1.7</maven.compiler.source>
> >> +        <maven.compiler.target>1.7</maven.compiler.target>
> >> +    </properties>
> >> +    <dependencies>
> >> +        <dependency>
> >> +            <groupId>org.apache.httpcomponents</groupId>
> >> +            <artifactId>httpclient</artifactId>
> >> +            <version>4.4</version>
> >> +        </dependency>
> >> +        <dependency>
> >> +            <groupId>commons-rdf</groupId>
> >> +            <artifactId>commons-rdf-api</artifactId>
> >> +            <version>0.1-SNAPSHOT</version>
> >> +        </dependency>
> >> +        <dependency>
> >> +            <groupId>commons-rdf</groupId>
> >> +            <artifactId>commons-rdf-impl-utils</artifactId>
> >> +            <version>0.1-SNAPSHOT</version>
> >> +        </dependency>
> >> +        <dependency>
> >> +            <groupId>junit</groupId>
> >> +            <artifactId>junit</artifactId>
> >> +            <version>4.12</version>
> >> +            <scope>test</scope>
> >> +        </dependency>
> >> +        <dependency>
> >> +            <groupId>org.apache.jena</groupId>
> >> +            <artifactId>jena-fuseki</artifactId>
> >> +            <version>1.1.1</version>
> >> +            <scope>test</scope>
> >> +        </dependency>
> >> +    </dependencies>
> >> +</project>
> >> \ No newline at end of file
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,220 @@
> >> +/*
> >> + * To change this license header, choose License Headers in Project
> >> Properties.
> >> + * To change this template file, choose Tools | Templates
> >> + * and open the template in the editor.
> >> + */
> >> +package org.apache.commons.rdf.impl.sparql;
> >> +
> >> +import java.io.IOException;
> >> +import java.io.InputStream;
> >> +import java.io.UnsupportedEncodingException;
> >> +import java.util.ArrayList;
> >> +import java.util.Enumeration;
> >> +import java.util.HashMap;
> >> +import java.util.Hashtable;
> >> +import java.util.List;
> >> +import java.util.Map;
> >> +import java.util.logging.Level;
> >> +import java.util.logging.Logger;
> >> +import org.apache.http.HttpEntity;
> >> +import org.apache.http.NameValuePair;
> >> +import org.apache.http.client.entity.UrlEncodedFormEntity;
> >> +import org.apache.http.client.methods.CloseableHttpResponse;
> >> +import org.apache.http.client.methods.HttpPost;
> >> +import org.apache.http.impl.client.CloseableHttpClient;
> >> +import org.apache.http.impl.client.HttpClients;
> >> +import org.apache.http.message.BasicNameValuePair;
> >> +import org.apache.http.util.EntityUtils;
> >> +import javax.xml.parsers.*;
> >> +import org.apache.commons.rdf.BlankNode;
> >> +import org.apache.commons.rdf.BlankNodeOrIri;
> >> +import org.apache.commons.rdf.Iri;
> >> +import org.apache.commons.rdf.Language;
> >> +import org.apache.commons.rdf.Literal;
> >> +import org.apache.commons.rdf.RdfTerm;
> >> +import org.apache.commons.rdf.Triple;
> >> +import org.apache.commons.rdf.impl.utils.AbstractLiteral;
> >> +import org.xml.sax.*;
> >> +import org.xml.sax.helpers.*;
> >> +
> >> +/**
> >> + *
> >> + * @author developer
> >> + */
> >> +public class SparqlClient {
> >> +
> >> +    final String endpoint;
> >> +
> >> +    public SparqlClient(final String endpoint) {
> >> +        this.endpoint = endpoint;
> >> +    }
> >> +
> >> +    List<Map<String, RdfTerm>> queryResultSet(final String query)
> throws
> >> IOException {
> >> +        CloseableHttpClient httpclient = HttpClients.createDefault();
> >> +        HttpPost httpPost = new HttpPost(endpoint);
> >> +        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
> >> +        nvps.add(new BasicNameValuePair("query", query));
> >> +        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
> >> +        CloseableHttpResponse response2 = httpclient.execute(httpPost);
> >> +
> >> +        try {
> >> +            HttpEntity entity2 = response2.getEntity();
> >> +            InputStream in = entity2.getContent();
> >> +            SAXParserFactory spf = SAXParserFactory.newInstance();
> >> +            spf.setNamespaceAware(true);
> >> +            SAXParser saxParser = spf.newSAXParser();
> >> +            XMLReader xmlReader = saxParser.getXMLReader();
> >> +            final SparqlsResultsHandler sparqlsResultsHandler = new
> >> SparqlsResultsHandler();
> >> +            xmlReader.setContentHandler(sparqlsResultsHandler);
> >> +            xmlReader.parse(new InputSource(in));
> >> +            /*
> >> +             for (int ch = in.read(); ch != -1; ch = in.read()) {
> >> +             System.out.print((char)ch);
> >> +             }
> >> +             */
> >> +            // do something useful with the response body
> >> +            // and ensure it is fully consumed
> >> +            EntityUtils.consume(entity2);
> >> +            return sparqlsResultsHandler.getResults();
> >> +        } catch (ParserConfigurationException ex) {
> >> +            throw new RuntimeException(ex);
> >> +        } catch (SAXException ex) {
> >> +            throw new RuntimeException(ex);
> >> +        } finally {
> >> +            response2.close();
> >> +        }
> >> +
> >> +    }
> >> +
> >> +    final public static class SparqlsResultsHandler extends
> >> DefaultHandler {
> >> +
> >> +        private String currentBindingName;
> >> +        private Map<String, RdfTerm> currentResult = null;
> >> +        private final List<Map<String, RdfTerm>> results = new
> >> ArrayList<>();
> >> +        private boolean readingValue;
> >> +        private String value;
> >> +        private Map<String, BlankNode> bNodeMap = new HashMap<>();
> >> +        private static final Iri XSD_STRING = new Iri("
> >> http://www.w3.org/2001/XMLSchema#string");
> >> +
> >> +        private RdfTerm getBNode(String value) {
> >> +            if (!bNodeMap.containsKey(value)) {
> >> +                bNodeMap.put(value, new BlankNode());
> >> +            }
> >> +            return bNodeMap.get(value);
> >> +        }
> >> +
> >> +        private List<Map<String, RdfTerm>> getResults() {
> >> +            return results;
> >> +        }
> >> +
> >> +        enum BindingType {
> >> +
> >> +            uri, bnode, literal;
> >> +        }
> >> +
> >> +        @Override
> >> +        public void startDocument() throws SAXException {
> >> +
> >> +        }
> >> +
> >> +        @Override
> >> +        public void startElement(String namespaceURI,
> >> +                String localName,
> >> +                String qName,
> >> +                Attributes atts)
> >> +                throws SAXException {
> >> +            if ("http://www.w3.org/2005/sparql-results#
> ".equals(namespaceURI))
> >> {
> >> +                if ("result".equals(localName)) {
> >> +                    if (currentResult != null) {
> >> +                        throw new SAXException("unexpected tag
> <result>");
> >> +                    }
> >> +                    currentResult = new HashMap<>();
> >> +                } else if ("binding".equals(localName)) {
> >> +                    if (currentResult == null) {
> >> +                        throw new SAXException("unexpected tag
> >> <binding>");
> >> +                    }
> >> +                    currentBindingName = atts.getValue("name");
> >> +                } else if ("uri".equals(localName) ||
> >> "bnode".equals(localName) || "literal".equals(localName)) {
> >> +                    if (readingValue) {
> >> +                        throw new SAXException("unexpected tag <" +
> >> localName + ">");
> >> +                    }
> >> +                    readingValue = true;
> >> +                }
> >> +            }
> >> +
> >> +            //System.out.println(namespaceURI);
> >> +            //System.out.println(qName);
> >> +        }
> >> +
> >> +        @Override
> >> +        public void characters(char[] chars, int start, int length)
> >> throws SAXException {
> >> +            if (readingValue) {
> >> +                value = new String(chars, start, length);
> >> +                //System.err.println(value + start + ", " + length);
> >> +            }
> >> +        }
> >> +
> >> +        @Override
> >> +        public void endElement(String namespaceURI,
> >> +                String localName,
> >> +                String qName)
> >> +                throws SAXException {
> >> +            if ("http://www.w3.org/2005/sparql-results#
> ".equals(namespaceURI))
> >> {
> >> +                if ("result".equals(localName)) {
> >> +                    results.add(currentResult);
> >> +                    currentResult = null;
> >> +                } else if ("binding".equals(localName)) {
> >> +                    if (currentBindingName == null) {
> >> +                        throw new SAXException("unexpected tag
> >> </binding>");
> >> +                    }
> >> +                    currentBindingName = null;
> >> +                } else {
> >> +                    try {
> >> +                        BindingType b = BindingType.valueOf(localName);
> >> +                        RdfTerm rdfTerm = null;
> >> +                        switch (b) {
> >> +                            case uri:
> >> +                                rdfTerm = new Iri(value);
> >> +                                break;
> >> +                            case bnode:
> >> +                                rdfTerm = getBNode(value);
> >> +                                break;
> >> +                            case literal:
> >> +                                final String lf = value;
> >> +                                rdfTerm = new AbstractLiteral() {
> >> +
> >> +                                    @Override
> >> +                                    public String getLexicalForm() {
> >> +                                        return lf;
> >> +                                    }
> >> +
> >> +                                    @Override
> >> +                                    public Iri getDataType() {
> >> +                                        //TODO implement
> >> +                                        return XSD_STRING;
> >> +                                    }
> >> +
> >> +                                    @Override
> >> +                                    public Language getLanguage() {
> >> +                                        //TODO impl
> >> +                                        return null;
> >> +                                    }
> >> +                                };
> >> +                                break;
> >> +                        }
> >> +                        currentResult.put(currentBindingName, rdfTerm);
> >> +                        readingValue = false;
> >> +                    } catch (IllegalArgumentException e) {
> >> +                            //not uri|bnode|literal
> >> +                    }
> >> +                }
> >> +            }
> >> +        }
> >> +
> >> +        public void endDocument() throws SAXException {
> >> +            //System.out.println("results: " + results.size());
> >> +        }
> >> +
> >> +    }
> >> +
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,121 @@
> >> +/*
> >> + * To change this license header, choose License Headers in Project
> >> Properties.
> >> + * To change this template file, choose Tools | Templates
> >> + * and open the template in the editor.
> >> + */
> >> +package org.apache.commons.rdf.impl.sparql;
> >> +
> >> +import java.io.IOException;
> >> +import java.util.Iterator;
> >> +import java.util.List;
> >> +import java.util.Map;
> >> +import org.apache.commons.rdf.BlankNode;
> >> +import org.apache.commons.rdf.BlankNodeOrIri;
> >> +import org.apache.commons.rdf.Iri;
> >> +import org.apache.commons.rdf.Literal;
> >> +import org.apache.commons.rdf.RdfTerm;
> >> +import org.apache.commons.rdf.Triple;
> >> +import org.apache.commons.rdf.impl.utils.AbstractGraph;
> >> +import org.apache.commons.rdf.impl.utils.TripleImpl;
> >> +
> >> +/**
> >> + *
> >> + * @author reto
> >> + */
> >> +public class SparqlGraph extends AbstractGraph {
> >> +
> >> +    final SparqlClient sparqlClient;
> >> +
> >> +    /** Constructs a Graph representing the default graph at the
> specified
> >> +     * endpoint
> >> +     */
> >> +    public SparqlGraph(final String endpoint) {
> >> +        sparqlClient = new SparqlClient(endpoint);
> >> +    }
> >> +
> >> +    @Override
> >> +    protected Iterator<Triple> performFilter(final BlankNodeOrIri
> subject,
> >> +            final Iri predicate, final RdfTerm object) {
> >> +        try {
> >> +            final StringBuilder queryBuilder = new StringBuilder();
> >> +            queryBuilder.append("SELECT * WHERE { ");
> >> +            if (subject == null) {
> >> +                queryBuilder.append("?s");
> >> +            } else {
> >> +                queryBuilder.append(asSparqlTerm(subject));
> >> +            }
> >> +            queryBuilder.append(' ');
> >> +            if (predicate == null) {
> >> +                queryBuilder.append("?p");
> >> +            } else {
> >> +                queryBuilder.append(asSparqlTerm(predicate));
> >> +            }
> >> +            queryBuilder.append(' ');
> >> +            if (object == null) {
> >> +                queryBuilder.append("?o");
> >> +            } else {
> >> +                queryBuilder.append(asSparqlTerm(object));
> >> +            }
> >> +            queryBuilder.append(" }");
> >> +            List<Map<String, RdfTerm>> sparqlResults =
> >> sparqlClient.queryResultSet(queryBuilder.toString());
> >> +            final Iterator<Map<String, RdfTerm>> resultsIterator =
> >> sparqlResults.iterator();
> >> +            return new Iterator<Triple>() {
> >> +
> >> +                @Override
> >> +                public boolean hasNext() {
> >> +                    return resultsIterator.hasNext();
> >> +                }
> >> +
> >> +                @Override
> >> +                public Triple next() {
> >> +                    Map<String, RdfTerm> result =
> resultsIterator.next();
> >> +                    return new TripleImpl(subject != null ? subject :
> >> (BlankNodeOrIri)result.get("s"),
> >> +                            predicate != null ? predicate :
> >> (Iri)result.get("p"),
> >> +                            object != null ? object : result.get("o"));
> >> +                }
> >> +            };
> >> +        } catch (IOException ex) {
> >> +            throw new RuntimeException(ex);
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    protected int performSize() {
> >> +        try {
> >> +            return sparqlClient.queryResultSet("SELECT * WHERE { ?s ?p
> >> ?o}").size();
> >> +        } catch (IOException ex) {
> >> +            throw new RuntimeException(ex);
> >> +        }
> >> +    }
> >> +
> >> +    private String asSparqlTerm(Iri iri) {
> >> +        return "<"+iri.getUnicodeString()+">";
> >> +    }
> >> +
> >> +    private String asSparqlTerm(Literal literal) {
> >> +        //TODO langauge and datatype
> >> +        return "\""+literal.getLexicalForm()+"\"";
> >> +    }
> >> +
> >> +    private String asSparqlTerm(BlankNode bnode) {
> >> +        //this requires adding additional clauses to the graph pattern
> >> +        throw new UnsupportedOperationException("Not supported yet.");
> >> +    }
> >> +
> >> +    private String asSparqlTerm(BlankNodeOrIri term) {
> >> +        if (term instanceof Iri) {
> >> +            return asSparqlTerm((Iri)term);
> >> +        } else {
> >> +            return asSparqlTerm((BlankNode)term);
> >> +        }
> >> +    }
> >> +
> >> +    private String asSparqlTerm(RdfTerm term) {
> >> +        if (term instanceof BlankNodeOrIri) {
> >> +            return asSparqlTerm((BlankNodeOrIri)term);
> >> +        } else {
> >> +            return asSparqlTerm((Literal)term);
> >> +        }
> >> +    }
> >> +
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,106 @@
> >> +/*
> >> + * To change this license header, choose License Headers in Project
> >> Properties.
> >> + * To change this template file, choose Tools | Templates
> >> + * and open the template in the editor.
> >> + */
> >> +package org.apache.commons.rdf.impl.sparql;
> >> +
> >> +import com.hp.hpl.jena.query.DatasetAccessor;
> >> +import com.hp.hpl.jena.query.DatasetAccessorFactory;
> >> +import java.io.File;
> >> +import java.io.IOException;
> >> +import java.net.ServerSocket;
> >> +import org.apache.jena.fuseki.EmbeddedFusekiServer;
> >> +import com.hp.hpl.jena.rdf.model.Model;
> >> +import com.hp.hpl.jena.rdf.model.ModelFactory;
> >> +import java.io.InputStream;
> >> +import java.util.HashSet;
> >> +import java.util.Iterator;
> >> +import java.util.Set;
> >> +import org.apache.commons.rdf.Graph;
> >> +import org.apache.commons.rdf.Iri;
> >> +import org.apache.commons.rdf.Literal;
> >> +import org.apache.commons.rdf.RdfTerm;
> >> +import org.apache.commons.rdf.Triple;
> >> +import org.apache.commons.rdf.impl.utils.PlainLiteralImpl;
> >> +import org.junit.AfterClass;
> >> +import org.junit.Assert;
> >> +import org.junit.BeforeClass;
> >> +import org.junit.Test;
> >> +
> >> +/**
> >> + *
> >> + * @author reto
> >> + */
> >> +public class SparqlGraphTest {
> >> +
> >> +    final static int serverPort = findFreePort();
> >> +    static EmbeddedFusekiServer server;
> >> +
> >> +    @BeforeClass
> >> +    public static void prepare() throws IOException {
> >> +        final String serviceURI = "http://localhost:" + serverPort +
> >> "/ds/data";
> >> +        final DatasetAccessorFactory factory = new
> >> DatasetAccessorFactory();
> >> +        final DatasetAccessor accessor =
> factory.createHTTP(serviceURI);
> >> +        final InputStream in =
> >> SparqlGraphTest.class.getResourceAsStream("grounded.ttl");
> >> +        final Model m = ModelFactory.createDefaultModel();
> >> +        String base = "http://example.org/";
> >> +        m.read(in, base, "TURTLE");
> >> +
> >> +        final File dataSet = File.createTempFile("dataset", "fuseki");
> >> +        dataSet.delete();
> >> +        server = EmbeddedFusekiServer.memTDB(serverPort,
> >> "/ds");//dataSet.getAbsolutePath());
> >> +        server.start();
> >> +        System.out.println("Started fuseki on port " + serverPort);
> >> +        accessor.putModel(m);
> >> +    }
> >> +
> >> +    @AfterClass
> >> +    public static void cleanup() {
> >> +        server.stop();
> >> +    }
> >> +
> >> +    @Test
> >> +    public void graphSize() {
> >> +        final Graph graph = new SparqlGraph("http://localhost:" +
> >> serverPort + "/ds/query");
> >> +        Assert.assertEquals("Graph not of the exepected size", 8,
> >> graph.size());
> >> +    }
> >> +
> >> +    @Test
> >> +    public void filter1() {
> >> +        final Graph graph = new SparqlGraph("http://localhost:" +
> >> serverPort + "/ds/query");
> >> +        final Iri spiderman = new Iri("http://example.org/#spiderman
> ");
> >> +        final Iri greenGoblin = new Iri("
> http://example.org/#green-goblin
> >> ");
> >> +        final Iri enemyOf = new Iri("
> >> http://www.perceive.net/schemas/relationship/enemyOf");
> >> +        final Iri foafName = new Iri("http://xmlns.com/foaf/0.1/name
> ");
> >> +        {
> >> +            final Iterator<Triple> iter = graph.filter(spiderman, null,
> >> greenGoblin);
> >> +            Assert.assertTrue(iter.hasNext());
> >> +            Assert.assertEquals(enemyOf, iter.next().getPredicate());
> >> +            Assert.assertFalse(iter.hasNext());
> >> +        }
> >> +        {
> >> +            final Iterator<Triple> iter = graph.filter(spiderman,
> >> foafName, null);
> >> +            Set<Literal> names = new HashSet<>();
> >> +            for (int i = 0; i < 2; i++) {
> >> +                Assert.assertTrue(iter.hasNext());
> >> +                RdfTerm name = iter.next().getObject();
> >> +                Assert.assertTrue(name instanceof Literal);
> >> +                names.add((Literal)name);
> >> +            }
> >> +            Assert.assertFalse(iter.hasNext());
> >> +            Assert.assertTrue(names.contains(new
> >> PlainLiteralImpl("Spiderman")));
> >> +        }
> >> +    }
> >> +
> >> +    public static int findFreePort() {
> >> +        int port = 0;
> >> +        try (ServerSocket server = new ServerSocket(0);) {
> >> +            port = server.getLocalPort();
> >> +        } catch (Exception e) {
> >> +            throw new RuntimeException("unable to find a free port");
> >> +        }
> >> +        return port;
> >> +    }
> >> +
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,16 @@
> >> +@base <http://example.org/> .
> >> +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
> >> +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
> >> +@prefix foaf: <http://xmlns.com/foaf/0.1/> .
> >> +@prefix rel: <http://www.perceive.net/schemas/relationship/> .
> >> +
> >> +<#green-goblin>
> >> +    rel:enemyOf <#spiderman> ;
> >> +    a foaf:Person ;    # in the context of the Marvel universe
> >> +    foaf:name "Green Goblin" ;
> >> +    foaf:age 128 .
> >> +
> >> +<#spiderman>
> >> +    rel:enemyOf <#green-goblin> ;
> >> +    a foaf:Person ;
> >> +    foaf:name "Spiderman", "Человек-паук"@ru .
> >> \ No newline at end of file
> >>
> >> Propchange: commons/sandbox/rdf/trunk/impl.utils/
> >>
> >>
> ------------------------------------------------------------------------------
> >> --- svn:ignore (added)
> >> +++ svn:ignore Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1 @@
> >> +target
> >>
> >> Copied: commons/sandbox/rdf/trunk/impl.utils/pom.xml (from r1651181,
> >> commons/sandbox/rdf/trunk/pom.xml)
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/pom.xml?p2=commons/sandbox/rdf/trunk/impl.utils/pom.xml&p1=commons/sandbox/rdf/trunk/pom.xml&r1=1651181&r2=1659973&rev=1659973&view=diff
> >>
> >>
> ==============================================================================
> >> --- commons/sandbox/rdf/trunk/pom.xml (original)
> >> +++ commons/sandbox/rdf/trunk/impl.utils/pom.xml Sun Feb 15 18:41:15
> 2015
> >> @@ -22,13 +22,14 @@
> >>      <parent>
> >>          <groupId>org.apache.commons</groupId>
> >>          <artifactId>commons-parent</artifactId>
> >> -        <version>35</version>
> >> +        <version>37</version>
> >> +        <relativePath />
> >>      </parent>
> >>      <modelVersion>4.0.0</modelVersion>
> >>      <groupId>commons-rdf</groupId>
> >> -    <artifactId>commons-rdf</artifactId>
> >> +    <artifactId>commons-rdf-impl-utils</artifactId>
> >>      <version>0.1-SNAPSHOT</version>
> >> -    <name>Apache Commons RDF</name>
> >> +    <name>Apache Commons RDF Implementation Utils</name>
> >>      <description>
> >>          Apache Commons RDF provides an API modelling the RDF data model
> >> as defined by
> >>          http://www.w3.org/TR/rdf11-concepts/
> >> @@ -50,11 +51,22 @@
> >>
> >>      <dependencies>
> >>          <dependency>
> >> +            <groupId>commons-rdf</groupId>
> >> +            <artifactId>commons-rdf-api</artifactId>
> >> +            <version>0.1-SNAPSHOT</version>
> >> +        </dependency>
> >> +        <dependency>
> >>              <groupId>junit</groupId>
> >>              <artifactId>junit</artifactId>
> >>              <version>4.12</version>
> >>              <scope>test</scope>
> >>          </dependency>
> >> +        <dependency>
> >> +            <groupId>org.slf4j</groupId>
> >> +            <artifactId>slf4j-api</artifactId>
> >> +            <version>1.7.7</version>
> >> +            <type>jar</type>
> >> +        </dependency>
> >>      </dependencies>
> >>
> >>      <distributionManagement>
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,316 @@
> >> +/*
> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >> + * or more contributor license agreements.  See the NOTICE file
> >> + * distributed with this work for additional information
> >> + * regarding copyright ownership.  The ASF licenses this file
> >> + * to you under the Apache License, Version 2.0 (the
> >> + * "License"); you may not use this file except in compliance
> >> + * with the License.  You may obtain a copy of the License at
> >> + *
> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing,
> >> + * software distributed under the License is distributed on an
> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >> + * KIND, either express or implied.  See the License for the
> >> + * specific language governing permissions and limitations
> >> + * under the License.
> >> + */
> >> +package org.apache.commons.rdf.impl.utils;
> >> +
> >> +import java.lang.ref.WeakReference;
> >> +import java.util.AbstractCollection;
> >> +import java.util.Collection;
> >> +import java.util.Collections;
> >> +import java.util.HashSet;
> >> +import java.util.Iterator;
> >> +
> >> +import java.util.Set;
> >> +import java.util.concurrent.locks.Lock;
> >> +import java.util.concurrent.locks.ReadWriteLock;
> >> +import java.util.concurrent.locks.ReentrantReadWriteLock;
> >> +import org.apache.commons.rdf.BlankNodeOrIri;
> >> +import org.apache.commons.rdf.RdfTerm;
> >> +import org.apache.commons.rdf.Triple;
> >> +import org.apache.commons.rdf.Graph;
> >> +import org.apache.commons.rdf.ImmutableGraph;
> >> +import org.apache.commons.rdf.Iri;
> >> +import org.apache.commons.rdf.WatchableGraph;
> >> +import org.apache.commons.rdf.event.AddEvent;
> >> +import org.apache.commons.rdf.event.FilterTriple;
> >> +import org.apache.commons.rdf.event.GraphEvent;
> >> +import org.apache.commons.rdf.event.GraphListener;
> >> +import org.apache.commons.rdf.event.RemoveEvent;
> >> +import
> >> org.apache.commons.rdf.impl.utils.debug.ReentrantReadWriteLockTracker;
> >> +import org.apache.commons.rdf.impl.utils.simple.SimpleImmutableGraph;
> >> +
> >> +/**
> >> + * An abstract implementation of <code>Graph</code> implementing
> >> + * <code>iterator</code> and <code>contains</code> calling
> >> <code>filter</code>.
> >> + *
> >> + * @author reto
> >> + */
> >> +public abstract class AbstractGraph extends AbstractCollection<Triple>
> >> +        implements Graph {
> >> +
> >> +
> >> +    private static final String DEBUG_MODE = "rdfLocksDebugging";
> >> +    private final ReadWriteLock lock;
> >> +
> >> +    private final Lock readLock;
> >> +    private final Lock writeLock;
> >> +
> >> +    /**
> >> +     * Constructs a LocalbleMGraph for an Graph.
> >> +     *
> >> +     * @param providedMGraph a non-lockable graph
> >> +     */
> >> +    public AbstractGraph() {
> >> +        {
> >> +            String debugMode = System.getProperty(DEBUG_MODE);
> >> +            if (debugMode != null &&
> >> debugMode.toLowerCase().equals("true")) {
> >> +                lock = new ReentrantReadWriteLockTracker();
> >> +            } else {
> >> +                lock = new ReentrantReadWriteLock();
> >> +            }
> >> +        }
> >> +        readLock = lock.readLock();
> >> +        writeLock = lock.writeLock();
> >> +    }
> >> +
> >> +    public AbstractGraph(final ReadWriteLock lock) {
> >> +        this.lock = lock;
> >> +        readLock = lock.readLock();
> >> +        writeLock = lock.writeLock();
> >> +    }
> >> +
> >> +    @Override
> >> +    public ReadWriteLock getLock() {
> >> +        return lock;
> >> +    }
> >> +
> >> +    @Override
> >> +    public ImmutableGraph getImmutableGraph() {
> >> +        readLock.lock();
> >> +        try {
> >> +            return performGetImmutableGraph();
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    public ImmutableGraph performGetImmutableGraph() {
> >> +        return new SimpleImmutableGraph(this);
> >> +    }
> >> +
> >> +    @Override
> >> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
> predicate,
> >> RdfTerm object) {
> >> +        readLock.lock();
> >> +        try {
> >> +            return new LockingIterator(performFilter(subject,
> predicate,
> >> object), lock);
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public int size() {
> >> +        readLock.lock();
> >> +        try {
> >> +            return performSize();
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean isEmpty() {
> >> +        readLock.lock();
> >> +        try {
> >> +            return performIsEmpty();
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    @SuppressWarnings("element-type-mismatch")
> >> +    public boolean contains(Object o) {
> >> +        readLock.lock();
> >> +        try {
> >> +            return performContains(o);
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public Iterator<Triple> iterator() {
> >> +        readLock.lock();
> >> +        try {
> >> +            return new LockingIterator(performIterator(), lock);
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public Object[] toArray() {
> >> +        readLock.lock();
> >> +        try {
> >> +            return performToArray();
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public <T> T[] toArray(T[] a) {
> >> +        readLock.lock();
> >> +        try {
> >> +            return performToArray(a);
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean containsAll(Collection<?> c) {
> >> +        readLock.lock();
> >> +        try {
> >> +            return performContainsAll(c);
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean add(Triple e) {
> >> +        writeLock.lock();
> >> +        try {
> >> +            return performAdd(e);
> >> +        } finally {
> >> +            writeLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean remove(Object o) {
> >> +        writeLock.lock();
> >> +        try {
> >> +            return performRemove(o);
> >> +        } finally {
> >> +            writeLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean addAll(Collection<? extends Triple> c) {
> >> +        writeLock.lock();
> >> +        try {
> >> +            return performAddAll(c);
> >> +        } finally {
> >> +            writeLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean removeAll(Collection<?> c) {
> >> +        writeLock.lock();
> >> +        try {
> >> +            return performRemoveAll(c);
> >> +        } finally {
> >> +            writeLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean retainAll(Collection<?> c) {
> >> +        writeLock.lock();
> >> +        try {
> >> +            return performRetainAll(c);
> >> +        } finally {
> >> +            writeLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public void clear() {
> >> +        writeLock.lock();
> >> +        try {
> >> +            performClear();
> >> +        } finally {
> >> +            writeLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +
> >> +    @Override
> >> +    public boolean equals(Object obj) {
> >> +        /*if (obj == null) {
> >> +            return false;
> >> +        }
> >> +        if (obj == this) {
> >> +            return true;
> >> +        }
> >> +        if (obj.getClass() != getClass()) {
> >> +            return false;
> >> +        }*/
> >> +        return this == obj;
> >> +    }
> >> +
> >> +
> >> +    protected abstract Iterator<Triple> performFilter(BlankNodeOrIri
> >> subject, Iri predicate, RdfTerm object);
> >> +
> >> +    protected abstract int performSize();
> >> +
> >> +    protected boolean performIsEmpty() {
> >> +        return super.isEmpty();
> >> +    }
> >> +
> >> +    protected Object[] performToArray() {
> >> +        return super.toArray();
> >> +    }
> >> +
> >> +    protected boolean performRemove(Object o) {
> >> +        return super.remove(o);
> >> +    }
> >> +
> >> +    protected boolean performAddAll(Collection<? extends Triple> c) {
> >> +        return super.addAll(c);
> >> +    }
> >> +
> >> +    protected boolean performRemoveAll(Collection<?> c) {
> >> +        return super.removeAll(c);
> >> +    }
> >> +
> >> +    protected boolean performRetainAll(Collection<?> c) {
> >> +        return super.retainAll(c);
> >> +    }
> >> +
> >> +    protected void performClear() {
> >> +        super.clear();
> >> +    }
> >> +
> >> +    protected boolean performContains(Object o) {
> >> +        return super.contains(o);
> >> +    }
> >> +
> >> +    protected Iterator<Triple> performIterator() {
> >> +        return performFilter(null, null, null);
> >> +    }
> >> +
> >> +    protected boolean performContainsAll(Collection<?> c) {
> >> +        return super.containsAll(c);
> >> +    }
> >> +
> >> +    protected <T> T[] performToArray(T[] a) {
> >> +        return super.toArray(a);
> >> +    }
> >> +
> >> +    protected boolean performAdd(Triple e) {
> >> +        return super.add(e);
> >> +    }
> >> +
> >> +
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,112 @@
> >> +/*
> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >> + * or more contributor license agreements.  See the NOTICE file
> >> + * distributed with this work for additional information
> >> + * regarding copyright ownership.  The ASF licenses this file
> >> + * to you under the Apache License, Version 2.0 (the
> >> + * "License"); you may not use this file except in compliance
> >> + * with the License.  You may obtain a copy of the License at
> >> + *
> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing,
> >> + * software distributed under the License is distributed on an
> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >> + * KIND, either express or implied.  See the License for the
> >> + * specific language governing permissions and limitations
> >> + * under the License.
> >> + */
> >> +package org.apache.commons.rdf.impl.utils;
> >> +
> >> +import java.util.Collection;
> >> +import java.util.Iterator;
> >> +
> >> +import org.apache.commons.rdf.BlankNode;
> >> +import org.apache.commons.rdf.ImmutableGraph;
> >> +import org.apache.commons.rdf.RdfTerm;
> >> +import org.apache.commons.rdf.Triple;
> >> +import org.apache.commons.rdf.impl.utils.graphmatching.GraphMatcher;
> >> +
> >> +/**
> >> + * <code>AbstractGraph</code> is an abstract implementation of
> >> <code>ImmutableGraph</code>
> >> + * implementing the <code>equals</code> and the <code>hashCode</code>
> >> methods.
> >> + *
> >> + * @author reto
> >> + *
> >> + */
> >> +public abstract class AbstractImmutableGraph extends AbstractGraph
> >> +        implements ImmutableGraph {
> >> +
> >> +    public final synchronized int hashCode() {
> >> +        int result = 0;
> >> +        for (Iterator<Triple> iter = iterator(); iter.hasNext();) {
> >> +            result += getBlankNodeBlindHash(iter.next());
> >> +        }
> >> +        return result;
> >> +    }
> >> +
> >> +    /**
> >> +     * @param triple
> >> +     * @return hash without BNode hashes
> >> +     */
> >> +    private int getBlankNodeBlindHash(Triple triple) {
> >> +        int hash = triple.getPredicate().hashCode();
> >> +        RdfTerm subject = triple.getSubject();
> >> +
> >> +        if (!(subject instanceof BlankNode)) {
> >> +            hash ^= subject.hashCode() >> 1;
> >> +        }
> >> +        RdfTerm object = triple.getObject();
> >> +        if (!(object instanceof BlankNode)) {
> >> +            hash ^= object.hashCode() << 1;
> >> +        }
> >> +
> >> +        return hash;
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean add(Triple e) {
> >> +        throw new UnsupportedOperationException("Graphs are not
> mutable,
> >> use Graph");
> >> +
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean addAll(Collection<? extends Triple> c) {
> >> +        throw new UnsupportedOperationException("Graphs are not
> mutable,
> >> use Graph");
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean remove(Object o) {
> >> +        throw new UnsupportedOperationException("Graphs are not
> mutable,
> >> use Graph");
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean removeAll(Collection<?> c) {
> >> +        throw new UnsupportedOperationException("Graphs are not
> mutable,
> >> use Graph");
> >> +    }
> >> +
> >> +    @Override
> >> +    public void clear() {
> >> +        throw new UnsupportedOperationException("Graphs are not
> mutable,
> >> use Graph");
> >> +    }
> >> +
> >> +
> >> +    @Override
> >> +    public ImmutableGraph getImmutableGraph() {
> >> +        return this;
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean equals(Object obj) {
> >> +        if (this == obj) {
> >> +            return true;
> >> +        }
> >> +        if (!(obj instanceof ImmutableGraph)) {
> >> +            return false;
> >> +        }
> >> +        if (hashCode() != obj.hashCode()) {
> >> +            return false;
> >> +        }
> >> +        return GraphMatcher.getValidMapping(this, (ImmutableGraph) obj)
> >> != null;
> >> +    }
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,61 @@
> >> +/*
> >> + * Copyright 2015 The Apache Software Foundation.
> >> + *
> >> + * Licensed under the Apache License, Version 2.0 (the "License");
> >> + * you may not use this file except in compliance with the License.
> >> + * You may obtain a copy of the License at
> >> + *
> >> + *      http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing, software
> >> + * distributed under the License is distributed on an "AS IS" BASIS,
> >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> >> implied.
> >> + * See the License for the specific language governing permissions and
> >> + * limitations under the License.
> >> + */
> >> +package org.apache.commons.rdf.impl.utils;
> >> +
> >> +import org.apache.commons.rdf.Literal;
> >> +
> >> +/**
> >> + *
> >> + * @author developer
> >> + */
> >> +public abstract class AbstractLiteral implements Literal {
> >> +
> >> +    @Override
> >> +    public int hashCode() {
> >> +        int result = 0;
> >> +        if (getLanguage() != null) {
> >> +            result = getLanguage().hashCode();
> >> +        }
> >> +        result += getLexicalForm().hashCode();
> >> +        result += getDataType().hashCode();
> >> +        return result;
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean equals(Object obj) {
> >> +        if (this == obj) {
> >> +            return true;
> >> +        }
> >> +        if (obj instanceof Literal) {
> >> +            Literal other = (Literal) obj;
> >> +
> >> +            if (getLanguage() == null) {
> >> +                if (other.getLanguage() != null) {
> >> +                    return false;
> >> +                }
> >> +            } else {
> >> +                if (!getLanguage().equals(other.getLanguage())) {
> >> +                    return false;
> >> +                }
> >> +            }
> >> +            boolean res = getDataType().equals(other.getDataType()) &&
> >> getLexicalForm().equals(other.getLexicalForm());
> >> +            return res;
> >> +        } else {
> >> +            return false;
> >> +        }
> >> +    }
> >> +
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,112 @@
> >> +/*
> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >> + * or more contributor license agreements.  See the NOTICE file
> >> + * distributed with this work for additional information
> >> + * regarding copyright ownership.  The ASF licenses this file
> >> + * to you under the Apache License, Version 2.0 (the
> >> + * "License"); you may not use this file except in compliance
> >> + * with the License.  You may obtain a copy of the License at
> >> + *
> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing,
> >> + * software distributed under the License is distributed on an
> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >> + * KIND, either express or implied.  See the License for the
> >> + * specific language governing permissions and limitations
> >> + * under the License.
> >> + */
> >> +package org.apache.commons.rdf.impl.utils;
> >> +
> >> +import java.lang.ref.WeakReference;
> >> +import java.util.*;
> >> +
> >> +import org.apache.commons.rdf.event.GraphEvent;
> >> +import org.apache.commons.rdf.event.GraphListener;
> >> +import org.slf4j.Logger;
> >> +import org.slf4j.LoggerFactory;
> >> +
> >> +/**
> >> + *
> >> + * @author reto
> >> + */
> >> +class DelayedNotificator {
> >> +
> >> +    private static final Logger log =
> >> LoggerFactory.getLogger(DelayedNotificator.class);
> >> +    private static Timer timer = new Timer("Event delivery
> timer",true);
> >> +
> >> +    static class ListenerHolder {
> >> +
> >> +        long delay;
> >> +        List<GraphEvent> events = null;
> >> +        WeakReference<GraphListener> listenerRef;
> >> +
> >> +        public ListenerHolder(GraphListener listener, long delay) {
> >> +            this.listenerRef = new
> WeakReference<GraphListener>(listener);
> >> +            this.delay = delay;
> >> +        }
> >> +
> >> +        private void registerEvent(GraphEvent event) {
> >> +            synchronized (this) {
> >> +                if (events == null) {
> >> +                    events = new ArrayList<GraphEvent>();
> >> +                    events.add(event);
> >> +                    timer.schedule(new TimerTask() {
> >> +
> >> +                        @Override
> >> +                        public void run() {
> >> +                            List<GraphEvent> eventsLocal;
> >> +                            synchronized (ListenerHolder.this) {
> >> +                                eventsLocal = events;
> >> +                                events = null;
> >> +                            }
> >> +                            GraphListener listener = listenerRef.get();
> >> +                            if (listener == null) {
> >> +                                log.debug("Ignoring garbage collected
> >> listener");
> >> +                            } else {
> >> +                                try {
> >> +                                    listener.graphChanged(eventsLocal);
> >> +                                } catch (Exception e) {
> >> +                                    log.warn("Exception delivering
> >> ImmutableGraph event", e);
> >> +                                }
> >> +                            }
> >> +                        }
> >> +                    }, delay);
> >> +                } else {
> >> +                    events.add(event);
> >> +                }
> >> +            }
> >> +        }
> >> +    }
> >> +
> >> +    private final Map<GraphListener, ListenerHolder> map =
> >> Collections.synchronizedMap(
> >> +            new WeakHashMap<GraphListener, ListenerHolder>());
> >> +
> >> +    void addDelayedListener(GraphListener listener, long delay) {
> >> +        map.put(listener, new ListenerHolder(listener, delay));
> >> +    }
> >> +
> >> +    /**
> >> +     * removes a Listener, this doesn't prevent the listenerRef from
> >> receiving
> >> +     * events alreay scheduled.
> >> +     *
> >> +     * @param listenerRef
> >> +     */
> >> +    void removeDelayedListener(GraphListener listener) {
> >> +        map.remove(listener);
> >> +    }
> >> +
> >> +    /**
> >> +     * if the listenerRef has not been registered as delayed
> listenerRef
> >> te events is
> >> +     * forwarded synchroneously
> >> +     * @param event
> >> +     */
> >> +    void sendEventToListener(GraphListener listener, GraphEvent event)
> {
> >> +        ListenerHolder holder = map.get(listener);
> >> +        if (holder == null) {
> >> +            listener.graphChanged(Collections.singletonList(event));
> >> +        } else {
> >> +            holder.registerEvent(event);
> >> +        }
> >> +    }
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,73 @@
> >> +/*
> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >> + * or more contributor license agreements.  See the NOTICE file
> >> + * distributed with this work for additional information
> >> + * regarding copyright ownership.  The ASF licenses this file
> >> + * to you under the Apache License, Version 2.0 (the
> >> + * "License"); you may not use this file except in compliance
> >> + * with the License.  You may obtain a copy of the License at
> >> + *
> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing,
> >> + * software distributed under the License is distributed on an
> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >> + * KIND, either express or implied.  See the License for the
> >> + * specific language governing permissions and limitations
> >> + * under the License.
> >> + */
> >> +package org.apache.commons.rdf.impl.utils;
> >> +
> >> +import java.util.Iterator;
> >> +import java.util.concurrent.locks.Lock;
> >> +import java.util.concurrent.locks.ReadWriteLock;
> >> +import org.apache.commons.rdf.Triple;
> >> +
> >> +/**
> >> + * Wrapps an iterator<Triple> reading entering a read-lock on every
> >> invocation
> >> + * of hasNext and next
> >> + * @author reto
> >> + */
> >> +class LockingIterator implements Iterator<Triple> {
> >> +
> >> +    private Iterator<Triple> base;
> >> +    private Lock readLock;
> >> +    private Lock writeLock;
> >> +
> >> +    public LockingIterator(Iterator<Triple> iterator, ReadWriteLock
> lock)
> >> {
> >> +        base = iterator;
> >> +        readLock = lock.readLock();
> >> +        writeLock = lock.writeLock();
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean hasNext() {
> >> +        readLock.lock();
> >> +        try {
> >> +            return base.hasNext();
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public Triple next() {
> >> +        readLock.lock();
> >> +        try {
> >> +            return base.next();
> >> +        } finally {
> >> +            readLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public void remove() {
> >> +        writeLock.lock();
> >> +        try {
> >> +            base.remove();
> >> +        } finally {
> >> +            writeLock.unlock();
> >> +        }
> >> +    }
> >> +
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,104 @@
> >> +/*
> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >> + * or more contributor license agreements.  See the NOTICE file
> >> + * distributed with this work for additional information
> >> + * regarding copyright ownership.  The ASF licenses this file
> >> + * to you under the Apache License, Version 2.0 (the
> >> + * "License"); you may not use this file except in compliance
> >> + * with the License.  You may obtain a copy of the License at
> >> + *
> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing,
> >> + * software distributed under the License is distributed on an
> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >> + * KIND, either express or implied.  See the License for the
> >> + * specific language governing permissions and limitations
> >> + * under the License.
> >> + */
> >> +package org.apache.commons.rdf.impl.utils;
> >> +
> >> +import java.io.Serializable;
> >> +import org.apache.commons.rdf.Iri;
> >> +
> >> +import org.apache.commons.rdf.Language;
> >> +import org.apache.commons.rdf.Literal;
> >> +
> >> +/**
> >> + *
> >> + * @author reto
> >> + */
> >> +public class PlainLiteralImpl implements Literal, Serializable {
> >> +
> >> +    private String lexicalForm;
> >> +    private Language language = null;
> >> +
> >> +    public PlainLiteralImpl(String value) {
> >> +        if (value == null) {
> >> +            throw new IllegalArgumentException("The literal string
> cannot
> >> be null");
> >> +        }
> >> +        this.lexicalForm = value;
> >> +    }
> >> +
> >> +    public PlainLiteralImpl(String value, Language language) {
> >> +        if (value == null) {
> >> +            throw new IllegalArgumentException("The literal string
> cannot
> >> be null");
> >> +        }
> >> +        this.lexicalForm = value;
> >> +        this.language = language;
> >> +    }
> >> +
> >> +    @Override
> >> +    public String getLexicalForm() {
> >> +        return lexicalForm;
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean equals(Object otherObj) {
> >> +        if (!(otherObj instanceof Literal)) {
> >> +            return false;
> >> +        }
> >> +        Literal other = (Literal) otherObj;
> >> +        if (!lexicalForm.equals(other.getLexicalForm())) {
> >> +            return false;
> >> +        }
> >> +        if (language != null) {
> >> +            return language.equals(other.getLanguage());
> >> +        }
> >> +        if (other.getLanguage() != null) {
> >> +            return false;
> >> +        }
> >> +        return true;
> >> +    }
> >> +
> >> +    @Override
> >> +    public int hashCode() {
> >> +        int hash = lexicalForm.hashCode() + XSD_STRING_HASH;
> >> +        if (language != null) {
> >> +            hash += language.hashCode();
> >> +        }
> >> +        return hash;
> >> +    }
> >> +
> >> +    @Override
> >> +    public Language getLanguage() {
> >> +        return language;
> >> +    }
> >> +
> >> +    @Override
> >> +    public String toString() {
> >> +        StringBuffer result = new StringBuffer();
> >> +        result.append('\"').append(lexicalForm).append('\"');
> >> +        if (language != null) {
> >> +            result.append("@").append(language.toString());
> >> +        }
> >> +        return result.toString();
> >> +    }
> >> +
> >> +    @Override
> >> +    public Iri getDataType() {
> >> +        return XSD_STRING;
> >> +    }
> >> +    private static final Iri XSD_STRING = new Iri("
> >> http://www.w3.org/2001/XMLSchema#string");
> >> +    private static final int XSD_STRING_HASH = XSD_STRING.hashCode();
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,100 @@
> >> +/*
> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >> + * or more contributor license agreements.  See the NOTICE file
> >> + * distributed with this work for additional information
> >> + * regarding copyright ownership.  The ASF licenses this file
> >> + * to you under the Apache License, Version 2.0 (the
> >> + * "License"); you may not use this file except in compliance
> >> + * with the License.  You may obtain a copy of the License at
> >> + *
> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing,
> >> + * software distributed under the License is distributed on an
> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >> + * KIND, either express or implied.  See the License for the
> >> + * specific language governing permissions and limitations
> >> + * under the License.
> >> + */
> >> +package org.apache.commons.rdf.impl.utils;
> >> +
> >> +import org.apache.commons.rdf.BlankNodeOrIri;
> >> +import org.apache.commons.rdf.RdfTerm;
> >> +import org.apache.commons.rdf.Triple;
> >> +import org.apache.commons.rdf.Iri;
> >> +
> >> +/**
> >> + *
> >> + * @author reto
> >> + */
> >> +public class TripleImpl implements Triple {
> >> +
> >> +    private final BlankNodeOrIri subject;
> >> +    private final Iri predicate;
> >> +    private final RdfTerm object;
> >> +
> >> +    /**
> >> +     * Creates a new <code>TripleImpl</code>.
> >> +     *
> >> +     * @param subject  the subject.
> >> +     * @param predicate  the predicate.
> >> +     * @param object  the object.
> >> +     * @throws IllegalArgumentException  if an attribute is
> >> <code>null</code>.
> >> +     */
> >> +    public TripleImpl(BlankNodeOrIri subject, Iri predicate, RdfTerm
> >> object) {
> >> +        if (subject == null) {
> >> +            throw new IllegalArgumentException("Invalid subject:
> null");
> >> +        } else if (predicate == null) {
> >> +            throw new IllegalArgumentException("Invalid predicate:
> null");
> >> +        } else if (object == null) {
> >> +            throw new IllegalArgumentException("Invalid object: null");
> >> +        }
> >> +        this.subject = subject;
> >> +        this.predicate = predicate;
> >> +        this.object = object;
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean equals(Object obj) {
> >> +        if (obj == null) {
> >> +            return false;
> >> +        }
> >> +        if (!(obj instanceof Triple)) {
> >> +            return false;
> >> +        }
> >> +        final Triple other = (Triple) obj;
> >> +        if (!this.subject.equals(other.getSubject())) {
> >> +            return false;
> >> +        }
> >> +        if (!this.predicate.equals(other.getPredicate())) {
> >> +            return false;
> >> +        }
> >> +        if (!this.object.equals(other.getObject())) {
> >> +            return false;
> >> +        }
> >> +        return true;
> >> +    }
> >> +
> >> +    @Override
> >> +    public int hashCode() {
> >> +        return (subject.hashCode() >> 1) ^ predicate.hashCode() ^
> >> (object.hashCode() << 1);
> >> +    }
> >> +
> >> +    @Override
> >> +    public BlankNodeOrIri getSubject() {
> >> +        return subject;
> >> +    }
> >> +
> >> +    public Iri getPredicate() {
> >> +        return predicate;
> >> +    }
> >> +
> >> +    public RdfTerm getObject() {
> >> +        return object;
> >> +    }
> >> +
> >> +    @Override
> >> +    public String toString() {
> >> +        return subject + " " + predicate + " " + object + ".";
> >> +    }
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,80 @@
> >> +/*
> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >> + * or more contributor license agreements.  See the NOTICE file
> >> + * distributed with this work for additional information
> >> + * regarding copyright ownership.  The ASF licenses this file
> >> + * to you under the Apache License, Version 2.0 (the
> >> + * "License"); you may not use this file except in compliance
> >> + * with the License.  You may obtain a copy of the License at
> >> + *
> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing,
> >> + * software distributed under the License is distributed on an
> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >> + * KIND, either express or implied.  See the License for the
> >> + * specific language governing permissions and limitations
> >> + * under the License.
> >> + */
> >> +package org.apache.commons.rdf.impl.utils;
> >> +
> >> +import java.io.Serializable;
> >> +
> >> +import org.apache.commons.rdf.Iri;
> >> +import org.apache.commons.rdf.Language;
> >> +import org.apache.commons.rdf.Literal;
> >> +
> >> +/**
> >> + *
> >> + * @author reto
> >> + */
> >> +public class TypedLiteralImpl extends AbstractLiteral implements
> >> Serializable {
> >> +    private String lexicalForm;
> >> +    private Iri dataType;
> >> +    private int hashCode;
> >> +
> >> +    /**
> >> +     * @param lexicalForm
> >> +     * @param dataType
> >> +     */
> >> +    public TypedLiteralImpl(String lexicalForm, Iri dataType) {
> >> +        this.lexicalForm = lexicalForm;
> >> +        this.dataType = dataType;
> >> +        this.hashCode = lexicalForm.hashCode()+dataType.hashCode();
> >> +    }
> >> +
> >> +    public Iri getDataType() {
> >> +        return dataType;
> >> +    }
> >> +
> >> +    /* (non-Javadoc)
> >> +     * @see org.apache.clerezza.rdf.core.LiteralNode#getLexicalForm()
> >> +     */
> >> +    @Override
> >> +    public String getLexicalForm() {
> >> +        return lexicalForm;
> >> +    }
> >> +
> >> +    @Override
> >> +    public int hashCode() {
> >> +        return hashCode;
> >> +    }
> >> +
> >> +
> >> +    @Override
> >> +    public String toString() {
> >> +        StringBuffer result = new StringBuffer();
> >> +        result.append('\"');
> >> +        result.append(getLexicalForm());
> >> +        result.append('\"');
> >> +        result.append("^^");
> >> +        result.append(getDataType());
> >> +        return result.toString();
> >> +    }
> >> +
> >> +    @Override
> >> +    public Language getLanguage() {
> >> +        return null;
> >> +    }
> >> +
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,289 @@
> >> +/*
> >> + * Copyright 2015 The Apache Software Foundation.
> >> + *
> >> + * Licensed under the Apache License, Version 2.0 (the "License");
> >> + * you may not use this file except in compliance with the License.
> >> + * You may obtain a copy of the License at
> >> + *
> >> + *      http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing, software
> >> + * distributed under the License is distributed on an "AS IS" BASIS,
> >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> >> implied.
> >> + * See the License for the specific language governing permissions and
> >> + * limitations under the License.
> >> + */
> >> +package org.apache.commons.rdf.impl.utils;
> >> +
> >> +import java.lang.ref.WeakReference;
> >> +import java.util.Collection;
> >> +import java.util.Collections;
> >> +import java.util.HashSet;
> >> +import java.util.Iterator;
> >> +import java.util.Set;
> >> +import java.util.concurrent.locks.ReadWriteLock;
> >> +import org.apache.commons.rdf.BlankNodeOrIri;
> >> +import org.apache.commons.rdf.Graph;
> >> +import org.apache.commons.rdf.ImmutableGraph;
> >> +import org.apache.commons.rdf.Iri;
> >> +import org.apache.commons.rdf.RdfTerm;
> >> +import org.apache.commons.rdf.Triple;
> >> +import org.apache.commons.rdf.WatchableGraph;
> >> +import org.apache.commons.rdf.event.AddEvent;
> >> +import org.apache.commons.rdf.event.FilterTriple;
> >> +import org.apache.commons.rdf.event.GraphEvent;
> >> +import org.apache.commons.rdf.event.GraphListener;
> >> +import org.apache.commons.rdf.event.RemoveEvent;
> >> +
> >> +/**
> >> + *
> >> + * @author developer
> >> + */
> >> +public class WatchableGraphWrapper implements WatchableGraph {
> >> +
> >> +    final Graph wrapped;
> >> +
> >> +    public WatchableGraphWrapper(Graph wrapped) {
> >> +        this.wrapped = wrapped;
> >> +    }
> >> +
> >> +
> >> +    //all listeners
> >> +    private final Set<ListenerConfiguration> listenerConfigs =
> >> Collections.synchronizedSet(
> >> +            new HashSet<ListenerConfiguration>());
> >> +    private DelayedNotificator delayedNotificator = new
> >> DelayedNotificator();
> >> +
> >> +    @Override
> >> +    public Iterator<Triple> iterator() {
> >> +        return filter(null, null, null);
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean contains(Object o) {
> >> +        if (!(o instanceof Triple)) {
> >> +            return false;
> >> +        }
> >> +        Triple t = (Triple) o;
> >> +        return filter(t.getSubject(), t.getPredicate(),
> >> t.getObject()).hasNext();
> >> +    }
> >> +
> >> +    @Override
> >> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri
> predicate,
> >> +            RdfTerm object) {
> >> +        final Iterator<Triple> baseIter = wrapped.filter(subject,
> >> predicate, object);
> >> +        return new Iterator<Triple>() {
> >> +
> >> +            Triple currentTriple = null;
> >> +
> >> +            @Override
> >> +            public boolean hasNext() {
> >> +                return baseIter.hasNext();
> >> +            }
> >> +
> >> +            @Override
> >> +            public Triple next() {
> >> +                currentTriple = baseIter.next();
> >> +                return currentTriple;
> >> +            }
> >> +
> >> +            @Override
> >> +            public void remove() {
> >> +                baseIter.remove();
> >> +                dispatchEvent(new
> RemoveEvent(WatchableGraphWrapper.this,
> >> currentTriple));
> >> +            }
> >> +        };
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean add(Triple triple) {
> >> +        boolean success = performAdd(triple);
> >> +        if (success) {
> >> +            dispatchEvent(new AddEvent(this, triple));
> >> +        }
> >> +        return success;
> >> +    }
> >> +
> >> +    /**
> >> +     * A subclass of <code>AbstractGraph</code> should override
> >> +     * this method instead of <code>add</code> for Graph event support
> to
> >> be
> >> +     * added.
> >> +     *
> >> +     * @param e The triple to be added to the triple collection
> >> +     * @return
> >> +     */
> >> +    protected boolean performAdd(Triple e) {
> >> +        return wrapped.add(e);
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean remove(Object o) {
> >> +        Triple triple = (Triple) o;
> >> +        boolean success = performRemove(triple);
> >> +        if (success) {
> >> +            dispatchEvent(new RemoveEvent(this, triple));
> >> +        }
> >> +        return success;
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean removeAll(Collection<?> c) {
> >> +        boolean modified = false;
> >> +        for (Iterator<? extends Object> it = c.iterator();
> it.hasNext();)
> >> {
> >> +            Object object = it.next();
> >> +            if (remove(object)) {
> >> +                modified = true;
> >> +            }
> >> +        }
> >> +        return modified;
> >> +    }
> >> +
> >> +    /**
> >> +     * A subclass of <code>AbstractGraph</code> should override
> >> +     * this method instead of <code>remove</code> for ImmutableGraph
> >> event support to be
> >> +     * added.
> >> +     *
> >> +     * @param o The triple to be removed from the triple collection
> >> +     * @return
> >> +     */
> >> +    protected boolean performRemove(Triple triple) {
> >> +        Iterator<Triple> e = filter(null, null, null);
> >> +        while (e.hasNext()) {
> >> +            if (triple.equals(e.next())) {
> >> +                e.remove();
> >> +                return true;
> >> +            }
> >> +        }
> >> +        return false;
> >> +    }
> >> +
> >> +    /**
> >> +     * Dispatches a <code>GraphEvent</code> to all registered listeners
> >> for which
> >> +     * the specified <code>Triple</code> matches the
> >> <code>FilterTriple</code>s
> >> +     * of the listeners.
> >> +     *
> >> +     * @param triple The Triple that was modified
> >> +     * @param type The type of modification
> >> +     */
> >> +    protected void dispatchEvent(GraphEvent event) {
> >> +        synchronized(listenerConfigs) {
> >> +            Iterator<ListenerConfiguration> iter =
> >> listenerConfigs.iterator();
> >> +            while (iter.hasNext()) {
> >> +                ListenerConfiguration config = iter.next();
> >> +                GraphListener registeredListener =
> config.getListener();
> >> +                if (registeredListener == null) {
> >> +                    iter.remove();
> >> +                    continue;
> >> +                }
> >> +                if (config.getFilter().match(event.getTriple())) {
> >> +
> >> delayedNotificator.sendEventToListener(registeredListener, event);
> >> +                }
> >> +            }
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public void addGraphListener(GraphListener listener, FilterTriple
> >> filter) {
> >> +        addGraphListener(listener, filter, 0);
> >> +    }
> >> +
> >> +    @Override
> >> +    public void addGraphListener(GraphListener listener, FilterTriple
> >> filter,
> >> +            long delay) {
> >> +        listenerConfigs.add(new ListenerConfiguration(listener,
> filter));
> >> +        if (delay > 0) {
> >> +            delayedNotificator.addDelayedListener(listener, delay);
> >> +        }
> >> +    }
> >> +
> >> +    @Override
> >> +    public void removeGraphListener(GraphListener listener) {
> >> +        synchronized(listenerConfigs) {
> >> +            Iterator<ListenerConfiguration> iter =
> >> listenerConfigs.iterator();
> >> +            while (iter.hasNext()) {
> >> +                ListenerConfiguration listenerConfig = iter.next();
> >> +                GraphListener registeredListener =
> >> listenerConfig.getListener();
> >> +                if ((registeredListener == null) ||
> >> (registeredListener.equals(listener))) {
> >> +                    iter.remove();
> >> +                }
> >> +            }
> >> +        }
> >> +        delayedNotificator.removeDelayedListener(listener);
> >> +    }
> >> +
> >> +    @Override
> >> +    public ImmutableGraph getImmutableGraph() {
> >> +        throw new UnsupportedOperationException("Not supported yet.");
> >> //To change body of generated methods, choose Tools | Templates.
> >> +    }
> >> +
> >> +    @Override
> >> +    public ReadWriteLock getLock() {
> >> +        return wrapped.getLock();
> >> +    }
> >> +
> >> +    @Override
> >> +    public int size() {
> >> +        return wrapped.size();
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean isEmpty() {
> >> +        return wrapped.isEmpty();
> >> +    }
> >> +
> >> +    @Override
> >> +    public Object[] toArray() {
> >> +        return wrapped.toArray();
> >> +    }
> >> +
> >> +    @Override
> >> +    public <T> T[] toArray(T[] a) {
> >> +        return wrapped.toArray(a);
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean containsAll(Collection<?> c) {
> >> +        return wrapped.containsAll(c);
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean addAll(Collection<? extends Triple> c) {
> >> +        return wrapped.addAll(c);
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean retainAll(Collection<?> c) {
> >> +        return wrapped.retainAll(c);
> >> +    }
> >> +
> >> +    @Override
> >> +    public void clear() {
> >> +        wrapped.clear();
> >> +    }
> >> +
> >> +    private static class ListenerConfiguration {
> >> +
> >> +        private WeakReference<GraphListener> listenerRef;
> >> +        private FilterTriple filter;
> >> +
> >> +        private ListenerConfiguration(GraphListener listener,
> >> FilterTriple filter) {
> >> +            this.listenerRef = new
> WeakReference<GraphListener>(listener);
> >> +            this.filter = filter;
> >> +        }
> >> +
> >> +        /**
> >> +         * @return the listener
> >> +         */
> >> +        GraphListener getListener() {
> >> +            GraphListener listener = listenerRef.get();
> >> +            return listener;
> >> +        }
> >> +
> >> +        /**
> >> +         * @return the filter
> >> +         */
> >> +        FilterTriple getFilter() {
> >> +            return filter;
> >> +        }
> >> +    }
> >> +
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,85 @@
> >> +/*
> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >> + * or more contributor license agreements.  See the NOTICE file
> >> + * distributed with this work for additional information
> >> + * regarding copyright ownership.  The ASF licenses this file
> >> + * to you under the Apache License, Version 2.0 (the
> >> + * "License"); you may not use this file except in compliance
> >> + * with the License.  You may obtain a copy of the License at
> >> + *
> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing,
> >> + * software distributed under the License is distributed on an
> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >> + * KIND, either express or implied.  See the License for the
> >> + * specific language governing permissions and limitations
> >> + * under the License.
> >> + */
> >> +
> >> +package org.apache.commons.rdf.impl.utils.debug;
> >> +
> >> +import java.util.concurrent.TimeUnit;
> >> +import java.util.concurrent.locks.Condition;
> >> +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
> >> +
> >> +/**
> >> + *
> >> + * @author mir
> >> + */
> >> +public class ReadLockDebug extends ReadLock {
> >> +
> >> +    ReentrantReadWriteLockTracker lock;
> >> +    StackTraceElement[] stackTrace;
> >> +
> >> +    ReadLock readLock;
> >> +    public ReadLockDebug(ReentrantReadWriteLockTracker lock) {
> >> +        super(lock);
> >> +        this.lock = lock;
> >> +        this.readLock = lock.realReadLock();
> >> +    }
> >> +
> >> +    @Override
> >> +    public void lock() {
> >> +        readLock.lock();
> >> +        lock.addLockedReadLock(this);
> >> +        stackTrace = Thread.currentThread().getStackTrace();
> >> +    }
> >> +
> >> +    @Override
> >> +    public void lockInterruptibly() throws InterruptedException {
> >> +        readLock.lockInterruptibly();
> >> +    }
> >> +
> >> +    @Override
> >> +    public Condition newCondition() {
> >> +        return readLock.newCondition();
> >> +    }
> >> +
> >> +    @Override
> >> +    public String toString() {
> >> +        return readLock.toString();
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean tryLock() {
> >> +        return readLock.tryLock();
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean tryLock(long timeout, TimeUnit unit) throws
> >> InterruptedException {
> >> +        return readLock.tryLock(timeout, unit);
> >> +    }
> >> +
> >> +    @Override
> >> +    public void unlock() {
> >> +        readLock.unlock();
> >> +        lock.removeReadLock(this);
> >> +        stackTrace = null;
> >> +    }
> >> +
> >> +    public StackTraceElement[] getStackTrace() {
> >> +        return stackTrace;
> >> +    }
> >> +
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,133 @@
> >> +/*
> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >> + * or more contributor license agreements.  See the NOTICE file
> >> + * distributed with this work for additional information
> >> + * regarding copyright ownership.  The ASF licenses this file
> >> + * to you under the Apache License, Version 2.0 (the
> >> + * "License"); you may not use this file except in compliance
> >> + * with the License.  You may obtain a copy of the License at
> >> + *
> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing,
> >> + * software distributed under the License is distributed on an
> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >> + * KIND, either express or implied.  See the License for the
> >> + * specific language governing permissions and limitations
> >> + * under the License.
> >> + */
> >> +package org.apache.commons.rdf.impl.utils.debug;
> >> +
> >> +import java.util.Collection;
> >> +import java.util.Collections;
> >> +import java.util.HashSet;
> >> +import java.util.Set;
> >> +import java.util.concurrent.locks.Condition;
> >> +import java.util.concurrent.locks.ReentrantReadWriteLock;
> >> +
> >> +/**
> >> + *
> >> + * @author mir
> >> + */
> >> +public class ReentrantReadWriteLockTracker extends
> ReentrantReadWriteLock
> >> {
> >> +
> >> +
> >> +    private Set<ReadLockDebug> lockedReadLocks =
> >> Collections.synchronizedSet(new HashSet<ReadLockDebug>());
> >> +    private final WriteLockDebug writeLock = new WriteLockDebug(this);
> >> +    @Override
> >> +    protected Thread getOwner() {
> >> +        return super.getOwner();
> >> +    }
> >> +
> >> +    @Override
> >> +    protected Collection<Thread> getQueuedReaderThreads() {
> >> +        return super.getQueuedReaderThreads();
> >> +    }
> >> +
> >> +    @Override
> >> +    protected Collection<Thread> getQueuedThreads() {
> >> +        return super.getQueuedThreads();
> >> +    }
> >> +
> >> +    @Override
> >> +    protected Collection<Thread> getQueuedWriterThreads() {
> >> +        return super.getQueuedWriterThreads();
> >> +    }
> >> +
> >> +    @Override
> >> +    public int getReadHoldCount() {
> >> +        return super.getReadHoldCount();
> >> +    }
> >> +
> >> +    @Override
> >> +    public int getReadLockCount() {
> >> +        return super.getReadLockCount();
> >> +    }
> >> +
> >> +    @Override
> >> +    public int getWaitQueueLength(Condition condition) {
> >> +        return super.getWaitQueueLength(condition);
> >> +    }
> >> +
> >> +    @Override
> >> +    protected Collection<Thread> getWaitingThreads(Condition
> condition) {
> >> +        return super.getWaitingThreads(condition);
> >> +    }
> >> +
> >> +    @Override
> >> +    public int getWriteHoldCount() {
> >> +        return super.getWriteHoldCount();
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean hasWaiters(Condition condition) {
> >> +        return super.hasWaiters(condition);
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean isWriteLocked() {
> >> +        return super.isWriteLocked();
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean isWriteLockedByCurrentThread() {
> >> +        return super.isWriteLockedByCurrentThread();
> >> +    }
> >> +
> >> +    @Override
> >> +    public ReadLock readLock() {
> >> +        return new ReadLockDebug(this);
> >> +    }
> >> +
> >> +    ReadLock realReadLock() {
> >> +        return super.readLock();
> >> +    }
> >> +
> >> +    WriteLock realWriteLock() {
> >> +        return super.writeLock();
> >> +    }
> >> +
> >> +    @Override
> >> +    public String toString() {
> >> +        return super.toString();
> >> +    }
> >> +
> >> +    @Override
> >> +    public WriteLockDebug writeLock() {
> >> +        return writeLock;
> >> +    }
> >> +
> >> +    void addLockedReadLock(ReadLockDebug lock) {
> >> +        lockedReadLocks.add(lock);
> >> +    }
> >> +
> >> +    void removeReadLock(ReadLockDebug lock) {
> >> +        lockedReadLocks.remove(lock);
> >> +    }
> >> +
> >> +    public Set<ReadLockDebug> getLockedReadLocks() {
> >> +        return lockedReadLocks;
> >> +    }
> >> +
> >> +
> >> +}
> >>
> >> Added:
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java?rev=1659973&view=auto
> >>
> >>
> ==============================================================================
> >> ---
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> >> (added)
> >> +++
> >>
> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
> >> Sun Feb 15 18:41:15 2015
> >> @@ -0,0 +1,89 @@
> >> +/*
> >> + * Licensed to the Apache Software Foundation (ASF) under one
> >> + * or more contributor license agreements.  See the NOTICE file
> >> + * distributed with this work for additional information
> >> + * regarding copyright ownership.  The ASF licenses this file
> >> + * to you under the Apache License, Version 2.0 (the
> >> + * "License"); you may not use this file except in compliance
> >> + * with the License.  You may obtain a copy of the License at
> >> + *
> >> + *   http://www.apache.org/licenses/LICENSE-2.0
> >> + *
> >> + * Unless required by applicable law or agreed to in writing,
> >> + * software distributed under the License is distributed on an
> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >> + * KIND, either express or implied.  See the License for the
> >> + * specific language governing permissions and limitations
> >> + * under the License.
> >> + */
> >> +
> >> +package org.apache.commons.rdf.impl.utils.debug;
> >> +
> >> +import java.util.concurrent.TimeUnit;
> >> +import java.util.concurrent.locks.Condition;
> >> +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
> >> +
> >> +/**
> >> + *
> >> + * @author mir
> >> + */
> >> +public class WriteLockDebug extends WriteLock {
> >> +
> >> +    private ReentrantReadWriteLockTracker lock;
> >> +    private WriteLock writeLock;
> >> +    private StackTraceElement[] stackTrace;
> >> +
> >> +    public WriteLockDebug(ReentrantReadWriteLockTracker lock) {
> >> +        super(lock);
> >> +        this.lock = lock;
> >> +        this.writeLock = lock.realWriteLock();
> >> +    }
> >> +
> >> +    @Override
> >> +    public int getHoldCount() {
> >> +        return writeLock.getHoldCount();
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean isHeldByCurrentThread() {
> >> +        return writeLock.isHeldByCurrentThread();
> >> +    }
> >> +
> >> +    @Override
> >> +    public void lock() {
> >> +        writeLock.lock();
> >> +        stackTrace = Thread.currentThread().getStackTrace();
> >> +    }
> >> +
> >> +    @Override
> >> +    public void lockInterruptibly() throws InterruptedException {
> >> +        writeLock.lockInterruptibly();
> >> +    }
> >> +
> >> +    @Override
> >> +    public Condition newCondition() {
> >> +        return writeLock.newCondition();
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean tryLock() {
> >> +        return writeLock.tryLock();
> >> +    }
> >> +
> >> +    @Override
> >> +    public boolean tryLock(long timeout, TimeUnit unit) throws
> >> InterruptedException {
> >> +        return writeLock.tryLock(timeout, unit);
> >> +    }
> >> +
> >> +    @Override
> >> +    public void unlock() {
> >> +        writeLock.unlock();
> >> +        stackTrace = null;
> >> +    }
> >> +
> >> +    public StackTraceElement[] getStackTrace() {
> >> +        return stackTrace;
> >> +    }
> >> +
> >> +
> >> +}
> >>
> >>
> >>
> >
> >
> > --
> > http://people.apache.org/~britter/
> > http://www.systemoutprintln.de/
> > http://twitter.com/BenediktRitter
> > http://github.com/britter
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>


-- 
http://people.apache.org/~britter/
http://www.systemoutprintln.de/
http://twitter.com/BenediktRitter
http://github.com/britter

Re: svn commit: r1659973 [1/3] - in /commons/sandbox/rdf/trunk: ./ api/src/main/java/org/apache/commons/rdf/ impl.sparql/ impl.sparql/src/ impl.sparql/src/main/ impl.sparql/src/main/java/ impl.sparql/src/main/java/org/ impl.sparql/src/main/java/org/apache/...

Posted by Peter Ansell <an...@gmail.com>.
Hi Bernard,

The Commons RDF project is not planning on including any non-trivial
implementations, to avoid bias towards any of the participating
platforms. Stian has written a trivial implementation and submitted it
to GitHub to provide a reference for our test harness, but it is never
planned to be used by anyone for non-trivial purposes.

Reto is moving this code here unilaterally from Clerezza at this point
based on the ability of any Apache committer to send code into Apache
Commons.

The code that will be sent to the incubator is still planned to be the
code that is in the GitHub repository at the time the incubator
request goes through.

Cheers,

Peter

On 16 February 2015 at 18:34, Benedikt Ritter <br...@apache.org> wrote:
> Hello Reto,
>
> how does this relate to github Commons RDF? Is this part of the code base
> proposed for incubation?
>
> Regards,
> Benedikt
>
> 2015-02-15 19:41 GMT+01:00 <re...@apache.org>:
>
>> Author: reto
>> Date: Sun Feb 15 18:41:15 2015
>> New Revision: 1659973
>>
>> URL: http://svn.apache.org/r1659973
>> Log:
>> Started SPARQL Backed Implementation
>>
>> Added:
>>     commons/sandbox/rdf/trunk/alerts.txt
>>     commons/sandbox/rdf/trunk/impl.sparql/   (with props)
>>     commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>>     commons/sandbox/rdf/trunk/impl.sparql/src/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/main/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>>     commons/sandbox/rdf/trunk/impl.sparql/src/main/resources/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/test/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/
>>     commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/
>>
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>>     commons/sandbox/rdf/trunk/impl.utils/   (with props)
>>     commons/sandbox/rdf/trunk/impl.utils/pom.xml
>>       - copied, changed from r1651181, commons/sandbox/rdf/trunk/pom.xml
>>     commons/sandbox/rdf/trunk/impl.utils/src/
>>     commons/sandbox/rdf/trunk/impl.utils/src/main/
>>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/
>>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/
>>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/
>>     commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GraphNotIsomorphicException.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/GroupMappingIterator.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/HashMatching.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/MappingIterator.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/PermutationIterator.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/Utils.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashMap.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntHashSet.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntIterator.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/graphmatching/collections/IntSet.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/package-info.java
>>       - copied, changed from r1651181,
>> commons/sandbox/rdf/trunk/src/main/java/org/apache/commons/rdf/package-info.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraph.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/simple/SimpleMGraph.java
>>     commons/sandbox/rdf/trunk/impl.utils/src/main/resources/
>>     commons/sandbox/rdf/trunk/impl.utils/src/test/
>>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/
>>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/
>>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/
>>     commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/PlainLiteralImplTest.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/SimpleGraphTest.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TripleImplTest.java
>>
>> commons/sandbox/rdf/trunk/impl.utils/src/test/java/org/apache/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
>>     commons/sandbox/rdf/trunk/report.xml
>> Modified:
>>
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>>     commons/sandbox/rdf/trunk/pom.xml
>>
>> Added: commons/sandbox/rdf/trunk/alerts.txt
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/alerts.txt?rev=1659973&view=auto
>>
>> ==============================================================================
>>     (empty)
>>
>> Modified:
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java?rev=1659973&r1=1659972&r2=1659973&view=diff
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> (original)
>> +++
>> commons/sandbox/rdf/trunk/api/src/main/java/org/apache/commons/rdf/Literal.java
>> Sun Feb 15 18:41:15 2015
>> @@ -84,7 +84,8 @@ public interface Literal extends RdfTerm
>>
>>      /**
>>       * Returns the hash code of the lexical form plus the hash code of the
>> -     * language, plush the hash code of the datatype
>> +     * datatype plus if the literal has a language the hash code of the
>> +     * language.
>>       *
>>       * @return hash code
>>       */
>>
>> Propchange: commons/sandbox/rdf/trunk/impl.sparql/
>>
>> ------------------------------------------------------------------------------
>> --- svn:ignore (added)
>> +++ svn:ignore Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1 @@
>> +target
>>
>> Added: commons/sandbox/rdf/trunk/impl.sparql/pom.xml
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/pom.xml?rev=1659973&view=auto
>>
>> ==============================================================================
>> --- commons/sandbox/rdf/trunk/impl.sparql/pom.xml (added)
>> +++ commons/sandbox/rdf/trunk/impl.sparql/pom.xml Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,52 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>> http://maven.apache.org/POM/4.0.0
>> http://maven.apache.org/xsd/maven-4.0.0.xsd">
>> +    <parent>
>> +        <groupId>org.apache.commons</groupId>
>> +        <artifactId>commons-parent</artifactId>
>> +        <version>37</version>
>> +        <relativePath />
>> +    </parent>
>> +    <modelVersion>4.0.0</modelVersion>
>> +    <groupId>commons-rdf</groupId>
>> +    <artifactId>commons-rdf-impl-sparql</artifactId>
>> +    <version>1.0.0-SNAPSHOT</version>
>> +    <packaging>jar</packaging>
>> +    <name>Apache Commons RDF SPARQL backed implementation.</name>
>> +    <description>An implementation of the rdf commons API backed by a
>> sparql
>> +        endpoint. STATUS: Incomplete, currecnt code only supports reading
>> +        graphs and does not yet support BlankNodes.</description>
>> +    <properties>
>> +        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
>> +        <maven.compiler.source>1.7</maven.compiler.source>
>> +        <maven.compiler.target>1.7</maven.compiler.target>
>> +    </properties>
>> +    <dependencies>
>> +        <dependency>
>> +            <groupId>org.apache.httpcomponents</groupId>
>> +            <artifactId>httpclient</artifactId>
>> +            <version>4.4</version>
>> +        </dependency>
>> +        <dependency>
>> +            <groupId>commons-rdf</groupId>
>> +            <artifactId>commons-rdf-api</artifactId>
>> +            <version>0.1-SNAPSHOT</version>
>> +        </dependency>
>> +        <dependency>
>> +            <groupId>commons-rdf</groupId>
>> +            <artifactId>commons-rdf-impl-utils</artifactId>
>> +            <version>0.1-SNAPSHOT</version>
>> +        </dependency>
>> +        <dependency>
>> +            <groupId>junit</groupId>
>> +            <artifactId>junit</artifactId>
>> +            <version>4.12</version>
>> +            <scope>test</scope>
>> +        </dependency>
>> +        <dependency>
>> +            <groupId>org.apache.jena</groupId>
>> +            <artifactId>jena-fuseki</artifactId>
>> +            <version>1.1.1</version>
>> +            <scope>test</scope>
>> +        </dependency>
>> +    </dependencies>
>> +</project>
>> \ No newline at end of file
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlClient.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,220 @@
>> +/*
>> + * To change this license header, choose License Headers in Project
>> Properties.
>> + * To change this template file, choose Tools | Templates
>> + * and open the template in the editor.
>> + */
>> +package org.apache.commons.rdf.impl.sparql;
>> +
>> +import java.io.IOException;
>> +import java.io.InputStream;
>> +import java.io.UnsupportedEncodingException;
>> +import java.util.ArrayList;
>> +import java.util.Enumeration;
>> +import java.util.HashMap;
>> +import java.util.Hashtable;
>> +import java.util.List;
>> +import java.util.Map;
>> +import java.util.logging.Level;
>> +import java.util.logging.Logger;
>> +import org.apache.http.HttpEntity;
>> +import org.apache.http.NameValuePair;
>> +import org.apache.http.client.entity.UrlEncodedFormEntity;
>> +import org.apache.http.client.methods.CloseableHttpResponse;
>> +import org.apache.http.client.methods.HttpPost;
>> +import org.apache.http.impl.client.CloseableHttpClient;
>> +import org.apache.http.impl.client.HttpClients;
>> +import org.apache.http.message.BasicNameValuePair;
>> +import org.apache.http.util.EntityUtils;
>> +import javax.xml.parsers.*;
>> +import org.apache.commons.rdf.BlankNode;
>> +import org.apache.commons.rdf.BlankNodeOrIri;
>> +import org.apache.commons.rdf.Iri;
>> +import org.apache.commons.rdf.Language;
>> +import org.apache.commons.rdf.Literal;
>> +import org.apache.commons.rdf.RdfTerm;
>> +import org.apache.commons.rdf.Triple;
>> +import org.apache.commons.rdf.impl.utils.AbstractLiteral;
>> +import org.xml.sax.*;
>> +import org.xml.sax.helpers.*;
>> +
>> +/**
>> + *
>> + * @author developer
>> + */
>> +public class SparqlClient {
>> +
>> +    final String endpoint;
>> +
>> +    public SparqlClient(final String endpoint) {
>> +        this.endpoint = endpoint;
>> +    }
>> +
>> +    List<Map<String, RdfTerm>> queryResultSet(final String query) throws
>> IOException {
>> +        CloseableHttpClient httpclient = HttpClients.createDefault();
>> +        HttpPost httpPost = new HttpPost(endpoint);
>> +        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
>> +        nvps.add(new BasicNameValuePair("query", query));
>> +        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
>> +        CloseableHttpResponse response2 = httpclient.execute(httpPost);
>> +
>> +        try {
>> +            HttpEntity entity2 = response2.getEntity();
>> +            InputStream in = entity2.getContent();
>> +            SAXParserFactory spf = SAXParserFactory.newInstance();
>> +            spf.setNamespaceAware(true);
>> +            SAXParser saxParser = spf.newSAXParser();
>> +            XMLReader xmlReader = saxParser.getXMLReader();
>> +            final SparqlsResultsHandler sparqlsResultsHandler = new
>> SparqlsResultsHandler();
>> +            xmlReader.setContentHandler(sparqlsResultsHandler);
>> +            xmlReader.parse(new InputSource(in));
>> +            /*
>> +             for (int ch = in.read(); ch != -1; ch = in.read()) {
>> +             System.out.print((char)ch);
>> +             }
>> +             */
>> +            // do something useful with the response body
>> +            // and ensure it is fully consumed
>> +            EntityUtils.consume(entity2);
>> +            return sparqlsResultsHandler.getResults();
>> +        } catch (ParserConfigurationException ex) {
>> +            throw new RuntimeException(ex);
>> +        } catch (SAXException ex) {
>> +            throw new RuntimeException(ex);
>> +        } finally {
>> +            response2.close();
>> +        }
>> +
>> +    }
>> +
>> +    final public static class SparqlsResultsHandler extends
>> DefaultHandler {
>> +
>> +        private String currentBindingName;
>> +        private Map<String, RdfTerm> currentResult = null;
>> +        private final List<Map<String, RdfTerm>> results = new
>> ArrayList<>();
>> +        private boolean readingValue;
>> +        private String value;
>> +        private Map<String, BlankNode> bNodeMap = new HashMap<>();
>> +        private static final Iri XSD_STRING = new Iri("
>> http://www.w3.org/2001/XMLSchema#string");
>> +
>> +        private RdfTerm getBNode(String value) {
>> +            if (!bNodeMap.containsKey(value)) {
>> +                bNodeMap.put(value, new BlankNode());
>> +            }
>> +            return bNodeMap.get(value);
>> +        }
>> +
>> +        private List<Map<String, RdfTerm>> getResults() {
>> +            return results;
>> +        }
>> +
>> +        enum BindingType {
>> +
>> +            uri, bnode, literal;
>> +        }
>> +
>> +        @Override
>> +        public void startDocument() throws SAXException {
>> +
>> +        }
>> +
>> +        @Override
>> +        public void startElement(String namespaceURI,
>> +                String localName,
>> +                String qName,
>> +                Attributes atts)
>> +                throws SAXException {
>> +            if ("http://www.w3.org/2005/sparql-results#".equals(namespaceURI))
>> {
>> +                if ("result".equals(localName)) {
>> +                    if (currentResult != null) {
>> +                        throw new SAXException("unexpected tag <result>");
>> +                    }
>> +                    currentResult = new HashMap<>();
>> +                } else if ("binding".equals(localName)) {
>> +                    if (currentResult == null) {
>> +                        throw new SAXException("unexpected tag
>> <binding>");
>> +                    }
>> +                    currentBindingName = atts.getValue("name");
>> +                } else if ("uri".equals(localName) ||
>> "bnode".equals(localName) || "literal".equals(localName)) {
>> +                    if (readingValue) {
>> +                        throw new SAXException("unexpected tag <" +
>> localName + ">");
>> +                    }
>> +                    readingValue = true;
>> +                }
>> +            }
>> +
>> +            //System.out.println(namespaceURI);
>> +            //System.out.println(qName);
>> +        }
>> +
>> +        @Override
>> +        public void characters(char[] chars, int start, int length)
>> throws SAXException {
>> +            if (readingValue) {
>> +                value = new String(chars, start, length);
>> +                //System.err.println(value + start + ", " + length);
>> +            }
>> +        }
>> +
>> +        @Override
>> +        public void endElement(String namespaceURI,
>> +                String localName,
>> +                String qName)
>> +                throws SAXException {
>> +            if ("http://www.w3.org/2005/sparql-results#".equals(namespaceURI))
>> {
>> +                if ("result".equals(localName)) {
>> +                    results.add(currentResult);
>> +                    currentResult = null;
>> +                } else if ("binding".equals(localName)) {
>> +                    if (currentBindingName == null) {
>> +                        throw new SAXException("unexpected tag
>> </binding>");
>> +                    }
>> +                    currentBindingName = null;
>> +                } else {
>> +                    try {
>> +                        BindingType b = BindingType.valueOf(localName);
>> +                        RdfTerm rdfTerm = null;
>> +                        switch (b) {
>> +                            case uri:
>> +                                rdfTerm = new Iri(value);
>> +                                break;
>> +                            case bnode:
>> +                                rdfTerm = getBNode(value);
>> +                                break;
>> +                            case literal:
>> +                                final String lf = value;
>> +                                rdfTerm = new AbstractLiteral() {
>> +
>> +                                    @Override
>> +                                    public String getLexicalForm() {
>> +                                        return lf;
>> +                                    }
>> +
>> +                                    @Override
>> +                                    public Iri getDataType() {
>> +                                        //TODO implement
>> +                                        return XSD_STRING;
>> +                                    }
>> +
>> +                                    @Override
>> +                                    public Language getLanguage() {
>> +                                        //TODO impl
>> +                                        return null;
>> +                                    }
>> +                                };
>> +                                break;
>> +                        }
>> +                        currentResult.put(currentBindingName, rdfTerm);
>> +                        readingValue = false;
>> +                    } catch (IllegalArgumentException e) {
>> +                            //not uri|bnode|literal
>> +                    }
>> +                }
>> +            }
>> +        }
>> +
>> +        public void endDocument() throws SAXException {
>> +            //System.out.println("results: " + results.size());
>> +        }
>> +
>> +    }
>> +
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.sparql/src/main/java/org/apache/commons/rdf/impl/sparql/SparqlGraph.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,121 @@
>> +/*
>> + * To change this license header, choose License Headers in Project
>> Properties.
>> + * To change this template file, choose Tools | Templates
>> + * and open the template in the editor.
>> + */
>> +package org.apache.commons.rdf.impl.sparql;
>> +
>> +import java.io.IOException;
>> +import java.util.Iterator;
>> +import java.util.List;
>> +import java.util.Map;
>> +import org.apache.commons.rdf.BlankNode;
>> +import org.apache.commons.rdf.BlankNodeOrIri;
>> +import org.apache.commons.rdf.Iri;
>> +import org.apache.commons.rdf.Literal;
>> +import org.apache.commons.rdf.RdfTerm;
>> +import org.apache.commons.rdf.Triple;
>> +import org.apache.commons.rdf.impl.utils.AbstractGraph;
>> +import org.apache.commons.rdf.impl.utils.TripleImpl;
>> +
>> +/**
>> + *
>> + * @author reto
>> + */
>> +public class SparqlGraph extends AbstractGraph {
>> +
>> +    final SparqlClient sparqlClient;
>> +
>> +    /** Constructs a Graph representing the default graph at the specified
>> +     * endpoint
>> +     */
>> +    public SparqlGraph(final String endpoint) {
>> +        sparqlClient = new SparqlClient(endpoint);
>> +    }
>> +
>> +    @Override
>> +    protected Iterator<Triple> performFilter(final BlankNodeOrIri subject,
>> +            final Iri predicate, final RdfTerm object) {
>> +        try {
>> +            final StringBuilder queryBuilder = new StringBuilder();
>> +            queryBuilder.append("SELECT * WHERE { ");
>> +            if (subject == null) {
>> +                queryBuilder.append("?s");
>> +            } else {
>> +                queryBuilder.append(asSparqlTerm(subject));
>> +            }
>> +            queryBuilder.append(' ');
>> +            if (predicate == null) {
>> +                queryBuilder.append("?p");
>> +            } else {
>> +                queryBuilder.append(asSparqlTerm(predicate));
>> +            }
>> +            queryBuilder.append(' ');
>> +            if (object == null) {
>> +                queryBuilder.append("?o");
>> +            } else {
>> +                queryBuilder.append(asSparqlTerm(object));
>> +            }
>> +            queryBuilder.append(" }");
>> +            List<Map<String, RdfTerm>> sparqlResults =
>> sparqlClient.queryResultSet(queryBuilder.toString());
>> +            final Iterator<Map<String, RdfTerm>> resultsIterator =
>> sparqlResults.iterator();
>> +            return new Iterator<Triple>() {
>> +
>> +                @Override
>> +                public boolean hasNext() {
>> +                    return resultsIterator.hasNext();
>> +                }
>> +
>> +                @Override
>> +                public Triple next() {
>> +                    Map<String, RdfTerm> result = resultsIterator.next();
>> +                    return new TripleImpl(subject != null ? subject :
>> (BlankNodeOrIri)result.get("s"),
>> +                            predicate != null ? predicate :
>> (Iri)result.get("p"),
>> +                            object != null ? object : result.get("o"));
>> +                }
>> +            };
>> +        } catch (IOException ex) {
>> +            throw new RuntimeException(ex);
>> +        }
>> +    }
>> +
>> +    @Override
>> +    protected int performSize() {
>> +        try {
>> +            return sparqlClient.queryResultSet("SELECT * WHERE { ?s ?p
>> ?o}").size();
>> +        } catch (IOException ex) {
>> +            throw new RuntimeException(ex);
>> +        }
>> +    }
>> +
>> +    private String asSparqlTerm(Iri iri) {
>> +        return "<"+iri.getUnicodeString()+">";
>> +    }
>> +
>> +    private String asSparqlTerm(Literal literal) {
>> +        //TODO langauge and datatype
>> +        return "\""+literal.getLexicalForm()+"\"";
>> +    }
>> +
>> +    private String asSparqlTerm(BlankNode bnode) {
>> +        //this requires adding additional clauses to the graph pattern
>> +        throw new UnsupportedOperationException("Not supported yet.");
>> +    }
>> +
>> +    private String asSparqlTerm(BlankNodeOrIri term) {
>> +        if (term instanceof Iri) {
>> +            return asSparqlTerm((Iri)term);
>> +        } else {
>> +            return asSparqlTerm((BlankNode)term);
>> +        }
>> +    }
>> +
>> +    private String asSparqlTerm(RdfTerm term) {
>> +        if (term instanceof BlankNodeOrIri) {
>> +            return asSparqlTerm((BlankNodeOrIri)term);
>> +        } else {
>> +            return asSparqlTerm((Literal)term);
>> +        }
>> +    }
>> +
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/java/org/apache/commons/rdf/impl/sparql/SparqlGraphTest.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,106 @@
>> +/*
>> + * To change this license header, choose License Headers in Project
>> Properties.
>> + * To change this template file, choose Tools | Templates
>> + * and open the template in the editor.
>> + */
>> +package org.apache.commons.rdf.impl.sparql;
>> +
>> +import com.hp.hpl.jena.query.DatasetAccessor;
>> +import com.hp.hpl.jena.query.DatasetAccessorFactory;
>> +import java.io.File;
>> +import java.io.IOException;
>> +import java.net.ServerSocket;
>> +import org.apache.jena.fuseki.EmbeddedFusekiServer;
>> +import com.hp.hpl.jena.rdf.model.Model;
>> +import com.hp.hpl.jena.rdf.model.ModelFactory;
>> +import java.io.InputStream;
>> +import java.util.HashSet;
>> +import java.util.Iterator;
>> +import java.util.Set;
>> +import org.apache.commons.rdf.Graph;
>> +import org.apache.commons.rdf.Iri;
>> +import org.apache.commons.rdf.Literal;
>> +import org.apache.commons.rdf.RdfTerm;
>> +import org.apache.commons.rdf.Triple;
>> +import org.apache.commons.rdf.impl.utils.PlainLiteralImpl;
>> +import org.junit.AfterClass;
>> +import org.junit.Assert;
>> +import org.junit.BeforeClass;
>> +import org.junit.Test;
>> +
>> +/**
>> + *
>> + * @author reto
>> + */
>> +public class SparqlGraphTest {
>> +
>> +    final static int serverPort = findFreePort();
>> +    static EmbeddedFusekiServer server;
>> +
>> +    @BeforeClass
>> +    public static void prepare() throws IOException {
>> +        final String serviceURI = "http://localhost:" + serverPort +
>> "/ds/data";
>> +        final DatasetAccessorFactory factory = new
>> DatasetAccessorFactory();
>> +        final DatasetAccessor accessor = factory.createHTTP(serviceURI);
>> +        final InputStream in =
>> SparqlGraphTest.class.getResourceAsStream("grounded.ttl");
>> +        final Model m = ModelFactory.createDefaultModel();
>> +        String base = "http://example.org/";
>> +        m.read(in, base, "TURTLE");
>> +
>> +        final File dataSet = File.createTempFile("dataset", "fuseki");
>> +        dataSet.delete();
>> +        server = EmbeddedFusekiServer.memTDB(serverPort,
>> "/ds");//dataSet.getAbsolutePath());
>> +        server.start();
>> +        System.out.println("Started fuseki on port " + serverPort);
>> +        accessor.putModel(m);
>> +    }
>> +
>> +    @AfterClass
>> +    public static void cleanup() {
>> +        server.stop();
>> +    }
>> +
>> +    @Test
>> +    public void graphSize() {
>> +        final Graph graph = new SparqlGraph("http://localhost:" +
>> serverPort + "/ds/query");
>> +        Assert.assertEquals("Graph not of the exepected size", 8,
>> graph.size());
>> +    }
>> +
>> +    @Test
>> +    public void filter1() {
>> +        final Graph graph = new SparqlGraph("http://localhost:" +
>> serverPort + "/ds/query");
>> +        final Iri spiderman = new Iri("http://example.org/#spiderman");
>> +        final Iri greenGoblin = new Iri("http://example.org/#green-goblin
>> ");
>> +        final Iri enemyOf = new Iri("
>> http://www.perceive.net/schemas/relationship/enemyOf");
>> +        final Iri foafName = new Iri("http://xmlns.com/foaf/0.1/name");
>> +        {
>> +            final Iterator<Triple> iter = graph.filter(spiderman, null,
>> greenGoblin);
>> +            Assert.assertTrue(iter.hasNext());
>> +            Assert.assertEquals(enemyOf, iter.next().getPredicate());
>> +            Assert.assertFalse(iter.hasNext());
>> +        }
>> +        {
>> +            final Iterator<Triple> iter = graph.filter(spiderman,
>> foafName, null);
>> +            Set<Literal> names = new HashSet<>();
>> +            for (int i = 0; i < 2; i++) {
>> +                Assert.assertTrue(iter.hasNext());
>> +                RdfTerm name = iter.next().getObject();
>> +                Assert.assertTrue(name instanceof Literal);
>> +                names.add((Literal)name);
>> +            }
>> +            Assert.assertFalse(iter.hasNext());
>> +            Assert.assertTrue(names.contains(new
>> PlainLiteralImpl("Spiderman")));
>> +        }
>> +    }
>> +
>> +    public static int findFreePort() {
>> +        int port = 0;
>> +        try (ServerSocket server = new ServerSocket(0);) {
>> +            port = server.getLocalPort();
>> +        } catch (Exception e) {
>> +            throw new RuntimeException("unable to find a free port");
>> +        }
>> +        return port;
>> +    }
>> +
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.sparql/src/test/resources/org/apache/commons/rdf/impl/sparql/grounded.ttl
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,16 @@
>> +@base <http://example.org/> .
>> +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
>> +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
>> +@prefix foaf: <http://xmlns.com/foaf/0.1/> .
>> +@prefix rel: <http://www.perceive.net/schemas/relationship/> .
>> +
>> +<#green-goblin>
>> +    rel:enemyOf <#spiderman> ;
>> +    a foaf:Person ;    # in the context of the Marvel universe
>> +    foaf:name "Green Goblin" ;
>> +    foaf:age 128 .
>> +
>> +<#spiderman>
>> +    rel:enemyOf <#green-goblin> ;
>> +    a foaf:Person ;
>> +    foaf:name "Spiderman", "Человек-паук"@ru .
>> \ No newline at end of file
>>
>> Propchange: commons/sandbox/rdf/trunk/impl.utils/
>>
>> ------------------------------------------------------------------------------
>> --- svn:ignore (added)
>> +++ svn:ignore Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1 @@
>> +target
>>
>> Copied: commons/sandbox/rdf/trunk/impl.utils/pom.xml (from r1651181,
>> commons/sandbox/rdf/trunk/pom.xml)
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/pom.xml?p2=commons/sandbox/rdf/trunk/impl.utils/pom.xml&p1=commons/sandbox/rdf/trunk/pom.xml&r1=1651181&r2=1659973&rev=1659973&view=diff
>>
>> ==============================================================================
>> --- commons/sandbox/rdf/trunk/pom.xml (original)
>> +++ commons/sandbox/rdf/trunk/impl.utils/pom.xml Sun Feb 15 18:41:15 2015
>> @@ -22,13 +22,14 @@
>>      <parent>
>>          <groupId>org.apache.commons</groupId>
>>          <artifactId>commons-parent</artifactId>
>> -        <version>35</version>
>> +        <version>37</version>
>> +        <relativePath />
>>      </parent>
>>      <modelVersion>4.0.0</modelVersion>
>>      <groupId>commons-rdf</groupId>
>> -    <artifactId>commons-rdf</artifactId>
>> +    <artifactId>commons-rdf-impl-utils</artifactId>
>>      <version>0.1-SNAPSHOT</version>
>> -    <name>Apache Commons RDF</name>
>> +    <name>Apache Commons RDF Implementation Utils</name>
>>      <description>
>>          Apache Commons RDF provides an API modelling the RDF data model
>> as defined by
>>          http://www.w3.org/TR/rdf11-concepts/
>> @@ -50,11 +51,22 @@
>>
>>      <dependencies>
>>          <dependency>
>> +            <groupId>commons-rdf</groupId>
>> +            <artifactId>commons-rdf-api</artifactId>
>> +            <version>0.1-SNAPSHOT</version>
>> +        </dependency>
>> +        <dependency>
>>              <groupId>junit</groupId>
>>              <artifactId>junit</artifactId>
>>              <version>4.12</version>
>>              <scope>test</scope>
>>          </dependency>
>> +        <dependency>
>> +            <groupId>org.slf4j</groupId>
>> +            <artifactId>slf4j-api</artifactId>
>> +            <version>1.7.7</version>
>> +            <type>jar</type>
>> +        </dependency>
>>      </dependencies>
>>
>>      <distributionManagement>
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractGraph.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,316 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *   http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +package org.apache.commons.rdf.impl.utils;
>> +
>> +import java.lang.ref.WeakReference;
>> +import java.util.AbstractCollection;
>> +import java.util.Collection;
>> +import java.util.Collections;
>> +import java.util.HashSet;
>> +import java.util.Iterator;
>> +
>> +import java.util.Set;
>> +import java.util.concurrent.locks.Lock;
>> +import java.util.concurrent.locks.ReadWriteLock;
>> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>> +import org.apache.commons.rdf.BlankNodeOrIri;
>> +import org.apache.commons.rdf.RdfTerm;
>> +import org.apache.commons.rdf.Triple;
>> +import org.apache.commons.rdf.Graph;
>> +import org.apache.commons.rdf.ImmutableGraph;
>> +import org.apache.commons.rdf.Iri;
>> +import org.apache.commons.rdf.WatchableGraph;
>> +import org.apache.commons.rdf.event.AddEvent;
>> +import org.apache.commons.rdf.event.FilterTriple;
>> +import org.apache.commons.rdf.event.GraphEvent;
>> +import org.apache.commons.rdf.event.GraphListener;
>> +import org.apache.commons.rdf.event.RemoveEvent;
>> +import
>> org.apache.commons.rdf.impl.utils.debug.ReentrantReadWriteLockTracker;
>> +import org.apache.commons.rdf.impl.utils.simple.SimpleImmutableGraph;
>> +
>> +/**
>> + * An abstract implementation of <code>Graph</code> implementing
>> + * <code>iterator</code> and <code>contains</code> calling
>> <code>filter</code>.
>> + *
>> + * @author reto
>> + */
>> +public abstract class AbstractGraph extends AbstractCollection<Triple>
>> +        implements Graph {
>> +
>> +
>> +    private static final String DEBUG_MODE = "rdfLocksDebugging";
>> +    private final ReadWriteLock lock;
>> +
>> +    private final Lock readLock;
>> +    private final Lock writeLock;
>> +
>> +    /**
>> +     * Constructs a LocalbleMGraph for an Graph.
>> +     *
>> +     * @param providedMGraph a non-lockable graph
>> +     */
>> +    public AbstractGraph() {
>> +        {
>> +            String debugMode = System.getProperty(DEBUG_MODE);
>> +            if (debugMode != null &&
>> debugMode.toLowerCase().equals("true")) {
>> +                lock = new ReentrantReadWriteLockTracker();
>> +            } else {
>> +                lock = new ReentrantReadWriteLock();
>> +            }
>> +        }
>> +        readLock = lock.readLock();
>> +        writeLock = lock.writeLock();
>> +    }
>> +
>> +    public AbstractGraph(final ReadWriteLock lock) {
>> +        this.lock = lock;
>> +        readLock = lock.readLock();
>> +        writeLock = lock.writeLock();
>> +    }
>> +
>> +    @Override
>> +    public ReadWriteLock getLock() {
>> +        return lock;
>> +    }
>> +
>> +    @Override
>> +    public ImmutableGraph getImmutableGraph() {
>> +        readLock.lock();
>> +        try {
>> +            return performGetImmutableGraph();
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    public ImmutableGraph performGetImmutableGraph() {
>> +        return new SimpleImmutableGraph(this);
>> +    }
>> +
>> +    @Override
>> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri predicate,
>> RdfTerm object) {
>> +        readLock.lock();
>> +        try {
>> +            return new LockingIterator(performFilter(subject, predicate,
>> object), lock);
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public int size() {
>> +        readLock.lock();
>> +        try {
>> +            return performSize();
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public boolean isEmpty() {
>> +        readLock.lock();
>> +        try {
>> +            return performIsEmpty();
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    @SuppressWarnings("element-type-mismatch")
>> +    public boolean contains(Object o) {
>> +        readLock.lock();
>> +        try {
>> +            return performContains(o);
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public Iterator<Triple> iterator() {
>> +        readLock.lock();
>> +        try {
>> +            return new LockingIterator(performIterator(), lock);
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public Object[] toArray() {
>> +        readLock.lock();
>> +        try {
>> +            return performToArray();
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public <T> T[] toArray(T[] a) {
>> +        readLock.lock();
>> +        try {
>> +            return performToArray(a);
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public boolean containsAll(Collection<?> c) {
>> +        readLock.lock();
>> +        try {
>> +            return performContainsAll(c);
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public boolean add(Triple e) {
>> +        writeLock.lock();
>> +        try {
>> +            return performAdd(e);
>> +        } finally {
>> +            writeLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public boolean remove(Object o) {
>> +        writeLock.lock();
>> +        try {
>> +            return performRemove(o);
>> +        } finally {
>> +            writeLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public boolean addAll(Collection<? extends Triple> c) {
>> +        writeLock.lock();
>> +        try {
>> +            return performAddAll(c);
>> +        } finally {
>> +            writeLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public boolean removeAll(Collection<?> c) {
>> +        writeLock.lock();
>> +        try {
>> +            return performRemoveAll(c);
>> +        } finally {
>> +            writeLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public boolean retainAll(Collection<?> c) {
>> +        writeLock.lock();
>> +        try {
>> +            return performRetainAll(c);
>> +        } finally {
>> +            writeLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public void clear() {
>> +        writeLock.lock();
>> +        try {
>> +            performClear();
>> +        } finally {
>> +            writeLock.unlock();
>> +        }
>> +    }
>> +
>> +
>> +    @Override
>> +    public boolean equals(Object obj) {
>> +        /*if (obj == null) {
>> +            return false;
>> +        }
>> +        if (obj == this) {
>> +            return true;
>> +        }
>> +        if (obj.getClass() != getClass()) {
>> +            return false;
>> +        }*/
>> +        return this == obj;
>> +    }
>> +
>> +
>> +    protected abstract Iterator<Triple> performFilter(BlankNodeOrIri
>> subject, Iri predicate, RdfTerm object);
>> +
>> +    protected abstract int performSize();
>> +
>> +    protected boolean performIsEmpty() {
>> +        return super.isEmpty();
>> +    }
>> +
>> +    protected Object[] performToArray() {
>> +        return super.toArray();
>> +    }
>> +
>> +    protected boolean performRemove(Object o) {
>> +        return super.remove(o);
>> +    }
>> +
>> +    protected boolean performAddAll(Collection<? extends Triple> c) {
>> +        return super.addAll(c);
>> +    }
>> +
>> +    protected boolean performRemoveAll(Collection<?> c) {
>> +        return super.removeAll(c);
>> +    }
>> +
>> +    protected boolean performRetainAll(Collection<?> c) {
>> +        return super.retainAll(c);
>> +    }
>> +
>> +    protected void performClear() {
>> +        super.clear();
>> +    }
>> +
>> +    protected boolean performContains(Object o) {
>> +        return super.contains(o);
>> +    }
>> +
>> +    protected Iterator<Triple> performIterator() {
>> +        return performFilter(null, null, null);
>> +    }
>> +
>> +    protected boolean performContainsAll(Collection<?> c) {
>> +        return super.containsAll(c);
>> +    }
>> +
>> +    protected <T> T[] performToArray(T[] a) {
>> +        return super.toArray(a);
>> +    }
>> +
>> +    protected boolean performAdd(Triple e) {
>> +        return super.add(e);
>> +    }
>> +
>> +
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractImmutableGraph.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,112 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *   http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +package org.apache.commons.rdf.impl.utils;
>> +
>> +import java.util.Collection;
>> +import java.util.Iterator;
>> +
>> +import org.apache.commons.rdf.BlankNode;
>> +import org.apache.commons.rdf.ImmutableGraph;
>> +import org.apache.commons.rdf.RdfTerm;
>> +import org.apache.commons.rdf.Triple;
>> +import org.apache.commons.rdf.impl.utils.graphmatching.GraphMatcher;
>> +
>> +/**
>> + * <code>AbstractGraph</code> is an abstract implementation of
>> <code>ImmutableGraph</code>
>> + * implementing the <code>equals</code> and the <code>hashCode</code>
>> methods.
>> + *
>> + * @author reto
>> + *
>> + */
>> +public abstract class AbstractImmutableGraph extends AbstractGraph
>> +        implements ImmutableGraph {
>> +
>> +    public final synchronized int hashCode() {
>> +        int result = 0;
>> +        for (Iterator<Triple> iter = iterator(); iter.hasNext();) {
>> +            result += getBlankNodeBlindHash(iter.next());
>> +        }
>> +        return result;
>> +    }
>> +
>> +    /**
>> +     * @param triple
>> +     * @return hash without BNode hashes
>> +     */
>> +    private int getBlankNodeBlindHash(Triple triple) {
>> +        int hash = triple.getPredicate().hashCode();
>> +        RdfTerm subject = triple.getSubject();
>> +
>> +        if (!(subject instanceof BlankNode)) {
>> +            hash ^= subject.hashCode() >> 1;
>> +        }
>> +        RdfTerm object = triple.getObject();
>> +        if (!(object instanceof BlankNode)) {
>> +            hash ^= object.hashCode() << 1;
>> +        }
>> +
>> +        return hash;
>> +    }
>> +
>> +    @Override
>> +    public boolean add(Triple e) {
>> +        throw new UnsupportedOperationException("Graphs are not mutable,
>> use Graph");
>> +
>> +    }
>> +
>> +    @Override
>> +    public boolean addAll(Collection<? extends Triple> c) {
>> +        throw new UnsupportedOperationException("Graphs are not mutable,
>> use Graph");
>> +    }
>> +
>> +    @Override
>> +    public boolean remove(Object o) {
>> +        throw new UnsupportedOperationException("Graphs are not mutable,
>> use Graph");
>> +    }
>> +
>> +    @Override
>> +    public boolean removeAll(Collection<?> c) {
>> +        throw new UnsupportedOperationException("Graphs are not mutable,
>> use Graph");
>> +    }
>> +
>> +    @Override
>> +    public void clear() {
>> +        throw new UnsupportedOperationException("Graphs are not mutable,
>> use Graph");
>> +    }
>> +
>> +
>> +    @Override
>> +    public ImmutableGraph getImmutableGraph() {
>> +        return this;
>> +    }
>> +
>> +    @Override
>> +    public boolean equals(Object obj) {
>> +        if (this == obj) {
>> +            return true;
>> +        }
>> +        if (!(obj instanceof ImmutableGraph)) {
>> +            return false;
>> +        }
>> +        if (hashCode() != obj.hashCode()) {
>> +            return false;
>> +        }
>> +        return GraphMatcher.getValidMapping(this, (ImmutableGraph) obj)
>> != null;
>> +    }
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/AbstractLiteral.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,61 @@
>> +/*
>> + * Copyright 2015 The Apache Software Foundation.
>> + *
>> + * Licensed under the Apache License, Version 2.0 (the "License");
>> + * you may not use this file except in compliance with the License.
>> + * You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.commons.rdf.impl.utils;
>> +
>> +import org.apache.commons.rdf.Literal;
>> +
>> +/**
>> + *
>> + * @author developer
>> + */
>> +public abstract class AbstractLiteral implements Literal {
>> +
>> +    @Override
>> +    public int hashCode() {
>> +        int result = 0;
>> +        if (getLanguage() != null) {
>> +            result = getLanguage().hashCode();
>> +        }
>> +        result += getLexicalForm().hashCode();
>> +        result += getDataType().hashCode();
>> +        return result;
>> +    }
>> +
>> +    @Override
>> +    public boolean equals(Object obj) {
>> +        if (this == obj) {
>> +            return true;
>> +        }
>> +        if (obj instanceof Literal) {
>> +            Literal other = (Literal) obj;
>> +
>> +            if (getLanguage() == null) {
>> +                if (other.getLanguage() != null) {
>> +                    return false;
>> +                }
>> +            } else {
>> +                if (!getLanguage().equals(other.getLanguage())) {
>> +                    return false;
>> +                }
>> +            }
>> +            boolean res = getDataType().equals(other.getDataType()) &&
>> getLexicalForm().equals(other.getLexicalForm());
>> +            return res;
>> +        } else {
>> +            return false;
>> +        }
>> +    }
>> +
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/DelayedNotificator.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,112 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *   http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +package org.apache.commons.rdf.impl.utils;
>> +
>> +import java.lang.ref.WeakReference;
>> +import java.util.*;
>> +
>> +import org.apache.commons.rdf.event.GraphEvent;
>> +import org.apache.commons.rdf.event.GraphListener;
>> +import org.slf4j.Logger;
>> +import org.slf4j.LoggerFactory;
>> +
>> +/**
>> + *
>> + * @author reto
>> + */
>> +class DelayedNotificator {
>> +
>> +    private static final Logger log =
>> LoggerFactory.getLogger(DelayedNotificator.class);
>> +    private static Timer timer = new Timer("Event delivery timer",true);
>> +
>> +    static class ListenerHolder {
>> +
>> +        long delay;
>> +        List<GraphEvent> events = null;
>> +        WeakReference<GraphListener> listenerRef;
>> +
>> +        public ListenerHolder(GraphListener listener, long delay) {
>> +            this.listenerRef = new WeakReference<GraphListener>(listener);
>> +            this.delay = delay;
>> +        }
>> +
>> +        private void registerEvent(GraphEvent event) {
>> +            synchronized (this) {
>> +                if (events == null) {
>> +                    events = new ArrayList<GraphEvent>();
>> +                    events.add(event);
>> +                    timer.schedule(new TimerTask() {
>> +
>> +                        @Override
>> +                        public void run() {
>> +                            List<GraphEvent> eventsLocal;
>> +                            synchronized (ListenerHolder.this) {
>> +                                eventsLocal = events;
>> +                                events = null;
>> +                            }
>> +                            GraphListener listener = listenerRef.get();
>> +                            if (listener == null) {
>> +                                log.debug("Ignoring garbage collected
>> listener");
>> +                            } else {
>> +                                try {
>> +                                    listener.graphChanged(eventsLocal);
>> +                                } catch (Exception e) {
>> +                                    log.warn("Exception delivering
>> ImmutableGraph event", e);
>> +                                }
>> +                            }
>> +                        }
>> +                    }, delay);
>> +                } else {
>> +                    events.add(event);
>> +                }
>> +            }
>> +        }
>> +    }
>> +
>> +    private final Map<GraphListener, ListenerHolder> map =
>> Collections.synchronizedMap(
>> +            new WeakHashMap<GraphListener, ListenerHolder>());
>> +
>> +    void addDelayedListener(GraphListener listener, long delay) {
>> +        map.put(listener, new ListenerHolder(listener, delay));
>> +    }
>> +
>> +    /**
>> +     * removes a Listener, this doesn't prevent the listenerRef from
>> receiving
>> +     * events alreay scheduled.
>> +     *
>> +     * @param listenerRef
>> +     */
>> +    void removeDelayedListener(GraphListener listener) {
>> +        map.remove(listener);
>> +    }
>> +
>> +    /**
>> +     * if the listenerRef has not been registered as delayed listenerRef
>> te events is
>> +     * forwarded synchroneously
>> +     * @param event
>> +     */
>> +    void sendEventToListener(GraphListener listener, GraphEvent event) {
>> +        ListenerHolder holder = map.get(listener);
>> +        if (holder == null) {
>> +            listener.graphChanged(Collections.singletonList(event));
>> +        } else {
>> +            holder.registerEvent(event);
>> +        }
>> +    }
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LockingIterator.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,73 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *   http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +package org.apache.commons.rdf.impl.utils;
>> +
>> +import java.util.Iterator;
>> +import java.util.concurrent.locks.Lock;
>> +import java.util.concurrent.locks.ReadWriteLock;
>> +import org.apache.commons.rdf.Triple;
>> +
>> +/**
>> + * Wrapps an iterator<Triple> reading entering a read-lock on every
>> invocation
>> + * of hasNext and next
>> + * @author reto
>> + */
>> +class LockingIterator implements Iterator<Triple> {
>> +
>> +    private Iterator<Triple> base;
>> +    private Lock readLock;
>> +    private Lock writeLock;
>> +
>> +    public LockingIterator(Iterator<Triple> iterator, ReadWriteLock lock)
>> {
>> +        base = iterator;
>> +        readLock = lock.readLock();
>> +        writeLock = lock.writeLock();
>> +    }
>> +
>> +    @Override
>> +    public boolean hasNext() {
>> +        readLock.lock();
>> +        try {
>> +            return base.hasNext();
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public Triple next() {
>> +        readLock.lock();
>> +        try {
>> +            return base.next();
>> +        } finally {
>> +            readLock.unlock();
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public void remove() {
>> +        writeLock.lock();
>> +        try {
>> +            base.remove();
>> +        } finally {
>> +            writeLock.unlock();
>> +        }
>> +    }
>> +
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,104 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *   http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +package org.apache.commons.rdf.impl.utils;
>> +
>> +import java.io.Serializable;
>> +import org.apache.commons.rdf.Iri;
>> +
>> +import org.apache.commons.rdf.Language;
>> +import org.apache.commons.rdf.Literal;
>> +
>> +/**
>> + *
>> + * @author reto
>> + */
>> +public class PlainLiteralImpl implements Literal, Serializable {
>> +
>> +    private String lexicalForm;
>> +    private Language language = null;
>> +
>> +    public PlainLiteralImpl(String value) {
>> +        if (value == null) {
>> +            throw new IllegalArgumentException("The literal string cannot
>> be null");
>> +        }
>> +        this.lexicalForm = value;
>> +    }
>> +
>> +    public PlainLiteralImpl(String value, Language language) {
>> +        if (value == null) {
>> +            throw new IllegalArgumentException("The literal string cannot
>> be null");
>> +        }
>> +        this.lexicalForm = value;
>> +        this.language = language;
>> +    }
>> +
>> +    @Override
>> +    public String getLexicalForm() {
>> +        return lexicalForm;
>> +    }
>> +
>> +    @Override
>> +    public boolean equals(Object otherObj) {
>> +        if (!(otherObj instanceof Literal)) {
>> +            return false;
>> +        }
>> +        Literal other = (Literal) otherObj;
>> +        if (!lexicalForm.equals(other.getLexicalForm())) {
>> +            return false;
>> +        }
>> +        if (language != null) {
>> +            return language.equals(other.getLanguage());
>> +        }
>> +        if (other.getLanguage() != null) {
>> +            return false;
>> +        }
>> +        return true;
>> +    }
>> +
>> +    @Override
>> +    public int hashCode() {
>> +        int hash = lexicalForm.hashCode() + XSD_STRING_HASH;
>> +        if (language != null) {
>> +            hash += language.hashCode();
>> +        }
>> +        return hash;
>> +    }
>> +
>> +    @Override
>> +    public Language getLanguage() {
>> +        return language;
>> +    }
>> +
>> +    @Override
>> +    public String toString() {
>> +        StringBuffer result = new StringBuffer();
>> +        result.append('\"').append(lexicalForm).append('\"');
>> +        if (language != null) {
>> +            result.append("@").append(language.toString());
>> +        }
>> +        return result.toString();
>> +    }
>> +
>> +    @Override
>> +    public Iri getDataType() {
>> +        return XSD_STRING;
>> +    }
>> +    private static final Iri XSD_STRING = new Iri("
>> http://www.w3.org/2001/XMLSchema#string");
>> +    private static final int XSD_STRING_HASH = XSD_STRING.hashCode();
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TripleImpl.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,100 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *   http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +package org.apache.commons.rdf.impl.utils;
>> +
>> +import org.apache.commons.rdf.BlankNodeOrIri;
>> +import org.apache.commons.rdf.RdfTerm;
>> +import org.apache.commons.rdf.Triple;
>> +import org.apache.commons.rdf.Iri;
>> +
>> +/**
>> + *
>> + * @author reto
>> + */
>> +public class TripleImpl implements Triple {
>> +
>> +    private final BlankNodeOrIri subject;
>> +    private final Iri predicate;
>> +    private final RdfTerm object;
>> +
>> +    /**
>> +     * Creates a new <code>TripleImpl</code>.
>> +     *
>> +     * @param subject  the subject.
>> +     * @param predicate  the predicate.
>> +     * @param object  the object.
>> +     * @throws IllegalArgumentException  if an attribute is
>> <code>null</code>.
>> +     */
>> +    public TripleImpl(BlankNodeOrIri subject, Iri predicate, RdfTerm
>> object) {
>> +        if (subject == null) {
>> +            throw new IllegalArgumentException("Invalid subject: null");
>> +        } else if (predicate == null) {
>> +            throw new IllegalArgumentException("Invalid predicate: null");
>> +        } else if (object == null) {
>> +            throw new IllegalArgumentException("Invalid object: null");
>> +        }
>> +        this.subject = subject;
>> +        this.predicate = predicate;
>> +        this.object = object;
>> +    }
>> +
>> +    @Override
>> +    public boolean equals(Object obj) {
>> +        if (obj == null) {
>> +            return false;
>> +        }
>> +        if (!(obj instanceof Triple)) {
>> +            return false;
>> +        }
>> +        final Triple other = (Triple) obj;
>> +        if (!this.subject.equals(other.getSubject())) {
>> +            return false;
>> +        }
>> +        if (!this.predicate.equals(other.getPredicate())) {
>> +            return false;
>> +        }
>> +        if (!this.object.equals(other.getObject())) {
>> +            return false;
>> +        }
>> +        return true;
>> +    }
>> +
>> +    @Override
>> +    public int hashCode() {
>> +        return (subject.hashCode() >> 1) ^ predicate.hashCode() ^
>> (object.hashCode() << 1);
>> +    }
>> +
>> +    @Override
>> +    public BlankNodeOrIri getSubject() {
>> +        return subject;
>> +    }
>> +
>> +    public Iri getPredicate() {
>> +        return predicate;
>> +    }
>> +
>> +    public RdfTerm getObject() {
>> +        return object;
>> +    }
>> +
>> +    @Override
>> +    public String toString() {
>> +        return subject + " " + predicate + " " + object + ".";
>> +    }
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,80 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *   http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +package org.apache.commons.rdf.impl.utils;
>> +
>> +import java.io.Serializable;
>> +
>> +import org.apache.commons.rdf.Iri;
>> +import org.apache.commons.rdf.Language;
>> +import org.apache.commons.rdf.Literal;
>> +
>> +/**
>> + *
>> + * @author reto
>> + */
>> +public class TypedLiteralImpl extends AbstractLiteral implements
>> Serializable {
>> +    private String lexicalForm;
>> +    private Iri dataType;
>> +    private int hashCode;
>> +
>> +    /**
>> +     * @param lexicalForm
>> +     * @param dataType
>> +     */
>> +    public TypedLiteralImpl(String lexicalForm, Iri dataType) {
>> +        this.lexicalForm = lexicalForm;
>> +        this.dataType = dataType;
>> +        this.hashCode = lexicalForm.hashCode()+dataType.hashCode();
>> +    }
>> +
>> +    public Iri getDataType() {
>> +        return dataType;
>> +    }
>> +
>> +    /* (non-Javadoc)
>> +     * @see org.apache.clerezza.rdf.core.LiteralNode#getLexicalForm()
>> +     */
>> +    @Override
>> +    public String getLexicalForm() {
>> +        return lexicalForm;
>> +    }
>> +
>> +    @Override
>> +    public int hashCode() {
>> +        return hashCode;
>> +    }
>> +
>> +
>> +    @Override
>> +    public String toString() {
>> +        StringBuffer result = new StringBuffer();
>> +        result.append('\"');
>> +        result.append(getLexicalForm());
>> +        result.append('\"');
>> +        result.append("^^");
>> +        result.append(getDataType());
>> +        return result.toString();
>> +    }
>> +
>> +    @Override
>> +    public Language getLanguage() {
>> +        return null;
>> +    }
>> +
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/WatchableGraphWrapper.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,289 @@
>> +/*
>> + * Copyright 2015 The Apache Software Foundation.
>> + *
>> + * Licensed under the Apache License, Version 2.0 (the "License");
>> + * you may not use this file except in compliance with the License.
>> + * You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.commons.rdf.impl.utils;
>> +
>> +import java.lang.ref.WeakReference;
>> +import java.util.Collection;
>> +import java.util.Collections;
>> +import java.util.HashSet;
>> +import java.util.Iterator;
>> +import java.util.Set;
>> +import java.util.concurrent.locks.ReadWriteLock;
>> +import org.apache.commons.rdf.BlankNodeOrIri;
>> +import org.apache.commons.rdf.Graph;
>> +import org.apache.commons.rdf.ImmutableGraph;
>> +import org.apache.commons.rdf.Iri;
>> +import org.apache.commons.rdf.RdfTerm;
>> +import org.apache.commons.rdf.Triple;
>> +import org.apache.commons.rdf.WatchableGraph;
>> +import org.apache.commons.rdf.event.AddEvent;
>> +import org.apache.commons.rdf.event.FilterTriple;
>> +import org.apache.commons.rdf.event.GraphEvent;
>> +import org.apache.commons.rdf.event.GraphListener;
>> +import org.apache.commons.rdf.event.RemoveEvent;
>> +
>> +/**
>> + *
>> + * @author developer
>> + */
>> +public class WatchableGraphWrapper implements WatchableGraph {
>> +
>> +    final Graph wrapped;
>> +
>> +    public WatchableGraphWrapper(Graph wrapped) {
>> +        this.wrapped = wrapped;
>> +    }
>> +
>> +
>> +    //all listeners
>> +    private final Set<ListenerConfiguration> listenerConfigs =
>> Collections.synchronizedSet(
>> +            new HashSet<ListenerConfiguration>());
>> +    private DelayedNotificator delayedNotificator = new
>> DelayedNotificator();
>> +
>> +    @Override
>> +    public Iterator<Triple> iterator() {
>> +        return filter(null, null, null);
>> +    }
>> +
>> +    @Override
>> +    public boolean contains(Object o) {
>> +        if (!(o instanceof Triple)) {
>> +            return false;
>> +        }
>> +        Triple t = (Triple) o;
>> +        return filter(t.getSubject(), t.getPredicate(),
>> t.getObject()).hasNext();
>> +    }
>> +
>> +    @Override
>> +    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri predicate,
>> +            RdfTerm object) {
>> +        final Iterator<Triple> baseIter = wrapped.filter(subject,
>> predicate, object);
>> +        return new Iterator<Triple>() {
>> +
>> +            Triple currentTriple = null;
>> +
>> +            @Override
>> +            public boolean hasNext() {
>> +                return baseIter.hasNext();
>> +            }
>> +
>> +            @Override
>> +            public Triple next() {
>> +                currentTriple = baseIter.next();
>> +                return currentTriple;
>> +            }
>> +
>> +            @Override
>> +            public void remove() {
>> +                baseIter.remove();
>> +                dispatchEvent(new RemoveEvent(WatchableGraphWrapper.this,
>> currentTriple));
>> +            }
>> +        };
>> +    }
>> +
>> +    @Override
>> +    public boolean add(Triple triple) {
>> +        boolean success = performAdd(triple);
>> +        if (success) {
>> +            dispatchEvent(new AddEvent(this, triple));
>> +        }
>> +        return success;
>> +    }
>> +
>> +    /**
>> +     * A subclass of <code>AbstractGraph</code> should override
>> +     * this method instead of <code>add</code> for Graph event support to
>> be
>> +     * added.
>> +     *
>> +     * @param e The triple to be added to the triple collection
>> +     * @return
>> +     */
>> +    protected boolean performAdd(Triple e) {
>> +        return wrapped.add(e);
>> +    }
>> +
>> +    @Override
>> +    public boolean remove(Object o) {
>> +        Triple triple = (Triple) o;
>> +        boolean success = performRemove(triple);
>> +        if (success) {
>> +            dispatchEvent(new RemoveEvent(this, triple));
>> +        }
>> +        return success;
>> +    }
>> +
>> +    @Override
>> +    public boolean removeAll(Collection<?> c) {
>> +        boolean modified = false;
>> +        for (Iterator<? extends Object> it = c.iterator(); it.hasNext();)
>> {
>> +            Object object = it.next();
>> +            if (remove(object)) {
>> +                modified = true;
>> +            }
>> +        }
>> +        return modified;
>> +    }
>> +
>> +    /**
>> +     * A subclass of <code>AbstractGraph</code> should override
>> +     * this method instead of <code>remove</code> for ImmutableGraph
>> event support to be
>> +     * added.
>> +     *
>> +     * @param o The triple to be removed from the triple collection
>> +     * @return
>> +     */
>> +    protected boolean performRemove(Triple triple) {
>> +        Iterator<Triple> e = filter(null, null, null);
>> +        while (e.hasNext()) {
>> +            if (triple.equals(e.next())) {
>> +                e.remove();
>> +                return true;
>> +            }
>> +        }
>> +        return false;
>> +    }
>> +
>> +    /**
>> +     * Dispatches a <code>GraphEvent</code> to all registered listeners
>> for which
>> +     * the specified <code>Triple</code> matches the
>> <code>FilterTriple</code>s
>> +     * of the listeners.
>> +     *
>> +     * @param triple The Triple that was modified
>> +     * @param type The type of modification
>> +     */
>> +    protected void dispatchEvent(GraphEvent event) {
>> +        synchronized(listenerConfigs) {
>> +            Iterator<ListenerConfiguration> iter =
>> listenerConfigs.iterator();
>> +            while (iter.hasNext()) {
>> +                ListenerConfiguration config = iter.next();
>> +                GraphListener registeredListener = config.getListener();
>> +                if (registeredListener == null) {
>> +                    iter.remove();
>> +                    continue;
>> +                }
>> +                if (config.getFilter().match(event.getTriple())) {
>> +
>> delayedNotificator.sendEventToListener(registeredListener, event);
>> +                }
>> +            }
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public void addGraphListener(GraphListener listener, FilterTriple
>> filter) {
>> +        addGraphListener(listener, filter, 0);
>> +    }
>> +
>> +    @Override
>> +    public void addGraphListener(GraphListener listener, FilterTriple
>> filter,
>> +            long delay) {
>> +        listenerConfigs.add(new ListenerConfiguration(listener, filter));
>> +        if (delay > 0) {
>> +            delayedNotificator.addDelayedListener(listener, delay);
>> +        }
>> +    }
>> +
>> +    @Override
>> +    public void removeGraphListener(GraphListener listener) {
>> +        synchronized(listenerConfigs) {
>> +            Iterator<ListenerConfiguration> iter =
>> listenerConfigs.iterator();
>> +            while (iter.hasNext()) {
>> +                ListenerConfiguration listenerConfig = iter.next();
>> +                GraphListener registeredListener =
>> listenerConfig.getListener();
>> +                if ((registeredListener == null) ||
>> (registeredListener.equals(listener))) {
>> +                    iter.remove();
>> +                }
>> +            }
>> +        }
>> +        delayedNotificator.removeDelayedListener(listener);
>> +    }
>> +
>> +    @Override
>> +    public ImmutableGraph getImmutableGraph() {
>> +        throw new UnsupportedOperationException("Not supported yet.");
>> //To change body of generated methods, choose Tools | Templates.
>> +    }
>> +
>> +    @Override
>> +    public ReadWriteLock getLock() {
>> +        return wrapped.getLock();
>> +    }
>> +
>> +    @Override
>> +    public int size() {
>> +        return wrapped.size();
>> +    }
>> +
>> +    @Override
>> +    public boolean isEmpty() {
>> +        return wrapped.isEmpty();
>> +    }
>> +
>> +    @Override
>> +    public Object[] toArray() {
>> +        return wrapped.toArray();
>> +    }
>> +
>> +    @Override
>> +    public <T> T[] toArray(T[] a) {
>> +        return wrapped.toArray(a);
>> +    }
>> +
>> +    @Override
>> +    public boolean containsAll(Collection<?> c) {
>> +        return wrapped.containsAll(c);
>> +    }
>> +
>> +    @Override
>> +    public boolean addAll(Collection<? extends Triple> c) {
>> +        return wrapped.addAll(c);
>> +    }
>> +
>> +    @Override
>> +    public boolean retainAll(Collection<?> c) {
>> +        return wrapped.retainAll(c);
>> +    }
>> +
>> +    @Override
>> +    public void clear() {
>> +        wrapped.clear();
>> +    }
>> +
>> +    private static class ListenerConfiguration {
>> +
>> +        private WeakReference<GraphListener> listenerRef;
>> +        private FilterTriple filter;
>> +
>> +        private ListenerConfiguration(GraphListener listener,
>> FilterTriple filter) {
>> +            this.listenerRef = new WeakReference<GraphListener>(listener);
>> +            this.filter = filter;
>> +        }
>> +
>> +        /**
>> +         * @return the listener
>> +         */
>> +        GraphListener getListener() {
>> +            GraphListener listener = listenerRef.get();
>> +            return listener;
>> +        }
>> +
>> +        /**
>> +         * @return the filter
>> +         */
>> +        FilterTriple getFilter() {
>> +            return filter;
>> +        }
>> +    }
>> +
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReadLockDebug.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,85 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *   http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +
>> +package org.apache.commons.rdf.impl.utils.debug;
>> +
>> +import java.util.concurrent.TimeUnit;
>> +import java.util.concurrent.locks.Condition;
>> +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
>> +
>> +/**
>> + *
>> + * @author mir
>> + */
>> +public class ReadLockDebug extends ReadLock {
>> +
>> +    ReentrantReadWriteLockTracker lock;
>> +    StackTraceElement[] stackTrace;
>> +
>> +    ReadLock readLock;
>> +    public ReadLockDebug(ReentrantReadWriteLockTracker lock) {
>> +        super(lock);
>> +        this.lock = lock;
>> +        this.readLock = lock.realReadLock();
>> +    }
>> +
>> +    @Override
>> +    public void lock() {
>> +        readLock.lock();
>> +        lock.addLockedReadLock(this);
>> +        stackTrace = Thread.currentThread().getStackTrace();
>> +    }
>> +
>> +    @Override
>> +    public void lockInterruptibly() throws InterruptedException {
>> +        readLock.lockInterruptibly();
>> +    }
>> +
>> +    @Override
>> +    public Condition newCondition() {
>> +        return readLock.newCondition();
>> +    }
>> +
>> +    @Override
>> +    public String toString() {
>> +        return readLock.toString();
>> +    }
>> +
>> +    @Override
>> +    public boolean tryLock() {
>> +        return readLock.tryLock();
>> +    }
>> +
>> +    @Override
>> +    public boolean tryLock(long timeout, TimeUnit unit) throws
>> InterruptedException {
>> +        return readLock.tryLock(timeout, unit);
>> +    }
>> +
>> +    @Override
>> +    public void unlock() {
>> +        readLock.unlock();
>> +        lock.removeReadLock(this);
>> +        stackTrace = null;
>> +    }
>> +
>> +    public StackTraceElement[] getStackTrace() {
>> +        return stackTrace;
>> +    }
>> +
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/ReentrantReadWriteLockTracker.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,133 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *   http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +package org.apache.commons.rdf.impl.utils.debug;
>> +
>> +import java.util.Collection;
>> +import java.util.Collections;
>> +import java.util.HashSet;
>> +import java.util.Set;
>> +import java.util.concurrent.locks.Condition;
>> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>> +
>> +/**
>> + *
>> + * @author mir
>> + */
>> +public class ReentrantReadWriteLockTracker extends ReentrantReadWriteLock
>> {
>> +
>> +
>> +    private Set<ReadLockDebug> lockedReadLocks =
>> Collections.synchronizedSet(new HashSet<ReadLockDebug>());
>> +    private final WriteLockDebug writeLock = new WriteLockDebug(this);
>> +    @Override
>> +    protected Thread getOwner() {
>> +        return super.getOwner();
>> +    }
>> +
>> +    @Override
>> +    protected Collection<Thread> getQueuedReaderThreads() {
>> +        return super.getQueuedReaderThreads();
>> +    }
>> +
>> +    @Override
>> +    protected Collection<Thread> getQueuedThreads() {
>> +        return super.getQueuedThreads();
>> +    }
>> +
>> +    @Override
>> +    protected Collection<Thread> getQueuedWriterThreads() {
>> +        return super.getQueuedWriterThreads();
>> +    }
>> +
>> +    @Override
>> +    public int getReadHoldCount() {
>> +        return super.getReadHoldCount();
>> +    }
>> +
>> +    @Override
>> +    public int getReadLockCount() {
>> +        return super.getReadLockCount();
>> +    }
>> +
>> +    @Override
>> +    public int getWaitQueueLength(Condition condition) {
>> +        return super.getWaitQueueLength(condition);
>> +    }
>> +
>> +    @Override
>> +    protected Collection<Thread> getWaitingThreads(Condition condition) {
>> +        return super.getWaitingThreads(condition);
>> +    }
>> +
>> +    @Override
>> +    public int getWriteHoldCount() {
>> +        return super.getWriteHoldCount();
>> +    }
>> +
>> +    @Override
>> +    public boolean hasWaiters(Condition condition) {
>> +        return super.hasWaiters(condition);
>> +    }
>> +
>> +    @Override
>> +    public boolean isWriteLocked() {
>> +        return super.isWriteLocked();
>> +    }
>> +
>> +    @Override
>> +    public boolean isWriteLockedByCurrentThread() {
>> +        return super.isWriteLockedByCurrentThread();
>> +    }
>> +
>> +    @Override
>> +    public ReadLock readLock() {
>> +        return new ReadLockDebug(this);
>> +    }
>> +
>> +    ReadLock realReadLock() {
>> +        return super.readLock();
>> +    }
>> +
>> +    WriteLock realWriteLock() {
>> +        return super.writeLock();
>> +    }
>> +
>> +    @Override
>> +    public String toString() {
>> +        return super.toString();
>> +    }
>> +
>> +    @Override
>> +    public WriteLockDebug writeLock() {
>> +        return writeLock;
>> +    }
>> +
>> +    void addLockedReadLock(ReadLockDebug lock) {
>> +        lockedReadLocks.add(lock);
>> +    }
>> +
>> +    void removeReadLock(ReadLockDebug lock) {
>> +        lockedReadLocks.remove(lock);
>> +    }
>> +
>> +    public Set<ReadLockDebug> getLockedReadLocks() {
>> +        return lockedReadLocks;
>> +    }
>> +
>> +
>> +}
>>
>> Added:
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> URL:
>> http://svn.apache.org/viewvc/commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java?rev=1659973&view=auto
>>
>> ==============================================================================
>> ---
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> (added)
>> +++
>> commons/sandbox/rdf/trunk/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/debug/WriteLockDebug.java
>> Sun Feb 15 18:41:15 2015
>> @@ -0,0 +1,89 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + *   http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + */
>> +
>> +package org.apache.commons.rdf.impl.utils.debug;
>> +
>> +import java.util.concurrent.TimeUnit;
>> +import java.util.concurrent.locks.Condition;
>> +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
>> +
>> +/**
>> + *
>> + * @author mir
>> + */
>> +public class WriteLockDebug extends WriteLock {
>> +
>> +    private ReentrantReadWriteLockTracker lock;
>> +    private WriteLock writeLock;
>> +    private StackTraceElement[] stackTrace;
>> +
>> +    public WriteLockDebug(ReentrantReadWriteLockTracker lock) {
>> +        super(lock);
>> +        this.lock = lock;
>> +        this.writeLock = lock.realWriteLock();
>> +    }
>> +
>> +    @Override
>> +    public int getHoldCount() {
>> +        return writeLock.getHoldCount();
>> +    }
>> +
>> +    @Override
>> +    public boolean isHeldByCurrentThread() {
>> +        return writeLock.isHeldByCurrentThread();
>> +    }
>> +
>> +    @Override
>> +    public void lock() {
>> +        writeLock.lock();
>> +        stackTrace = Thread.currentThread().getStackTrace();
>> +    }
>> +
>> +    @Override
>> +    public void lockInterruptibly() throws InterruptedException {
>> +        writeLock.lockInterruptibly();
>> +    }
>> +
>> +    @Override
>> +    public Condition newCondition() {
>> +        return writeLock.newCondition();
>> +    }
>> +
>> +    @Override
>> +    public boolean tryLock() {
>> +        return writeLock.tryLock();
>> +    }
>> +
>> +    @Override
>> +    public boolean tryLock(long timeout, TimeUnit unit) throws
>> InterruptedException {
>> +        return writeLock.tryLock(timeout, unit);
>> +    }
>> +
>> +    @Override
>> +    public void unlock() {
>> +        writeLock.unlock();
>> +        stackTrace = null;
>> +    }
>> +
>> +    public StackTraceElement[] getStackTrace() {
>> +        return stackTrace;
>> +    }
>> +
>> +
>> +}
>>
>>
>>
>
>
> --
> http://people.apache.org/~britter/
> http://www.systemoutprintln.de/
> http://twitter.com/BenediktRitter
> http://github.com/britter

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org