Skip to content

Commit

Permalink
Replace clerezza code with jena
Browse files Browse the repository at this point in the history
- Use n-triples content-type for jena RDF processing

Resolves: https://jira.duraspace.org/browse/FCREPO-1730
  • Loading branch information
acoburn authored and Andrew Woods committed Sep 15, 2015
1 parent 44eeac1 commit 56c1d73
Show file tree
Hide file tree
Showing 9 changed files with 84 additions and 65 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -1,5 +1,6 @@
*.class
fcrepo4-data/
*transaction.log
*~

# Mobile Tools for Java (J2ME)
Expand Down
4 changes: 4 additions & 0 deletions fcrepo-audit-triplestore/pom.xml
Expand Up @@ -43,6 +43,10 @@
<groupId>org.fcrepo</groupId>
<artifactId>fcrepo-audit</artifactId>
</dependency>
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>jena-core</artifactId>
</dependency>

<!-- logging -->
<dependency>
Expand Down
Expand Up @@ -18,16 +18,19 @@
import static org.fcrepo.audit.AuditNamespaces.AUDIT;
import static org.fcrepo.audit.AuditNamespaces.PREMIS;
import static org.fcrepo.audit.AuditNamespaces.PROV;
import static org.fcrepo.audit.AuditNamespaces.XSD;
import static org.fcrepo.camel.RdfNamespaces.RDF;
import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDdateTime;
import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDstring;
import static com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createProperty;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createTypedLiteral;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.TimeZone;

import org.fcrepo.audit.AuditUtils;
Expand All @@ -37,14 +40,9 @@
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.apache.clerezza.rdf.core.Triple;
import org.apache.clerezza.rdf.core.UriRef;
import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
import org.apache.clerezza.rdf.core.impl.TripleImpl;
import org.apache.clerezza.rdf.core.impl.TypedLiteralImpl;
import org.apache.clerezza.rdf.core.serializedform.SerializingProvider;
import org.apache.clerezza.rdf.jena.serializer.JenaSerializerProvider;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource;

