Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


Excerpt

Table of Contents
absoluteUrltrue


Versioning in Fedora is composed of three specific types of resources - a versionable resource (a LDPRv), a versions container (a LDPCv), and the actual versioned resource (a LDPRm)- and a variety of strategies to interact with these resources.  Each type of resource and the HTTP methods that can be used on them are discussed below.


Excerpt

Working with a versionable resource (a LDPRv)


A versionable resource is a type of (regular) resource - see RESTful HTTP API - Containers - but it is created by invoking a specific Link header and the GET method has an additional interaction model beyond the GET scenarios when interacting with non-versioned resources.  All of the headers and methods for regular resources are applicable to a versionable resource.

A resource can be declared versionable when it is created originally.  This is achieved by including the following link header to your PUT or POST commands when creating the resource.  When a versionable resource is created, the versions container will be created at the same time.

Code Block
Link: <http://mementoweb.org/ns#OriginalResource>; rel="type"


Request URI: /path/to/resource

Methods: GET, PUT, POST


Status
titleGET
Retrieve the versioned resource from a specific point in time.

For more details about Fedora's datetime negotiation behaviors, see Memento Datetime Negotiation Algorithm.

Request Headers:

ACCEPT-datetime  An RFC-1123 Date. (E.g. "Wed, 30 May 2018 23:02:44 GMT")

Example:

Code Block
curl -H "Accept: text/turtle" -H "Accept-Datetime: Wed, 29 Aug 2018 15:47:50 GMT" http://localhost:8080/rest/path/to/resource

Response:

Code Block
HTTP/1.1 302 Found
Date: Wed, 29 Aug 2018 22:09:28 GMT
Set-Cookie: JSESSIONID=hrj5jm80kdjdw9attrozpy19;Path=/
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Tue, 28-Aug-2018 22:09:28 GMT
Link: <http://www.w3.org/ns/ldp#Resource>;rel="type"
Link: <http://www.w3.org/ns/ldp#Container>;rel="type"
Link: <http://www.w3.org/ns/ldp#BasicContainer>;rel="type"
Link: <http://localhost:8080/static/constraints/ContainerConstraints.rdf>; rel="http://www.w3.org/ns/ldp#constrainedBy"
Link: <http://localhost:8080/rest/path/to/resource6>; rel="timegate"
Link: <http://localhost:8080/rest/path/to/resource>; rel="original"
Link: <http://localhost:8080/rest/path/to/resource/fcr:versions>; rel="timemap"
Link: <http://mementoweb.org/ns#OriginalResource>; rel="type"
Link: <http://mementoweb.org/ns#TimeGate>; rel="type"
Accept-Patch: application/sparql-update
Accept-Post: text/turtle,text/rdf+n3,text/n3,application/rdf+xml,application/n-triples,application/ld+json
Allow: MOVE,COPY,DELETE,POST,HEAD,GET,PUT,PATCH,OPTIONS
Link: <http://localhost:8080/rest/path/to/resource/fcr:acl>; rel="acl"
Preference-Applied: return=representation
Vary: Prefer
Vary: Accept
Vary: Range
Vary: Accept-Encoding
Vary: Accept-Language
Vary: Accept-Datetime
Location: http://localhost:8080/rest/path/to/resource/fcr:versions/20180829154750
Content-Length: 0
Server: Jetty(9.3.1.v20150714)

Status:

Status
subtletrue
colourGreen
title200
302 Found

Status
subtletrue
colourRed
title400
Bad Request: Accept-Datetime header not properly formatted per RFC-1123

Status
subtletrue
colourRed
title406
Unacceptable: No appropriate versioned resource found for the supplied Accept-Datetime value



Examples: 

Code Block
#PUT 
curl -X PUT -H "Link: <http://mementoweb.org/ns#OriginalResource>; rel=\"type\"" http://localhost:8080/rest/path/to/resource


#POST 
curl -X POST -H "Link: <http://mementoweb.org/ns#OriginalResource>; rel=\"type\"" -H "Slug: resource" http://localhost:8080/rest/path/to




Excerpt

Working with a versions container (a LDPCv)


Request URI: /path/to/resource/fcr:versions

Methods: GET, POST, DELETE


Status
titleGET
 
Get a list of the available versions of an object

Request Headers:

