From 2fdc1b902e063f57276fda2646fa3506604cc18c Mon Sep 17 00:00:00 2001 From: Stefano Cossu Date: Wed, 27 Sep 2017 11:14:08 -0500 Subject: [PATCH] Initial commit: some boilerplate borrowed from Combine, basic folder structure and documentation. --- .gitignore | 104 ++++ LICENSE | 201 +++++++ README.md | 48 ++ doc/pdf/lakesuperior_recommendations.pdf | Bin 0 -> 130852 bytes doc/src/lakesuperior_recommendations.md | 522 ++++++++++++++++++ doc/src/template.latex | 258 +++++++++ etc.skeleton/README | 5 + etc.skeleton/application.yml | 64 +++ etc.skeleton/flask.yml | 6 + etc.skeleton/namespaces.yml | 18 + lakesuperior/config/README | 2 + lakesuperior/config/namespaces.py | 46 ++ lakesuperior/config_parser.py | 25 + .../connectors/filesystem_connector.py | 4 + .../connectors/graph_store_connector.py | 70 +++ lakesuperior/ldp/resource.py | 12 + server.py | 39 ++ toolbox/README | 8 + toolbox/bootstrap.py | 8 + toolbox/mkdoc.sh | 9 + 20 files changed, 1449 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 doc/pdf/lakesuperior_recommendations.pdf create mode 100644 doc/src/lakesuperior_recommendations.md create mode 100644 doc/src/template.latex create mode 100644 etc.skeleton/README create mode 100644 etc.skeleton/application.yml create mode 100644 etc.skeleton/flask.yml create mode 100644 etc.skeleton/namespaces.yml create mode 100644 lakesuperior/config/README create mode 100644 lakesuperior/config/namespaces.py create mode 100644 lakesuperior/config_parser.py create mode 100644 lakesuperior/connectors/filesystem_connector.py create mode 100644 lakesuperior/connectors/graph_store_connector.py create mode 100644 lakesuperior/ldp/resource.py create mode 100644 server.py create mode 100644 toolbox/README create mode 100755 toolbox/bootstrap.py create mode 100755 toolbox/mkdoc.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..af2f537 --- /dev/null +++ b/.gitignore @@ -0,0 +1,104 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +.static_storage/ +.media/ +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb7638d --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# LAKEsuperior + +LAKEsuperior is an experimental [Fedora Repository](http://fedorarepository.org) +implementation. + +## Basic concepts + +LAKEsuperior stores LDP resources in a triplestore (currently Blazegraph) and +non-RDF sources (i.e. binaries) in a filesystem. + +Resources are stored in discrete named graphs under the hood. A "main" graph +contains metadata about the resources, e.g. provenance information (NOTE: +versioning is not in the Level 1 scope). + +[@TODO more] + +## Installation + +This is currently just a couple of config files, so there is nothing to install +yet. However, in the happiest possible outcome for Level 1, it should go like +this: + +1. Install [Blazegraph](https://sourceforge.net/projects/bigdata/files/bigdata/) +2. Create a folder to store binary contents +3. Copy the `etc.skeleton` folder to a separate location +4. Configure the application and optionally add custom namespaces +5. Run `server.py` + +## Status and development + +LAKEsuperior is in **pre-alpha** status. + +Development will be planned in subsequent "levels", the scope of each depending +on the outcomes of the previous level development and feedback: + +- Level 1: proof of concept. This implementation will adhere to the current +Fedora Repository v4 specifications, in order to provide a testbed application +that easily integrates with Samvera and/or Islandora and can be used to test +and compare features with the official Fedora 4 implementation. +- Level 2: After a review with community members, the goal is to produce a beta +release that includes basic features to become a drop-in (or near there) with +the official Fedora 4. +- Level 3: production quality release. +- Level 4: Conform to the new [Fedora API specifications](http://fedora.info/spec/) + +## Further docuentation + +The design documents are in the `doc/pdf` folder. diff --git a/doc/pdf/lakesuperior_recommendations.pdf b/doc/pdf/lakesuperior_recommendations.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f133fd36a5e1a9319309545ef2cd2ef69d08dc52 GIT binary patch literal 130852 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 literal 0 HcmV?d00001 diff --git a/doc/src/lakesuperior_recommendations.md b/doc/src/lakesuperior_recommendations.md new file mode 100644 index 0000000..22452cd --- /dev/null +++ b/doc/src/lakesuperior_recommendations.md @@ -0,0 +1,522 @@ +--- +title: LAKEsuperior Recommendations +author: "Stefano Cossu, the Art Institute of Chicago + Kevin Ford, the Art Institute of Chicago, " +papersize: letter +geometry: "margin=1in" +output: pdf_document +fontfamily: ebgaramond +fontfamilyoptions: osf +fontsize: 11pt +urlcolor: blue +--- + +# General Remarks + +## Purpose + +`lakesuperior` is the code name of the current +internal Fedora repository that is part of LAKE, the institutional +repository and DAMS for the Art Institute of Chicago Collections. + +In order to overcome the current technical limitations of the current +Modeshape-backed Fedora 4 implementation, we want to propose an +alternative implementation of Fedora. + +End goal of this project is a repository system primarily, but not exclusively, supported and used by +AIC, fully compliant to the official Fedora API specifications at +[http://fedora.info]. + +The full-scale project is divided into three levels, +corresponding to three major milestones: + +- **Level 1**: Proof of Concept(PoC): a product satisfying a minimum set of requirements for the sole +purpose of evaluating feasibility and performance and to compare with +existing alternative Fedora implementation efforts. +- **Level 2**: Minimum Viable Product (MVP): a production-ready Fedora implementation that +satisfies the minimum requirements to interoperate with the current +Hyrax version (at the time of completion), in addition to a small subset +of features aimed at significant improvements in the Hydra/Fedora layer. +The implementation of this level will be further subdivided into +sub-projects: alpha, beta, release candidate and stable release. The +main goal for this milestone is to provide a drop-in Fedora replacement +that offers clear, quantifiable advantages over the Modeshape +implementation and provides documented tools to migrate data from fedora +4 in order to gain support from other Hydra and Islandora adopters. +Slight modification to the client may be tolerable depending on +stakeholders’ opinion. +- **Level 3**: Production-quality implementation. +- **Level 4**: Fedora-compliant implementation: a +repository implementation that aligns with the official Fedora +specification and passes all expected compatibility tests. This is +pending the finalization of such specifications. The implementation of +additional non-core specifications (which may be considered core by AIC +or other stakeholders) is also to be determined based use cases and on +the final status of such specification sets. + +## General requirements + +Our Fedora implementation should fulfill the following high-level +requirements: + +- Scale vertically and horizontally +- Support a large volume of data and perform efficient graph traversals +- Implement a query language guarantee the maximum stability of content +- Consist of a thinlayer of custom code on top of systems with as many required features as +possible provided out of the box +- Transparently store binary files (either in file system or in a dedicated store) + +## Scope of this document + +This is in no way an exhaustive path to development and less than ever a +spec sheet. It is mostly a collection of recommended patterns to resolve +specific issues for building an alternative implementation of Fedora. +Some of these recommendations may differ from the final implementation. + +# Level 1 Recommendations + +## Scope + +Level 1 implementation is aimed at +providing a proof-of-concept (PoC) repository system with a minimal set +of features. The resulting system should be easily deployable and offer +most commonly used features and features that present particular +challenges in the current Fedora implementation. + +The Level 1 development cycle should delivery a system that can be tested by a variety of +stakeholders with the purpose of gathering feedback to drive further +development and possible collaboration with other Fedora 4 alternative +implementation efforts. + +## Compatibility + +The Level 1 LAKEsuperior implementation supports a minimum set of features meeting the following +requirements: + +- Supports all the principal operations performed by Sufia +7.2 and, specifically, LAKEshore +- Supports all operations performed by Combine +- If a specific feature is particularly onerous to implement for +Level 1 but is required by the above clients, it can be “mocked” for +expediency’s sake based on how critical its use is, and documented as +incomplete + +## Technology Map + +### Graph Store + +Blazegraph is the most convenient choice for a PoC. + +Pros: + +- familiarity of AIC with the software +- Ease of translation between +Fedora API and back end +- Supports transactions (to be verified) +- Transparent import/export for migration (triples in, triples out) +- Easy translation of LDP data exchange format (RDF) and query language +(SPARQL) + +Cons: + +- Does not store binaries +- No Python API (must use REST API) +- No new releases since August 2016 (although development is active) +- Need to purchase enterprise version for distributed setup + +Alternatives can be considered beyond Level 1 if significant hurdles or limitations are +encountered during this development phase. Therefore, the code should +use standard triplestore features and be explicitly document the +implementation-specific features necessary for LAKEsuperior to function. + +## Binary Store + +Binaries are stored in the filesystem. See below for +implementation details. + +## Application Layer + +The application is written in Python 3 using the Python standard library and mature, well-respected +3rd party libraries: Flask, Requests, RDFLib, etc. + +Application configuration is stored in separate files in an appropriate structured +format (e.g. YAML). + +## Methodologies + +### Partitioning strategy + +Partitioning within a quad-store can be done via named graphs. Each “resource” as +intended in LDP is contained in a separate named graph. This allows to +clearly identify such LDP “resources”. + +There are multiple approaches to +this implementation, mostly differing in the handling of the graph name: + +#### 1. Graph name same as subject + +~~~ +[prefix definitions] +res:16fb6c41-b862-4adc-8656-5f9c356b56bb { + res:16fb6c41-b862-4adc-8656-5f9c356b56bb a ldp:NonRdfSource ; + ebucore:height "1024" ; + ebucore:width "1920" ; + ebucore:filename "xyz.png" ; + premis:hasMessageDigest . +} +~~~ + +This is the most straightforward implementation and does not impose any additional +construct on a straight SPARQL query. On the other hand, the repetition +of the graph name in the subject is redundant and limits further +strategic use of named graphs. + +#### 2. Named graphs as abstractions and proxies + +\[LEVEL 2?\] + +~~~ +[prefix definitions] +main { + res:a a ltype:Resource ; + fcrepo:hasVersion res:b , res:c ; + res:b a ltype:Snapshot . + res:c a ltype:Snapshot . +} + +res:a { + lake:16fb6c41-b862-4adc-8656-5f9c356b56bb + a ldp:Container , aictype:Work ; + skos:prefLabel "Composition in Red" ; +} + +res:b { + lake:16fb6c41-b862-4adc-8656-5f9c356b56bb + a ldp:Container , aictype:Work ; + skos:prefLabel "Composition in Reed" ; +} + +res:c { + lake:16fb6c41-b862-4adc-8656-5f9c356b56bb + a ldp:Container , aictype:Work ; + skos:prefLabel "Composition in Read" ; +} +~~~ + +This other approach has a +“main” graph holding metadata about the first-class resources: their +provenance, relationships with other named graphs, etc. Multiple named +graphs can be different representations of the same resource. This makes +it easier to build provenance data, such as version snapshots. On the +other hand it is a more indirect approach, in that LAKEsuperior has to +find one or more named graphs that represent the resource that is being +requested. In the example above, the repository application needs to get +triples from the graph that has the `ltype:Resource` and skip the ones +from the `ltype:Snapshot` graphs. + +### Graph store to LDP mapping + +This is done by the application layer. This implementation supports all necessary +building blocks for interacting with ActiveFedora: LDP-NR, LDPC, LDP-DC, +LDP-IC, etc. + +Resources are stored internally with a prefixed namespace +that is replaced by the domain-specific URI prefix. No host-specific +information is stored in the triplestore in order to guarantee +portability of the data set. + +### LDP containers + +LAKEsuperior supports all the LDP container types and +their related behavior, especially with regard to direct and indirect +containers. + +### Deletion strategy + +#### Individual triples + +For individually deleted triples (i.e. property values) versioning can be engaged. + +#### Resources + +Allowing the deletion of a resource altogether poses several +challenges (see also “Referential integrity” below). Non-destructive +deletion and optional admin-restricted purging is the recommended +approach. + +Two “soft-delete” approaches are possible: + +1. A resource is marked as “deleted” by a special status, either internally managed or +transparently communicated to the client. +2. A new version of the resource is created with an empty graph. This allow to enforce +referential integrity and history tracking. + +#### Tombstone + +Deleted resources (with either method) should leave a tombstone. If the tombstone is +deleted, the resource may be deleted permanently (barring referential +integrity issues). + +A tombstone, while available, may offer method to “resurrect” a deleted resource. + +#### Hierarchies + +Currently several clients rely on the mechanism by which, given `` and ``, if +`` is deleted, `` is also deleted. A tombstone +should be left on `` and surface if either `` or +`` is requested, as per current fcrepo4 behavior +\[VERIFY\]. + +### Explicit definition of LAKE resources + +\[DISCUSS utility, extent and pitfalls\] Since any triples can be inserted in a +triplestore, it may be useful to explicitly identify a LAKEsuperior +“resource” by adding e.g. a +`` RDF type to all the +resources directly managed and exposed by LAKEsuperior. This RDF type is +server managed and not exposed in the LDP API. The presence of this type +for a resource may trigger further validation of server-managed +properties and other constraints. + +The designated LAKE resource class +should be included in each named graph for each LAKEsuperior resource +appearing as a subject. + +While it is not ideal to enforce low-level +structural rules in a repository, experience has proven that when +systems become out of sync or external clients behave in an unexpected +way, a repository without any structural integrity rules becomes more +easily corrupted and structural issues become harder to identify and +fix. Therefore it may be valuable to place some basic restrictions for +resources in the repository so that errors surface early and are more +likely to be caught and repaired. + +### Bitstream storage + +Files are stored in the filesystem. The filesystem path for each LDP-NR is obtained by a +root prefix defined in the application configuration and a balanced +pairtree created from the file SHA1 checksum of the file content. This +means that identical binaries can be represented by multiple LDP +resources but are stored under the same file behind the scenes. + +A server-managed triple contains the path to a file for each version. + +Sample data set: + +~~~ +[prefix definitions] + +area:main { + res:16fb6c41-b862-4adc-8656-5f9c356b56bb + a ldp:NonRdfSource , ltype:Resource ; + ebucore:height "1024" ; + ebucore:width "1920" ; + ebucore:filename "xyz.png" ; + premis:hasMessageDigest ; + fcr:content "/eaa3/379d8/4150/eaa3379d8415071369f3c8b3699fa91fcfc6888c" ; + aic:status res:58f00eca-c398-02f0-f9bb-6b2b6105c0ef . +} +~~~ + +Note that `fcr:content` is redundant since it can be inferred by the +`premis:hasMessageDigest` URI. + +The binary file content is stored in `/eaa3/379d8/4150/eaa3379d8415071369f3c8b3699fa91fcfc6888c`. + +Sample LDP requests and responses: + +~~~ +GET http://lakesuperior.artic.edu/rest/main:16fb6c41-b862-4adc-8656-5f9c356b56bb + +[binary data] + +GET http://lakesuperior.artic.edu/rest/main:16fb6c41-b862-4adc-8656-5f9c356b56bb/fcr:metadata + +[prefix definitions] + + + a ldp:NonRdfSource ; + ebucore:height "1024" ; + ebucore:width "1920" ; + ebucore:filename "xyz.png" ; + premis:hasMessageDigest ; + iana:describedBy + aic:status res:58f00eca-c398-02f0-f9bb-6b2b6105c0ef . +} +~~~ + +### Server-managed properties + +Server-managed properties should be supported the same way +the current Fedora 4.x implementation does, to the extent that allows a +drop-in replacement as a Samvera client. This includes "magic" LDP +predicates for direct and indirect containers. + +### Internal use only properties + +Some server-managed properties are not exposed in the +client-facing API. These properties have predicates within a dedicated +namespace. If a client tries to insert a triple including an internal +use only predicate, the application should return a `409 Conflict` +response. + +Some internal use only predicates are: + +- content (reference to the filesystem path of the content of a binary resource) +- Versions +- \[…\] + +# Level 2 Recommendations + +## Scope + +The Level 2 implementation builds upon the +Level 1 proof of concept and, ideally, possible feedback from a variety +of testers. + +The goal for Level 2 is a feature-complete, beta-quality +product compatible with Hyrax and Islandora (pending the presence of +Islandora stakeholders) + +## Structural restrictions + +### Types of restrictions + +Structural restrictions can include: + +- Cardinality of properties +- Uniqueness of property values across the repository +- Domain and range of properties + +Enforcing these three types of restrictions may satisfy a +very broad number of use cases. + +### Enforcing restrictions + +Restrictions should be completely optional for implementers. + +The subsystem responsible for enforcing restrictions should be close enough to the +core repository to ensure that all interaction with the persistence +layer passes through it; and isolated enough that it can always be +configured and enabled or disabled separately. + +### Referential integrity + +Referential integrity should be ideally enforced within resources which +share the same domain, i.e. are managed by the same repository. + +Referential integrity is hard to maintain if the repository allows +deletion of versioned resources. Consider two resources, `` and ``: + +1. Client creates a relationship: ` ns:rel ` +2. Client deletes the relationship. This is no longer present in the current version of ``, +but it is still present in historical versions. +3. `` is deleted. The referential integrity is broken in previous versions of ``. +4. If `` is restored to its previous version, this breakage surfaces in the main +resource. + +There are three possible ways to address this: + +1. Not supporting referential integrity at all; +2. Not supporting deletion of resources and replacing it with a “deleted” status (see above); 3. Only supporting deletion of a resource if this has no inbound links from any +resource in any version (this can trigger a costly query in a large +store). + +Actual referential integrity is a better candidate for Level 2 +but some early decisions should be made with this setup in mind. + +## Versioning + +Previous versions of a resource are stored as sets of triples +within a separate named graph: + +~~~ +PREFIX area: +PREFIX res: +PREFIX ltype: +PREFIX snap: +PREFIX aic: + +area:main { + res:16fb6c41-b862-4adc-8656-5f9c356b56bb + a ldp:NonRdfSource , ltype:Resource ; + ebucore:height "1024" ; + ebucore:width "1920" ; + ebucore:filename "xyz.png" ; + premis:hasMessageDigest ; + aic:status res:58f00eca-c398-02f0-f9bb-6b2b6105c0ef ; +} + +area:historic { + res:16fb6c41-b862-4adc-8656-5f9c356b56bb + fedora:hasVersion + snap:fa297320-4ae1-46c9-8d2b-9356e713489f , + snap:7c96c502-b101-410d-8119-3b690a38a46a . + + snap:fa297320-4ae1-46c9-8d2b-9356e713489f + a ldp:NonRdfSource , ltype:Resource ; + fedora:hasVersionLabel "Version 2" ; + ebucore:height "1018" ; + ebucore:width "1318" ; + ebucore:filename "xyz_older.png" ; + premis:hasMessageDigest ; + fedora:created "2017-08-22T14:21:14.941Z"^^xsd:\#dateTime ; + aic:status res:58f00eca-c398-02f0-f9bb-6b2b6105c0ef . + +snap:7c96c502-b101-410d-8119-3b690a38a46a + a ldp:NonRdfSource , ltype:Resource ; + fedora:hasVersionLabel "Version 1" ; + ebucore:height "768" ; + ebucore:width "1024" ; + ebucore:filename "xyz_oldest.jpg" ; + premis:hasMessageDigest ; + fedora:created "2017-08-22T14:51:46.036Z"^^xsd:\#dateTime ; + aic:status res:58f00eca-c398-02f0-f9bb-6b2b6105c0ef . +} +~~~ + +Versions are retrieved by a mechanism similar to fcrepo4, with some differences: + +~~~ +GET http://lakesuperior.artic.edu/rest/historic:16fb6c41-b862-4adc-8656-5f9c356b56bb + +[prefix definitions] + + + fedora:hasVersion + , + . + + + fedora:created "2017-08-22T14:21:14.941Z"^^xsd:\#dateTime ; + fedora:hasVersionLabel "Version 2" . + + + fedora:created "2017-08-22T14:51:46.036Z"^^xsd:\#dateTime ; + fedora:hasVersionLabel "Version 1" . +~~~ + +Most importantly note the lack of +`fedora:hasVersions` property that points to the `./fcr:versions` resource. +This is replaced by a resource with the same URI as the main resource, +within the `historic` namespace. If a client requires the +`fedora:hasVersions` property for whatever reason, it may be reasonable to +add it and have it point to the resource in the `historic` area. + +## Transactions + +Transactions are not supported by LAKEsuperior at the LDP +API level, at least in Levels 1 and 2, and maybe not in early stable +releases either. The pitfalls of implementing transactions are too many +to tackle in early releases. + +However, Level 1 should guarantee that a single client request is always atomic even if this entails multiple interactions with the underlying store. For this reason, any candidate +backing triplestore must support transactions. + +## Fixity + +\[TODO\] Fixity support should be implemented as per current fcrepo4 specs. + +# Level 3 Recommendations + +TBD \ No newline at end of file diff --git a/doc/src/template.latex b/doc/src/template.latex new file mode 100644 index 0000000..7f4bbf4 --- /dev/null +++ b/doc/src/template.latex @@ -0,0 +1,258 @@ +\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$babel-lang$,$endif$$if(papersize)$$papersize$paper,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$} +\usepackage{titlesec} +\newcommand{\sectionbreak}{\clearpage} +$if(fontfamily)$ +\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} +$else$ +\usepackage{lmodern} +$endif$ +$if(linestretch)$ +\usepackage{setspace} +\setstretch{$linestretch$} +$endif$ +\usepackage{amssymb,amsmath} +\usepackage{ifxetex,ifluatex} +\usepackage{fixltx2e} % provides \textsubscript +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} + \usepackage[utf8]{inputenc} +$if(euro)$ + \usepackage{eurosym} +$endif$ +\else % if luatex or xelatex + \ifxetex + \usepackage{mathspec} + \else + \usepackage{fontspec} + \fi + \defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase} +$if(euro)$ + \newcommand{\euro}{€} +$endif$ +$if(mainfont)$ + \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$} +$endif$ +$if(sansfont)$ + \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$} +$endif$ +$if(monofont)$ + \setmonofont[Mapping=tex-ansi$if(monofontoptions)$,$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$endif$]{$monofont$} +$endif$ +$if(mathfont)$ + \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} +$endif$ +$if(CJKmainfont)$ + \usepackage{xeCJK} + \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} +$endif$ +\fi +% use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +% use microtype if available +\IfFileExists{microtype.sty}{% +\usepackage{microtype} +\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +$if(geometry)$ +\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +\usepackage{hyperref} +$if(colorlinks)$ +\PassOptionsToPackage{usenames,dvipsnames}{color} % color is loaded by hyperref +$endif$ +\hypersetup{unicode=true, +$if(title-meta)$ + pdftitle={$title-meta$}, +$endif$ +$if(author-meta)$ + pdfauthor={$author-meta$}, +$endif$ +$if(keywords)$ + pdfkeywords={$for(keywords)$$keywords$$sep$; $endfor$}, +$endif$ +$if(colorlinks)$ + colorlinks=true, + linkcolor=$if(linkcolor)$$linkcolor$$else$Maroon$endif$, + citecolor=$if(citecolor)$$citecolor$$else$Blue$endif$, + urlcolor=$if(urlcolor)$$urlcolor$$else$Blue$endif$, +$else$ + pdfborder={0 0 0}, +$endif$ + breaklinks=true} +\urlstyle{same} % don't use monospace font for urls +$if(lang)$ +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel} +$if(babel-newcommands)$ + $babel-newcommands$ +$endif$ +\else + \usepackage{polyglossia} + \setmainlanguage[$polyglossia-lang.options$]{$polyglossia-lang.name$} +$for(polyglossia-otherlangs)$ + \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$} +$endfor$ +\fi +$endif$ +$if(natbib)$ +\usepackage{natbib} +\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} +$endif$ +$if(biblatex)$ +\usepackage$if(biblio-style)$[style=$biblio-style$]$endif${biblatex} +$if(biblatexoptions)$\ExecuteBibliographyOptions{$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$}$endif$ +$for(bibliography)$ +\addbibresource{$bibliography$} +$endfor$ +$endif$ +$if(listings)$ +\usepackage{listings} +$endif$ +$if(lhs)$ +\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} +$endif$ +$if(highlighting-macros)$ +$highlighting-macros$ +$endif$ +$if(verbatim-in-note)$ +\usepackage{fancyvrb} +\VerbatimFootnotes % allows verbatim text in footnotes +$endif$ +$if(tables)$ +\usepackage{longtable,booktabs} +$endif$ +$if(graphics)$ +\usepackage{graphicx,grffile} +\makeatletter +\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +\makeatother +% Scale images if necessary, so that they will not overflow the page +% margins by default, and it is still possible to overwrite the defaults +% using explicit options in \includegraphics[width, height, ...]{} +\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +$endif$ +$if(links-as-notes)$ +% Make links footnotes instead of hotlinks: +\renewcommand{\href}[2]{#2\footnote{\url{#1}}} +$endif$ +$if(strikeout)$ +\usepackage[normalem]{ulem} +% avoid problems with \sout in headers with hyperref: +\pdfstringdefDisableCommands{\renewcommand{\sout}{}} +$endif$ +$if(indent)$ +$else$ +\IfFileExists{parskip.sty}{% +\usepackage{parskip} +}{% else +\setlength{\parindent}{0pt} +\setlength{\parskip}{6pt plus 2pt minus 1pt} +} +$endif$ +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +$if(numbersections)$ +\setcounter{secnumdepth}{5} +$else$ +\setcounter{secnumdepth}{0} +$endif$ +$if(subparagraph)$ +$else$ +% Redefines (sub)paragraphs to behave more like sections +\ifx\paragraph\undefined\else +\let\oldparagraph\paragraph +\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else +\let\oldsubparagraph\subparagraph +\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}} +\fi +$endif$ +$if(dir)$ +\ifxetex + % load bidi as late as possible as it modifies e.g. graphicx + $if(latex-dir-rtl)$ + \usepackage[RTLdocument]{bidi} + $else$ + \usepackage{bidi} + $endif$ +\fi +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \TeXXeTstate=1 + \newcommand{\RL}[1]{\beginR #1\endR} + \newcommand{\LR}[1]{\beginL #1\endL} + \newenvironment{RTL}{\beginR}{\endR} + \newenvironment{LTR}{\beginL}{\endL} +\fi +$endif$ +$for(header-includes)$ +$header-includes$ +$endfor$ + +$if(title)$ +\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} +$endif$ +$if(subtitle)$ +\providecommand{\subtitle}[1]{} +\subtitle{$subtitle$} +$endif$ +$if(author)$ +\author{$for(author)$$author$$sep$ \and $endfor$} +$endif$ +\date{$date$} + +\begin{document} +$if(title)$ +\maketitle +$endif$ +$if(abstract)$ +\begin{abstract} +$abstract$ +\end{abstract} +$endif$ + +$for(include-before)$ +$include-before$ + +$endfor$ +$if(toc)$ +{ +$if(colorlinks)$ +\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$black$endif$} +$endif$ +\setcounter{tocdepth}{$toc-depth$} +\tableofcontents +} +$endif$ +$if(lot)$ +\listoftables +$endif$ +$if(lof)$ +\listoffigures +$endif$ +$body$ + +$if(natbib)$ +$if(bibliography)$ +$if(biblio-title)$ +$if(book-class)$ +\renewcommand\bibname{$biblio-title$} +$else$ +\renewcommand\refname{$biblio-title$} +$endif$ +$endif$ +\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} + +$endif$ +$endif$ +$if(biblatex)$ +\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ + +$endif$ +$for(include-after)$ +$include-after$ + +$endfor$ +\end{document} diff --git a/etc.skeleton/README b/etc.skeleton/README new file mode 100644 index 0000000..8c174de --- /dev/null +++ b/etc.skeleton/README @@ -0,0 +1,5 @@ +User-defined configuration goes here. Note that this folder is a +version-controlled template and its contents should not be directly changed. +Please copy this folder in a safe location outside source control and set the +FCREPO_CONFIG_DIR environment variable in your web server/reverse proxy to +point to that folder. diff --git a/etc.skeleton/application.yml b/etc.skeleton/application.yml new file mode 100644 index 0000000..eea9bb4 --- /dev/null +++ b/etc.skeleton/application.yml @@ -0,0 +1,64 @@ +# Configuration for repository. + +graph: + # Name of the "main" graph containing metadata about all resources. + # + # Default: main + main_graph: main + +# Configuration for binary path and fixity check generation. The hash is a +# checksumn of the contents of the file. +uuid: + # Algorithm used to calculate the hash that generates the content path. + # One of: sha1, sha224, sha256, sha384, or sha512, corresponding to the + # omonymous hashlib function. + # + # Default: sha1. + algo: sha1 + + +# Data store configuration. +store: + # The semantic store used for persisting LDP-RS (RDF Source) resources. + # MUST support SPARQL 1.1 query and update. + ldp_rs: + webroot: http://localhost:9999/namespace/fcrepo/ + query_ep: sparql + update_ep: sparql + default_graph: http://www.w3.org/ns/sparql-service-description# + # Optional + username: + password: + ssl_verify: false + + # The path used to persist LDP-NR (bitstreams). + # This is for now a POSIX filesystem. Other solutions such as HDFS may be + # possible in the future. + ldp_nr: + # The filesystem path to the root of the binary store. + path: /data/fcrepo/ldpnr_store + + # How to split the balanced pairtree to generate a path. The hash + # string is defined by the uuid.algo parameter value. + # This parameter defines how many characters are in each branch. 2-4 is + # the recommended setting. NOTE: a value of 2 will generate up to 256 + # sub-folders in a folder; 3 will generate max. 4096 and 4 will + # generate max. 65536. Check your filesystem capabilities before + # setting this to a non-default value. + # + # Default: 2 + pairtree_branch_length: 2 + + # Max. number of branches to generate. 0 will split the string until + # it reaches the end. + # E.g. if the hash value is 01234567-89ab-cdef-0123-4565789abcdef + # (dashes added for readability), and the branch length value is 2, and + # the branch number is 4, the path will be + # 01/23/45/67/89abcdef01234565789abcdef. For a value of 0 it will be + # 01/23/45/67/89/ab/cd/ef/01/23/45/67/89/ab/cd/ef. Check your system + # capabilities for maximum nested directories before setting this to 0, + # especially with longer hash algorithms. + # + # Default: 4 + pairtree_branches: 4 + diff --git a/etc.skeleton/flask.yml b/etc.skeleton/flask.yml new file mode 100644 index 0000000..bbbb8e7 --- /dev/null +++ b/etc.skeleton/flask.yml @@ -0,0 +1,6 @@ +# Set to 1 in development. +DEBUG: 1 +# Generate key with: +# >>> import os +# >>> os.urandom(24) +SECRET_KEY: diff --git a/etc.skeleton/namespaces.yml b/etc.skeleton/namespaces.yml new file mode 100644 index 0000000..7b5753b --- /dev/null +++ b/etc.skeleton/namespaces.yml @@ -0,0 +1,18 @@ +# Place CUSTOM namespace prefix definitions here. Internal FCREPO definitions +# are defined in the core application configuration and will OVERRIDE duplicate +# prefixes defined here. + +aic : http://definitions.artic.edu/ontology/1.0/ +aicpc : http://definitions.artic.edu/publish_channel/ +aictype : http://definitions.artic.edu/ontology/1.0/type/ +dctype : http://purl.org/dc/dcmitype/ +exif : http://www.w3.org/2003/12/exif/ns# +foaf : http://xmlns.com/foaf/0.1/ +geo : http://www.w3.org/2003/01/geo/wgs84_pos# +hw : http://projecthydra.org/works/models# +oa : http://www.w3.org/ns/oa# +ore : http://www.openarchives.org/ore/terms/ +pcdm : http://pcdm.org/models# +rel : http://id.loc.gov/vocabulary/relators/ +skos : http://www.w3.org/2004/02/skos/core + diff --git a/lakesuperior/config/README b/lakesuperior/config/README new file mode 100644 index 0000000..a35b2c3 --- /dev/null +++ b/lakesuperior/config/README @@ -0,0 +1,2 @@ +This directory is for internal FCREPO configuration. It is version-controlled +and should not be changed by users. diff --git a/lakesuperior/config/namespaces.py b/lakesuperior/config/namespaces.py new file mode 100644 index 0000000..74334ff --- /dev/null +++ b/lakesuperior/config/namespaces.py @@ -0,0 +1,46 @@ +import rdflib + +from rdflib import Graph +from rdflib.namespace import Namespace, NamespaceManager + +from lakesuperior.configparser import config + +# Core namespace prefixes. These add to and override any user-defined prefixes. +# @TODO Some of these have been copy-pasted from FCREPO4 and may be deprecated. +core_namespaces = { + 'authz' : Namespace('http://fedora.info/definitions/v4/authorization#'), + 'cnt' : Namespace('http://www.w3.org/2011/content#'), + 'dc' : rdflib.namespace.DC, + 'dcterms' : namespace.DCTERMS, + 'ebucore' : Namespace('http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#'), + 'fedora' : Namespace('http://fedora.info/definitions/v4/repository#'), + 'fedoraconfig' : Namespace('http://fedora.info/definitions/v4/config#'), # fcrepo =< 4.7 + 'gen' : Namespace('http://www.w3.org/2006/gen/ont#'), + 'iana' : Namespace('http://www.iana.org/assignments/relation/'), + 'ldp' : Namespace('http://www.w3.org/ns/ldp#'), + 'owl' : rdflib.namespace.OWL, + 'premis' : Namespace('http://www.loc.gov/premis/rdf/v1#'), + 'rdf' : rdflib.namespace.RDF, + 'rdfs' : rdflib.namespace.RDFS, + 'res' : Namespace('http://definitions.artic.edu/lake/resource#'), + 'snap' : Namespace('http://definitions.artic.edu/lake/snapshot#'), + 'webac' : Namespace('http://www.w3.org/ns/auth/acl#'), + 'xml' : Namespace('http://www.w3.org/XML/1998/namespace'), + 'xsd' : rdflib.namespace.XSD, + 'xsi' : Namespace('http://www.w3.org/2001/XMLSchema-instance'), +} + +ns_collection = config['namespaces'][:] +ns_collection.update(core_namespaces) + +ns_mgr = NamespaceManager(Graph()) +ns_pfx_sparql = dict() + +# Collection of prefixes in a dict. +for ns,uri in ns_collection.items(): + ns_mgr.bind(ns, uri, override=False) + #ns_pfx_sparql[ns] = 'PREFIX {}: <{}>'.format(ns, uri) + +# Prefix declarations formatted for SPARQL queries. +#pfx_decl='\n'.join(ns_pfx_sparql.values()) + diff --git a/lakesuperior/config_parser.py b/lakesuperior/config_parser.py new file mode 100644 index 0000000..3d13171 --- /dev/null +++ b/lakesuperior/config_parser.py @@ -0,0 +1,25 @@ +import os + +import yaml + +configs = [ + 'application', + 'namespaces', + 'flask', +] + +# This will hold a dict of all configuration values. +config = {} + +# Parse configuration +if 'FCREPO_CONFIG_DIR' in os.environ: + CONFIG_DIR = os.environ['FCREPO_CONFIG_DIR'] +else: + CONFIG_DIR = os.path.dirname(os.path.abspath(__file__)) + '/etc' + +for cname in configs: + file = '{}/{}.yml'.format(CONFIG_DIR , cname) + with open(file, 'r') as stream: + config[cname] = yaml.load(stream, yaml.SafeLoader) + + diff --git a/lakesuperior/connectors/filesystem_connector.py b/lakesuperior/connectors/filesystem_connector.py new file mode 100644 index 0000000..72c4bd9 --- /dev/null +++ b/lakesuperior/connectors/filesystem_connector.py @@ -0,0 +1,4 @@ +import logging + +class FilesystemConnector: + diff --git a/lakesuperior/connectors/graph_store_connector.py b/lakesuperior/connectors/graph_store_connector.py new file mode 100644 index 0000000..ae623ee --- /dev/null +++ b/lakesuperior/connectors/graph_store_connector.py @@ -0,0 +1,70 @@ +import logging + +from rdflib import Dataset +from rdflib.plugins.sparql import prepareQuery +from rdflib.plugins.stores.sparqlstore import SPARQLUpdateStore + +from lakesuperior.config_parser import config + +class GraphStoreConnector: + '''Connector for LDP-RS (RDF Source) resources. Connects to a + triplestore.''' + + _conf = config['application']['store']['ldp_rs'] + _logger = logging.getLogger(__module__) + + + ## MAGIC METHODS ## + + def __init__(self, method=POST): + '''Initialize the graph store. + + @param method (string) HTTP method to use for the query. POST is the + default and recommended value since it places virtually no limitation + on the query string length. + + NOTE: `rdflib.Dataset` requires a RDF 1.1 compliant store with support + for Graph Store HTTP protocol + (https://www.w3.org/TR/sparql11-http-rdf-update/). This may not be + viable with the current version of Blazegraph. It would with Fuseki, + but other considerations would have to be made (e.g. Jena has no REST + API for handling transactions). + ''' + + self._store = SPARQLUpdateStore(queryEnpdpoint=self._conf['query_ep'], + update_endpoint=self._conf['update_ep']) + try: + self._store.open(self._conf['base_url']) + except: + raise RuntimeError('Error opening remote graph store.') + self.dataset = Dataset(self._store) + + + def __del__(self): + '''Commit pending transactions and close connection.''' + self._store.close(True) + + + ## PUBLIC METHODS ## + + def query(self, q, initNs=None, initBindings=None): + '''Query the triplestore. + + @param q (string) SPARQL query. + + @return rdflib.query.Result + ''' + self._logger.debug('Querying SPARQL endpoint: {}'.format(q)) + return self.dataset.query(q, initNs=initNs or nsc, + initBindings=initBindings) + + + def find_by_type(self, type): + '''Find all resources by RDF type. + + @param type (rdflib.term.URIRef) RDF type to query. + ''' + return self.query('SELECT ?s {{?s a {} . }}'.format(type.n3())) + + + diff --git a/lakesuperior/ldp/resource.py b/lakesuperior/ldp/resource.py new file mode 100644 index 0000000..b275e05 --- /dev/null +++ b/lakesuperior/ldp/resource.py @@ -0,0 +1,12 @@ +from lakesuperior.connectors.graph_store_connector import GraphStoreConnector + +class Resource: + '''Model for LDP resources.''' + + def __init__(self): + self.ds = GraphStoreConnector() + + def get(uuid): + g = ds + + diff --git a/server.py b/server.py new file mode 100644 index 0000000..d1c3f2e --- /dev/null +++ b/server.py @@ -0,0 +1,39 @@ +import io +import json +import os.path + +from flask import Flask + +from lakesuperior.config_parser import config +from lakesuperior.ldp.resource import Resource + +app = Flask(__name__) +app.config.update(config['flask']) + +@app.route('/', methods=['GET']) +def index(): + '''Homepage''' + return 'Hello. This is LAKEsuperior.' + + +@app.route('/', methods=['GET']) +def get_resource(): + '''Add a new resource in a new URI.''' + rsrc = Resource.get(uuid) + return rsrc.path + + +@app.route('/', methods=['POST']) +def post_resource(): + '''Add a new resource in a new URI.''' + rsrc = Resource.post(path) + return rsrc.path + + +@app.route('/', methods=['PUT']) +def put_resource(): + '''Add a new resource in a new URI.''' + rsrc = Resource.put(path) + return rsrc.path + + diff --git a/toolbox/README b/toolbox/README new file mode 100644 index 0000000..53f05f2 --- /dev/null +++ b/toolbox/README @@ -0,0 +1,8 @@ +Place various utility scripts here, for example for: bootstrap, migration, +cleanup, recovery, etc. + +This directory can be added to a system user's PATH and used for cron jobs +where relevant. + +While Python is preferred, other languages such as Bash and Perl are possible +if some functions are best performed with those. diff --git a/toolbox/bootstrap.py b/toolbox/bootstrap.py new file mode 100755 index 0000000..ceda2a7 --- /dev/null +++ b/toolbox/bootstrap.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python + +# This script will parse configuration files and initialize a filesystem and +# triplestore with an empty FCREPO repository. +# +# Additional, scaffolding files may be parsed to create initial contents. + +# @TODO diff --git a/toolbox/mkdoc.sh b/toolbox/mkdoc.sh new file mode 100755 index 0000000..d2f6e5e --- /dev/null +++ b/toolbox/mkdoc.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/../doc" +for i in "${dir}/src/*.md"; do + #basename="${i##*/}" + basename=$(basename "${i}") + fname="${basename%%.*}" # Filename without ext + pandoc --toc --template "${dir}/src/template.latex" "${i}" -o "${dir}/pdf/${fname}.pdf" +done