/**
* A processor that converts an audit message into a sparql-update
Expand All @@ -66,17 +64,11 @@ public void process(final Exchange exchange) throws Exception {
final Message in = exchange.getIn();
final String eventURIBase = in.getHeader(AuditHeaders.EVENT_BASE_URI, String.class);
final String eventID = in.getHeader(JmsHeaders.EVENT_ID, String.class);
final UriRef eventURI = new UriRef(eventURIBase + "/" + eventID);
final Set<Triple> triples = triplesForMessage(in, eventURI);

// serialize triples
final SerializingProvider serializer = new JenaSerializerProvider();
final ByteArrayOutputStream serializedGraph = new ByteArrayOutputStream();
serializer.serialize(serializedGraph, new SimpleMGraph(triples), "text/rdf+nt");
final Resource eventURI = createResource(eventURIBase + "/" + eventID);

// generate SPARQL Update
final StringBuilder query = new StringBuilder("update=");
query.append(ProcessorUtils.insertData(serializedGraph.toString("UTF-8"), null));
query.append(ProcessorUtils.insertData(serializedGraphForMessage(in, eventURI), null));

// update exchange
in.setBody(query.toString());
Expand All @@ -86,19 +78,15 @@ public void process(final Exchange exchange) throws Exception {
}

// namespaces and properties
private static final UriRef INTERNAL_EVENT = new UriRef(AUDIT + "InternalEvent");
private static final UriRef PREMIS_EVENT = new UriRef(PREMIS + "Event");
private static final UriRef PROV_EVENT = new UriRef(PROV + "InstantaneousEvent");

private static final UriRef PREMIS_TIME = new UriRef(PREMIS + "hasEventDateTime");
private static final UriRef PREMIS_OBJ = new UriRef(PREMIS + "hasEventRelatedObject");
private static final UriRef PREMIS_AGENT = new UriRef(PREMIS + "hasEventRelatedAgent");
private static final UriRef PREMIS_TYPE = new UriRef(PREMIS + "hasEventType");

private static final UriRef RDF_TYPE = new UriRef(RDF + "type");
private static final UriRef XSD_DATE = new UriRef(XSD + "dateTime");
private static final UriRef XSD_STRING = new UriRef(XSD + "string");
private static final Resource INTERNAL_EVENT = createResource(AUDIT + "InternalEvent");
private static final Resource PREMIS_EVENT = createResource(PREMIS + "Event");
private static final Resource PROV_EVENT = createResource(PROV + "InstantaneousEvent");

private static final Property PREMIS_TIME = createProperty(PREMIS + "hasEventDateTime");
private static final Property PREMIS_OBJ = createProperty(PREMIS + "hasEventRelatedObject");
private static final Property PREMIS_AGENT = createProperty(PREMIS + "hasEventRelatedAgent");
private static final Property PREMIS_TYPE = createProperty(PREMIS + "hasEventType");
private static final Property RDF_TYPE = createProperty(RDF + "type");

private static final String EMPTY_STRING = "";

Expand All @@ -107,7 +95,11 @@ public void process(final Exchange exchange) throws Exception {
* @param message Camel message produced by an audit event
* @param subject RDF subject of the audit description
*/
private static Set<Triple> triplesForMessage(final Message message, final UriRef subject) throws IOException {
private static String serializedGraphForMessage(final Message message, final Resource subject) throws IOException {

// serialize triples
final ByteArrayOutputStream serializedGraph = new ByteArrayOutputStream();
final Model model = createDefaultModel();

// get info from jms message headers
final String eventType = (String) message.getHeader(JmsHeaders.EVENT_TYPE, EMPTY_STRING);
Expand All @@ -121,20 +113,20 @@ private static Set<Triple> triplesForMessage(final Message message, final UriRef
final String identifier = ProcessorUtils.getSubjectUri(message);
final String premisType = AuditUtils.getAuditEventType(eventType, properties);

// types
final Set<Triple> triples = new HashSet<>();
triples.add( new TripleImpl(subject, RDF_TYPE, INTERNAL_EVENT) );
triples.add( new TripleImpl(subject, RDF_TYPE, PREMIS_EVENT) );
triples.add( new TripleImpl(subject, RDF_TYPE, PROV_EVENT) );
model.add( model.createStatement(subject, RDF_TYPE, INTERNAL_EVENT) );
model.add( model.createStatement(subject, RDF_TYPE, PREMIS_EVENT) );
model.add( model.createStatement(subject, RDF_TYPE, PROV_EVENT) );

// basic event info
triples.add( new TripleImpl(subject, PREMIS_TIME, new TypedLiteralImpl(date, XSD_DATE)) );
triples.add( new TripleImpl(subject, PREMIS_OBJ, new UriRef(identifier)) );
triples.add( new TripleImpl(subject, PREMIS_AGENT, new TypedLiteralImpl(user, XSD_STRING)) );
triples.add( new TripleImpl(subject, PREMIS_AGENT, new TypedLiteralImpl(agent, XSD_STRING)) );
model.add( model.createStatement(subject, PREMIS_TIME, createTypedLiteral(date, XSDdateTime)) );
model.add( model.createStatement(subject, PREMIS_OBJ, createResource(identifier)) );
model.add( model.createStatement(subject, PREMIS_AGENT, createTypedLiteral(user, XSDstring)) );
model.add( model.createStatement(subject, PREMIS_AGENT, createTypedLiteral(agent, XSDstring)) );
if (premisType != null) {
triples.add(new TripleImpl(subject, PREMIS_TYPE, new UriRef(premisType)));
model.add(model.createStatement(subject, PREMIS_TYPE, createResource(premisType)));
}
return triples;

model.write(serializedGraph, "N-TRIPLE");
return serializedGraph.toString("UTF-8");
}
}
6 changes: 6 additions & 0 deletions fcrepo-fixity/pom.xml
Expand Up @@ -65,6 +65,12 @@
<artifactId>camel-test-blueprint</artifactId>
</dependency>

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
Expand Down
6 changes: 6 additions & 0 deletions fcrepo-indexing-solr/pom.xml
Expand Up @@ -85,6 +85,12 @@
<artifactId>hamcrest-all</artifactId>
</dependency>

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<scope>test</scope>
</dependency>

</dependencies>

<build>
Expand Down
Expand Up @@ -113,6 +113,7 @@ public void configure() throws Exception {
.routeId("FcrepoTriplestoreUpdater")
.setHeader(FCREPO_NAMED_GRAPH)
.simple("{{triplestore.namedGraph}}")
.to("fcrepo:{{fcrepo.baseUrl}}?accept=application/n-triples")
.process(new SparqlUpdateProcessor())
.log(LoggingLevel.INFO, logger,
"Indexing Triplestore Object ${headers[CamelFcrepoIdentifier]} " +
Expand Down
Expand Up @@ -158,7 +158,7 @@ public void configure() throws Exception {
getMockEndpoint(fusekiEndpoint).expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 200);
getMockEndpoint("mock://direct:delete.triplestore").expectedMessageCount(0);
getMockEndpoint("mock://direct:update.triplestore").expectedMessageCount(1);
getMockEndpoint(fcrepoEndpoint).expectedMessageCount(1);
getMockEndpoint(fcrepoEndpoint).expectedMessageCount(2);

await().until(TestUtils.triplestoreCount(fusekiBase, fullPath), equalTo(0));

Expand Down
25 changes: 16 additions & 9 deletions pom.xml
Expand Up @@ -40,10 +40,14 @@
<camel.version>2.15.1</camel.version>
<commons.lang3.version>3.3.2</commons.lang3.version>
<jackson2.version>2.5.2</jackson2.version>
<jena.version>2.13.0</jena.version>
<logback.version>1.1.2</logback.version>
<mustache.version>0.9.0</mustache.version>
<slf4j.version>1.7.10</slf4j.version>
<spring.version>4.1.5.RELEASE</spring.version>
<fcrepo.version>4.3.0</fcrepo.version>
<fcrepo-audit.version>4.3.0</fcrepo-audit.version>
<fcrepo-camel.version>4.3.1-SNAPSHOT</fcrepo-camel.version>
<!-- testing -->
<awaitility.version>1.6.3</awaitility.version>
<commons.codec.version>1.10</commons.codec.version>
Expand Down Expand Up @@ -175,7 +179,7 @@
<dependency>
<groupId>org.fcrepo.camel</groupId>
<artifactId>fcrepo-camel</artifactId>
<version>4.3.0</version>
<version>${fcrepo-camel.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
Expand All @@ -187,15 +191,25 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>jena-core</artifactId>
<version>${jena.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons.lang3.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.io.version}</version>
</dependency>
<dependency>
<groupId>org.fcrepo</groupId>
<artifactId>fcrepo-audit</artifactId>
<version>4.3.0</version>
<version>${fcrepo-audit.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
Expand Down Expand Up @@ -315,13 +329,6 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.io.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>jena-fuseki</artifactId>
Expand Down
26 changes: 14 additions & 12 deletions src/main/resources/features.xml
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.0.0" name="fcrepo-camel-toolbox-${project.version}">
<repository>mvn:org.fcrepo.camel/fcrepo-camel/${project.version}/xml/features</repository>
<repository>mvn:org.fcrepo.camel/fcrepo-camel/${fcrepo-camel.version}/xml/features</repository>
<repository>mvn:org.apache.camel.karaf/apache-camel/${camel.version}/xml/features</repository>
<repository>mvn:org.apache.activemq/activemq-karaf/${activemq.version}/xml/features</repository>

Expand All @@ -18,7 +18,7 @@
<feature version="${camel.version}">camel-blueprint</feature>
<feature version="${camel.version}">camel-spring</feature>
<feature version="${activemq.version}">activemq-camel</feature>
<feature version="${project.version}">fcrepo-camel</feature>
<feature version="${fcrepo-camel.version}">fcrepo-camel</feature>
<configfile finalname="/etc/org.fcrepo.camel.indexing.solr.cfg">mvn:org.fcrepo.camel/fcrepo-indexing-solr/${project.version}/cfg/configuration</configfile>
</feature>

Expand All @@ -30,7 +30,7 @@
<feature version="${camel.version}">camel-blueprint</feature>
<feature version="${camel.version}">camel-spring</feature>
<feature version="${activemq.version}">activemq-camel</feature>
<feature version="${project.version}">fcrepo-camel</feature>
<feature version="${fcrepo-camel.version}">fcrepo-camel</feature>
<configfile finalname="/etc/org.fcrepo.camel.fixity.cfg">mvn:org.fcrepo.camel/fcrepo-fixity/${project.version}/cfg/configuration</configfile>
</feature>

Expand All @@ -45,7 +45,7 @@
<feature version="${camel.version}">camel-blueprint</feature>
<feature version="${camel.version}">camel-spring</feature>
<feature version="${activemq.version}">activemq-camel</feature>
<feature version="${project.version}">fcrepo-camel</feature>
<feature version="${fcrepo-camel.version}">fcrepo-camel</feature>
<configfile finalname="/etc/org.fcrepo.camel.indexing.triplestore.cfg">mvn:org.fcrepo.camel/fcrepo-indexing-triplestore/${project.version}/cfg/configuration</configfile>
</feature>

Expand All @@ -63,23 +63,25 @@
<feature version="${camel.version}">camel-restlet</feature>
<feature version="${camel.version}">camel-spring</feature>
<feature version="${activemq.version}">activemq-camel</feature>
<feature version="${project.version}">fcrepo-camel</feature>
<feature version="${fcrepo-camel.version}">fcrepo-camel</feature>
<configfile finalname="/etc/org.fcrepo.camel.reindexing.cfg">mvn:org.fcrepo.camel/fcrepo-reindexing/${project.version}/cfg/configuration</configfile>
</feature>

<feature name="fcrepo-audit-triplestore" version="${project.version}" resolver="(obr)" start-level="50">
<details>Installs the fcrepo audit service with a triplestore backend</details>
<bundle>mvn:org.fcrepo.camel/fcrepo-audit-triplestore/${project.version}</bundle>

<bundle dependency="true">mvn:org.apache.jena/jena-osgi/${jena.version}</bundle>

<!-- The following bundles are defined in a self-contained feature in the fcrepo-karaf project.
Once fcrepo-karaf is published to maven the following can be replaced with
<feature version="${project.version}">fcrepo-audit</feature>
<feature version="${fcrepo-audit.version}">fcrepo-audit</feature>
-->
<bundle dependency="true">mvn:org.fcrepo/fcrepo-audit/${project.version}</bundle>
<bundle dependency="true">mvn:org.fcrepo/fcrepo-metrics/${project.version}</bundle>
<bundle dependency="true">mvn:org.fcrepo/fcrepo-kernel-api/${project.version}</bundle>
<bundle dependency="true">mvn:org.fcrepo/fcrepo-kernel-modeshape/${project.version}</bundle>
<bundle dependency="true">mvn:org.fcrepo/fcrepo-mint/${project.version}</bundle>
<bundle dependency="true">mvn:org.fcrepo/fcrepo-audit/${fcrepo-audit.version}</bundle>
<bundle dependency="true">mvn:org.fcrepo/fcrepo-metrics/${fcrepo.version}</bundle>
<bundle dependency="true">mvn:org.fcrepo/fcrepo-kernel-api/${fcrepo.version}</bundle>
<bundle dependency="true">mvn:org.fcrepo/fcrepo-kernel-modeshape/${fcrepo.version}</bundle>
<bundle dependency="true">mvn:org.fcrepo/fcrepo-mint/${fcrepo.version}</bundle>
<bundle dependency="true">mvn:javax.jcr/jcr/2.0</bundle>
<bundle dependency="true">wrap:mvn:org.apache.jena/jena-core/2.12.1</bundle>
<bundle dependency="true">wrap:mvn:org.apache.jena/jena-arq/2.12.1</bundle>
Expand Down Expand Up @@ -136,7 +138,7 @@
<feature version="${camel.version}">camel-blueprint</feature>
<feature version="${camel.version}">camel-spring</feature>
<feature version="${activemq.version}">activemq-camel</feature>
<feature version="${project.version}">fcrepo-camel</feature>
<feature version="${fcrepo-camel.version}">fcrepo-camel</feature>
<configfile finalname="/etc/org.fcrepo.camel.audit.cfg">mvn:org.fcrepo.camel/fcrepo-audit-triplestore/${project.version}/cfg/configuration</configfile>
</feature>

Expand Down

0 comments on commit 56c1d73

Please sign in to comment.