ACCEPT  application/ld+json, application/link-format, application/n-triples, application/rdf+xml, application/x-turtle, application/xhtml+xml, application/xml, text/html, text/n3, text/plain, text/rdf+n3, text/turtle

Example:

Code Block
curl -H "Accept: text/turtle" http://localhost:8080/rest/path/to/resource/fcr:versions

Response:

Code Block
Status: HTTP/1.1 200 OK


Headers:
	 ETag: W/"671df2a47622331ffb6b70b6156526a67e5ab760"
	 Last-Modified: Wed, 30 May 2018 21:03:54 GMT
	 Link: <http://www.w3.org/ns/ldp#Resource>;rel="type"
	 Link: <http://www.w3.org/ns/ldp#RDFSource>;rel="type"
	 Link: <http://localhost:8080/rest/path/to/resource/fcr:versions/fcr:acl>; rel="acl"
	 Link: <http://mementoweb.org/ns#TimeMap>; rel="type"
	 Link: <http://localhost:8080/rest/path/to/resource>; rel="original"
	 Link: <http://localhost:8080/rest/path/to/resource>; rel="timegate"
	 Link: <http://localhost:8080/rest/path/to/resource/fcr:versions>; rel="timemap"
	 Vary-Post: Memento-Datetime
	 Allow: POST,HEAD,GET,OPTIONS,DELETE
	 Preference-Applied: return=representation
	 Vary: Prefer
	 Vary: Accept
	 Vary: Range
	 Vary: Accept-Encoding
	 Vary: Accept-Language
	 Content-Type: text/turtle;charset=utf-8
	 Content-Length: 1944


Body: 


@prefix memento:  <http://mementoweb.org/ns#> .
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix fedora:  <http://fedora.info/definitions/v4/repository#> .
@prefix ldp:  <http://www.w3.org/ns/ldp#> .

<http://localhost:8080/rest/path/to/resource/fcr:versions>
        rdf:type               fedora:TimeMap ;
        rdf:type               fedora:Resource ;
        fedora:lastModifiedBy  "bypassAdmin" ;
        fedora:createdBy       "bypassAdmin" ;
        fedora:created         "2018-05-30T21:00:48.169Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> ;
        fedora:lastModified    "2018-05-30T21:03:54.88Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> ;
        memento:original       <http://localhost:8080/rest/path/to/resource> ;
        rdf:type               ldp:RDFSource ;
        fedora:writable        true ;
        ldp:contains           <http://localhost:8080/rest/path/to/resource/fcr:versions/20180530210300> ;
        ldp:contains           <http://localhost:8080/rest/path/to/resource/fcr:versions/20180530210354> .

Status:

Status
subtletrue
colourGreen
title200
OK

Status
subtletrue
colourRed
title404
Not Found: Versions container resource does not exist.


 


Status
colourBlue
titlePOST
Create a new versioned resource (a new LDPRm)

Versions can by created in one of two ways, with a Memento-Datetime header and request body or with neither. If the Memento-Datetime header is omitted, the current time will be used by default and the current state of the versionable resource will be preserved.  Any specified body will be ignored.  If, however, the Memento-Datetime header is included, the versioned resource will be stored at this time marker and the request body will be stored as the versioned resource. 

Request Headers

MEMENTO-DATETIME (Optional) An RFC-1123 Date. (E.g. "Wed, 30 May 2018 23:02:44 GMT")


Example 1 (Create a new version resource 'now.'  Its state is that of the current versionable resource.):

Code Block
# Create version from current state of the object 
curl -X POST http://localhost:8080/rest/path/to/resource/fcr:versions  

Response:

Code Block
HTTP/1.1 201 Created
Date: Wed, 29 Aug 2018 21:21:34 GMT
Set-Cookie: JSESSIONID=dmqpuv06yty7b0tf9y94z3rx;Path=/
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Tue, 28-Aug-2018 21:21:34 GMT
ETag: W/"f7c04eb7e3f04c17d1fc852bef5f6b030ea271e7"
Last-Modified: Wed, 29 Aug 2018 20:22:11 GMT
Link: <http://localhost:8080/static/constraints/ContainerConstraints.rdf>; rel="http://www.w3.org/ns/ldp#constrainedBy"
Link: <http://localhost:8080/rest/path/to/resource>; rel="timegate"
Link: <http://localhost:8080/rest/path/to/resource>; rel="original"
Link: <http://localhost:8080/rest/path/to/resource/fcr:versions>; rel="timemap"
Memento-Datetime: Wed, 29 Aug 2018 21:21:34 GMT
Link: <http://mementoweb.org/ns#Memento>; rel="type"
Location: http://localhost:8080/rest/path/to/resource/fcr:versions/20180829212134
Content-Type: text/plain
Content-Length: 68
Server: Jetty(9.3.1.v20150714)

