Hi all,

Sorry that I couldn't reply earlier.

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

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

Cheers,
Reto

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

> I am not speaking for Reto, but I imagined that since Reto has joined
> the CommonsRDF incubator proposal, then his sandbox-code would
> eventually turn into pull requests and branches on the incubator
> codebase so that we can evaluate each of the differences separately.
>
>
> On 19 February 2015 at 06:54, Benedikt Ritter <brit...@apache.org> wrote:
> > 2015-02-17 7:04 GMT+01:00 Benedikt Ritter <brit...@apache.org>:
> >
> >>
> >>
> >> 2015-02-17 0:13 GMT+01:00 Peter Ansell <ansell.pe...@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 <brit...@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 <r...@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-unsubscr...@commons.apache.org
> >>> For additional commands, e-mail: dev-h...@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
>

Reply via email to