DSP-API and Sipi
Configuration
The DSP-API specific configuration and scripts for Sipi are in the
sipi subdirectory of the DSP-API source tree. See the README.md for
instructions on how to start Sipi with DSP-API.
Lua Scripts
DSP-API v2 uses custom Lua scripts to control Sipi. These scripts can be
found in sipi/scripts in the DSP-API source tree.
Each of these scripts expects a JSON Web Token in the
URL parameter token. In all cases, the token must be signed by DSP-API,
it must have an expiration date and not have expired, its issuer must equal
the hostname and port of the API, and its audience must include Sipi.
The other contents of the expected tokens are described below.
upload.lua
The upload.lua script is available at Sipi's upload route. It processes one
or more file uploads submitted to Sipi. It converts uploaded images to JPEG 2000
format, and stores them in Sipi's tmp directory. The usage of this script is described in
Upload Files to Sipi.
Each time upload.lua processes a request, it also deletes old temporary files
from tmp and (recursively) from any subdirectories. The maximum allowed age of
temporary files can be set in Sipi's configuration file, using the parameter
max_temp_file_age, which takes a value in seconds, and defaults to
86400 (1 day).
store.lua
The store.lua script is available at Sipi's store route. It moves a file
from temporary to permanent storage. It expects an HTTP POST request containing
application/x-www-form-urlencoded data with the parameters prefix (the
project shortcode) and filename (the internal Sipi-generated filename of the file
to be moved).
The JWT sent to this script must contain the key knora-data, whose value
must be a JSON object containing:
permission: must beStoreFileprefix: the project shortcode submitted in the form datafilename: the filename submitted in the form data
delete_temp_file.lua
The delete_temp_file.lua script is available at Sipi's delete_temp_file route.
It is used only if DSP-API rejects a file value update request. It expects an
HTTP DELETE request, with a filename as the last component of the URL.
The JWT sent to this script must contain the key knora-data, whose value
must be a JSON object containing:
permission: must beDeleteTempFilefilename: must be the same as the filename submitted in the URL
SipiConnector
In DSP-API, the org.knora.webapi.iiif.SipiConnector handles all communication
with Sipi. It blocks while processing each request, to ensure that the number of
concurrent requests to Sipi is not greater than
akka.actor.deployment./storeManager/iiifManager/sipiConnector.nr-of-instances.
If it encounters an error, it returns SipiException.
The Image File Upload Workflow
- The client uploads an image file to the
uploadroute, which runsupload.lua. The image is converted to JPEG 2000 and stored in Sipi'stmpdirectory. In the response, the client receives the JPEG 2000's unique, randomly generated filename. - The client submits a JSON-LD request to a DSP-API route (
/v2/valuesor/v2/resources) to create or change a file value. The request includes Sipi's internal filename. - During parsing of this JSON-LD request, a
StillImageFileValueContentV2is constructed to represent the file value. During the construction of this object, aGetFileMetadataRequestV2is sent toSipiConnector, which uses Sipi's built-inknora.jsonroute to get the rest of the file's metadata. - A responder (
ResourcesResponderV2orValuesResponderV2) validates the request and updates the triplestore. (If it isResourcesResponderV2, it asksValuesResponderV2to generate SPARQL for the values.) - The responder that did the update calls
ValueUtilV2.doSipiPostUpdate. If the triplestore update was successful, this method sendsMoveTemporaryFileToPermanentStorageRequestV2toSipiConnector, which makes a request to Sipi'sstoreroute. Otherwise, the same method sendsDeleteTemporaryFileRequestV2toSipiConnector, which makes a request to Sipi'sdelete_temp_fileroute.
If the request to DSP-API cannot be parsed, the temporary file is not deleted
immediately, but it will be deleted during the processing of a subsequent
request by Sipi's upload route.
If Sipi's store route fails, DSP-API returns the SipiException to the client.
In this case, manual intervention may be necessary to restore consistency
between DSP-API and Sipi.
If Sipi's delete_temp_file route fails, the error is not returned to the client,
because there is already a DSP-API error that needs to be returned to the client.
In this case, the Sipi error is simply logged.