http://localhost:8080/rest/versioning/v9/fcr:versions/20180829212134

 

Status:

Status
subtletrue
colourGreen
title201
Created: if a new version is created successfully

Status
subtletrue
colourRed
title404
Not Found: if the version container resource does not exist



Example 2 (Create a new versioned resource at the supplied time marker.  Its state is supplied as the request body.):

Code Block
# Create version by supplying body and Memento-Datetime
curl -X GET http://localhost:8080/rest/path/to/resource > resource.ttl
curl -X POST -H "Memento-Datetime: Wed, 30 May 2018 23:02:44 GMT" -H "Content-Type: text/turtle" --data-binary "@resource.ttl"  http://localhost:8080/rest/path/to/resource/fcr:versions  

Response:

Code Block
HTTP/1.1 201 Created
Date: Wed, 29 Aug 2018 21:38:01 GMT
Set-Cookie: JSESSIONID=7bs7ddtba9l110261g9qyyotq;Path=/
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Tue, 28-Aug-2018 21:38:01 GMT
ETag: W/"a6b6c76b16935d00bcd1b5f259cfd2ecb225e3bd"
Last-Modified: Wed, 29 Aug 2018 20:22:11 GMT
Link: <http://localhost:8080/static/constraints/ContainerConstraints.rdf>; rel="http://www.w3.org/ns/ldp#constrainedBy"
Link: <http://localhost:8080/rest/path/to/resource>; rel="timegate"
Link: <http://localhost:8080/rest/path/to/resource>; rel="original"
Link: <http://localhost:8080/rest/path/to/resource/fcr:versions>; rel="timemap"
Memento-Datetime: Wed, 30 May 2018 23:02:44 GMT
Link: <http://mementoweb.org/ns#Memento>; rel="type"
Location: http://localhost:8080/rest/path/to/resource/fcr:versions/20180530230244
Content-Type: text/plain
Content-Length: 68
Server: Jetty(9.3.1.v20150714)

http://localhost:8080/rest/versioning/v9/fcr:versions/20180530230244

Status:

Status
subtletrue
colourGreen
title201
Created: if a new version is created successfully

Status
subtletrue
colourRed
title400
Bad Request: Request body was empty or invalid.

Status
subtletrue
colourRed
title404
Not Found: if the version container resource does not exist

Status
subtletrue
colourRed
title409
Conflict: if a version with the same timestamp already exists for this resource.

Status
subtletrue
colourRed
title415
Unsupported media type: If a Memento-Datetime is supplied without an accompanying Content-Type header to indicate the mime type.




Status
colourRed
titleDELETE
Remove the versions container and all versioned resources


NB: In addition to deleting all versioned resources, the parent - or versionable resource - will no longer be versionable, meaning the parent resource cannot be versioned until made versionable again.


Example:

Code Block
curl -X DELETE http://localhost:8080/rest/path/to/resource/fcr:versions


Response:

Code Block
HTTP/1.1 204 No Content
Date: Wed, 29 Aug 2018 21:41:54 GMT
Set-Cookie: JSESSIONID=1hfa3law3t4kp3z3wjps3qw84;Path=/
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Tue, 28-Aug-2018 21:41:54 GMT
Server: Jetty(9.3.1.v20150714)


Status:

Status
subtletrue
colourGreen
title204
No Content: if the version is reverted successfully

Status
subtletrue
colourRed
title404
Not Found: if the version does not exist




Excerpt

Working with a versioned resource (a LDPRm)


Request URI: /path/to/resource/fcr:versions/<timestamp>

Methods: GET, DELETE

 


Status
titleGET
 
Get a specific versioned resource

Request Headers:

ACCEPT  application/ld+json, application/link-format, application/n-triples, application/rdf+xml, application/x-turtle, application/xhtml+xml, application/xml, text/html, text/n3, text/plain, text/rdf+n3, text/turtle

Example:

Code Block
curl -H "Accept: text/turtle" http://localhost:8080/rest/path/to/resource/fcr:versions/20180829154750

