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 >