commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stian Soiland-Reyes <st...@apache.org>
Subject 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/...
Date Thu, 19 Feb 2015 15:01:58 GMT
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 <britter@apache.org> wrote:
> 2015-02-17 7:04 GMT+01:00 Benedikt Ritter <britter@apache.org>:
>
>>
>>
>> 2015-02-17 0:13 GMT+01:00 Peter Ansell <ansell.peter@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 <britter@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 <reto@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


Mime
View raw message