From 24c706fc976553a2f0b9f117d4358ab67d071974 Mon Sep 17 00:00:00 2001 From: Jo Pol Date: Fri, 29 Nov 2019 09:48:18 +0100 Subject: [PATCH] EASY-2209 Upgrade to v4.0 of license for GDPR * new version of the depositor agreement * uses only few emd-fields * no longer needs a human readable version for the audience * no longer needs fsrdb * the font has changed, otherwise printing the document failed * added easy-licenses resources for appendix3 --- Functional requirements.md | 70 ++--- debug-init-env.sh | 1 + docs/01_manual.md | 0 docs/index.md | 4 + pom.xml | 46 +++ .../assembly/dist/cfg/application.properties | 4 - src/main/assembly/dist/res/DrivenByData.png | Bin 0 -> 212249 bytes .../assembly/dist/res/agreement_version.txt | 1 - src/main/assembly/dist/res/dans_logo.png | Bin 7917 -> 19847 bytes .../assembly/dist/res/template/Agreement.html | 119 ++----- .../assembly/dist/res/template/Appendix.html | 46 --- .../assembly/dist/res/template/Appendix1.html | 40 +++ .../assembly/dist/res/template/Appendix2.html | 71 +++++ src/main/assembly/dist/res/template/Body.html | 278 ++++++++-------- .../assembly/dist/res/template/FileTable.html | 21 -- .../dist/res/template/Header-sample.html | 14 +- .../assembly/dist/res/template/Header.html | 14 +- .../assembly/dist/res/template/Table.html | 9 - src/main/assembly/dist/res/template/style.css | 158 ++++++++++ .../easy/agreement/AgreementCreator.scala | 9 +- .../easy/agreement/AgreementCreatorApp.scala | 7 +- .../agreement/AgreementCreatorServlet.scala | 4 +- .../nl/knaw/dans/easy/agreement/Command.scala | 17 +- .../knaw/dans/easy/agreement/Parameters.scala | 11 +- .../agreement/internal/DatasetLoader.scala | 194 +++--------- .../dans/easy/agreement/internal/Fedora.scala | 35 --- .../agreement/internal/KeywordMapping.scala | 29 +- .../easy/agreement/internal/Parameters.scala | 44 ++- .../internal/PlaceholderMapper.scala | 202 ++---------- .../easy/agreement/internal/package.scala | 92 ++---- src/test/resources/datasetloader/emd.xml | 4 - .../debug-config/application.properties | 4 - .../AgreementCreatorServletSpec.scala | 4 - .../easy/agreement/TemplateResolverSpec.scala | 164 ++++++++++ .../internal/DatasetLoaderSpec.scala | 153 +-------- .../internal/PlaceholderMapperSpec.scala | 296 +----------------- .../VelocityTemplateResolverSpec.scala | 14 +- 37 files changed, 879 insertions(+), 1300 deletions(-) create mode 100755 docs/01_manual.md create mode 100644 src/main/assembly/dist/res/DrivenByData.png delete mode 100644 src/main/assembly/dist/res/agreement_version.txt delete mode 100644 src/main/assembly/dist/res/template/Appendix.html create mode 100644 src/main/assembly/dist/res/template/Appendix1.html create mode 100644 src/main/assembly/dist/res/template/Appendix2.html delete mode 100644 src/main/assembly/dist/res/template/FileTable.html delete mode 100644 src/main/assembly/dist/res/template/Table.html create mode 100644 src/main/assembly/dist/res/template/style.css create mode 100644 src/test/scala/nl/knaw/dans/easy/agreement/TemplateResolverSpec.scala diff --git a/Functional requirements.md b/Functional requirements.md index 94deabc..fc40650 100644 --- a/Functional requirements.md +++ b/Functional requirements.md @@ -15,7 +15,7 @@ and an `OutputStream` to which the output is written as its arguments and return ## New design The new design of `easy-deposit-agreement-creator` consists of (1) an API which can be called from within other -modules that are dependents of this module and (2) a command line tool. In case the latter is used, +modules which depend on this module and (2) a command line tool. In case the latter is used, we assume that the dataset as well as the depositor data are already present in EASY. Again notice that this command line tool is not intended to ingest the newly generated deposit agreement into EASY! @@ -24,7 +24,7 @@ The input and output of both parts of `easy-deposit-agreement-creator` are as fo * *input (via API call):* either one of * dataset identifier, `OutputStream` - *used in modification tools* * EMD object, depositor object, `OutputStream` - *used in the business-layer* - * EMD object, depositor identifier, list of file metadata objects, `OutputStream` - *used in Easy-Stage-Dataset* + * EMD object, depositor identifier, an obsolete list of file metadata objects, `OutputStream` - *used in Easy-Stage-Dataset* * dataset object, `OutputStream` * *output (via command line):* pdf document with the deposit agreement * *output (via API call):* `Unit` @@ -40,29 +40,23 @@ The input and output of both parts of `easy-deposit-agreement-creator` are as fo * `easy-deposit-agreement-creator` wil *not* send emails to depositors whose datasets are modified or newly ingested. * No data is written to the databases; this module only reads data! -### Additions relative to the former version - * In the list of files in the dataset the access category for each file needs to be included. - * An explaination of the distinct access categories from the previous item. - ## Resources The deposit agreement is generated from a series of template files with placeholders. Using the resources listed below this module can resolve these placeholders and transform the whole text into a pdf. ### Template files - * `Appendix.html` - an appendix with more information about the CC0 access category + * `styles.css` - styling for the various elements + * `Agreement.html` - the main template with the content for the footer and parsing the other templates * `Body.html` - the main content of the deposit agreement text + * `Appendix1.html` - an appendix with the chosen access rights, license and an optional embargo statement + * `Appendix2.html` - an appendix with the dans license that may be applicable or not as explained in the body.html * `dans_logo.png` - the Dans logo to be displayed in the header of each page - * `Embargo.html` - an optional text in case the dataset is under embargo - * `FileTable.html` - an overview of all the files in the dataset, showing the file path, checksum and access category - * `Agreement.html` - the main file in which all the other html files are merged together - * `agreement_version.txt` - the version of the agreement to be displayed in the footer of each page of the document + * `DriveByData.png` - background in the footer * `MetadataTerms.properties` - a mapping between terms from the metadata and the text to be displayed in the agreement - * `Table.html` - an overview of the metadata of the dataset ### Data resources - * *Fedora* - metadata of the dataset is stored in Fedora. The EMD datastream dissemination contains the metadata of the dataset itself, the AMD datastream dissemination contains the depositor identifier, the EASY_FILE datastream and EASY_FILE_METADATA datastream dissemination contain the data of the files in the dataset. + * *Fedora* - metadata of the dataset is stored in Fedora. The EMD datastream dissemination contains the metadata of the dataset itself, the AMD datastream dissemination contains the depositor identifier. * *LDAP* - the depositor data required for the agreement is stored in LDAP. - * *RiSearch* - this is part of Fedora and provides the relation between the dataset and the files. ### Required data in the template Besides the dataset's metadata and the list of files contained in the dataset, several other values @@ -71,14 +65,13 @@ are required in the creation of the deposit agreement. | Data | Used in | Stored in | |------|---------|-----------| | Dataset - identifier | all occasions where a query for (a part of) the dataset in Fedora is required | application parameter | -| Dataset - DANS managed DOI | template `Body.html` | `emd:identifier // dc:identifier` | -| Dataset - encoded DANS managed DOI | template `Body.html`, see the link on the managed DOI above | `let id = emd:identifier // dc:identifier in (id@eas:identification-system ++ "/" ++ id.value)` | -| Dataset - date submitted | template `Body.html` | `emd:date // eas:dateSubmitted` | -| Dataset - preferred title | template `Body.html` | `emd:title // dc:title` | -| Dataset - access category | template `Agreement.html` | `emd:rights // dct:accessRights` or `dc:rights` (*these are always the same, only in different schemas. Therefore we can always use the value from EMD to get the least amount of Fedora queries*)| -| Dataset - is under embargo | code `LicenseComposer.java:193` | to be calculated based on the current date and `Dataset - date available` below | -| Dataset - date available | template `Embargo.html` | `emd:date // eas:available` | -| Current time | template `Tail.html`, this is the timestamp of creating the deposit agreement: `new org.joda.time.DateTime().toString("YYYY-MM-dd HH:mm:ss"))` | calculated at runtime | +| Dataset - DANS managed DOI | template `Header.tml` | `emd:identifier // dc:identifier` | +| Dataset - encoded DANS managed DOI | template `Header.html`, see the link on the managed DOI above | `let id = emd:identifier // dc:identifier in (id@eas:identification-system ++ "/" ++ id.value)` | +| Dataset - date submitted | template `Header.tml` | `emd:date // eas:dateSubmitted` | +| Dataset - preferred title | template `Header.html` | `emd:title // dc:title` | +| Dataset - open access | template `Apppendix1.html` | `emd:rights // dct:accessRights` or `dc:rights`
(*these are always the same, only in different schemas. Therefore we can always use the value from EMD to get the least amount of Fedora queries*)| +| Dataset - is under embargo | template `Apppendix1.html` | to be calculated based on the current date and `Dataset - date available` below | +| Dataset - date available | template `Apppendix1.html` | `emd:date // eas:available` | | EasyUser - displayName | template `Body.html` | LDAP user database - `(givenName <> initials)? + dansPrefixes? + sn?` | | EasyUser - organization | template `Body.html` | LDAP user database - `o` | | EasyUser - address | template `Body.html` | LDAP user database - `postalAddress` | @@ -88,32 +81,6 @@ are required in the creation of the deposit agreement. | EasyUser - telephone | template `Body.html` | LDAP user database - `telephoneNumber` | | EasyUser - email | template `Body.html` | LDAP user database - `mail` | -### Displaying the dataset metadata -* For each term in the metadata the *qualified name* is calculated ([namespace].[name]) and mapped to the corresponding value in `MetadataTerms.properties`. -* If the term equals **AUDIENCE**, all associated *discipline identifiers* are queried from Fedora and displayed as a comma-separated `String`. -* If the term equals **ACCESSRIGHTS**, it is mapped to the corresponding string representation (see below). -* For all other terms the values are displayed as a comma-separated `String`. -* Every term corresponds to one row in the table. - -### Displaying the files in the dataset -* All files contained in the dataset are retrieved from Fedora using `RiSearch`. -* For each file the SHA1-hash is queried. -* Each file (path and hash) corresponds to one row in the table. -* In case the dataset does not contain any files, the text "*No uploaded files*" is added instead of the table. -* In case the SHA1-hash of a file is not calculated, the alternative text "*------------- not-calculated -------------*" is used - -### Mapping of access categories -| Access Category | Agreement snippet | String representation | -|-----------------|-----------------|-----------------------| -| ANONYMOUS_ACCESS | OpenAccess.html | `"Anonymous"` | -| OPEN_ACCESS | OpenAccess.html | `"Open Access"` | -| OPEN_ACCESS_FOR_REGISTERED_USERS | OpenAccessForRegisteredUsers.html | `"Open access for registered users"` | -| GROUP_ACCESS | RestrictGroup.html | `"Restricted -'archaeology' group"` | -| REQUEST_PERMISSION | RestrictRequest.html | `"Restricted -request permission"` | -| ACCESS_ELSEWHERE | OtherAccess.html | `"Elsewhere"` | -| NO_ACCESS | OtherAccess.html | `"Other"` | -| FREELY_AVAILABLE | OpenAccess.html | `"Open Access"` | - ## Page layout * The document has an A4 page size and the following margins (top-right-bottom-left): 2.5cm 1.5cm 2cm 1.5cm * Every page has a header with the DANS logo @@ -134,12 +101,11 @@ resolved. This only happens when the property `runtime.references.strict = true` Velocity properties file. Besides that Velocity requires the path to the resources to be set using the property `file.resource.loader.path`. As an extra parameter we added `template.file.name`, holding the name of the file to be resolved by Velocity. This file is supposed to be present inside -the `file.resource.loader.path` folder. All these parameters can are set in the -`velocity-engine.properties` file in `src/main/assembly/dist/res/`. +the `file.resource.loader.path` folder. All these parameters are [hard coded](https://github.com/DANS-KNAW/easy-deposit-agreement-creator/blob/230a1e1ffaf24213f71277c1de1dbb9cd08daf96/src/main/scala/nl/knaw/dans/easy/agreement/internal/package.scala#L43-L51). ### WeasyPrint The transformation from html to pdf is done using the WeasyPrint command line tool. This tool is -installed on the servers (*deasy*, *teasy* and *easy01*). For running it locally (during -development) we recommend using the `localrun.sh` script. Indicate this in the +installed on the servers (*deasy*, *teasy* and *easy11*). For running it locally (during +development) we recommend using the `src/main/assembly/dist/res/pdfgen.sh` script. Indicate this in the `application.properties` located in `src/main/assembly/dist/cfg/` and fill in the `...` placeholders in the script. diff --git a/debug-init-env.sh b/debug-init-env.sh index 8e90f4c..ee6d85e 100755 --- a/debug-init-env.sh +++ b/debug-init-env.sh @@ -20,3 +20,4 @@ DATADIR=data touch $DATADIR/easy-deposit-agreement-creator.log cp src/test/resources/debug-config/pdfgen.sh $HOMEDIR/res/ +cp -r target/easy-licenses/licenses $HOMEDIR/res/licenses \ No newline at end of file diff --git a/docs/01_manual.md b/docs/01_manual.md new file mode 100755 index 0000000..e69de29 diff --git a/docs/index.md b/docs/index.md index 753ded8..b96c99b 100755 --- a/docs/index.md +++ b/docs/index.md @@ -70,6 +70,10 @@ yum install redhat-rpm-config python-devel python-pip python-lxml cairo pango gd After this, `weasyprint --help` is supposed to show the appropriate help page. +Python however may complain about `unknown locale`, add to your profile: + + export LC_ALL=en_US.UTF-8 + export LANG=en_US.UTF-8 BUILDING FROM SOURCE -------------------- diff --git a/pom.xml b/pom.xml index 78ebec0..5bdbd1a 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,7 @@ nl.knaw.dans.easy.agreement.Command 3.8.0 + 1.0.3 @@ -175,6 +176,33 @@ + + + + maven-dependency-plugin + + + resources + generate-resources + + unpack + + + + + nl.knaw.dans.easy + easy-licenses + ${easy-licenses.version} + ${project.build.directory}/easy-licenses + + + + + + + + + rpm @@ -219,6 +247,24 @@ + + /var/opt/${dans-provider-name}/resource/${project.artifactId}/template/licenses + ${rpm-replace-configuration} + + + target/easy-licenses/licenses + + + + + /opt/${dans-provider-name}/${project.artifactId}/res/template/licenses + ${rpm-replace-configuration} + + + target/easy-licenses/licenses + + + diff --git a/src/main/assembly/dist/cfg/application.properties b/src/main/assembly/dist/cfg/application.properties index 25718bf..eb99e65 100644 --- a/src/main/assembly/dist/cfg/application.properties +++ b/src/main/assembly/dist/cfg/application.properties @@ -1,12 +1,8 @@ fcrepo.url=http://localhost:8080/fedora fcrepo.user=fedoraAdmin fcrepo.password=changeme -fsrdb.db-connection-url=jdbc:postgresql://localhost:5432/easy_db -fsrdb.db-connection-username=easy_webui -fsrdb.db-connection-password=changeme auth.ldap.url=ldap://localhost auth.ldap.user=cn=ldapadmin,dc=dans,dc=knaw,dc=nl auth.ldap.password=changeme agreement.resources=/var/opt/dans.knaw.nl/resource/easy-deposit-agreement-creator -agreement.fileLimit=500 daemon.http.port=20130 diff --git a/src/main/assembly/dist/res/DrivenByData.png b/src/main/assembly/dist/res/DrivenByData.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f5814d69a82df1e963c6e53b5d416960e352b9 GIT binary patch literal 212249 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

WMvX?#1pesEw;pX3QnXV0&Z`LvGR{HGcyl^i} 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
p#b6u3oUmLG!;jZFwKn1iw{3 zbWgquW51xpQ!b_?K*nXjCu8x^=FMAKvIx+px z`_(`~DI)gMK$)M>VKFra9BOlxF=v0VxYwOdMf6s9sqn#!OLrIHQ#eO61pbl4N7ufk zr5a}iDDI{?gIPy2u2YNj($3?wGFTKyh8}HZ3;-)(eRFhn#uuWSU@w?A_pe6>>)Iae zC-1=H9(ZVjthH(A?f^B2D@XMN7M%10C*>SbJpt(0zWro%B+v^c!^IEr{7&taOA7u{ zwm$xlxOVq_#7SJrwki>Z?y3{C`Ix)EPH@uzlhyUWljiEnOYqrx!P;x2{JfzH3cepj z7?Xc_siKC>NE-5cYB1&xBJ93C+;g6HfyK|$mC@@cqNAx0TjeG1%3qC5*@KpmL(!pB z*PMsqt{f|r&Kk8D07A=jUeeZ1^s_pT?)^jTvIA8|z%T-R7q4iz?3>R z<%wAP)%b9mF2VOK5Vx@9)~W$~Y)ZFy^}~@4BJhO$#QRyDCq_6PTzXLaA$#(63p3J6 zD*f=Ug$h}9rXC_N4C>#Fkw|~M2E4NMZ|Mr4lVqC|g>mpjB~n0+3Q#dBXaz_nHDe9f zjxqJj40B*g37W$y%WJFN5hc@MOm;Mqa`Gzzpk~`%l>GwVWtd7?lIFP5Fau%Gw;7NZ z{t0TV8BPcYrx!rsFxr{=+%G{M|5q{sQ5OLMVgh`+S($%qA>7hMVY!m`g)TO4&id^9 zF|}C;&-+{G6Et#AjnOTx%BmMxg=XmQ=|Rlrx4y5hb;DUehZBg)B&+=qpka7EA*


