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