Response:

Code Block
HTTP/1.1 200 OK

Date: Thu, 30 Aug 2018 14:31:30 GMT
Set-Cookie: JSESSIONID=yb9ppso27n221q1xdvu4cqzi5;Path=/
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Wed, 29-Aug-2018 14:31:30 GMT
ETag: W/"e766f5e674845e72f7d589e346b6a96a7735336e"
Last-Modified: Wed, 29 Aug 2018 15:47:31 GMT
Link: <http://www.w3.org/ns/ldp#Resource>;rel="type"
Link: <http://www.w3.org/ns/ldp#Container>;rel="type"
Link: <http://www.w3.org/ns/ldp#BasicContainer>;rel="type"
Link: <http://localhost:8080/static/constraints/ContainerConstraints.rdf>; rel="http://www.w3.org/ns/ldp#constrainedBy"
Link: <http://localhost:8080/rest/path/to/resource>; rel="timegate"
Link: <http://localhost:8080/rest/path/to/resource>; rel="original"
Link: <http://localhost:8080/rest/path/to/resource/fcr:versions>; rel="timemap"
Allow: GET,HEAD,OPTIONS,DELETE
Memento-Datetime: Wed, 29 Aug 2018 15:47:50 GMT
Link: <http://mementoweb.org/ns#Memento>; rel="type"
Preference-Applied: return=representation
Vary: Prefer
Vary: Accept
Vary: Range
Vary: Accept-Encoding
Vary: Accept-Language
Content-Type: text/turtle;charset=utf-8
Content-Length: 1754
Server: Jetty(9.3.1.v20150714)

@prefix premis:  <http://www.loc.gov/premis/rdf/v1#> .
@prefix test:  <info:fedora/test/> .
@prefix memento:  <http://mementoweb.org/ns#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix webac:  <http://fedora.info/definitions/v4/webac#> .
@prefix acl:  <http://www.w3.org/ns/auth/acl#> .
@prefix ns001:  <http://localhost:8080/rest/ktest/> .
@prefix xsi:  <http://www.w3.org/2001/XMLSchema-instance> .
@prefix xmlns:  <http://www.w3.org/2000/xmlns/> .
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix fedora:  <http://fedora.info/definitions/v4/repository#> .
@prefix xml:  <http://www.w3.org/XML/1998/namespace> .
@prefix ebucore:  <http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#> .
@prefix ldp:  <http://www.w3.org/ns/ldp#> .
@prefix xs:  <http://www.w3.org/2001/XMLSchema> .
@prefix fedoraconfig:  <http://fedora.info/definitions/v4/config#> .
@prefix foaf:  <http://xmlns.com/foaf/0.1/> .
@prefix dc:  <http://purl.org/dc/elements/1.1/> .

<http://localhost:8080/rest/path/to/resource>
        rdf:type               ldp:RDFSource ;
        rdf:type               ldp:Container ;
        rdf:type               fedora:Resource ;
        rdf:type               ldp:BasicContainer ;
        rdf:type               fedora:Container ;
        fedora:created         "2018-08-29T15:47:31.041Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> ;
        fedora:writable        true ;
        fedora:lastModified    "2018-08-29T15:47:31.041Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> ;
        fedora:lastModifiedBy  "fedoraAdmin" ;
        fedora:createdBy       "fedoraAdmin" ;
        rdf:type               ldp:RDFSource ;
        rdf:type               ldp:Container ;
        fedora:writable        true .

Status:

Status
subtletrue
colourGreen
title200
OK

Status
subtletrue
colourRed
title404
Not Found: Versions container resource does not exist.




Status
colourRed
titleDELETE
Remove a previous version of an object

Example:

Code Block
curl -i -X DELETE http://localhost:8080/rest/path/to/resource/fcr:versions/20180829154750


Response:

Code Block
HTTP/1.1 204 No Content
Date: Thu, 30 Aug 2018 14:35:21 GMT
Set-Cookie: JSESSIONID=1w3ta3umg5nai1q4mtfp5qn48p;Path=/
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Wed, 29-Aug-2018 14:35:21 GMT
Server: Jetty(9.3.1.v20150714)


Status:

Status
subtletrue
colourGreen
title204
No Content: if the version was deleted successfully

Status
subtletrue
colourRed
title404
Not Found: if the version does not exist