|U!b?Wv?ov(%QEY{qP(|%a*cUFYl&G~Zt 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�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 literal 0 HcmV?d00001 diff --git a/src/main/assembly/dist/res/agreement_version.txt b/src/main/assembly/dist/res/agreement_version.txt deleted file mode 100644 index 71fc71e..0000000 --- a/src/main/assembly/dist/res/agreement_version.txt +++ /dev/null @@ -1 +0,0 @@ -Version 5.3 EN; 27-06-2016 diff --git a/src/main/assembly/dist/res/dans_logo.png b/src/main/assembly/dist/res/dans_logo.png index 740267894205cbbe7e8a67efcf6a39c0849b7b41..7fb097d3e4f26d62597e056f45bec5ff163eddd0 100644 GIT binary patch literal 19847 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 F_P=bd`=tN? literal 7917 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 Xj69BUUp^m`00000NkvXXu0mjfy3pv+ diff --git a/src/main/assembly/dist/res/template/Agreement.html b/src/main/assembly/dist/res/template/Agreement.html index 0ef492e..aa95ff5 100644 --- a/src/main/assembly/dist/res/template/Agreement.html +++ b/src/main/assembly/dist/res/template/Agreement.html @@ -2,57 +2,7 @@ @@ -64,48 +14,39 @@ #end #parse("Body.html") - -#if ($OpenAccess) -

[Open Access: unlimited access without registration of user registration]

-

The Depositor agrees to the dataset being made available in accordance with the conditions of the Creative Commons Zero Waiver, the CC0 1.0 Universal Public Domain Dedication (Appendix 1). In doing so, the Depositor renounces all possible rights relating to the dataset.

-#elseif ($OpenAccessForRegisteredUsers) -

[Open Access for Registered Users: unlimited access for registered users]

-

The Repository is permitted to make the dataset available to all persons, legal entities and organisations registered with the Repository.

-#elseif ($OtherAccess) -

[Other Access: the data are not available via EASY]

-

The dataset will be made available by means of another method to be agreed with the Repository.

-#elseif ($RestrictGroup) -

[Restricted Access: access restricted to registered persons or group members, N.B. only for archeology]

-

The Depositor may grant access permission in advance for persons, legal entities and organisations that belong to one of the user groups specified by DANS and/or the Depositor.

-#elseif ($RestrictRequest) -

[Restricted Access: access with the permission of the Repository]

-

The Repository is permitted to make the dataset available to persons, legal entities and organisations registered with the Depositor only after receiving express permission from the Depositor.

-#else - -

NO VALID VALUE FOR THE ACCESS CATEGORY FOUND!!!

-#end - -#if ($UnderEmbargo) -

You have additionally chosen:

-

[Temporary restriction: Embargo]; only possible if Open Access, Open Access for Registered Users or Restricted Access has been chosen

-

The dataset will be temporarily unavailable until $DateAvailable, commencing on the date of publication. The embargo period cannot be longer than two years and cannot be extended. When this period elapses, one of the special provisions set out above shall automatically apply. An extension of this period is only possible in consultation with the Depositor.

+#if (! $IsSample) +

This agreement has been accepted by both parties on $DateSubmitted upon completion of the deposit process via easy.dans.knaw.nl.

#end -

The Depositor hereby agrees to the above provisions and the general code(s) of conduct referred to in this document.

- -#parse("Table.html") - -#if ($HasFiles) -
- #parse("FileTable.html") -#else -

No uploaded files.

+#parse("Appendix1.html") +#parse("Appendix2.html") +#if ($OpenAccess) +

Appendix 3 Legal text of chosen public-domain statement or Open Access Licence

+
+        #parse($Appendix3)
+    
#end -
-#parse("Appendix.html") +
diff --git a/src/main/assembly/dist/res/template/Appendix.html b/src/main/assembly/dist/res/template/Appendix.html deleted file mode 100644 index f437793..0000000 --- a/src/main/assembly/dist/res/template/Appendix.html +++ /dev/null @@ -1,46 +0,0 @@ -

Appendix 1 text CC Zero Waiver

-Source: http://creativecommons.org/publicdomain/zero/1.0/legalcode - -

CC0 1.0 Universal (CC0 1.0) Public Domain Dedication

- -

N.B. The articles mentioned in this appendix are those of the Creative Commons Zero Waiver licence, the CC0 1.0 Universal Public Domain Dedication. This licence is only valid if the access category “Open Access: unlimited access without registration of user registration” has been chosen for disseminating the datasets, or parts of it.

- -

Statement of Purpose

-

The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an “owner”) of an original work of authorship and/or a database (each, a “Work”).

- -

Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works (“Commons”) that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.

- -

For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the “Affirmer”), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.

- -

- 1. Copyright and Related Rights. - A Work made available under CC0 may be protected by copyright and related or neighboring rights (“Copyright and Related Rights”). Copyright and Related Rights include, but are not limited to, the following: -

- -
    -
  1. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
  2. -
  3. moral rights retained by the original author(s) and/or performer(s);
  4. -
  5. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
  6. -
  7. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
  8. -
  9. rights protecting the extraction, dissemination, use and reuse of data in a Work;
  10. -
  11. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
  12. -
  13. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
  14. -
- -

- 2. Waiver. - To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “Waiver”). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. -

- -

- 3. Public License Fallback. - Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “License”). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. -

- -

4. Limitations and Disclaimers.

-
    -
  1. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
  2. -
  3. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
  4. -
  5. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
  6. -
  7. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
  8. -
diff --git a/src/main/assembly/dist/res/template/Appendix1.html b/src/main/assembly/dist/res/template/Appendix1.html new file mode 100644 index 0000000..ba179a2 --- /dev/null +++ b/src/main/assembly/dist/res/template/Appendix1.html @@ -0,0 +1,40 @@ +

Appendix 1 Dataset availability

+

The Dataset will be distributed and made available by the Depositary in the manner set out below. If the Dataset contains personal data within the meaning of the GDPR, with the exception of Bibliographical Data, the only access category permitted is Restricted Access. Metadata will always be made freely available.

+#if ($OpenAccess) +

Open Access

+

The files in the Dataset will be directly accessible to third parties. Third parties do not have to register with the Depositary. The Dataset will be placed in the public domain or made available under an Open Access Licence.

+

Using the following public-domain statement or Open Access Licence:

+

+ #if ($TermsLicenseUrl) + #if ($TermsLicense) + $TermsLicense : $TermsLicenseUrl + #else + $TermsLicenseUrl + #end + #else + #if ($TermsLicense) + $TermsLicense + #else + neither name nor URL for chosen license + #end + #end + #if ($Appendix3) + (see Appendix 3) + #end +

+#else +

Restricted Access

+

The files in the Dataset will be made available to Users by the Depositary only after the Depositor has given its express consent. Users will be obliged to comply with the DANS Licence. After receiving a permission request for access to the Dataset, the Depositor can approve the request, reject it or impose additional conditions of use on a User.

+

Using the following licence:

+

DANS Licence (see Appendix 2)

+#end +#if ($UnderEmbargo) +

Embargo

+

The files in the Dataset will not be made available to third parties for a limited period of up to two years from the commencement of this agreement. After this period has expired, the agreed access category and public-domain declaration or licence will automatically take effect. Extension of this period will only be possible for compelling reasons and in consultation with the Depositary.

+

Until the following date1:

+

$DateAvailable

+
+
+

1The end date will be a maximum of 2 years after the commencement of this agreement.

+
+#end diff --git a/src/main/assembly/dist/res/template/Appendix2.html b/src/main/assembly/dist/res/template/Appendix2.html new file mode 100644 index 0000000..8b41b55 --- /dev/null +++ b/src/main/assembly/dist/res/template/Appendix2.html @@ -0,0 +1,71 @@ +

Appendix 2 DANS Licence

+

DANS Licence

+

Effective from 9 January 2020

+

This licence sets out the conditions for using datasets to which the access categories “Open access for registered users” and “Restricted access” apply.

+

Anyone to whom DANS, on behalf of the holder of the rights to the dataset, makes one or more files of a dataset available (hereinafter referred to as the “User”), agrees to the following conditions. Acceptance of the conditions establishes an agreement between DANS and the User.

+
    +
  1. Responsible use

    +

    The User will act in accordance with the Netherlands Code of Conduct for Research Integrity, the GDPR and other applicable laws and regulations.

    +
  2. +
  3. Citing the dataset

    +

    The User will always cite the dataset in the research results they publish, in whatever form, when it has been used in the research.

    +

    This source reference will at least consist of:

    +
      +
    • The names and/or organisations of the producers of the dataset;
    • +
    • The year in which the dataset was produced;
    • +
    • The title of the dataset;
    • +
    • The name of organisation managing the archive in which the dataset is stored: DANS;
    • +
    • The persistent identifier of the dataset as a full URL.
    • +
    +

    For example:

    +

    +

    + Doorn, dr P.K.; Bommeljé, drs L.S.; Vroom, dr J.A.C.; Wijngaarden, drs H. van; +
    + Bommeljé, drs Y.B. (1990): The Aetolian Studies Project. +
    + DANS. https://doi.org/10.17026/dans-xxu-6utq +

    +
  4. +
  5. Distribution or disclosure of the dataset

    +

    The User shall respect all intellectual property rights to the dataset, such as copyrights, database and/or neighbouring rights.

    +

    For distribution or disclosure of the entire dataset or of substantial parts thereof, the User must first request permission from the holder of the rights to the dataset. This is the person(s) and/or institution(s) listed in the “Rights holder” metadata field of the dataset. If no holder is listed in this field, the User must contact the person(s) and/or organisation of the person(s) who produced the dataset.

    +
  6. +
  7. Statement when distributing or disclosing the dataset

    + +

    When distributing or disclosing the entire dataset or substantial parts of it, in the manner described in Article 2 of this DANS Licence and with the permission of the rights holder, the User shall, in addition to the acknowledgement referred to in Article 2, declare at all times:

    +
      +
    • the name of the dataset rights holder;
    • +
    • that this rights holder has granted permission for the distribution;
    • +
    • that further distribution by third parties is not permitted without the consent of the dataset rights holder.
    • +
    +
  8. +
  9. Publications

    +

    The User will inform DANS of the publications for which the dataset has been used. In this context, publications are defined as publications with an internationally recognized standard identification number, such as ISBN, ISSN or DOI. If a publication is available on the internet, the User will pass on the URL to DANS. If a publication is not available on the internet (via an URL), the User will pass on the source reference to DANS.

    +
  10. +
  11. Personal data

    +

    The User will always be responsible for the processing of personal data made available within the meaning of the GDPR and any other relevant privacy legislation, as well as for complying with any conditions set by the depositor.

    +
  12. +
  13. Liability for content

    +

    DANS shall in no way be liable for the contents or accompanying documentation of the dataset, including infringements of privacy rights within the meaning of the GDPR, unless in the event of intent or gross negligence on the part of DANS. The User is requested to inform DANS of any inaccuracies found as soon as possible after their discovery.

    +

    Neither DANS nor the depositor provide any guarantee that a dataset made available will meet the research objectives of the User. Neither DANS nor the depositor are liable for conclusions based on the dataset.

    +
  14. +
  15. Non-compliance with licence conditions

    +
      +
    1. If the licence conditions are not complied with, the use of the dataset must immediately be discontinued upon DANS’s first request. DANS reserves the right to inform the User's employer. In the event of unlawful use of personal data, DANS has the right to inform the Data Protection Authority as well. These measures are without prejudice to the authority of DANS to hold the User to account in court in the event of non-compliance or insufficient compliance with this licence.
    2. +
    3. If the licence conditions are not complied with, the User’s access to datasets other than that of the rights holder will be suspended until the issue has been resolved in consultation with the User, their employer and the rights holder (where applicable).
    4. +
    5. The User will indemnify DANS against all claims by third parties which are directly or indirectly related to the use of a dataset made available.
    6. +
    +
  16. +
  17. Compelling reasons

    +

    For compelling reasons, such as, but not limited to, an infringement of other people’s copyright or an infringement of the Code of Conduct for Research Integrity, DANS has the right to order the User to stop using the dataset.

    +
  18. +
  19. Changes to the agreement

    +

    DANS reserves the right to unilaterally change this agreement. In the event of substantial changes, DANS will inform the User, through EASY or by other means, before the new conditions take effect, so that the User has the opportunity to become aware of the changes. If the User does not accept the changes, the User must stop using the dataset(s) and delete any downloaded files. By continuing to use the dataset(s) after the changes have taken effect, the User accepts the updated conditions.

    +
  20. +
  21. Applicable law

    +
      +
    1. This licence is governed by Dutch law.
    2. +
    3. Disputes that cannot be resolved amicably will be submitted to the competent court in the Amsterdam district.
    4. +
    +
\ No newline at end of file diff --git a/src/main/assembly/dist/res/template/Body.html b/src/main/assembly/dist/res/template/Body.html index 3dd1f7c..73c133c 100644 --- a/src/main/assembly/dist/res/template/Body.html +++ b/src/main/assembly/dist/res/template/Body.html @@ -1,135 +1,161 @@ -

- Licence Agreement relating to
- Title of the study/research:
- “$Title” -

- -

The following parties are involved in this Licence Agreement:

