The proposed implementation of the audit service is to use the existing eventing system, Camel workflow engine, and external triplestore.
The first phase of implementation will be to use the existing event system to emit messages about audit events, process those events with Camel, and creating RDF for events in an external triplestore. The primary goal of this phase is to satisfy the audit service requirements with minimal impact on the repository.
The second phase of the implementation will be to create an optional component for persisting audit information in the repository. The primary goal of this phase is to improve the durability of the audit persistence using the repository.
Instead of creating a new REST API, we could simply create a container named, e.g., "audit" within any container. External events could be posted there using the existing LDP API, and we would need to update Fedora 4 to do that automatically for internal events. Much of the machinery needed to do this is already in place as part of the JMS module which currently listens to JCR events emits JMS events for all repository updates. We could either update the JMS module to also create audit nodes, or create a separate module just for listening to JCR events and creating audit nodes.
Following the Audit Service PROV-O vs PREMIS guidelines, a typical event encoded in RDF would look like this:
@prefix audit: <http://fedora.info/definitions/v4/audit#> . @prefix fedora: <http://fedora.info/definitions/v4/repository#> . @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix premis: <http://www.loc.gov/premis/rdf/v1#> . @prefix prov: <http://www.w3.org/ns/prov#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . <event1> a prov:InstantaneousEvent, premis:Event, audit:InternalEvent ; premis:hasEventRelatedAgent "jquser"^^xsd:string, "Client Software v1.2.3"^^xsd:string . premis:hasEventType <http://id.loc.gov/vocabulary/preservationEvents/cre> ; premis:hasEventRelatedObject <http://localhost:8080/rest/55/59/ec/05/5559ec05-6ab1-4d61-905a-a5f3da360b23> ; premis:hasEventDateTime "2012-04-30T20:40:40"^^xsd:dateTime . |
External events (either directly added to a triplestore or created using the REST API in phase 2), should include the rdf:type audit:ExternalEvent to differentiate them from internal events.
Fixity events will also include the checksum generated:
<event1> premis:hasFixity <event1#fixity1> ; premis:EventOutcomeInformation "SUCCESS" . <event1#fixity1> a premis:Fixity ; premis:hasMessageDigest "cf23df2207d99a74fbe169e3eba035e633b65d94"^^xsd:string ; premis:hasMessageDigestAlgorithm "SHA1"^^xsd:string . |
<event1> a prov:InstantaneousEvent, premis:Event ; premis:hasEventRelatedAgent <agent1> ; <agent1> a premis:Agent ; premis:agentType <http://id.loc.gov/vocabulary/preservation/agentType/sof> ; foaf:name "Client Software v1.2.3"^^xsd:String ; prov:actedOnBehalfOf <agent2> . <agent2> a premis:Agent ; premis:agentType <http://id.loc.gov/vocabulary/preservation/agentType/per> ; foaf:nick "jquser"^^xsd:String . |