|
|
Regel 1: |
Regel 1: |
| = Archivematica CMIS Server User Manual =
| | [https://picturae.com/images/memorix_archieven_handleidingen/User_Manual_CMIS_Server.pdf Engelstalige handleiding van de CMIS server] |
| | |
| This manual will cover the way how to access AIPs and AIP files
| |
| | |
| that were ingested and stored in Archivematica Storage Service.
| |
| | |
| '''Links and References:'''
| |
| | |
| <ul>
| |
| <li><p>[http://docs.oasis-open.org/cmis/CMIS/v1.1/errata01/os/CMIS-v1.1-errata01-os-complete.html CMIS Specification]</p></li>
| |
| <li><p>[https://chemistry.apache.org/java/opencmis.html Apache Chemistry Open CMIS]</p>
| |
| <p>This resorce gathered all needed information for Developers and Users of CMIS Protocol.</p></li>
| |
| <li><p>[https://chemistry.apache.org/java/developing/tools/dev-tools-workbench.html CMIS Workbench]</p>
| |
| <p>Useful tool for Browsing and Testing CMIS Server.</p></li></ul>
| |
| | |
| '''Features Implemented:'''
| |
| | |
| <ul>
| |
| <li><p>Segregated User Access to AIPs per Location.</p>
| |
| <p>User can access AIPs from particular location.</p></li>
| |
| <li><p>Browse All Ingested AIPs in Location.</p></li>
| |
| <li><p>Browse File&Folders structure of AIP.</p></li>
| |
| <li><p>Download whole AIP.</p></li>
| |
| <li><p>Download particular AIP’s File.</p></li></ul>
| |
| | |
| == Connecting to CMIS ==
| |
| | |
| Current implementation of CMIS allows only
| |
| | |
| [http://docs.oasis-open.org/cmis/CMIS/v1.1/errata01/os/CMIS-v1.1-errata01-os-complete.html#x1-5360005 Browser Binding] connections. So CMIS Clients must use Browser Binding only.
| |
| | |
| Before connection to CMIS Server make sure you have your credentials (user and password)
| |
| | |
| and CMIS Endpoint to access it.
| |
| | |
| Example:
| |
| | |
| * Username – <code>demo</code>
| |
| * Password – <code>demo</code>
| |
| * URL – <code>http://pic-devel.edepot.picturae.com/</code>
| |
| | |
| For testing purposes it is recommended to use CMIS Workbench (see link above).
| |
| | |
| That can help to understand the overall CMIS Protocol and its Data Structures.
| |
| | |
| For Development bare CMIS Clients you can follow steps from Next Paragraph
| |
| | |
| === Browser Binding API ===
| |
| | |
| All requests to CMIS Server must include [https://tools.ietf.org/html/rfc7617 HTTP Basic Authentication]
| |
| | |
| with your Username and Password.
| |
| | |
| Example HTTP Request:
| |
| | |
| <source lang="http">
| |
| GET / HTTP/1.1
| |
| | |
| Host: pic-devel-cmis.edepot.picturae.com
| |
| | |
| Authorization: Basic ZGVtbzpkZW1v
| |
| </source>
| |
| Authorization header contains base64 encoded string with credentials <code>demo:demo</code>.
| |
| | |
| In the following sections we assume that all request includes Authorization header
| |
| | |
| and requests are sent to CMIS Endpoint URL. For example <code>GET /</code> will be translated to
| |
| | |
| HTTP Request as following:
| |
| | |
| <source lang="http">
| |
| GET /
| |
| | |
| Host: your-cmis-server-endpoint.nl
| |
| | |
| Authorization: Basic <YOUR ENCODED CREDENTIALS>
| |
| </source>
| |
| ==== Getting CMIS Repository ====
| |
| | |
| Request:
| |
| | |
| <source lang="http">
| |
| GET /
| |
| </source>
| |
| Response:
| |
| | |
| <source lang="json">
| |
| {
| |
| | |
| "ea550466-7dff-4b57-844e-c1163b3a7168": {
| |
| | |
| "repositoryId": "ea550466-7dff-4b57-844e-c1163b3a7168",
| |
| | |
| "repositoryName": "Archivematica Repository",
| |
| | |
| "repositoryDescription": "Repository for Accessing Archivematica AIPs",
| |
| | |
| "vendorName": "Picturae",
| |
| | |
| "productName": "Picturae CMIS Server",
| |
| | |
| "productVersion": "0.0.1",
| |
| | |
| "rootFolderId": "root",
| |
| | |
| "latestChangeLogToken": null,
| |
| | |
| "capabilities": {
| |
| | |
| "capabilityACL": "none",
| |
| | |
| "capabilityAllVersionsSearchable": false,
| |
| | |
| "capabilityChanges": "none",
| |
| | |
| "capabilityContentStreamUpdatability": "none",
| |
| | |
| "capabilityGetDescendants": false,
| |
| | |
| "capabilityGetFolderTree": false,
| |
| | |
| "capabilityOrderBy": "none",
| |
| | |
| "capabilityMultifiling": false,
| |
| | |
| "capabilityPWCSearchable": false,
| |
| | |
| "capabilityPWCUpdatable": false,
| |
| | |
| "capabilityQuery": "none",
| |
| | |
| "capabilityRenditions": "read",
| |
| | |
| "capabilityUnfiling": false,
| |
| | |
| "capabilityVersionSpecificFiling": false,
| |
| | |
| "capabilityJoin": "none",
| |
| | |
| "capabilityCreatablePropertyTypes": null,
| |
| | |
| "capabilityNewTypeSettableAttributes": null
| |
| | |
| },
| |
| | |
| "aclCapability": null,
| |
| | |
| "cmisVersionSupported": "1.1",
| |
| | |
| "thinClientURI": null,
| |
| | |
| "changesIncomplete": null,
| |
| | |
| "changesOnType": [],
| |
| | |
| "principalAnonymous": null,
| |
| | |
| "principalAnyone": null,
| |
| | |
| "extendedFeatures": [],
| |
| | |
| "rootFolderUrl": "https://pic-devel-cmis.edepot.picturae.com/ea550466-7dff-4b57-844e-c1163b3a7168/root",
| |
| | |
| "repositoryUrl": "https://pic-devel-cmis.edepot.picturae.com/ea550466-7dff-4b57-844e-c1163b3a7168"
| |
| | |
| }
| |
| | |
| }
| |
| </source>
| |
| Response contains a list of single Repository that user can access.
| |
| | |
| (multiple repositories is not yet supported).
| |
| | |
| Repository Info contains few major parts which must be used in next sections:
| |
| | |
| <ul>
| |
| <li><p><code>repositoryId</code> – this field contains unique repositoryId</p></li>
| |
| <li><p><code>rootFolderId</code> – CMIS Object ID for root folder to repository.</p>
| |
| <p>In current implementation it is always <code>root</code></p></li>
| |
| <li><p><code>repositoryUrl</code> and <code>rootFolderUrl</code> – these urls MUST be used as entrypoints for further</p>
| |
| <p>communication with Repository (like Get Object, Get Children, Get Content, etc… )</p>
| |
| <p>Repository URL and Root Folder URL will use current CMIS Server Hostname and Repository ID</p></li></ul>
| |
| | |
| ==== Getting List of Ingested AIPs ====
| |
| | |
| In order to obtain the list of your ingested AIPs use following URL
| |
| | |
| <source lang="http">
| |
| GET {rootFolderUrl}/?cmisselector=children&succinct=true
| |
| </source>
| |
| Response Example:
| |
| | |
| <source lang="json">
| |
| {
| |
| | |
| "numItems": 1,
| |
| | |
| "moreItems": false,
| |
| | |
| "objects": [
| |
| | |
| {
| |
| | |
| "object": {
| |
| | |
| "id": "aba7175b-856e-4b03-9201-e9ce551c0f9f",
| |
| | |
| "relationship": [],
| |
| | |
| "changeEventInfo": null,
| |
| | |
| "acl": null,
| |
| | |
| "exactACL": null,
| |
| | |
| "policyIds": null,
| |
| | |
| "renditions": [
| |
| | |
| {
| |
| | |
| "streamId": "aba7175b-856e-4b03-9201-e9ce551c0f9f",
| |
| | |
| "mimeType": "application/x-tar",
| |
| | |
| "length": 17408095,
| |
| | |
| "kind": "package",
| |
| | |
| "title": "Archived Package",
| |
| | |
| "height": null,
| |
| | |
| "width": null,
| |
| | |
| "renditionDocumentId": null
| |
| | |
| }
| |
| | |
| ],
| |
| | |
| "succinctProperties": {
| |
| | |
| "cmis:name": "Test_dubbellebestanden2_20180727_2-aba7175b-856e-4b03-9201-e9ce551c0f9f",
| |
| | |
| "cmis:description": "Test_dubbellebestanden2_20180727_2-aba7175b-856e-4b03-9201-e9ce551c0f9f",
| |
| | |
| "cmis:objectId": "aba7175b-856e-4b03-9201-e9ce551c0f9f",
| |
| | |
| "cmis:baseTypeId": "cmis:folder",
| |
| | |
| "cmis:objectTypeId": "cmis:folder",
| |
| | |
| "cmis:secondaryObjectTypeIds": null,
| |
| | |
| "cmis:createdBy": "Admin",
| |
| | |
| "cmis:creationDate": 946681200,
| |
| | |
| "cmis:lastModifiedBy": "Admin",
| |
| | |
| "cmis:lastModificationDate": 946681200,
| |
| | |
| "cmis:changeToken": "946681200",
| |
| | |
| "cmis:parentId": "root",
| |
| | |
| "cmis:path": "/Test_dubbellebestanden2_20180727_2-aba7175b-856e-4b03-9201-e9ce551c0f9f",
| |
| | |
| "cmis:allowedChildObjectTypeIds": null
| |
| | |
| }
| |
| | |
| },
| |
| | |
| "pathSegment": "Test_dubbellebestanden2_20180727_2-aba7175b-856e-4b03-9201-e9ce551c0f9f"
| |
| | |
| }
| |
| | |
| ]
| |
| | |
| }
| |
| </source>
| |
| Response will contain a list of Ingested AIPs in format Name + UUID.
| |
| | |
| The full list of fields is described in [http://docs.oasis-open.org/cmis/CMIS/v1.1/errata01/os/CMIS-v1.1-errata01-os-complete.html#x1-220002 CMIS Object]
| |
| | |
| Let’s focus on major parts that will be used in following sections.
| |
| | |
| * <code>object.id</code> – contains AIP UUID.
| |
| * <code>object.succinctProperties.cmis:name</code> – contains AIP Name + UUID. That name will be displayed in CMIS Workbench.
| |
| * <code>object.succinctProperties.cmis:path</code> – contains Path via what this object (AIP) can be accessed.
| |
| | |
| So now we can browse AIP’s file structure.
| |
| | |
| ==== Browse File and Folder Structure of AIP ====
| |
| | |
| From previous step we can obtain AIP Object ID (UUID) or AIP Access Path.
| |
| | |
| And we can browse its internal structure. Request:
| |
| | |
| <source lang="http">
| |
| GET {rootFolderUrl}/{AIP_Path}?cmisselector=children&succinct=true
| |
| </source>
| |
| Or:
| |
| | |
| <source lang="http">
| |
| GET {repositoryUrl}?objectId={AIP UUID}&cmisselector=children&succinct=true
| |
| </source>
| |
| According to CMIS Specification object can be accessed through Path URL or by ObjectID including to Repository URL. Read more about it in
| |
| | |
| [http://docs.oasis-open.org/cmis/CMIS/v1.1/errata01/os/CMIS-v1.1-errata01-os-complete.html#x1-5580004 CMIS Specification]
| |
| | |
| Response:
| |
| | |
| <source lang="json">
| |
| {
| |
| | |
| "numItems": 5,
| |
| | |
| "moreItems": false,
| |
| | |
| "objects": [
| |
| | |
| {
| |
| | |
| "object": {
| |
| | |
| "id": "/Test_grootbestand_20180725_1-5def6da9-9c70-4800-84e9-5e501bc6687e/objects/GDBA-7774-01.pdf",
| |
| | |
| "relationship": [],
| |
| | |
| "changeEventInfo": null,
| |
| | |
| "acl": null,
| |
| | |
| "exactACL": null,
| |
| | |
| "policyIds": null,
| |
| | |
| "renditions": [],
| |
| | |
| "succinctProperties": {
| |
| | |
| "cmis:name": "GDBA-7774-01.pdf",
| |
| | |
| "cmis:description": "GDBA-7774-01.pdf",
| |
| | |
| "cmis:objectId": "/Test_grootbestand_20180725_1-5def6da9-9c70-4800-84e9-5e501bc6687e/objects/GDBA-7774-01.pdf",
| |
| | |
| "cmis:baseTypeId": "cmis:document",
| |
| | |
| "cmis:objectTypeId": "cmis:document",
| |
| | |
| "cmis:secondaryObjectTypeIds": null,
| |
| | |
| "cmis:createdBy": "Admin",
| |
| | |
| "cmis:creationDate": 946681200,
| |
| | |
| "cmis:lastModifiedBy": "Admin",
| |
| | |
| "cmis:lastModificationDate": 946681200,
| |
| | |
| "cmis:changeToken": "946681200",
| |
| | |
| "cmis:isImmutable": true,
| |
| | |
| "cmis:isLatestVersion": null,
| |
| | |
| "cmis:isMajorVersion": null,
| |
| | |
| "cmis:isLatestMajorVersion": null,
| |
| | |
| "cmis:isPrivateWorkingCopy": null,
| |
| | |
| "cmis:versionLabel": null,
| |
| | |
| "cmis:versionSeriesId": null,
| |
| | |
| "cmis:isVersionSeriesCheckedOut": null,
| |
| | |
| "cmis:versionSeriesCheckedOutBy": null,
| |
| | |
| "cmis:versionSeriesCheckedOutId": null,
| |
| | |
| "cmis:checkinComment": null,
| |
| | |
| "cmis:contentStreamLength": 0,
| |
| | |
| "cmis:contentStreamMimeType": "text/plain",
| |
| | |
| "cmis:contentStreamFileName": "GDBA-7774-01.pdf",
| |
| | |
| "cmis:contentStreamId": "/Test_grootbestand_20180725_1-5def6da9-9c70-4800-84e9-5e501bc6687e/objects/GDBA-7774-01.pdf"
| |
| | |
| }
| |
| | |
| },
| |
| | |
| "pathSegment": "GDBA-7774-01.pdf"
| |
| | |
| },
| |
| | |
| ...
| |
| | |
| ]
| |
| | |
| }
| |
| </source>
| |
| The result is presented in the same format as for requesting List of AIPS.
| |
| | |
| Because in terms of CMIS Protocol it is same actions – Get Children of an Object.
| |
| | |
| In that particular example we can see ingested file from AIP Files.
| |
| | |
| All files has <code>cmis:objectTypeId</code> property set to <code>cmis:document</code>.
| |
| | |
| For folders it is <code>cmis:folder</code>.
| |
| | |
| In current implementation of CMIS Server Object IDs are equals to theirs Paths.
| |
| | |
| This is useful for accessing object either via ObjectID or via Path.
| |
| | |
| Difference between files and folders is that File can have Content Stream to download.
| |
| | |
| Response contains following properties that can be used to download particular file:
| |
| | |
| <ul>
| |
| <li><p><code>object.succinctProperties.cmis:contentStreamId</code> –</p>
| |
| <p>Contains an Content Stream ID that should be used to download File Content.</p>
| |
| <p>In current Implementation Content Stream ID is equal to Object ID and thus its path.</p></li>
| |
| <li><p><code>object.succinctProperties.cmis:contentStreamFileName</code> –</p>
| |
| <p>Contains File Name that can be used as name of downloaded file.</p></li></ul>
| |
| | |
| Following Content Stream related properties needs to be Implemented in the Future:
| |
| | |
| <ul>
| |
| <li><p><code>cmis:contentStreamLength</code> – should be used to provide File Size information.</p>
| |
| <p>Right now it’s always <code>0</code>.</p></li>
| |
| <li><p><code>cmis:contentStreamMimeType</code> – should be used to provide File Content MIME type. To discover file type.</p>
| |
| <p>Right now it is always <code>test/plain</code></p></li></ul>
| |
| | |
| ==== Downloading File from AIP ====
| |
| | |
| As described above to Download AIP File you have to use its Stream ID which is the same
| |
| | |
| as Object ID or Object Path. So request to download a file is following:
| |
| | |
| <source lang="http">
| |
| GET {rootFolderUrl}/{File Path}?cmisselector=content
| |
| </source>
| |
| Response will Redirect with Http status <code>302 Found</code> to File Location.
| |
| | |
| <source lang="http">
| |
| HTTP/1.1 302 Found
| |
| | |
| ...
| |
| | |
| Location: /ss-content-proxy/5def6da9-9c70-4800-84e9-5e501bc6687e/Test_grootbestand_20180725_1-5def6da9-9c70-4800-84e9-5e501bc6687e/data/objects/GDBA-7774-02.pdf
| |
| </source>
| |
| So your CMIS Client has to follow HTTP Redirect in order to Download a file.
| |
| | |
| == Accessing files without CMIS ==
| |
| | |
| As presented in section above CMIS will redirect a HTTP Client to specific File location to
| |
| | |
| download file. It is possible to combine the URL request in order to download needed file without
| |
| | |
| using CMIS even.
| |
| | |
| However there are few requirements:
| |
| | |
| * You have to know exact Repository ID. Which is an Archivematica Location UUID assigned to your user.
| |
| * You have to know exact AIP Name (including name and UUID).
| |
| * You have to know exact path of needed file inside of AIP Package.
| |
| | |
| If requirements above are met you are able to build an URL to download needed file.
| |
| | |
| The rules are following:
| |
| | |
| <code>{CMIS Endpoint}</code> + <code>/ss-content-proxy/</code> + <code>{Repository ID}</code> + <code>/{AIP Name}</code> + <code>/{File Path inside AIP}</code>
| |
| | |
| For example this url:
| |
| | |
| <code>https://pic-devel-cmis.edepot.picturae.com/ss-content-proxy/5def6da9-9c70-4800-84e9-5e501bc6687e/Test_grootbestand_20180725_1-5def6da9-9c70-4800-84e9-5e501bc6687e/data/objects/GDBA-7774-02.pdf</code>
| |
| | |
| It contains following parts:
| |
| | |
| <ul>
| |
| <li><p>CMIS Endpoint – <code>https://pic-devel-cmis.edepot.picturae.com</code></p></li>
| |
| <li><p>Repository ID – <code>5def6da9-9c70-4800-84e9-5e501bc6687e</code></p></li>
| |
| <li><p>AIP Name – <code>Test_grootbestand_20180725_1-5def6da9-9c70-4800-84e9-5e501bc6687e</code></p></li>
| |
| <li><p>File Path – <code>data/objects/GDBA-7774-02.pdf</code></p>
| |
| <p>Please notice that file location contains root folder <code>data</code> which is not presented in CMIS AIP Structure. So you have to include it explicitly.</p></li></ul>
| |
| | |
| So now you can download needed file without using CMIS.
| |
| | |
| '''Note''' Downloading big files may be slow. Because it requires some time to Extract file from an AIP Archive.
| |
| | |
| == CMIS Workbench ==
| |
| | |
| === Installation ===
| |
| | |
| In order to connect via CMIS Workbench you need to install [https://java.com/en/download/ Java].
| |
| | |
| Follow instruction from official Java Web site to download and install it on your Machine (Windows, MacOS, Linux, etc… ).
| |
| | |
| Once you have Java installed, check that it is accessible from your terminal. type:
| |
| | |
| <code>java --version</code> to see that it is working.
| |
| | |
| Example:
| |
| | |
| <source lang="bash">
| |
| $ java --version
| |
| | |
| java 10.0.1 2018-04-17
| |
| | |
| Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
| |
| | |
| Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
| |
| </source>
| |
| Now you can download CMIS Workbench from [http://www-eu.apache.org/dist/chemistry/opencmis/1.1.0/chemistry-opencmis-workbench-1.1.0-full.zip official mirror]
| |
| | |
| Unpack it to your favorite location. Example (MacOS, Linux):
| |
| | |
| <source lang="bash">
| |
| curl -o cmis-workbench.zip http://www-eu.apache.org/dist/chemistry/opencmis/1.1.0/chemistry-opencmis-workbench-1.1.0-full.zip
| |
| | |
| mkdir cmis-workbench
| |
| | |
| unzip -d cmis-workbench/
| |
| | |
| cd cmis-workbench/
| |
| </source>
| |
| After you unzipped the package you can run it <code>./workbench.command</code>
| |
| | |
| === Usage ===
| |
| | |
| After starting CMIS workbench you should see following window:
| |
| | |
| [[File:assets/cmis-open.png|thumb|none|alt=CMIS|CMIS]]
| |
| | |
| Now you need to login.
| |
| | |
| * URL – this is your CMIS Server endpoint. (Example: <code>https://pic-devel-cmis.edepot.picturae.com</code>)
| |
| * Binding – Browser
| |
| * Username – Your username (Example: <code>demo</code>)
| |
| * Password – Your password (Example: <code>demo</code>)
| |
| * Authentication – Standard
| |
| * Rest parameters leave As Is.
| |
| | |
| Then click on <code>Load Repositories</code> button and after it loads Repositories List click on Login.
| |
| | |
| Now you should see following window:
| |
| | |
| [[File:assets/cmis-browse.png|thumb|none|alt=CMIS Browse|CMIS Browse]]
| |
| | |
| On the left side you can see list of ingested AIPs and on the right side CMIS Object Details.
| |
| | |
| You can double-click on Folders (AIP Packages) in order to browse its file & folder structure.
| |
| | |
| Once you reached needed file Right Click on it and select Download.
| |
| | |
| [[File:assets/cmis-download.png|thumb|none|alt=CMIS File Download|CMIS File Download]]
| |
| | |
| Ignore MIME Error message. This is an issue with CMIS Workbench.
| |
| | |
| After you clicked on the Download Button it may take some time to extract the file from AIP and start downloading it.
| |