-
    -
  1. The organisation or person authorised to transfer and deposit - the digital dataset(s), hereafter referred to as - the Depositor +

    Parties

    +
      +
    1. +

      + the organisation or person who is entitled to transfer and manage + the Dataset, hereinafter referred to as Depositor, +

      +
      +
      Name:
      $Name
      +
      Organisation:
      $Organisation
      +
      Address:
      $Address
      +
      Postal code:
      $PostalCode
      +
      Town:
      $City
      +
      Country:
      $Country
      +
      Telephone:
      $Telephone
      +
      Email:
      $Email
      +
    2. -
    3. The organisation that is authorised to archive and manage the - digital dataset(s), hereafter referred to as - the Repository +
    4. +

      + the organisation that is entitled to archive and manage + the Dataset, hereinafter referred to as Depositary, +

      +
      +
      Organisation:
      Data Archiving and Networked Services (DANS), on behalf of the Royal Netherlands Academy of Arts and Sciences (KNAW)
      +
      Represented by:
      Dr. P.K. Doorn, Director
      +
      Address:
      Anna van Saksenlaan 51
      +
      Postal code:
      2509 AB
      +
      Town:
      The Hague
      +
      Country:
      The Netherlands
      +
      Telephone:
      +31 (0)70 349 4450
      +
      E-mail:
      info@dans.knaw.nl
      +
    -

    - The Depositor is:
    - Name: $Name
    - Organisation: $Organisation
    - Postal address: $Address
    - Postal code: $PostalCode
    - Town/city: $City
    - Country: $Country
    - Tel.: $Telephone
    - E-mail: $Email
    + DANS is an institute of KNAW (Royal Netherlands Academy of Arts and Sciences) + and NWO (Dutch Research Council) with its registered office in The Hague.

    - -

    - The Repository is:
    - Organisation: DANS, Data Archiving and Networked Services, on behalf of KNAW (Royal Netherlands Academy of Arts and Sciences)
    - Represented by: Dr. P.K. Doorn, Director
    - Postal address: P.O. Box 93067
    - Postal code: 2509 AB
    - Town/city: The Hague
    - Country: The Netherlands
    - Tel.: +31 (0)70 349 4450
    - E-mail: info@dans.knaw.nl
    -

    - -

    DANS is an institute under the auspices of the Royal Netherlands Academy of Arts and Sciences (KNAW) which is also supported by the Netherlands Organisation for Scientific Research (NWO). DANS is based in The Hague

    - -
    - -

    This Licence Agreement is subject to the following provisions:

    - -

    1. Licence

    -
      -
    1. The Depositor grants the Repository a non-exclusive licence for digital data files, hereafter referred to as 'dataset'.
    2. -
    3. The Repository is authorised to include the dataset in its data archive. The Repository shall transfer the content of the dataset to an available carrier, through any method and in any form.
    4. -
    5. The Repository is authorised to make the dataset (or substantial parts thereof) available to third parties by means of on-line transmission. In addition, the Repository has the right, on the instruction of third parties or otherwise, to make a copy of the dataset or to grant third parties permission to download a copy.
    6. -
    - -

    2. The Depositor

    -
      -
    1. The Depositor declares that he is a holder of rights to the dataset, or the only holder of rights to the dataset, under the Databases act (Databankenwet) and where relevant the Copyright Act (Auteurswet) or otherwise, and/or is entitled to act in the present matter with the permission of other parties that hold rights.
    2. -
    3. The Depositor indemnifies the Repository against all claims made by other parties against the Repository with regard to the dataset, the transfer of the dataset, and the form and/or content of the dataset.
    4. -
    - -

    3. The Repository

    -
      -
    1. The Repository shall ensure, to the best of its ability and resources, that the deposited dataset is archived in a sustainable manner and remains legible and accessible.
    2. -
    3. The Repository shall, as far as possible, preserve the dataset unchanged in its original software format, taking account of current technology and the costs of implementation. The Repository has the right to modify the - format and/or functionality of the dataset if this is necessary in order to facilitate the digital sustainability, distribution or re-use of the dataset.
    4. -
    5. If the access categories “Restricted Access” or “Other Access”, as specified at the end of this Agreement, are selected, the Repository shall, to the best of its ability and resources, ensure that effective technical and other measures are in place to prevent unauthorised third parties from gaining access to and/or consulting the dataset or substantial parts thereof.
    6. -
    - -

    4. The dataset

    -
      -
    1. The dataset to which the licence relates is specified in the appendix to this Agreement. The appendix forms an integral part of this Agreement.
    2. -
    3. The Depositor declares that the dataset corresponds to the specification provided.
    4. -
    5. The Depositor declares that the dataset contains no data or other elements that are contrary to Dutch law.
    6. -
    7. The Depositor indemnifies the Repository against all claims by third parties relating to the content of the dataset.
    8. -
    9. The Depositor will supply the dataset by means of a method and medium deemed acceptable by the Repository.
    10. -
    - -

    5. Removal of datasets / changes to access conditions

    -
      -
    1. The Repository may decide not to make the dataset available to third parties for a temporary period or permanently as well as to remove the dataset from the archive wholly or in part. The Repository is entitled to do so if a Depositor has submitted a request stating the reasons for this action. In the case of not making the dataset available, the Repository shall retain the dataset in the data archive, but shall no longer allow third parties to access the dataset or substantial parts thereof.
    2. -
    3. If sufficient weighty grounds exist, the Repository has the right to remove the dataset from the archive wholly or in part, or to restrict or prevent access to the dataset on a temporary or permanent basis. The Repository shall inform the Depositor in such cases.
    4. -
    - -

    6. Availability to third parties:

    -
      -
    1. The Repository shall make the dataset available to third parties in accordance with the access conditions agreed with the Depositor: “Open Access”, “Open Access for Registered Users”, “Restricted Access” or “Other Access”. Access conditions may vary between parts of the dataset.
    2. -
    3. The Repository shall make the dataset available to third parties with whom they have reached agreement on the General Conditions for Use only if agreement has been reached with the Depositor on one of the following access categories: “Open Access for Registered Users”, “Restricted Access” or “Other Access”. Unless agreed otherwise with the Depositor, the use of datasets is subject to the General Conditions of Use laid down by the Repository. When the “Open Access” access category is agreed, the dataset shall be made available to third parties without the Depositor necessarily agreeing on the General Conditions for Use with said third parties.
    4. -
    5. If the access category “Restricted Access” has been agreed, the Repository shall make the dataset (or parts thereof) available only to the persons and/or organisations specified by the Depositor.
    6. -
    7. If a dataset (or parts thereof) to which the access categories “Restricted Access” or “Other Access” apply contain, as evidenced by the specification provided by the Depositor, personal data as referred to in the Personal Data Protection Act of The Netherlands (WBP; Wet Bescherming Persoonsgegevens, Act of 6 July 2000, Bulletin of Acts and Decrees 302, Article 9 paragraph 3 and Article 23 paragraph 2), the Repository shall make the dataset (or parts thereof) available only if this is permitted by law, which in any case should be taken to include making the dataset (or parts thereof) available for the purpose of historical, statistical or scientific research.
    8. -
    9. Notwithstanding the above, the Repository can make the dataset (or substantial parts thereof) available to third parties: -
        -
      • if the Repository is required to do so by legislation or regulations, a court decision, or by a regulatory or other institution
      • -
      • if this is necessary for the preservation of the dataset and/or the data archive
      • -
      • (to a similar institution) if the Repository ceases to exist and/or its activities in the field of data-archiving are terminated
      • -
      -
    10. -
    11. The Repository shall publish the documentation, hereafter referred to as metadata, as provided by the Depositor with the dataset, and make this freely available. Metadata is defined in this agreement as the content of all the fields that has been filled in with this dataset as standard under the tab “Description” in EASY.
    12. -
    13. The general information about the research and the metadata relating to the dataset, as defined in article 6.f, shall be included in the Repository’s databases and publications that are freely accessible to all persons.
    14. -
    - -

    7. Provisions relating to use by third parties

    +

    Considering that:

      -
    1. The Repository shall require third parties to whom the dataset (or substantial parts thereof) is made available to include in the research results a clear reference to the dataset from which data have been used. The reference must comply with the DANS General Conditions of Use. This obligation does not apply if the “Open Access” access category has been agreed on. In that case, the Repository will make every effort to inform third parties that they should include in their research results in whatever form, a clear acknowledgement of the source of the datasets from which data have been used.
    2. -
    3. The Repository shall oblige any party or parties to which it makes the dataset available to respect any copyright or database rights relating to the dataset.
    4. +
    5. The objective of the Depositary is to make research files permanently and digitally available;
    6. +
    7. The Depositary will only include and publish research files in its digital archival system if this can be done in a responsible manner;
    8. +
    9. The Depositor wishes to make use of the possibilities for digital archiving and accessibility of the deposited Dataset offered by the Depositary.
    - -

    8. Death of the Depositor or Discontinuance of the Depositor's organisation

    -

    From the time that the Depositor dies or in the event that the Depositor's organisation ceases to exist and no notice of termination in accordance with Article 10 has been given and if no legal successors, other parties that hold rights to the dataset or other persons mentioned in the field Rights Holder or in the field Creator of the metadata relating to the dataset, as defined in article 6.f, are known to DANS, the Repository shall be entitled to do whatever it considers reasonable in order to realise its objectives.

    - -

    9. Liability

    +

    Agree as follows:

      -
    1. The Repository accepts no liability in the event that all or part of a dataset is lost.
    2. -
    3. The Repository accepts no liability for any damage or losses resulting from acts or omissions by third parties to whom the Repository has made the dataset available.
    4. -
    - -

    10. Term, cancellation and termination of the Agreement

    -
      -
    1. This Agreement shall come into effect on the date on which the Repository publishes the dataset (hereafter the date of publication) and shall remain valid for an indefinite period. If the repository decides not to include the dataset in its data archive, this Agreement is cancelled. The Repository notifies the Depositor of publication or non-inclusion of the dataset in its data archive. Cancellation of this Agreement is subject to a period of notice of six months, and notice shall be given in writing. It is possible to change the agreed access category at any time during the term of the Agreement.
    2. -
    3. Notwithstanding point (a), this Agreement shall end when the dataset is removed from the data archive in accordance with Article 5 of this Agreement.
    4. -
    5. If the Repository ceases to exist or terminates its data-archiving activities, the Repository shall attempt to transfer the data files to a similar organisation that will continue the Agreement with the Depositor under similar conditions if possible.
    6. +
    7. +

      Deposit agreement

      +
        +
      1. The Depositor will grant the Depositary a non-exclusive licence to the deposited digital data and associated metadata.
      2. +
      3. The Depositary will receive the right to include the Dataset in its digital archival system. The Depositary will transfer the contents of the Dataset to a compatible carrier in a manner and format of its choice.
      4. +
      5. Subject to the terms of this deposit agreement, the Depositary will receive the right to make the Dataset, or substantial parts of it, available to third parties by means of electronic distribution. In addition, the Depositary will have the right to make a copy of the Dataset, whether or not on behalf of third parties, or allow third parties to download a copy.
      6. +
      7. The licence will be granted free of charge. The Depositary will not charge costs for making the Dataset available.
      8. +
      +
    8. +
    9. +

      Depositor

      +
        +
      1. The Depositor declares to be the sole entitled party with regard to the intellectual property rights to the Dataset pursuant to, but not limited to, the Database Act, the Copyright Act and other relevant legislation, and/or to act with the permission of the titleholder(s) or co-titleholder(s).
      2. +
      3. The Depositor will indemnify the Depositary against all claims that others may make against the Depositary with regard to the Dataset or the deposit thereof, its format and/or contents or its availability for further research.
      4. +
      5. The Depositor confirms that the Dataset does not contain any data or other elements which, in isolation or upon disclosure outside the context of scientific research, are inconsistent with the Dutch Penal Code or other relevant national or international legislation.
      6. +
      +
    10. +
    11. +

      Depositary

      +
        +
      1. The Depositary will, to the best of its ability and resources, permanently archive the Dataset, preserving its readability and accessibility.
      2. +
      3. The Depositary will archive the Dataset unaltered and in its original software format as far as possible, taking into account the technological state of the art and the cost of implementation. The Depositary will have the right to change the design and/or functionality of the Dataset in so far as it is necessary to ensure the digital preservation, distribution or reusability of the Dataset.
      4. +
      5. If the Dataset has been assigned to the “Restricted Access” category, the Depositary will, to the best of its ability and resources, ensure effective technical provisions to prevent unauthorized third parties from accessing and/or consulting substantial parts of the Dataset.
      6. +
      7. The Depositor will remain the controller of the Dataset within the meaning of the General Data Protection Regulation (GDPR) insofar as the Dataset contains personal data within the meaning of the GDPR. The Depositary will be a processor within the meaning of the GDPR. If the Dataset contains personal data, the Depositor and the Depositary will conclude a processing agreement, except in the case of bibliographical data which exclusively refer to personal data that are necessary for the accountability of the Dataset, such as its creator, rights holders and citations (hereinafter: “Bibliographical Data”).
      8. +
      +
    12. +
    13. +

      Dataset

      +
        +
      1. The Dataset will consist of all the files transferred by the Depositor and the metadata provided by the Depositor. Metadata is understood to mean the contents of all fields that must be completed in the archival system at the time of deposit in order to describe the Dataset.
      2. +
      3. The Depositor declares that the Dataset corresponds to the metadata provided by the Depositor.
      4. +
      5. The Dataset shall be compiled with due observance of the Netherlands Code of Conduct for Research Integrity, the GDPR and other applicable laws and regulations.
      6. +
      7. The metadata and file names shall not contain any personal data within the meaning of the GDPR. Only Bibliographical Data are allowed. It is explicitly forbidden to include personal data that are part of the deposited data, such as - but not limited to - research subjects, in the metadata and file names.
      8. +
      9. The Depositor will provide the files in a preferred format, as defined on the Depositary's website at the time of deposit. In the event that a format is not defined as a preferred format, the Depositor will contact the Depositary before delivery. A different file format may only be supplied with the written consent of the Depositary.
      10. +
      11. The Depositor will provide documentation with the Dataset that explains its creation, contents and any specific values (such as codes, characters and abbreviations), its structure (such as folder structures and relationships between files) and its actual use (such as that of software) to third parties.
      12. +
      13. The Depositor will make the Dataset available to the Depositary in a manner and through a medium that the Depositary deems suitable.
      14. +
      +
    14. +
    15. +

      Removing the Dataset and/or changing its accessibility

      +
        +
      1. The Depositor may submit a reasoned request to the Depositary to make the Dataset temporarily or permanently unavailable to third parties or to remove it entirely or partly from the archival system. The Depositary will assess the request in view of its objective. In cases where the Dataset contains personal data, the Depositary will assess the request with due observance of the GDPR.
      2. +
      3. If there are compelling reasons to do so, the Depositary has the right to remove the Dataset, or part of it, from the archival system, or to limit or exclude access to it temporarily or permanently. In such cases, the Depositary will reasonably inform the Depositor.
      4. +
      +
    16. +
    17. +

      Availability to third parties

      +
        +
      1. All or part of the Dataset files will be made available to third parties in accordance with one or more access categories agreed with the Depositor: “Open Access” or “Restricted Access”, possibly with the addition of an embargo (see Appendix 1). If Restricted Access is applied, part of the files may be made available directly to third parties, in consultation with the Depositary.
      2. +
      3. If Open Access is applied, the Depositor determines whether the files in the Dataset are placed in the public domain or whether a licence (hereinafter: “Open Access Licence”) shall apply (see Appendix 1).
      4. +
      5. If the Open Access category has been agreed with the Depositor, the Depositary will make the Dataset available directly to third parties, providing either the public domain statement or the agreed Open Access Licence.
      6. +
      7. The Open Access Licence provided for the Open Access category by the Depositor will apply to all files and their contents, to the extent that they are protected by copyright. The Depositary will make the Dataset as a whole, as well as its content or parts of its content, available under the conditions of the specified licence.
      8. +
      9. If the files in the Dataset, or parts of them, contain personal data within the meaning of the GDPR, the Restricted Access category will be applied exclusively and the files will not be made available directly to third parties.
      10. +
      11. If the Depositor and Depositary agree on Restricted Access, the following shall apply: +
          +
        1. The Depositary will make the files in the Dataset, or parts of them, exclusively available to users registered with the Depositary with whom they have agreed the DANS Licence (see Appendix 2) (hereinafter: “Users”). The Depositor has taken note of the DANS Licence and agrees to make the Dataset available in accordance with this licence. The Depositor is free to impose further conditions on Users prior to making the Dataset available.
        2. +
        3. In addition to the aforementioned provisions, the Depositary will only make the files in the Dataset, or parts of them, available to Users who have submitted a permission request for access to the Dataset and who have subsequently been granted such permission by the Depositor.
        4. +
        5. If a Dataset with Restricted Access includes files which the Depositor wishes to provide without the required permission as referred to under (b), the Depositary shall make the files directly available to third parties at the request of the Depositor, referring to the DANS Licence.
        6. +
        7. The Depositor will ensure the availability of a stable email address and check it regularly so that permission requests can be processed within a reasonable period of time.
        8. +
        9. The Depositary will facilitate consultations between the Depositor and the User who wants to use a Dataset, but cannot be held responsible for the Depositor’s decision whether or not to make the Dataset available, nor for any conditions under which this is done. +
        10. +
        +
      12. +
      13. Contrary to the above, the Depositary may make the Dataset or substantial parts of it available to third parties: +
          +
        1. if the Depositary is obliged to do so by virtue of laws and regulations, a judicial decision, or by a supervisory body;
        2. +
        3. if this is necessary for preserving the Dataset or the archival system;
        4. +
        5. if the Depositary ceases to exist and/or terminates its activities in the field of data archiving, or transfers its activities to a similar institution in compliance with Article 8.
        6. +
        +
      14. +
      15. The Depositary will make the metadata associated with the Dataset freely available.
      16. +
      17. The metadata associated with the Dataset will be included in the Depositary’s databases and publications, and will be accessible to everyone.
      18. +
      19. When a Dataset no longer contains any personal data within the meaning of the GDPR, the Depositor and the Depositary may decide to change its access category.
      20. +
      +
    18. +

      Using Datasets with Restricted Access

      +
        +
      1. The Depositary will oblige Users to whom it makes a Dataset or substantial parts of it available to include in their research results an unambiguous acknowledgement of the source, as specified in the DANS Licence, regarding the Dataset whose data has been used.
      2. +
      3. The Depositary will oblige Users to whom it makes the Dataset available to respect any copyright and database rights pertaining to the Dataset, as indicated by the Depositor.
      4. +
      5. In the event that the Depositary finds a violation, the Depositary will contact the Depositor and the User will be excluded from further use of Datasets until the issue has been resolved with the Depositor.
      6. +
      7. The Depositor will notify the Depositary as soon as possible of a failure to cite the source or an infringement of copyright or database rights as referred to in this article, to allow the Depositary to take the measures that it deems necessary, including, but not limited to, exclusion from further use of Datasets.
      8. +
      +
    19. +
    20. +

      Death of the Depositor or liquidation of its organisation

      +

      Upon the death of the Depositor or the liquidation or termination of its organisation, if no legal successors or co-entitled parties are known to the Depositary, the Depositary will be entitled to do whatever it deems reasonably necessary with a view to achieving its objective. In the event that the Dataset contains personal data within the meaning of the GDPR, the Depositary will request another organisation to act as the Depositor. This request will only be made to an organisation established in the Netherlands that, according to its statutes or by law, has scientific research, or the support or promotion of it, among its core tasks and/or objectives.

      +
    21. +
    22. +

      Liability

      +
        +
      1. Barring intent and/or gross negligence, the Depositor will indemnify the Depositary against all liability resulting from complete or partial loss of the Dataset.
      2. +
      3. Barring intent and/or gross negligence, the Depositor will indemnify the Depositary against all claims from third parties that may be brought against the Depositary as a result of the Dataset being lost in whole or in part, as well as against the costs that the Depositary will incur, for example for legal proceedings.
      4. +
      +
    23. +
    24. +

      Duration, cancellation, termination of the agreement

      +
        +
      1. This agreement takes effect on the date of the acceptance of this deposit agreement by the Depositor. The Depositary will then publish the Dataset as soon as possible.
      2. +
      3. This agreement will remain in effect for an indefinite period of time, unless: +
          +
        1. Either of the parties cancels the agreement in writing, subject to a notice period of six months;
        2. +
        3. Pursuant to Article 5 of this agreement, the Dataset has been permanently removed from the archival system;
        4. +
        5. Article 8 applies.
        6. +
        +
      4. Changing the access category or Open Access Licence is always permitted at the written request of the Depositor, with due observance of Article 6(5) of this agreement.
      5. +
      +
    25. +

      Applicable law

      +
        +
      1. This agreement is governed by Dutch law.
      2. +
      3. Disputes that cannot be resolved amicably will be submitted to the competent court in the Amsterdam district.
      4. +
      +
    - -

    11. Jurisdiction

    -

    DANS is entitled, but not obliged, to act independently against violations of the Copyright Act (Auteurswet) and/or any other intellectual property right of the holder(s) of rights to the dataset and/or the data from the dataset.

    - -

    12. Applicable law

    -

    Dutch law is applicable to this agreement.

    - -
    - -

    Access categories for datasets:

    -

    The Repository is permitted to distribute the dataset and make it available by means of one of the methods mentioned below and, if indicated below, making use of the additional option Embargo. Notwithstanding the above, the Repository, after consultation with and on request of the Depositor, is permitted to distribute parts of the dataset and make these available by means of one of the methods mentioned below being another than the one chosen for the dataset if that is clearly indicated by the Depositor.

    - -

    You have chosen:

    diff --git a/src/main/assembly/dist/res/template/FileTable.html b/src/main/assembly/dist/res/template/FileTable.html deleted file mode 100644 index 11e9885..0000000 --- a/src/main/assembly/dist/res/template/FileTable.html +++ /dev/null @@ -1,21 +0,0 @@ -

    Uploaded files:

    - - - - - - - #foreach ($file in $FileTable) - - - - - - #end -
    FileSHA-1 checksumAccessible to
    $file.FilePath$file.FileChecksum$file.FileAccessibleTo
    - -#if ($shouldLimitFiles) -

    Please note that only the first $limitFiles files are listed here in order to keep this license at - a reasonable size. For the full list of files, please contact DANS at - info@dans.knaw.nl.

    -#end diff --git a/src/main/assembly/dist/res/template/Header-sample.html b/src/main/assembly/dist/res/template/Header-sample.html index 2db5726..1b13225 100644 --- a/src/main/assembly/dist/res/template/Header-sample.html +++ b/src/main/assembly/dist/res/template/Header-sample.html @@ -1,5 +1,13 @@ -

    Sample - Licence Agreement

    +

    Draft Deposit Agreement

    - Persistent Identifier: will be assigned after submitting the dataset
    - Deposit date: $DateSubmitted + This deposit agreement relates to the following digital data and associated metadata + (hereinafter collectively referred to as “Dataset”):

    +
    +
    Title:
    +
    $Title
    +
    Persistent identifier:
    +
    will be assigned after submitting the dataset
    +
    Deposit date:
    +
    .....................
    +
    diff --git a/src/main/assembly/dist/res/template/Header.html b/src/main/assembly/dist/res/template/Header.html index 482ad43..3bba0c5 100644 --- a/src/main/assembly/dist/res/template/Header.html +++ b/src/main/assembly/dist/res/template/Header.html @@ -1,5 +1,13 @@ -

    Licence Agreement

    +

    Deposit Agreement

    - Persistent Identifier: $DansManagedDoi
    - Deposit date: $DateSubmitted + This deposit agreement relates to the following digital data and associated metadata + (hereinafter collectively referred to as “Dataset”):

    +
    +
    Title:
    +
    $Title
    +
    Persistent identifier:
    +
    $DansManagedDoi
    +
    Deposit date:
    +
    $DateSubmitted
    +
    diff --git a/src/main/assembly/dist/res/template/Table.html b/src/main/assembly/dist/res/template/Table.html deleted file mode 100644 index 67a7b0e..0000000 --- a/src/main/assembly/dist/res/template/Table.html +++ /dev/null @@ -1,9 +0,0 @@ -

    List of all metadata provided for this dataset at $CurrentDateAndTime

    - -#foreach ($row in $MetadataTable) - - - - -#end -
    $row.MetadataKey$row.MetadataValue
    diff --git a/src/main/assembly/dist/res/template/style.css b/src/main/assembly/dist/res/template/style.css new file mode 100644 index 0000000..a5dc580 --- /dev/null +++ b/src/main/assembly/dist/res/template/style.css @@ -0,0 +1,158 @@ + +@page { + /* the bottom gets 2.5cm extra for the footer */ + margin: 2.5cm 1.5cm 4cm 1.5cm; + + size: A4; + @top-left { + content: ""; + width: 100%; + height: 100%; + background: url(data:image/jpg;base64,$DansLogo) no-repeat 0 0; + background-position: left bottom; + background-size: 235px 90px; + } + @bottom-right { + vertical-align: top; + margin-right: 8px; + font: 11px "DejaVu Serif"; + content: counter(page) "/" counter(pages); + } +} +body { + font: 12px "DejaVu Serif"; + text-align: justify; +} +pre { + font: 10px "DejaVu Sans Mono"; +} +footer { + position: fixed; + width: 100%; + bottom: -9em; + font: 10px "DejaVu Serif"; + background: #FFF url(data:image/jpg;base64,$DrivenByData) no-repeat 0 0; + background-size: 212px 33px; + + /* 4% in a PDF matches the 16px in "footer p:first-child { margin-right" */ + background-position: 96% 100%; +} +@media screen { + body { + margin-bottom: 9em; + } + footer { + bottom: 0; + } +} +footer p:first-child { + float: right; + + /* box model of appears to have a margin of 8px, + * the footer is 8px larger than the body with its margin + * which matches 4% for "footer { background-position" + */ + margin-right: 16px; + + margin-top: 2.5em; + text-align: right; + background-color: #FFF; +} +.choice, .choice-header { + padding-left: 5em; +} +.error { + color: red; + font-size: 150%; + font-weight: bold; +} +.choice-header { + /* NB: underline dances with by WeasyPrintPdfGenerator */ + text-decoration: underline; +} + +/* dataset, parties on front page. */ + +dt, dd { + min-height: 1em; /* avoid the need for   in an empty
    (part 1) */ +} +dt { + clear: left; /* avoid the need for   in an empty
    (part 2) */ + float: left; /* put it in the margin of
    */ + width: 10.5em; /* same as margin for
    */ +} +dd { + margin-left: 10.5em; /* place holder for the dt */ +} +li dt { + width: 9em; /* subtract padding-left of "body>ol" */ +} +li dd { + margin-left: 9em; +} + +/* first level numbered list, needs explicit counter for second level */ + +body>ol { + list-style-type: none; + counter-reset: level1; + padding-left: 1.5em; +} +body>ol>li { + counter-increment: level1; +} +body>ol>li>p:first-child { + font-weight: bold; + display: inline-block; +} +body>ol>li>p:first-child:before { + content: counters(level1, ".") ". "; + margin-left: -1.5em; + width: 1.5em; +} + +/* second level prefixed with first level */ + +.body>li>ol { + list-style-type: none; + counter-reset: level2; + padding-left: 3.5em; +} + +.body>li>ol>li { + counter-increment: level2; +} + +.body>li>ol>li:before { + content: counters(level1, ".") "." counters(level2, ".") "."; + display: inline-block; + margin-left: -3.5em; + width: 3.5em; +} + +/* lower-alpha numbering for different levels in different sections */ + +.body>li>ol>li>ol, +.appendix2>li>ol { + list-style-type: lower-alpha; + padding-left: 1.5em; +} + +/* unordered at any level */ + +ul { + list-style-type: disc; + padding-left: 1.8em; +} + +/* footnote */ + +.footnote { + padding-top: 2em; +} +hr { + color: #000; + height: 0; + width: 50%; + margin-left: 0; +} \ No newline at end of file diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreator.scala b/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreator.scala index 90d1118..9abe2ee 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreator.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreator.scala @@ -15,13 +15,12 @@ */ package nl.knaw.dans.easy.agreement -import java.io.{ByteArrayInputStream, ByteArrayOutputStream, OutputStream} +import java.io.{ ByteArrayInputStream, ByteArrayOutputStream, OutputStream } import nl.knaw.dans.easy.agreement.internal._ import nl.knaw.dans.lib.logging.DebugEnhancedLogging import nl.knaw.dans.pf.language.emd.EasyMetadata -import rx.lang.scala.Observable -import rx.lang.scala.TryToObservable +import rx.lang.scala.{ Observable, TryToObservable } import scala.util.Try @@ -34,7 +33,7 @@ class AgreementCreator(placeholderMapper: PlaceholderMapper, trace(dataset, outputStream) resource.managed(new ByteArrayOutputStream()) .map(templateOut => { - logger.info(s"""creating the agreement for dataset "${dataset.datasetID}"""") + logger.info(s"""creating the agreement for dataset "${ dataset.datasetID }"""") for { placeholders <- placeholderMapper.datasetToPlaceholderMap(dataset.validate) _ <- templateResolver.createTemplate(templateOut, placeholders) @@ -64,7 +63,7 @@ class AgreementCreatorWithDatasetLoader(datasetLoader: DatasetLoader, // used in Easy-Ingest-Flow def createAgreement(emd: EasyMetadata, depositorID: DepositorID, files: Seq[FileItem]) (outputStream: OutputStream): Observable[Nothing] = { - datasetLoader.getDataset(parameters.datasetID, emd, depositorID, files, parameters.fileLimit) + datasetLoader.getDataset(parameters.datasetID, emd, depositorID) .flatMap(createAgreement(_)(outputStream).toObservable) .filter(_ => false) .asInstanceOf[Observable[Nothing]] diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreatorApp.scala b/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreatorApp.scala index 15af853..2e7c0ff 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreatorApp.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreatorApp.scala @@ -16,9 +16,9 @@ package nl.knaw.dans.easy.agreement import java.io.File -import javax.naming.Context import com.yourmediashelf.fedora.client.{ FedoraClient, FedoraCredentials } +import javax.naming.Context import rx.schedulers.Schedulers class AgreementCreatorApp(configuration: Configuration) extends AutoCloseable { @@ -28,11 +28,6 @@ class AgreementCreatorApp(configuration: Configuration) extends AutoCloseable { configuration.properties.getString("fcrepo.url"), configuration.properties.getString("fcrepo.user"), configuration.properties.getString("fcrepo.password"))) - val fsrdb: (String, String, String) = ( - configuration.properties.getString("fsrdb.db-connection-url"), - configuration.properties.getString("fsrdb.db-connection-username"), - configuration.properties.getString("fsrdb.db-connection-password")) - val fileLimit: Int = configuration.properties.getInt("agreement.fileLimit") val ldapEnv: LdapEnv = new LdapEnv { put(Context.PROVIDER_URL, configuration.properties.getString("auth.ldap.url")) put(Context.SECURITY_AUTHENTICATION, "simple") diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreatorServlet.scala b/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreatorServlet.scala index 3db5c7c..3296d12 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreatorServlet.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/AgreementCreatorServlet.scala @@ -56,7 +56,7 @@ class AgreementCreatorServlet(app: AgreementCreatorApp) extends ScalatraServlet } private def validateDatasetIdExistsInFedora(pars: Params): Try[Unit] = { - logger.info(s"check if dataset ${pars.datasetID} exists") + logger.info(s"check if dataset ${ pars.datasetID } exists") pars.fedora.datasetIdExists(pars.datasetID).flatMap { case true => Success(()) case false => Failure(new NoSuchElementException(s"DatasetId ${ pars.datasetID } does not exist")) @@ -70,8 +70,6 @@ class AgreementCreatorServlet(app: AgreementCreatorApp) extends ScalatraServlet isSample = params.get("sample").fold(false)(_.toBoolean), fedoraClient = app.fedoraClient, ldapEnv = app.ldapEnv, - fsrdb = app.fsrdb, - fileLimit = app.fileLimit, ) } diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/Command.scala b/src/main/scala/nl/knaw/dans/easy/agreement/Command.scala index a988b1a..74b2412 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/Command.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/Command.scala @@ -55,7 +55,7 @@ object Command extends App with DebugEnhancedLogging { _ = logger.debug(s"Output will be written to ${ outputFile.getAbsolutePath }") _ <- validateDatasetIdExists(params) _ = createAgreement(outputFile, params) - _ = params.close() + _ = params.close() // TODO not reached when validation fails } yield () } .recoverWith { case t: Throwable => Failure(new Exception(s"Could not create agreement for ${ commandLine.datasetID() }: ${ t.getMessage }")) } @@ -72,14 +72,16 @@ object Command extends App with DebugEnhancedLogging { private def createAgreement(outputFile: File, params: internal.Parameters): Unit = { new FileOutputStream(outputFile) .usedIn(AgreementCreator(params).createAgreement) - .doOnCompleted { - logger.info(s"agreement saved at ${ outputFile.getAbsolutePath }") - } + .doOnCompleted(logger.info(s"agreement saved at ${ outputFile.getAbsolutePath }")) .toBlocking .subscribe( _ => {}, - e => logger.error("An error was caught in main:", e), - () => logger.debug("completed")) + e => { + logger.error("An error was caught in main:", e) + throw e + }, + () => logger.debug("completed") + ) } private def createParameters(app: AgreementCreatorApp): Try[internal.Parameters] = Try { @@ -89,8 +91,7 @@ object Command extends App with DebugEnhancedLogging { isSample = commandLine.isSample(), fedoraClient = app.fedoraClient, ldapEnv = app.ldapEnv, - fsrdb = app.fsrdb, - fileLimit = app.fileLimit) + ) } private def runAsService(app: AgreementCreatorApp): Try[FeedBackMessage] = Try { diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/Parameters.scala b/src/main/scala/nl/knaw/dans/easy/agreement/Parameters.scala index 4b13b68..d2f22f8 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/Parameters.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/Parameters.scala @@ -18,12 +18,12 @@ package nl.knaw.dans.easy.agreement import java.io.File import com.yourmediashelf.fedora.client.FedoraClient -import nl.knaw.dans.easy.agreement.internal.{BaseParameters => InternalBaseParams, Parameters => InternalParams} +import nl.knaw.dans.easy.agreement.internal.{ BaseParameters => InternalBaseParams, Parameters => InternalParams } object BaseParameters { - def apply(templateResourceDir: File, datasetID: DatasetID, isSample: Boolean, fileLimit: Int): InternalBaseParams = { - new internal.BaseParameters(templateResourceDir, datasetID, isSample, fileLimit) + def apply(templateResourceDir: File, datasetID: DatasetID, isSample: Boolean): InternalBaseParams = { + new internal.BaseParameters(templateResourceDir, datasetID, isSample) } } @@ -32,10 +32,9 @@ object Parameters { def apply(templateResourceDir: File, datasetID: DatasetID, isSample: Boolean, - fileLimit: Int, fedoraClient: FedoraClient, ldapEnv: LdapEnv, - fsrdb: (String, String, String)): InternalParams = { - new internal.Parameters(templateResourceDir, datasetID, isSample, fileLimit, fedoraClient, ldapEnv, fsrdb) + ): InternalParams = { + new internal.Parameters(templateResourceDir, datasetID, isSample, fedoraClient, ldapEnv) } } diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/internal/DatasetLoader.scala b/src/main/scala/nl/knaw/dans/easy/agreement/internal/DatasetLoader.scala index bea74dc..6c1cd6e 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/internal/DatasetLoader.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/internal/DatasetLoader.scala @@ -15,31 +15,28 @@ */ package nl.knaw.dans.easy.agreement.internal -import java.sql.SQLException import javax.naming.directory.Attributes - -import nl.knaw.dans.easy.agreement.{ DatasetID, DepositorID, FileAccessRight, FileItem } +import nl.knaw.dans.easy.agreement.{ DatasetID, DepositorID } import nl.knaw.dans.pf.language.emd.binding.EmdUnmarshaller -import nl.knaw.dans.pf.language.emd.{ EasyMetadata, EasyMetadataImpl, EmdAudience } +import nl.knaw.dans.pf.language.emd.{ EasyMetadata, EasyMetadataImpl } +import rx.lang.scala.Observable import rx.lang.scala.schedulers.IOScheduler -import rx.lang.scala.{ Observable, ObservableExtensions } -import scala.collection.JavaConverters._ import scala.language.postfixOps import scala.util.control.NonFatal /** - * Data class for an Easy User. Notice that some fields are mandatory and cannot be null! - * - * @param name the user's name (mandatory!) - * @param organization the user's organisation - * @param address the user's address (mandatory!) - * @param postalCode the user's zipcode (mandatory!) - * @param city the user's city (mandatory!) - * @param country the user's country - * @param telephone the user's telephone - * @param email the user's email (mandatory!) - */ + * Data class for an Easy User. Notice that some fields are mandatory and cannot be null! + * + * @param name the user's name (mandatory!) + * @param organization the user's organisation + * @param address the user's address (mandatory!) + * @param postalCode the user's zipcode (mandatory!) + * @param city the user's city (mandatory!) + * @param country the user's country + * @param telephone the user's telephone + * @param email the user's email (mandatory!) + */ case class EasyUser(name: String, organization: String, address: String, @@ -56,12 +53,7 @@ case class EasyUser(name: String, require(email != null, "'email' must be defined") } -case class Dataset(datasetID: DatasetID, - emd: EasyMetadata, - easyUser: EasyUser, - audiences: Seq[AudienceTitle], - fileItems: Seq[FileItem], - filesLimited: Boolean) { +case class Dataset(datasetID: DatasetID, emd: EasyMetadata, easyUser: EasyUser) { require(datasetID != null, "'datasetID' must be defined") @@ -71,84 +63,37 @@ case class Dataset(datasetID: DatasetID, trait DatasetLoader { /** - * Queries the audience title from Fedora given an audience identifiers - * - * @param audienceID the identifier of the audience - * @return The audidence title corresponding to the `audienceID` - */ - def getAudience(audienceID: AudienceID): Observable[AudienceTitle] - - /** - * Queries the audience titles from Fedora for the audiences in `EmdAudience`. - * @param audience the audience object with the identifiers - * @return the titles of the audiences that correspond to the identifiers in `EmdAudience` - */ - def getAudiences(audience: EmdAudience): Observable[AudienceTitle] = { - audience.getValues.asScala.toObservable.flatMap(getAudience) - } - - /** - * Create a `Dataset` based on the given `datasetID` - * - * @param datasetID the identifier of the dataset - * @return the dataset corresponding to `datasetID` - */ + * Create a `Dataset` based on the given `datasetID` + * + * @param datasetID the identifier of the dataset + * @return the dataset corresponding to `datasetID` + */ def getDatasetById(datasetID: DatasetID): Observable[Dataset] /** - * Create a `Dataset` based on the given `datasetID`, `emd`, `depositorID` and `files`, while - * querying for the audience titles and the depositor data. - * - * @param datasetID the identifier of the dataset - * @param emd the `EasyMetadata` of the dataset - * @param depositorID the depositor's identifier - * @param files the files belonging to the dataset - * @return the dataset corresponding to `datasetID` - */ - def getDataset(datasetID: DatasetID, emd: EasyMetadata, depositorID: DepositorID, files: Seq[FileItem], fileLimit: Int): Observable[Dataset] = { - val audiences = getAudiences(emd.getEmdAudience).toSeq - val easyUser = getUserById(depositorID) - val filesWereLimited = countFiles(datasetID).map(fileLimit <) - - easyUser.combineLatest(audiences) - .combineLatestWith(filesWereLimited) { - case ((user, auds), limited) => Dataset(datasetID, emd, user, auds, files, limited) - } + * Create a `Dataset` based on the given `datasetID`, `emd` and `depositorID`, while querying for the depositor data. + * + * @param datasetID the identifier of the dataset + * @param emd the `EasyMetadata` of the dataset + * @param depositorID the depositor's identifier + * @return the dataset corresponding to `datasetID` + */ + def getDataset(datasetID: DatasetID, emd: EasyMetadata, depositorID: DepositorID): Observable[Dataset] = { + getUserById(depositorID) + .map(Dataset(datasetID, emd, _)) } /** - * Returns all files corresponding to the dataset with identifier `datasetID` - * - * @param datasetID the identifier of the dataset - * @return the files corresponding to the dataset with identifier `datasetID` - */ - def getFilesInDataset(datasetID: DatasetID): Observable[FileItem] - - /** - * Return the number of files corresponding to the dataset with identifier `datasetID` + * Queries the user data given a `depositorID` * - * @param datasetID the identifier of the dataset - * @return the number of files corresponding to the dataset with identifier `datasetID` + * @param depositorID the identifier of the user + * @return the user data corresponding to the `depositorID` */ - def countFiles(datasetID: DatasetID): Observable[Int] - - /** - * Queries the user data given a `depositorID` - * - * @param depositorID the identifier of the user - * @return the user data corresponding to the `depositorID` - */ def getUserById(depositorID: DepositorID): Observable[EasyUser] } case class DatasetLoaderImpl()(implicit parameters: DatabaseParameters) extends DatasetLoader { - def getAudience(audienceID: AudienceID): Observable[String] = { - parameters.fedora.getDC(audienceID) - .map(resource.managed(_).acquireAndGet(_.loadXML \\ "title" text)) - .subscribeOn(IOScheduler()) - } - def getDatasetById(datasetID: DatasetID): Observable[Dataset] = { val emdObs = parameters.fedora.getEMD(datasetID) .map(resource.managed(_).acquireAndGet(new EmdUnmarshaller(classOf[EasyMetadataImpl]).unmarshal)) @@ -158,75 +103,10 @@ case class DatasetLoaderImpl()(implicit parameters: DatabaseParameters) extends .subscribeOn(IOScheduler()) .flatMap(getUserById(_).subscribeOn(IOScheduler())) - // publish because emd is used in multiple places here - emdObs.publish(emd => { - emd.combineLatestWith(depositorObs) { - (emdValue, depositorValue) => (audiences: Seq[AudienceTitle]) => (files: Seq[FileItem]) => (limited: Boolean) => - Dataset(datasetID, emdValue, depositorValue, audiences, files, limited) - } - .combineLatestWith(emd.map(_.getEmdAudience).flatMap(getAudiences).toSeq)(_(_)) - .combineLatestWith(getFilesInDataset(datasetID).toSeq)(_(_)) - .combineLatestWith(countFiles(datasetID).map(parameters.fileLimit <))(_(_)) - .single - .onErrorResumeNext { - case e: IllegalArgumentException => Observable.error(MultipleDatasetsFoundException(datasetID, e)) - case e: NoSuchElementException => Observable.error(NoDatasetFoundException(datasetID, e)) - case NonFatal(e) => Observable.error(e) - } - }) - } - - def getFilesInDataset(datasetID: DatasetID): Observable[FileItem] = { - Class.forName("org.postgresql.Driver") - val query = "SELECT pid, path, sha1checksum, accessible_to FROM easy_files WHERE dataset_sid = ? ORDER BY pid LIMIT ?;" - Observable.using(parameters.fsrdb.prepareStatement(query))( - prepStatement => { - prepStatement.setString(1, datasetID) - prepStatement.setInt(2, parameters.fileLimit) - - Observable.using(prepStatement.executeQuery())( - resultSet => Observable.defer(Observable.just(resultSet.next())) - .repeat - .takeWhile(b => b) - .map(_ => { - val pid = resultSet.getString("pid") - val path = resultSet.getString("path") - val sha1checksum = resultSet.getString("sha1checksum") - val accessibleTo = FileAccessRight.valueOf(resultSet.getString("accessible_to")) - .getOrElse(throw new IllegalArgumentException(s"illegal value for accessibleTo in file: $pid")) - - FileItem(path, accessibleTo, if (sha1checksum == "null") None else Some(sha1checksum)) - }), - _.close(), - disposeEagerly = true - ) - }, - _.close(), - disposeEagerly = true - ) - } - - def countFiles(datasetID: DatasetID): Observable[Int] = { - Class.forName("org.postgresql.Driver") - val query = "SELECT COUNT(pid) FROM easy_files WHERE dataset_sid = ?;" - Observable.using(parameters.fsrdb.prepareStatement(query))( - prepStatement => { - prepStatement.setString(1, datasetID) - - Observable.using(prepStatement.executeQuery())( - resultSet => { - if (resultSet.next()) - Observable.just(resultSet.getInt("count")) - else - Observable.error(new SQLException(s"unable to count the number of files in dataset $datasetID")) - }, - _.close(), - disposeEagerly = true - ) - }, - _.close(), - disposeEagerly = true - ) + emdObs.combineLatestWith(depositorObs) { + (emdValue, depositorValue) => + Dataset(datasetID, emdValue, depositorValue) + } } private def get(attrID: String)(implicit attrs: Attributes): Option[String] = { diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/internal/Fedora.scala b/src/main/scala/nl/knaw/dans/easy/agreement/internal/Fedora.scala index 2731d9e..5ab20bb 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/internal/Fedora.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/internal/Fedora.scala @@ -18,7 +18,6 @@ package nl.knaw.dans.easy.agreement.internal import java.io.InputStream import com.yourmediashelf.fedora.client.{ FedoraClient, FedoraClientException, FedoraCredentials } -import com.yourmediashelf.fedora.generated.management.DatastreamProfile import nl.knaw.dans.easy.agreement.DatasetID import rx.lang.scala.Observable @@ -34,14 +33,6 @@ trait Fedora { */ def getAMD(pid: DatasetID): Observable[InputStream] - /** - * Queries Fedora for the DC datastream dissemination xml of the dataset with `identifier = pid`. - * - * @param pid identifier of the dataset to be queried - * @return the resulting `InputStream` wrapped in an `Observable` - */ - def getDC(pid: DatasetID): Observable[InputStream] - /** * Queries Fedora for the EMD datastream dissemination xml of the dataset with `identifier = pid`. * @@ -50,22 +41,6 @@ trait Fedora { */ def getEMD(pid: DatasetID): Observable[InputStream] - /** - * Queries Fedora for the FILE_METADATA datastream dissemination xml of the dataset with `identifier = pid`. - * - * @param pid identifier of the dataset to be queried - * @return the resulting `InputStream` wrapped in an `Observable` - */ - def getFileMetadata(pid: FileID): Observable[InputStream] - - /** - * Queries Fedora for the EASY_FILE datastream of the dataset with `identifier = pid`. - * - * @param pid identifier of the dataset to be queried - * @return the resulting `DatastreamProfile` wrapped in an `Observable` - */ - def getFile(pid: FileID): Observable[DatastreamProfile] - /** * Queries whether the provided datasetID exists in Fedora * @@ -89,18 +64,8 @@ case class FedoraImpl(client: FedoraClient) extends Fedora { def getAMD(pid: DatasetID): Observable[InputStream] = query(pid, "AMD").single - def getDC(pid: DatasetID): Observable[InputStream] = query(pid, "DC").single - def getEMD(pid: DatasetID): Observable[InputStream] = query(pid, "EMD").single - def getFileMetadata(pid: FileID): Observable[InputStream] = query(pid, "EASY_FILE_METADATA").single - - def getFile(pid: FileID): Observable[DatastreamProfile] = { - Observable.just(FedoraClient.getDatastream(pid, "EASY_FILE") - .execute(client) - .getDatastreamProfile) - } - override def datasetIdExists(datasetID: DatasetID): Try[Boolean] = Try { FedoraClient.getObjectXML(datasetID) .execute(client) diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/internal/KeywordMapping.scala b/src/main/scala/nl/knaw/dans/easy/agreement/internal/KeywordMapping.scala index c076010..6c6ba75 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/internal/KeywordMapping.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/internal/KeywordMapping.scala @@ -18,8 +18,9 @@ package nl.knaw.dans.easy.agreement.internal // @formatter:off trait KeywordMapping { val keyword: String } -// logo in header (for 64bit encoding) +// logos in header and footer (for 64bit encoding) case object DansLogo extends KeywordMapping { val keyword = "DansLogo" } +case object DrivenByData extends KeywordMapping { val keyword = "DrivenByData" } // footer text case object FooterText extends KeywordMapping { val keyword = "FooterText" } @@ -43,30 +44,10 @@ case object DepositorEmail extends KeywordMapping { val keyword = // access rights case object OpenAccess extends KeywordMapping { val keyword = "OpenAccess" } -case object OpenAccessForRegisteredUsers extends KeywordMapping { val keyword = "OpenAccessForRegisteredUsers" } -case object OtherAccess extends KeywordMapping { val keyword = "OtherAccess" } -case object RestrictGroup extends KeywordMapping { val keyword = "RestrictGroup" } -case object RestrictRequest extends KeywordMapping { val keyword = "RestrictRequest" } - -// embargo case object UnderEmbargo extends KeywordMapping { val keyword = "UnderEmbargo" } case object DateAvailable extends KeywordMapping { val keyword = "DateAvailable" } case object CurrentDateAndTime extends KeywordMapping { val keyword = "CurrentDateAndTime" } - -// metadata table -case object MetadataTable extends KeywordMapping { val keyword = "MetadataTable" } -case object MetadataKey extends KeywordMapping { val keyword = "MetadataKey" } -case object MetadataValue extends KeywordMapping { val keyword = "MetadataValue" } - -// file table -case object HasFiles extends KeywordMapping { val keyword = "HasFiles" } -case object FileTable extends KeywordMapping { val keyword = "FileTable" } -case object FilePath extends KeywordMapping { val keyword = "FilePath" } -case object FileChecksum extends KeywordMapping { val keyword = "FileChecksum" } -case object FileAccessibleTo extends KeywordMapping { val keyword = "FileAccessibleTo" } - -// file limit -case object LimitFiles extends KeywordMapping { val keyword = "limitFiles" } -case object ShouldLimitFiles extends KeywordMapping { val keyword = "shouldLimitFiles" } -// @formatter:on +case object TermsLicense extends KeywordMapping { val keyword = "TermsLicense" } +case object TermsLicenseUrl extends KeywordMapping { val keyword = "TermsLicenseUrl" } +case object Appendix3 extends KeywordMapping { val keyword = "Appendix3" }// @formatter:on diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/internal/Parameters.scala b/src/main/scala/nl/knaw/dans/easy/agreement/internal/Parameters.scala index 99650bc..2a66b2c 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/internal/Parameters.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/internal/Parameters.scala @@ -16,43 +16,57 @@ package nl.knaw.dans.easy.agreement.internal import java.io.File -import java.sql.{ Connection, DriverManager } -import javax.naming.ldap.InitialLdapContext import com.yourmediashelf.fedora.client.FedoraClient +import javax.naming.ldap.InitialLdapContext import nl.knaw.dans.easy.agreement.{ DatasetID, LdapEnv } +import org.apache.commons.configuration.PropertiesConfiguration + +import scala.collection.JavaConverters._ +import scala.util.Try // this class needs to be in a separate file rather than in package.scala because of interop with // java business layer. class BaseParameters(val templateResourceDir: File, val datasetID: DatasetID, val isSample: Boolean, - val fileLimit: Int) + ) { + private val licenseUrlPrefixRegExp = "https?://(www.)?" + val licencesMap: Map[String, String] = Try { + val file = new File(templateResourceDir, "/template/licenses/licenses.properties") + val licenses = new PropertiesConfiguration(file) + licenses.getKeys.asScala.map(key => + key.replaceAll(licenseUrlPrefixRegExp, "") -> s"/licenses/${ licenses.getString(key) }" + ).toMap + }.getOrElse(Map.empty) + + def licenseLegalResource(url: String): String = { + licencesMap.getOrElse( + url.replaceAll(licenseUrlPrefixRegExp, ""), + throw new IllegalArgumentException(s"No legal text found for $url") + ) + } +} trait DatabaseParameters { val fedora: Fedora val ldap: Ldap - val fsrdb: Connection - val fileLimit: Int } case class Parameters(override val templateResourceDir: File, override val datasetID: DatasetID, override val isSample: Boolean, - override val fileLimit: Int, fedora: Fedora, - ldap: Ldap, - fsrdb: Connection) - extends BaseParameters(templateResourceDir, datasetID, isSample, fileLimit) with DatabaseParameters with AutoCloseable { + ldap: Ldap) + extends BaseParameters(templateResourceDir, datasetID, isSample) with DatabaseParameters with AutoCloseable { - def this(templateResourceDir: File, datasetID: DatasetID, isSample: Boolean, fileLimit: Int, fedoraClient: FedoraClient, ldapEnv: LdapEnv, fsrdb: (String, String, String)) = { - this(templateResourceDir, datasetID, isSample, fileLimit, FedoraImpl(fedoraClient), LdapImpl(new InitialLdapContext(ldapEnv, null)), DriverManager.getConnection(fsrdb._1, fsrdb._2, fsrdb._3)) + def this(templateResourceDir: File, datasetID: DatasetID, isSample: Boolean, fedoraClient: FedoraClient, ldapEnv: LdapEnv) = { + this(templateResourceDir, datasetID, isSample, FedoraImpl(fedoraClient), LdapImpl(new InitialLdapContext(ldapEnv, null))) } - override def close(): Unit = { - fsrdb.close() - ldap.close() - } + override def close(): Unit = { + ldap.close() + } override def toString: String = super.toString } diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/internal/PlaceholderMapper.scala b/src/main/scala/nl/knaw/dans/easy/agreement/internal/PlaceholderMapper.scala index 0b4bb49..6334e98 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/internal/PlaceholderMapper.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/internal/PlaceholderMapper.scala @@ -21,20 +21,18 @@ import java.{ util => ju } import nl.knaw.dans.common.lang.dataset.AccessCategory import nl.knaw.dans.common.lang.dataset.AccessCategory._ +import nl.knaw.dans.easy.agreement.FileAccessRight import nl.knaw.dans.easy.agreement.FileAccessRight._ -import nl.knaw.dans.easy.agreement.{ DatasetID, FileAccessRight, FileItem } import nl.knaw.dans.lib.error.TryExtensions import nl.knaw.dans.lib.logging.DebugEnhancedLogging -import nl.knaw.dans.lib.string.StringExtensions -import nl.knaw.dans.pf.language.emd.types.Spatial.{ Box, Point } import nl.knaw.dans.pf.language.emd.types._ -import nl.knaw.dans.pf.language.emd.{ EasyMetadata, EmdDate, Term } +import nl.knaw.dans.pf.language.emd.{ EasyMetadata, EmdDate } import org.apache.commons.codec.binary.Base64 import org.apache.commons.io.FileUtils import org.joda.time.DateTime import scala.collection.JavaConverters._ -import scala.collection.{ SortedMap, mutable } +import scala.collection.SortedMap import scala.language.{ implicitConversions, postfixOps } import scala.util.Try @@ -42,10 +40,6 @@ class PlaceholderMapper(metadataTermsFile: File)(implicit parameters: BaseParame type Table = ju.Collection[ju.Map[String, String]] - val metadataNames: ju.Properties = loadProperties(metadataTermsFile) - .doIfFailure { case e => logger.error(s"could not read the metadata terms in $metadataTermsFile", e) } - .getOrElse(new ju.Properties()) - def datasetToPlaceholderMap(dataset: Dataset): Try[PlaceholderMap] = { logger.debug("create placeholder map") @@ -55,17 +49,12 @@ class PlaceholderMapper(metadataTermsFile: File)(implicit parameters: BaseParame headerMap <- if (parameters.isSample) sampleHeader(emd) else header(emd) dansLogo = DansLogo -> encodeImage(dansLogoFile) - footer = FooterText -> footerText(footerTextFile) + drivenByData = DrivenByData -> encodeImage(drivenByDataFile) depositorMap = depositor(dataset.easyUser) - accessRightMap <- datasetAccessCategory(emd) + openAccess = OpenAccess -> boolean2Boolean(isOpenAccess(emd)) + termsLicenseMap <- termsLicenseMap(emd) embargoMap = embargo(emd) - dateTime = CurrentDateAndTime -> currentDateAndTime - metadata = MetadataTable -> metadataTable(emd, dataset.audiences, dataset.datasetID) - files @ (_, table) = FileTable -> filesTable(dataset.fileItems) - hasFiles = HasFiles -> boolean2Boolean(!table.isEmpty) - limitFiles = LimitFiles -> parameters.fileLimit.toString - shouldLimitFiles = ShouldLimitFiles -> boolean2Boolean(dataset.filesLimited) - } yield headerMap + dansLogo + footer ++ depositorMap ++ accessRightMap ++ embargoMap + dateTime + metadata + files + hasFiles + limitFiles + shouldLimitFiles + } yield headerMap + dansLogo + drivenByData ++ depositorMap + openAccess ++ termsLicenseMap ++ embargoMap } def header(emd: EasyMetadata): Try[PlaceholderMap] = Try { @@ -112,23 +101,11 @@ class PlaceholderMapper(metadataTermsFile: File)(implicit parameters: BaseParame ) } - def datasetAccessCategory(emd: EasyMetadata): Try[PlaceholderMap] = Try { + def isOpenAccess(emd: EasyMetadata): Boolean = { // access category in EMD may be null, in which case OPEN_ACCESS is the default value - val ac = Option(emd.getEmdRights.getAccessCategory).getOrElse(OPEN_ACCESS) - - val result = Map[KeywordMapping, List[AccessCategory]]( - OpenAccess -> List(OPEN_ACCESS, ANONYMOUS_ACCESS, FREELY_AVAILABLE), - OpenAccessForRegisteredUsers -> List(OPEN_ACCESS_FOR_REGISTERED_USERS), - OtherAccess -> List(ACCESS_ELSEWHERE, NO_ACCESS), - RestrictGroup -> List(GROUP_ACCESS), - RestrictRequest -> List(REQUEST_PERMISSION) - // because Velocity requires Java objects, we transform Scala's Boolean into a Java Boolean - ).mapValues(lst => boolean2Boolean(lst.contains(ac))) - - if (result.exists { case (_, bool) => bool == true }) - result - else - throw new IllegalArgumentException(s"The specified access category ($ac) does not map to any of these keywords.") + val accessCategory = Option(emd.getEmdRights.getAccessCategory).getOrElse(OPEN_ACCESS) + List(OPEN_ACCESS, ANONYMOUS_ACCESS, FREELY_AVAILABLE) + .contains(accessCategory) } def embargo(emd: EasyMetadata): PlaceholderMap = { @@ -140,82 +117,23 @@ class PlaceholderMapper(metadataTermsFile: File)(implicit parameters: BaseParame ) } - def currentDateAndTime: String = new DateTime().toString("YYYY-MM-dd HH:mm:ss") - - private val newLine = "
    " - - def metadataTable(emd: EasyMetadata, audiences: Seq[AudienceTitle], datasetID: => DatasetID): Table = { - def format(term: Term, items: mutable.Buffer[MetadataItem]): String = { - term.getName match { - case Term.Name.AUDIENCE => formatAudience(audiences, datasetID) - case Term.Name.ACCESSRIGHTS => formatDatasetAccessRights(items.head) - case Term.Name.SPATIAL => formatSpatials(items) - case Term.Name.LICENSE => getSpecifiedLicense(items) - .getOrElse(toLicense(emd.getEmdRights.getAccessCategory)) - case Term.Name.RELATION => formatRelations(items) - case _ => items.mkString(newLine) - } - } - - def getDisplayName(term: Term): String = { - val qualifiedName = term.getQualifiedName - Option(metadataNames.getProperty(qualifiedName)) - .getOrElse { - logger.warn(s"Could not find display name for a term with qualified name '$qualifiedName'") - qualifiedName - } - } - - emd.getTerms - .asScala - .map(term => (term, emd.getTerm(term).asScala)) - .filter { case (_, items) => items.nonEmpty } - .groupBy { case (term, _) => getDisplayName(term) } - .map { case (displayName, termsAndItems) => - // by definition of `groupBy`, `termsAndItems` cannot be empty - val termName = termsAndItems.head._1.getName - val value = termsAndItems - .map((format _).tupled) - .reduce(_ + newLine * 2 + _) - - // keep the Term.Name around for sorting according to the Enum order - termName -> Map( - MetadataKey -> displayName, - MetadataValue -> value - ).keywordMapAsJava - } - .sortedJavaCollection - } - - private def getSpecifiedLicense(licenseItems: mutable.Buffer[MetadataItem]): Option[String] = { - licenseItems.filterNot { - case s: BasicString if s.getValue == "accept" => true - case _ => false - }.map(_.toString).headOption - } - - private def toLicense(category: AccessCategory): String = { - category match { - case AccessCategory.OPEN_ACCESS => "http://creativecommons.org/publicdomain/zero/1.0/legalcode" - case _ => "http://dans.knaw.nl/en/about/organisation-and-policy/legal-information/DANSGeneralconditionsofuseUKDEF.pdf" - } - } - - private def formatRelations(items: mutable.Buffer[MetadataItem]): String = { - items.map { - case r: Relation => formatRelation(r) - case s => s.toString - }.mkString(newLine) + def termsLicenseMap(emd: EasyMetadata): Try[PlaceholderMap] = Try { + val url = emd.getEmdRights.getTermsLicense.asScala + .map(_.getValue) + .find(_.startsWith("http")) + .getOrElse(throw new IllegalArgumentException("Did not find a http...")) + val file = parameters.licenseLegalResource(url) + val extensionRegExp = ".[^.]+$" + val txtFile = file.toString.replaceAll(extensionRegExp, ".txt") + val baseFileName = new File(file).getName.replaceAll(extensionRegExp, "") + Map( + TermsLicenseUrl -> url, + TermsLicense -> baseFileName, + Appendix3 -> txtFile + ) } - def formatAudience(audiences: Seq[AudienceTitle], datasetID: => DatasetID): String = { - // may throw an UnsupportedOperationException - Try(audiences.reduce(_ + "; " + _)) - .doIfFailure { - case _: UnsupportedOperationException => logger.warn(s"Found a dataset with no audience: $datasetID. Returning an empty String instead.") - } - .getOrElse("") - } + def currentDateAndTime: String = new DateTime().toString("YYYY-MM-dd HH:mm:ss") def formatDatasetAccessRights(item: MetadataItem): String = { Try(AccessCategory.valueOf(item.toString)) // may throw an IllegalArgumentException @@ -235,60 +153,6 @@ class PlaceholderMapper(metadataTermsFile: File)(implicit parameters: BaseParame .getOrElse(item.toString) } - private def formatSpatials(items: mutable.Buffer[MetadataItem]): String = { - val basic = items.collect { - case s: BasicString => s.getValue - } - val spatial = items.collect { - case s: Spatial => formatEasSpatial(s).replace("\n", newLine) - } - (basic ++ spatial).mkString(newLine * 2) - } - - def formatEasSpatial(spatial: Spatial): String = { - val place = Option(spatial.getPlace).flatMap(_.getValue.toOption) - val point = Option(spatial.getPoint).map(formatPoint) - val box = Option(spatial.getBox).map(formatBox) - val polygonText = Option(spatial.getPolygons).flatMap(_.asScala.headOption).map(formatPolygon) - - (place.toList ::: point.toList ::: box.toList ::: polygonText.toList).mkString("\n") - } - - private def formatPoint(point: Point): String = { - val scheme = Option(point.getScheme).map("scheme = " + _ + ", ").getOrElse("") - val x = s"x = ${ point.getX }" - val y = s"y = ${ point.getY }" - - // note: no space between $scheme and $x: - // if $scheme is defined, it will do the space after it by itself; - // if $scheme is not defined, it doesn't require the extra space. - s"Point: $scheme$x, $y" - } - - private def formatBox(box: Box): String = { - val scheme = Option(box.getScheme).map("scheme = " + _ + ", ").getOrElse("") - val north = s"north = ${ box.getNorth }" - val east = s"east = ${ box.getEast }" - val south = s"south = ${ box.getSouth }" - val west = s"west = ${ box.getWest }" - - s"Box: $scheme$north, $east, $south, $west" - } - - private def formatPolygon(polygon: Polygon): String = { - s"""Polygon: - |To keep this agreement at a reasonable size the polygon coordinates are omitted. For a full listing of the polygons please contact DANS at info@dans.knaw.nl.""".stripMargin - } - - private def formatRelation(relation: Relation): String = { - val title = Option(relation.getSubjectTitle).flatMap(_.getValue.toOption.map("title = " +)) - val url = Option(relation.getSubjectLink).map("url = " +) - - title.map(t => url.fold(t)(u => s"$t, $u")) - .orElse(url) - .getOrElse("") - } - def formatFileAccessRights(accessRight: FileAccessRight.Value): String = { accessRight match { // @formatter:off @@ -301,20 +165,6 @@ class PlaceholderMapper(metadataTermsFile: File)(implicit parameters: BaseParame } } - def filesTable(fileItems: Seq[FileItem]): Table = { - fileItems - .map { case FileItem(path, accessibleTo, checkSum) => - val map = Map( - FilePath -> path, - FileChecksum -> checkSum.filterNot(_.isBlank).filterNot("none" ==).getOrElse(checkSumNotCalculated), - FileAccessibleTo -> formatFileAccessRights(accessibleTo) - ) - - (path, map.keywordMapAsJava) - } - .sortedJavaCollection - } - implicit class KeywordMapToJavaMap[Keyword <: KeywordMapping](map: Map[Keyword, String]) { def keywordMapAsJava: ju.Map[String, String] = map.map { case (k, v) => (k.keyword, v) }.asJava } diff --git a/src/main/scala/nl/knaw/dans/easy/agreement/internal/package.scala b/src/main/scala/nl/knaw/dans/easy/agreement/internal/package.scala index 4845774..a969167 100644 --- a/src/main/scala/nl/knaw/dans/easy/agreement/internal/package.scala +++ b/src/main/scala/nl/knaw/dans/easy/agreement/internal/package.scala @@ -25,20 +25,13 @@ import rx.lang.scala.Notification.{ OnCompleted, OnError, OnNext } import rx.lang.scala.{ Notification, Observable } import scala.language.postfixOps -import scala.util.Try import scala.xml.{ Elem, XML } package object internal { - type AudienceID = String - type AudienceTitle = String - - type FileID = String - type PlaceholderMap = Map[KeywordMapping, Object] val encoding: Charset = Charsets.UTF_8 - val checkSumNotCalculated = "------not-calculated------" def velocityProperties(implicit parameters: BaseParameters): Properties = { val p = new Properties @@ -58,8 +51,8 @@ package object internal { new File(parameters.templateResourceDir, "/dans_logo.png") } - def footerTextFile(implicit parameters: BaseParameters): File = { - new File(parameters.templateResourceDir, "/agreement_version.txt") + def drivenByDataFile(implicit parameters: BaseParameters): File = { + new File(parameters.templateResourceDir, "/DrivenByData.png") } def metadataTermsProperties(implicit parameters: BaseParameters): File = { @@ -85,55 +78,36 @@ package object internal { implicit class FileExtensions(val file: File) extends AnyVal { /** - * Copies a whole directory to a new location preserving the file dates. - *

    - * This method copies the specified directory and all its child - * directories and files to the specified destination. - * The destination is the new location and name of the directory. - *

    - * The destination directory is created if it does not exist. - * If the destination directory did exist, then this method merges - * the source with the destination, with the source taking precedence. - *

    - * Note: This method tries to preserve the files' last - * modified date/times using ``File#setLastModified(long)``, however - * it is not guaranteed that those operations will succeed. - * If the modification operation fails, no indication is provided. - * - * @param destDir the new directory, must not be ``null`` - */ + * Copies a whole directory to a new location preserving the file dates. + *

    + * This method copies the specified directory and all its child + * directories and files to the specified destination. + * The destination is the new location and name of the directory. + *

    + * The destination directory is created if it does not exist. + * If the destination directory did exist, then this method merges + * the source with the destination, with the source taking precedence. + *

    + * Note: This method tries to preserve the files' last + * modified date/times using ``File#setLastModified(long)``, however + * it is not guaranteed that those operations will succeed. + * If the modification operation fails, no indication is provided. + * + * @param destDir the new directory, must not be ``null`` + */ def copyDir(destDir: File): Unit = FileUtils.copyDirectory(file, destDir) /** - * Determines whether the ``parent`` directory contains the ``child`` element (a file or directory). - *

    - * Files are normalized before comparison. - *

    - * - * Edge cases: - *
      - *
    • A ``directory`` must not be null: if null, throw IllegalArgumentException
    • - *
    • A ``directory`` must be a directory: if not a directory, throw IllegalArgumentException
    • - *
    • A directory does not contain itself: return false
    • - *
    • A null child file is not contained in any parent: return false
    • - *
    - * - * @param child the file to consider as the child. - * @return true is the candidate leaf is under by the specified composite. False otherwise. - */ - def directoryContains(child: File): Boolean = FileUtils.directoryContains(file, child) - - /** - * Deletes a directory recursively. - */ + * Deletes a directory recursively. + */ def deleteDirectory(): Unit = FileUtils.deleteDirectory(file) /** - * Reads the contents of a file into a String using the default encoding for the VM. - * The file is always closed. - * - * @return the file contents, never ``null`` - */ + * Reads the contents of a file into a String using the default encoding for the VM. + * The file is always closed. + * + * @return the file contents, never ``null`` + */ def read(encoding: Charset = Charsets.UTF_8): String = FileUtils.readFileToString(file, encoding) } @@ -141,7 +115,7 @@ package object internal { def loadXML: Elem = XML.load(stream) } - // TODO not used here anymore, but useful for debugging purposed. Maybe we can migrate this to a EASY-Utils project? + // TODO not used here anymore, but useful for debugging purposes. implicit class ObservableDebug[T](val observable: Observable[T]) extends AnyVal { def debugThreadName(s: String = "")(implicit logger: Logger): Observable[T] = { @@ -154,7 +128,7 @@ package object internal { } observable.materialize - .doOnEach(o => logger.debug(s"$s: ${notificationKind(o)} - ${Thread.currentThread().getName}")) + .doOnEach(o => logger.debug(s"$s: ${ notificationKind(o) } - ${ Thread.currentThread().getName }")) .dematerialize } @@ -164,14 +138,4 @@ package object internal { .dematerialize } } - - def loadProperties(file: File): Try[Properties] = { - resource.Using.fileInputStream(file) - .map(fis => { - val props = new Properties - props.load(fis) - props - }) - .tried - } } diff --git a/src/test/resources/datasetloader/emd.xml b/src/test/resources/datasetloader/emd.xml index 688ee6d..2cd4429 100644 --- a/src/test/resources/datasetloader/emd.xml +++ b/src/test/resources/datasetloader/emd.xml @@ -2,8 +2,4 @@ descr foo bar - - aud1 - aud2 - diff --git a/src/test/resources/debug-config/application.properties b/src/test/resources/debug-config/application.properties index 5f139f8..ec87823 100644 --- a/src/test/resources/debug-config/application.properties +++ b/src/test/resources/debug-config/application.properties @@ -1,12 +1,8 @@ fcrepo.url=http://deasy.dans.knaw.nl:8080/fedora fcrepo.user=fedoraAdmin fcrepo.password=fedoraAdmin -fsrdb.db-connection-url=jdbc:postgresql://deasy.dans.knaw.nl:5432/easy_db -fsrdb.db-connection-username=easy_webui -fsrdb.db-connection-password=easy_webui auth.ldap.url=ldap://deasy.dans.knaw.nl auth.ldap.user=cn=ldapadmin,dc=dans,dc=knaw,dc=nl auth.ldap.password=ldapadmin agreement.resources=home/res -agreement.fileLimit=3 daemon.http.port=20130 diff --git a/src/test/scala/nl/knaw/dans/easy/agreement/AgreementCreatorServletSpec.scala b/src/test/scala/nl/knaw/dans/easy/agreement/AgreementCreatorServletSpec.scala index 1578c2e..b0fb0b7 100644 --- a/src/test/scala/nl/knaw/dans/easy/agreement/AgreementCreatorServletSpec.scala +++ b/src/test/scala/nl/knaw/dans/easy/agreement/AgreementCreatorServletSpec.scala @@ -47,14 +47,10 @@ class AgreementCreatorServletSpec extends FlatSpec addProperty("fcrepo.url", "http://localhost:8080/fedora") addProperty("fcrepo.user", "-") addProperty("fcrepo.password", "-") - addProperty("fsrdb.db-connection-url", "") - addProperty("fsrdb.db-connection-username", "-") - addProperty("fsrdb.db-connection-password", "-") addProperty("auth.ldap.url", "ldap://localhost") addProperty("auth.ldap.user", "") addProperty("auth.ldap.password", "") addProperty("agreement.resources", "") - addProperty("agreement.fileLimit", "3") }) } } diff --git a/src/test/scala/nl/knaw/dans/easy/agreement/TemplateResolverSpec.scala b/src/test/scala/nl/knaw/dans/easy/agreement/TemplateResolverSpec.scala new file mode 100644 index 0000000..ed796a4 --- /dev/null +++ b/src/test/scala/nl/knaw/dans/easy/agreement/TemplateResolverSpec.scala @@ -0,0 +1,164 @@ +/** + * Copyright (C) 2016 DANS - Data Archiving and Networked Services (info@dans.knaw.nl) + * + * 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. + */ +package nl.knaw.dans.easy.agreement + +import java.io.{ ByteArrayOutputStream, File, FileOutputStream, OutputStream } +import java.util.Arrays.asList + +import nl.knaw.dans.common.lang.dataset.AccessCategory +import nl.knaw.dans.easy.agreement.internal._ +import nl.knaw.dans.pf.language.emd.Term.Name +import nl.knaw.dans.pf.language.emd._ +import nl.knaw.dans.pf.language.emd.types.{ BasicString, IsoDate } +import org.joda.time.DateTime +import org.scalamock.scalatest.MockFactory +import org.scalatest.BeforeAndAfterAll +import org.scalatest.prop.TableDrivenPropertyChecks + +import scala.util.{ Failure, Success } + +class TemplateResolverSpec extends UnitSpec with MockFactory with TableDrivenPropertyChecks with BeforeAndAfterAll { + trait MockEasyMetadata extends EasyMetadata { + def toString(x: String, y: Name): String = "" + + def toString(x: String, y: Term): String = "" + + def toString(x: String, y: MDContainer): String = "" + + def toString(x: String): String = "" + } + + private val templateResourceDir = new java.io.File(testDir, "res") + private val properties = new File(templateResourceDir, "MetadataTestTerms.properties") + private val datasetId = "easy:12" + private val user = EasyUser( + name = "N.O. Body", + organization = "Eidgenössische Technische Hochschule", + address = "Rämistrasse 101", + postalCode = "8092", + city = " Zürich", + country = "Schweiz", + telephone = "+41 44 632 11 11", + email = "nobody@dans.knaw.nl" + ) + + override def beforeAll() { + testDir.mkdirs() + super.beforeAll() + testDir.deleteDirectory() + testDir.mkdirs() + new File("src/main/assembly/dist/res").copyDir(new File(testDir, "res")) + new File("target/easy-licenses/licenses").copyDir(new File(testDir, "res/template/licenses")) + } + + "createTemplate" should "find all place holders" in { + forEvery(for { + rights <- Seq(AccessCategory.OPEN_ACCESS, AccessCategory.REQUEST_PERMISSION) + isSample <- Seq(true, false) + available <- Seq(new DateTime, (new DateTime).plusYears(1)).map(new IsoDate(_)) + } yield (isSample, rights, available)) { + case (isSample, rights, available) => + create( + isSample, + mockDataset(rights, isSample, available), + new FileOutputStream(docName(isSample, rights, available)) + ) shouldBe Success(()) + } + } + + it should "not find a license url" in { + val dataset = mockDataset(AccessCategory.OPEN_ACCESS, isSample = false, new IsoDate(), new BasicString("accept")) + val outputStream = new ByteArrayOutputStream() + + create(isSample = false, dataset, outputStream) should matchPattern { + case Failure(e: IllegalArgumentException) if (e.getMessage == "Did not find a http...") => + } + } + + it should "not find the resource for Appendix 3" in { + val dataset = mockDataset(AccessCategory.OPEN_ACCESS, isSample = false, new IsoDate(), new BasicString("http://dans.knaw.nl")) + val outputStream = new ByteArrayOutputStream() + + create(isSample = false, dataset, outputStream) should matchPattern { + case Failure(e: java.lang.IllegalArgumentException) if (e.getMessage == "No legal text found for http://dans.knaw.nl") => + } + } + + it should "properly format all types of licenses" in { + forEvery(Seq( + new BasicString("http://creativecommons.org/licenses/by-nc-sa/3.0") + -> """BY-NC-SA-3.0 : http://creativecommons.org/licenses/by-nc-sa/3.0""", + new BasicString("https://creativecommons.org/licenses/by-nc-sa/3.0") + -> """BY-NC-SA-3.0 : https://creativecommons.org/licenses/by-nc-sa/3.0""", + new BasicString("https://www.creativecommons.org/licenses/by-nc-sa/3.0") + -> """BY-NC-SA-3.0 : https://www.creativecommons.org/licenses/by-nc-sa/3.0""", + new BasicString("http://www.creativecommons.org/licenses/by-nc-sa/3.0") + -> """BY-NC-SA-3.0 : http://www.creativecommons.org/licenses/by-nc-sa/3.0""", + )) { + case (emdRightsTermsLicense, expected) => + val dataset = mockDataset(AccessCategory.OPEN_ACCESS, isSample = false, new IsoDate(), emdRightsTermsLicense) + val outputStream = new ByteArrayOutputStream() + + create(isSample = false, dataset, outputStream) shouldBe Success(()) + + val lines = outputStream.toString.split("\n") + // .filter(_.contains("""class="choice">""")) // TODO less output in case of failure, but it's no longer on a single line + // lines should have length (1) // detected a forgotten #else in the template + lines.mkString("\n", "\n", "\n") should include(expected) + } + } + + private def create(isSample: Boolean, dataset: Dataset, outputStream: OutputStream) = { + implicit val parameters: BaseParameters = new BaseParameters(templateResourceDir, datasetId, isSample) + new PlaceholderMapper(properties) + .datasetToPlaceholderMap(dataset) + .flatMap(placeholders => + new VelocityTemplateResolver(velocityProperties) + .createTemplate(outputStream, placeholders) + ) + } + + private def docName(isSample: Boolean, rights: AccessCategory, available: IsoDate): String = { + val part1 = rights match { + case AccessCategory.OPEN_ACCESS => "OA" + case _ => "RA" // restricted as in appendix1.html + } + val part2 = if (isSample) "sample-" + else "" + s"$testDir/$part1-$part2$available.html" + } + + private def mockDataset(openaccess: AccessCategory, isSample: Boolean, dateAvailable: IsoDate, + emdRightsTermsLicense: BasicString = new BasicString("http://creativecommons.org/licenses/by-nc-sa/3.0") + ): Dataset = { + val emd = mock[MockEasyMetadata] + val date = mock[EmdDate] + val rights = mock[EmdRights] + emd.getPreferredTitle _ expects() returning "about testing" + emd.getEmdRights _ expects() returning rights twice() + emd.getEmdDate _ expects() returning date anyNumberOfTimes() + rights.getAccessCategory _ expects() returning openaccess + rights.getTermsLicense _ expects() returning asList(emdRightsTermsLicense) + date.getEasDateSubmitted _ expects() returning asList(new IsoDate("1992-07-30")) + date.getEasAvailable _ expects() returning asList(dateAvailable) anyNumberOfTimes() + if (!isSample) { + val emdIdentifier = mock[EmdIdentifier] + emd.getEmdIdentifier _ expects() returning emdIdentifier anyNumberOfTimes() + emdIdentifier.getDansManagedDoi _ expects() returning "10.17026/test-dans-2xg-umq8" anyNumberOfTimes() + } + Dataset(datasetID = "easy:12", emd, user).validate + } +} diff --git a/src/test/scala/nl/knaw/dans/easy/agreement/internal/DatasetLoaderSpec.scala b/src/test/scala/nl/knaw/dans/easy/agreement/internal/DatasetLoaderSpec.scala index bee3186..ed8d8a3 100644 --- a/src/test/scala/nl/knaw/dans/easy/agreement/internal/DatasetLoaderSpec.scala +++ b/src/test/scala/nl/knaw/dans/easy/agreement/internal/DatasetLoaderSpec.scala @@ -16,12 +16,9 @@ package nl.knaw.dans.easy.agreement.internal import java.io.File -import java.sql.{ Connection, PreparedStatement, ResultSet } -import java.util -import javax.naming.directory.BasicAttributes +import javax.naming.directory.BasicAttributes import nl.knaw.dans.easy.agreement._ -import nl.knaw.dans.pf.language.emd._ import org.apache.commons.io.{ FileUtils, IOUtils } import org.scalamock.scalatest.MockFactory import org.scalatest.{ BeforeAndAfter, BeforeAndAfterAll } @@ -35,7 +32,6 @@ class DatasetLoaderSpec extends UnitSpec with MockFactory with BeforeAndAfter wi private val fedoraMock = mock[Fedora] private val ldapMock = mock[Ldap] - private val fsrdbMock = mock[Connection] val (userAttributes, expectedUser) = { val attrs = new BasicAttributes @@ -56,8 +52,6 @@ class DatasetLoaderSpec extends UnitSpec with MockFactory with BeforeAndAfter wi implicit val parameters: DatabaseParameters = new DatabaseParameters { override val fedora: Fedora = fedoraMock override val ldap: Ldap = ldapMock - override val fsrdb: Connection = fsrdbMock - override val fileLimit: Int = 2 } before { @@ -122,11 +116,6 @@ class DatasetLoaderSpec extends UnitSpec with MockFactory with BeforeAndAfter wi val id = "testID" val depID = "depID" val user = EasyUser("name", "org", "addr", "pc", "city", "cntr", "phone", "mail") - val audiences = Seq("aud1", "aud2") - val files = Seq( - FileItem("path1", FileAccessRight.RESTRICTED_GROUP, Some("chs1")), - FileItem("path2", FileAccessRight.KNOWN, Some("chs2")) - ) val amdStream = IOUtils.toInputStream({depID}.toString) val emdStream = FileUtils.openInputStream(new File(testDir, "datasetloader/emd.xml")) @@ -134,151 +123,23 @@ class DatasetLoaderSpec extends UnitSpec with MockFactory with BeforeAndAfter wi fedoraMock.getAMD _ expects id returning Observable.just(amdStream) fedoraMock.getEMD _ expects id returning Observable.just(emdStream) - val loader = new DatasetLoaderImpl { + val loader: DatasetLoaderImpl = new DatasetLoaderImpl { override def getUserById(depositorID: DepositorID): Observable[EasyUser] = { if (depositorID == depID) Observable.just(user) else fail(s"not the correct depositorID, was $depositorID, should be $depID") } - - override def getAudiences(a: EmdAudience): Observable[AudienceTitle] = { - if (a.getDisciplines.asScala.map(_.getValue) == audiences) Observable.from(audiences) - else fail("not the correct audiences") - } - - override def getFilesInDataset(did: DatasetID): Observable[FileItem] = { - if (did == id) Observable.from(files) - else fail(s"not the correct datasetID, was $did, should be $id") - } - - override def countFiles(datasetID: DatasetID): Observable[Int] = { - Observable.just(3) - } } - val testObserver = TestSubscriber[(DatasetID, Seq[String], EasyUser, Seq[AudienceTitle], Seq[FileItem], Boolean)]() + val testObserver = TestSubscriber[(DatasetID, Seq[String], EasyUser)]() loader.getDatasetById(id) // there is no equals defined for the emd, so I need to unpack here - .map { case Dataset(datasetID, emd, usr, titles, fileItems, allFilesListed) => - (datasetID, emd.getEmdDescription.getDcDescription.asScala.map(_.getValue), usr, titles, fileItems, allFilesListed) } + .map { case Dataset(datasetID, emd, usr) => + (datasetID, emd.getEmdDescription.getDcDescription.asScala.map(_.getValue), usr) + } .subscribe(testObserver) testObserver.awaitTerminalEvent() - testObserver.assertValue((id, Seq("descr foo bar"), user, audiences, files, true)) - testObserver.assertNoErrors() - testObserver.assertCompleted() - } - - "getFilesInDataset" should "return the files contained in the dataset corresponding to the given datasetID" in { - val id = "testID" - val pid1 = "pid1" - val pid2 = "pid2" - val fi1 @ FileItem(path1, accTo1, Some(chcksm1)) = FileItem("path1", FileAccessRight.NONE, Some("chcksm1")) - val fi2 @ FileItem(path2, accTo2, _) = FileItem("path2", FileAccessRight.KNOWN, None) - - val mockedPrepStatement = mock[PreparedStatement] - val mockedResultSet = mock[ResultSet] - - inSequence { - (fsrdbMock.prepareStatement(_: String)) expects * returning mockedPrepStatement - mockedPrepStatement.setString _ expects(1, id) - mockedPrepStatement.setInt _ expects(2, 2) - mockedPrepStatement.executeQuery _ expects() returning mockedResultSet - mockedResultSet.next _ expects() returning true - (mockedResultSet.getString(_: String)) expects "pid" returning pid1 - (mockedResultSet.getString(_: String)) expects "path" returning path1 - (mockedResultSet.getString(_: String)) expects "sha1checksum" returning chcksm1 - (mockedResultSet.getString(_: String)) expects "accessible_to" returning accTo1.toString - mockedResultSet.next _ expects() returning true - (mockedResultSet.getString(_: String)) expects "pid" returning pid2 - (mockedResultSet.getString(_: String)) expects "path" returning path2 - (mockedResultSet.getString(_: String)) expects "sha1checksum" returning "null" - (mockedResultSet.getString(_: String)) expects "accessible_to" returning accTo2.toString - mockedResultSet.next _ expects() returning false - mockedResultSet.close _ expects() - mockedPrepStatement.close _ expects() - } - - val loader = DatasetLoaderImpl() - val testObserver = TestSubscriber[Set[FileItem]]() - loader.getFilesInDataset(id).toSet.subscribe(testObserver) - - testObserver.awaitTerminalEvent() - testObserver.assertValue(Set(fi1, fi2)) - testObserver.assertNoErrors() - testObserver.assertCompleted() - } - - "countFiles" should "return the number of files contained in the dataset corresponding to the given datasetID" in { - val id = "testID" - val fileCount = 500 - - val mockedPrepStatement = mock[PreparedStatement] - val mockedResultSet = mock[ResultSet] - - inSequence { - (fsrdbMock.prepareStatement(_: String)) expects * returning mockedPrepStatement - mockedPrepStatement.setString _ expects(1, id) - mockedPrepStatement.executeQuery _ expects() returning mockedResultSet - mockedResultSet.next _ expects() returning true - (mockedResultSet.getInt(_: String)) expects "count" returning fileCount - mockedResultSet.close _ expects() - mockedPrepStatement.close _ expects() - } - - val loader = DatasetLoaderImpl() - val testObserver = TestSubscriber[Int]() - loader.countFiles(id).subscribe(testObserver) - - testObserver.awaitTerminalEvent() - testObserver.assertValue(fileCount) - testObserver.assertNoErrors() - testObserver.assertCompleted() - } - - "getAudience" should "search the title for each audienceID in the EmdAudience in Fedora" in { - val is = IOUtils.toInputStream(title1.toString) - val (id1, title1) = ("id1", "title1") - - fedoraMock.getDC _ expects id1 returning Observable.just(is) - - val loader = DatasetLoaderImpl() - val testObserver = TestSubscriber[String]() - loader.getAudience(id1).subscribe(testObserver) - - testObserver.awaitTerminalEvent() - testObserver.assertValues(title1) - testObserver.assertNoErrors() - testObserver.assertCompleted() - } - - "getAudiences" should "search the title for each audienceID in the EmdAudience in Fedora" in { - val (id1, title1) = ("id1", "title1") - val (id2, title2) = ("id2", "title2") - val (id3, title3) = ("id3", "title3") - val audience = mock[EmdAudience] - - audience.getValues _ expects() returning util.Arrays.asList(id1, id2, id3) - - // can't do mocking due to concurrency issues - val loader = new DatasetLoaderImpl { - - var counter = 0 - - override def getAudience(audienceID: AudienceID): Observable[AudienceID] = { - counter += 1 - counter match { - case 1 => Observable.just(title1) - case 2 => Observable.just(title2) - case 3 => Observable.just(title3) - case _ => throw new IllegalStateException(s"Called this method too many times. audienceID = $audienceID") - } - } - } - val testObserver = TestSubscriber[String]() - loader.getAudiences(audience).subscribe(testObserver) - - testObserver.assertValues(title1, title2, title3) + testObserver.assertValue((id, Seq("descr foo bar"), user)) testObserver.assertNoErrors() testObserver.assertCompleted() - loader.counter shouldBe 3 } } diff --git a/src/test/scala/nl/knaw/dans/easy/agreement/internal/PlaceholderMapperSpec.scala b/src/test/scala/nl/knaw/dans/easy/agreement/internal/PlaceholderMapperSpec.scala index dab0f30..2ddc46e 100644 --- a/src/test/scala/nl/knaw/dans/easy/agreement/internal/PlaceholderMapperSpec.scala +++ b/src/test/scala/nl/knaw/dans/easy/agreement/internal/PlaceholderMapperSpec.scala @@ -16,14 +16,12 @@ package nl.knaw.dans.easy.agreement.internal import java.io.File -import java.net.URI import java.{ util => ju } import nl.knaw.dans.common.lang.dataset.AccessCategory -import nl.knaw.dans.easy.agreement.{ FileAccessRight, FileItem, UnitSpec } +import nl.knaw.dans.easy.agreement.{ FileAccessRight, UnitSpec } import nl.knaw.dans.pf.language.emd.Term.{ Name, Namespace } import nl.knaw.dans.pf.language.emd._ -import nl.knaw.dans.pf.language.emd.types.Spatial.{ Box, Point } import nl.knaw.dans.pf.language.emd.types._ import org.joda.time.DateTime import org.scalamock.scalatest.MockFactory @@ -55,8 +53,7 @@ class PlaceholderMapperSpec extends UnitSpec with MockFactory with BeforeAndAfte isSample = false, fedora = null, ldap = null, - fsrdb = null, - fileLimit = 3) + ) before { new File(getClass.getResource("/placeholdermapper/").toURI).copyDir(parameters.templateResourceDir) @@ -129,8 +126,7 @@ class PlaceholderMapperSpec extends UnitSpec with MockFactory with BeforeAndAfte isSample = true, fedora = null, ldap = null, - fsrdb = null, - fileLimit = 3) + ) val dates = ju.Arrays.asList(new IsoDate("1992-07-30"), new IsoDate("2016-07-30")) emd.getEmdIdentifier _ expects() never() @@ -156,8 +152,7 @@ class PlaceholderMapperSpec extends UnitSpec with MockFactory with BeforeAndAfte isSample = true, fedora = null, ldap = null, - fsrdb = null, - fileLimit = 3) + ) emd.getEmdIdentifier _ expects() never() ident.getDansManagedDoi _ expects() never() @@ -220,119 +215,47 @@ class PlaceholderMapperSpec extends UnitSpec with MockFactory with BeforeAndAfte "accessRights" should "map an Open Access category to an OpenAccess keyword" in { expectEmdRights(AccessCategory.OPEN_ACCESS) - - inside(testInstance.datasetAccessCategory(emd)) { - case Success(map) => map should contain theSameElementsAs List( - (OpenAccess, true), - (OpenAccessForRegisteredUsers, false), - (OtherAccess, false), - (RestrictGroup, false), - (RestrictRequest, false)) - } + testInstance.isOpenAccess(emd) shouldBe true } it should "map an Anonymous Access category to an OpenAccess keyword" in { expectEmdRights(AccessCategory.ANONYMOUS_ACCESS) - - inside(testInstance.datasetAccessCategory(emd)) { - case Success(map) => map should contain theSameElementsAs List( - (OpenAccess, true), - (OpenAccessForRegisteredUsers, false), - (OtherAccess, false), - (RestrictGroup, false), - (RestrictRequest, false)) - } + testInstance.isOpenAccess(emd) shouldBe true } it should "map a Freely Available category to an OpenAccess keyword" in { expectEmdRights(AccessCategory.FREELY_AVAILABLE) - - inside(testInstance.datasetAccessCategory(emd)) { - case Success(map) => map should contain theSameElementsAs List( - (OpenAccess, true), - (OpenAccessForRegisteredUsers, false), - (OtherAccess, false), - (RestrictGroup, false), - (RestrictRequest, false)) - } + testInstance.isOpenAccess(emd) shouldBe true } it should "map an Open Access For Registered Users category to an OpenAccessForRegisteredUsers keyword" in { expectEmdRights(AccessCategory.OPEN_ACCESS_FOR_REGISTERED_USERS) - - inside(testInstance.datasetAccessCategory(emd)) { - case Success(map) => map should contain theSameElementsAs List( - (OpenAccess, false), - (OpenAccessForRegisteredUsers, true), - (OtherAccess, false), - (RestrictGroup, false), - (RestrictRequest, false)) - } + testInstance.isOpenAccess(emd) shouldBe false } it should "map a Group Access category to an RestrictGroup keyword" in { expectEmdRights(AccessCategory.GROUP_ACCESS) - - inside(testInstance.datasetAccessCategory(emd)) { - case Success(map) => map should contain theSameElementsAs List( - (OpenAccess, false), - (OpenAccessForRegisteredUsers, false), - (OtherAccess, false), - (RestrictGroup, true), - (RestrictRequest, false)) - } + testInstance.isOpenAccess(emd) shouldBe false } it should "map a Request Permission category to an RestrictRequest keyword" in { expectEmdRights(AccessCategory.REQUEST_PERMISSION) - - inside(testInstance.datasetAccessCategory(emd)) { - case Success(map) => map should contain theSameElementsAs List( - (OpenAccess, false), - (OpenAccessForRegisteredUsers, false), - (OtherAccess, false), - (RestrictGroup, false), - (RestrictRequest, true)) - } + testInstance.isOpenAccess(emd) shouldBe false } it should "map an Access Elsewhere category to an OtherAccess keyword" in { expectEmdRights(AccessCategory.ACCESS_ELSEWHERE) - - inside(testInstance.datasetAccessCategory(emd)) { - case Success(map) => map should contain theSameElementsAs List( - (OpenAccess, false), - (OpenAccessForRegisteredUsers, false), - (OtherAccess, true), - (RestrictGroup, false), - (RestrictRequest, false)) - } + testInstance.isOpenAccess(emd) shouldBe false } it should "map a No Access category to an OtherAccess keyword" in { expectEmdRights(AccessCategory.NO_ACCESS) - - inside(testInstance.datasetAccessCategory(emd)) { - case Success(map) => map should contain theSameElementsAs List( - (OpenAccess, false), - (OpenAccessForRegisteredUsers, false), - (OtherAccess, true), - (RestrictGroup, false), - (RestrictRequest, false)) - } + testInstance.isOpenAccess(emd) shouldBe false } it should "map a null value to an OpenAccess keyword" in { - expectEmdRights(AccessCategory.OPEN_ACCESS) - - inside(testInstance.datasetAccessCategory(emd)) { - case Success(map) => map should contain theSameElementsAs List( - (OpenAccess, true), - (OpenAccessForRegisteredUsers, false), - (OtherAccess, false), - (RestrictGroup, false), - (RestrictRequest, false)) - } + expectEmdRights(accessCategory = null) + testInstance.isOpenAccess(emd) shouldBe true } "embargo" should "give the embargo keyword mappings with UnderEmbargo=true when there is an embargo" in { @@ -369,171 +292,6 @@ class PlaceholderMapperSpec extends UnitSpec with MockFactory with BeforeAndAfte ) } - "metadataTable" should "give a mapping for the metadata elements in the dataset" in { - val ccBy = "https://creativecommons.org/licenses/by/4.0/legalcode" - - val audienceTerm = new Term(Name.AUDIENCE, Namespace.DCTERMS) - val mediumTerm = new Term(Name.MEDIUM, Namespace.DC) - val abstractTerm = new Term(Name.ABSTRACT, Namespace.EAS) - val terms = Set(audienceTerm, accessRightsTerm, licenseTerm, mediumTerm, abstractTerm).asJava - - val anonymous = metadataItemMock("ANONYMOUS_ACCESS") - val open = metadataItemMock("OPEN_ACCESS") - val item1 = metadataItemMock("item1") - val item4 = metadataItemMock("item4") - val item5 = metadataItemMock("item5") - val item6 = metadataItemMock("item6") - - val audienceItems = List(item1, anonymous).asJava - val accessRightItems = List(anonymous, open).asJava - val mediumItems = List(item4, item5, item6).asJava - val abstractItems = ju.Collections.emptyList[MetadataItem]() - - emd.getTerms _ expects() returning terms - emd.getTerm _ expects audienceTerm returning audienceItems - emd.getTerm _ expects accessRightsTerm returning accessRightItems - emd.getTerm _ expects mediumTerm returning mediumItems - emd.getTerm _ expects abstractTerm returning abstractItems - - expectLicenses(Seq("accept", ccBy)) - - testInstance.metadataTable(emd, Seq("abc", "def"), "datasetID:1234").asScala.toList shouldBe List( - Map(MetadataKey.keyword -> "ghi", MetadataValue.keyword -> "item4
    item5
    item6").asJava, - Map(MetadataKey.keyword -> "Access rights", MetadataValue.keyword -> "Anonymous").asJava, - Map(MetadataKey.keyword -> "License", MetadataValue.keyword -> ccBy).asJava, - Map(MetadataKey.keyword -> "Audience", MetadataValue.keyword -> "abc; def").asJava, - ) - } - - it should "use the qualified names on invalid input" in { - // valid input would have DCTERMS for both - val audienceTerm = new Term(Name.AUDIENCE, Namespace.DC) - val accessRightsTerm = new Term(Name.ACCESSRIGHTS, Namespace.DC) - val items = List(metadataItemMock("ANONYMOUS_ACCESS")).asJava - emd.getTerms _ expects() returning Set(audienceTerm, accessRightsTerm).asJava - emd.getTerm _ expects audienceTerm returning items - emd.getTerm _ expects accessRightsTerm returning items - - testInstance.metadataTable(emd, Seq("abc", "def"), "datasetID:1234").asScala.toList shouldBe List( - Map(MetadataKey.keyword -> "DC.ACCESSRIGHTS", MetadataValue.keyword -> "Anonymous").asJava, - Map(MetadataKey.keyword -> "DC.AUDIENCE", MetadataValue.keyword -> "abc; def").asJava, - ) - } - - it should "give a mapping with a cc0 license" in { - emd.getTerms _ expects() returning Set(licenseTerm, accessRightsTerm).asJava - expectLicenses(Seq("accept")) - expectEmdRights(AccessCategory.OPEN_ACCESS) - expectRightsTerms(AccessCategory.OPEN_ACCESS) - - testInstance.metadataTable(emd, Seq("abc", "def"), "datasetID:1234").asScala should contain - Map( - MetadataKey.keyword -> "license", - MetadataValue.keyword -> "http://creativecommons.org/publicdomain/zero/1.0/legalcode", - ).asJava - } - - it should "give a mapping with a DANS license" in { - emd.getTerms _ expects() returning Set(licenseTerm, accessRightsTerm).asJava - expectLicenses(Seq("accept")) - expectEmdRights(AccessCategory.GROUP_ACCESS) - expectRightsTerms(AccessCategory.GROUP_ACCESS) - - testInstance.metadataTable(emd, Seq("abc", "def"), "datasetID:1234").asScala should contain - Map( - MetadataKey.keyword -> "license", - MetadataValue.keyword -> "http://dans.knaw.nl/en/about/organisation-and-policy/legal-information/DANSGeneralconditionsofuseUKDEF.pdf", - ).asJava - } - - it should "map an empty license list to a default license" in { - emd.getTerms _ expects() returning Set(licenseTerm, accessRightsTerm).asJava - val items: Seq[MetadataItem] = Seq[MetadataItem]() - emd.getTerm _ expects licenseTerm returning items.asJava - - expectRightsTerms(AccessCategory.REQUEST_PERMISSION) - - testInstance.metadataTable(emd, Seq("abc", "def"), "datasetID:1234").asScala should contain - Map( - MetadataKey.keyword -> "license", - MetadataValue.keyword -> "http://dans.knaw.nl/en/about/organisation-and-policy/legal-information/DANSGeneralconditionsofuseUKDEF.pdf", - ).asJava - } - - it should "map just access rights to a default license" in { - emd.getTerms _ expects() returning Set(accessRightsTerm).asJava - expectRightsTerms(AccessCategory.OPEN_ACCESS) - - testInstance.metadataTable(emd, Seq("abc", "def"), "datasetID:1234").asScala should contain - Map( - MetadataKey.keyword -> "License", - MetadataValue.keyword -> "http://dans.knaw.nl/en/about/organisation-and-policy/legal-information/DANSGeneralconditionsofuseUKDEF.pdf", - ).asJava - } - - it should "map the specified license" in { - val ccBy = "https://creativecommons.org/licenses/by/4.0/legalcode" - emd.getTerms _ expects() returning Set(licenseTerm).asJava - expectLicenses(Seq(ccBy)) - - testInstance.metadataTable(emd, Seq("abc", "def"), "datasetID:1234").asScala.toSeq shouldBe Seq( - Map( - MetadataKey.keyword -> "License", - MetadataValue.keyword -> ccBy, - ).asJava, - ) - } - - it should "map relations" in { - val term = new Term(Name.RELATION, Namespace.DC) - emd.getTerms _ expects() returning Set(term).asJava - emd.getTerm _ expects term returning Seq( - new BasicString("foo"), - new Relation("bar"), - new Relation("rabarbera", new URI("http://xx.dans.knaw.nl/yy")), - ).asJava - - testInstance.metadataTable(emd, Seq("abc", "def"), "datasetID:1234").asScala.toSeq shouldBe Seq( - Map( - MetadataKey.keyword -> "Relation", - MetadataValue.keyword -> Seq( - "foo", - "title = bar", - "title = rabarbera, url = http://xx.dans.knaw.nl/yy" - ).mkString("
    "), - ).asJava, - ) - } - - it should "map spatials" in { - val exterior = new PolygonPart("main triangle", ju.Arrays.asList( - new PolygonPoint("52.08110", "4.34521"), - new PolygonPoint("52.08071", "4.34422"), - new PolygonPoint("52.07913", "4.34332"), - new PolygonPoint("52.08110", "4.34521") - )) - val term = new Term(Name.SPATIAL, Namespace.DCTERMS) - emd.getTerms _ expects() returning Set(term).asJava - emd.getTerm _ expects term returning Seq( - new BasicString("foo"), - new Spatial("Amsterdam", new Point("RD", "1", "2")), - new Spatial("Amsterdam", new Box("RD", "463001", "155001", "462999", "154999")), - new Spatial("foo", new Polygon("bar", exterior, List().asJava)), - ).asJava - - testInstance.metadataTable(emd, Seq("abc", "def"), "datasetID:1234").asScala.toSeq shouldBe Seq( - Map( - MetadataKey.keyword -> "Spatial", - MetadataValue.keyword -> Seq( - "foo", - "Amsterdam
    Point: scheme = RD, x = 1, y = 2", - "Amsterdam
    Box: scheme = RD, north = 463001, east = 155001, south = 462999, west = 154999", - """foo
    Polygon:
    To keep this agreement at a reasonable size the polygon coordinates are omitted. For a full listing of the polygons please contact DANS at info@dans.knaw.nl.""", - ).mkString("

    "), - ).asJava, - ) - } - private val licenseTerm = new Term(Name.LICENSE, Namespace.DCTERMS) private def expectLicenses(values: Seq[String]) = { @@ -553,18 +311,6 @@ class PlaceholderMapperSpec extends UnitSpec with MockFactory with BeforeAndAfte emd.getTerm _ expects accessRightsTerm returning items.asJava } - "formatAudience" should "combine the audiences separated by " in { - testInstance.formatAudience(Seq("abc", "def"), "datasetID:1234") shouldBe "abc; def" - } - - it should "do the same with one element in the audience" in { - testInstance.formatAudience(Seq("abc"), "datasetID:1234") shouldBe "abc" - } - - it should "yield an Observable with one empty String when there is no audience" in { - testInstance.formatAudience(Seq.empty, "datasetID:1234") shouldBe "" - } - "formatAccessRights" should "return a String representation of the access category ANONYMOUS_ACCESS" in { testInstance.formatDatasetAccessRights(metadataItemMock("ANONYMOUS_ACCESS")) shouldBe "Anonymous" } @@ -620,18 +366,4 @@ class PlaceholderMapperSpec extends UnitSpec with MockFactory with BeforeAndAfte it should "return a String representation of the file access category NONE" in { testInstance.formatFileAccessRights(FileAccessRight.NONE) shouldBe "None" } - - "filesTable" should "give a mapping of files and checksums in the dataset" in { - val input = Seq( - FileItem("ABC", FileAccessRight.ANONYMOUS, Some("123")), - FileItem("DEF", FileAccessRight.KNOWN, Some("none")), - FileItem("GHI", FileAccessRight.RESTRICTED_GROUP, Some("")) - ) - - testInstance.filesTable(input).asScala should contain theSameElementsAs List( - Map(FilePath.keyword -> "ABC", FileChecksum.keyword -> "123", FileAccessibleTo.keyword -> "Anonymous").asJava, - Map(FilePath.keyword -> "DEF", FileChecksum.keyword -> checkSumNotCalculated, FileAccessibleTo.keyword -> "Known").asJava, - Map(FilePath.keyword -> "GHI", FileChecksum.keyword -> checkSumNotCalculated, FileAccessibleTo.keyword -> "Restricted group").asJava - ) - } } diff --git a/src/test/scala/nl/knaw/dans/easy/agreement/internal/VelocityTemplateResolverSpec.scala b/src/test/scala/nl/knaw/dans/easy/agreement/internal/VelocityTemplateResolverSpec.scala index 345fce3..b9b7432 100644 --- a/src/test/scala/nl/knaw/dans/easy/agreement/internal/VelocityTemplateResolverSpec.scala +++ b/src/test/scala/nl/knaw/dans/easy/agreement/internal/VelocityTemplateResolverSpec.scala @@ -15,19 +15,19 @@ */ package nl.knaw.dans.easy.agreement.internal -import java.io.{ByteArrayOutputStream, File} +import java.io.{ ByteArrayOutputStream, File } import java.util.Properties import nl.knaw.dans.easy.agreement.UnitSpec import org.apache.velocity.exception.MethodInvocationException import org.scalatest.exceptions.TestFailedException -import org.scalatest.{BeforeAndAfter, BeforeAndAfterAll} +import org.scalatest.{ BeforeAndAfter, BeforeAndAfterAll } -import scala.util.{Failure, Success} +import scala.util.{ Failure, Success } class VelocityTemplateResolverSpec extends UnitSpec with BeforeAndAfter with BeforeAndAfterAll { - implicit val parameters = new BaseParameters(new File(testDir, "template"), null, false, 3) + implicit val parameters = new BaseParameters(new File(testDir, "template"), null, false) before { new File(getClass.getResource("/velocity/").toURI).copyDir(parameters.templateResourceDir) @@ -39,7 +39,7 @@ class VelocityTemplateResolverSpec extends UnitSpec with BeforeAndAfter with Bef override def afterAll: Unit = testDir.getParentFile.deleteDirectory() - private val keyword: KeywordMapping = new KeywordMapping { val keyword: String = "name" } + private val keyword: KeywordMapping = new KeywordMapping {val keyword: String = "name" } private val testProperties = { val p = new Properties() @@ -69,7 +69,7 @@ class VelocityTemplateResolverSpec extends UnitSpec with BeforeAndAfter with Bef templateCreator.createTemplate(baos, map) shouldBe a[Success[_]] - new String(baos.toByteArray) should include ("

    hello world

    ") + new String(baos.toByteArray) should include("

    hello world

    ") } it should "fail if not all placeholders are filled in" in { @@ -80,7 +80,7 @@ class VelocityTemplateResolverSpec extends UnitSpec with BeforeAndAfter with Bef val res = templateCreator.createTemplate(baos, map) res shouldBe a[Failure[_]] - (the [MethodInvocationException] thrownBy res.get).getMessage should include ("$name") + (the[MethodInvocationException] thrownBy res.get).getMessage should include("$name") new String(baos.toByteArray) should not include "

    hello world

    " }