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 --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org