## September, 2020

Wed Sep 02, 2020 in Notes

## 2020-09-02

- Replace Marissa van Epp for Rhys Bucknall in the CCAFS groups on CGSpace because Marissa no longer works at CCAFS
- The AReS Explorer hasn’t updated its index since 2020-08-22 when I last forced it
  - I restarted it again now and told Moayad that the automatic indexing isn’t working
- Add `Alliance of Bioversity International and CIAT` to affiliations on CGSpace
- Abenet told me that the general search text on AReS doesn’t get reset when you use the “Reset Filters” button
  - I filed a bug on OpenRXV: https://github.com/ilri/OpenRXV/issues/39
- I filed an issue on OpenRXV to make some minor edits to the admin UI: https://github.com/ilri/OpenRXV/issues/40

- I ran the country code tagger on CGSpace:

    $ time chrt -b 0 dspace curate -t countrycodetagger -i all -r - -l 500 -s object | tee /tmp/2020-09-02-countrycodetagger.log
    ...
    real    2m10.516s
    user    1m43.953s
    sys     0m15.192s
    $ grep -c added /tmp/2020-09-02-countrycodetagger.log
    39

- I still need to create a cron job for this…
- Sisay and Abenet said they can’t log in with LDAP on DSpace Test (DSpace 6)
  - I tried and I can’t either… but it is working on CGSpace
  - The error on DSpace 6 is:

    2020-09-02 12:03:10,666 INFO  org.dspace.authenticate.LDAPAuthentication @ anonymous:session_id=A629116488DCC467E1EA2062A2E2EFD7:ip_addr=92.220.02.201:failed_login:no DN found for user aorth

- I tried to query LDAP directly using the application credentials with ldapsearch and it works:

    $ ldapsearch -x -H ldaps://AZCGNEROOT2.CGIARAD.ORG:636/ -b "dc=cgiarad,dc=org" -D "applicationaccount@cgiarad.org" -W "(sAMAccountName=me)"

- According to the DSpace 6 docs we need to escape commas in our LDAP parameters due to the new configuration system
  - I added the commas and restarted DSpace (though technically we shouldn’t need to restart due to the new config system hot reloading configs)
  - Run all system updates on DSpace Test (linode26) and reboot it
  - After the restart LDAP login works…

## 2020-09-03

- Fix some erroneous “review status” fields that Abenet noticed on AReS
  - I used my `fix-metadata-values.py` and `delete-metadata-values.py` scripts with the following input files:

    $ cat 2020-09-03-fix-review-status.csv
    dc.description.version,correct
    Externally Peer Reviewed,Peer Review
    Peer Reviewed,Peer Review
    Peer review,Peer Review
    Peer reviewed,Peer Review
    Peer-Reviewed,Peer Review
    Peer-reviewed,Peer Review
    peer Review,Peer Review
    $ cat 2020-09-03-delete-review-status.csv
    dc.description.version
    Report
    Formally Published
    Poster
    Unrefereed reprint
    $ ./delete-metadata-values.py -i 2020-09-03-delete-review-status.csv -db dspace -u dspace -p 'fuuu' -f dc.description.version -m 68
    $ ./fix-metadata-values.py -i 2020-09-03-fix-review-status.csv -db dspace -u dspace -p 'fuuu' -f dc.description.version -t 'correct' -m 68

- Start reviewing 95 items for IITA (20201stbatch)
  - I used my csv-metadata-quality tool to check and fix some low-hanging fruit first
  - This fixed a few unnecessary Unicode, excessive whitespace, invalid multi-value separator, and duplicate metadata values
  - Then I looked at the data in OpenRefine and noticed some things:
    - All issue dates use year only, but some have months in the citation so they could be more specific
    - I normalized all the DOIs to use “https://doi.org” format
    - I fixed a few AGROVOC subjects with a simple GREL: `value.replace("GRAINS","GRAIN").replace("SOILS","SOIL").replace("CORN","MAIZE")`
    - But there are a few more that are invalid that she will have to look at
    - I uploaded the items to DSpace Test and it was apparently successful but I get these errors to the console:

    Thu Sep 03 12:26:33 CEST 2020 | Query:containerItem:ea7a2648-180d-4fce-bdc5-c3aa2304fc58
    Error while updating
    java.lang.NullPointerException
            at com.atmire.dspace.cua.CUASolrLoggerServiceImpl$5.visit(SourceFile:1131)
            at com.atmire.dspace.cua.CUASolrLoggerServiceImpl.visitEachStatisticShard(SourceFile:212)
            at com.atmire.dspace.cua.CUASolrLoggerServiceImpl.update(SourceFile:1104)
            at com.atmire.dspace.cua.CUASolrLoggerServiceImpl.update(SourceFile:1093)
            at org.dspace.statistics.StatisticsLoggingConsumer.consume(SourceFile:104)
            at org.dspace.event.BasicDispatcher.consume(BasicDispatcher.java:177)
            at org.dspace.event.BasicDispatcher.dispatch(BasicDispatcher.java:123)
            at org.dspace.core.Context.dispatchEvents(Context.java:455)
            at org.dspace.core.Context.commit(Context.java:424)
            at org.dspace.core.Context.complete(Context.java:380)
            at org.dspace.app.bulkedit.MetadataImport.main(MetadataImport.java:1399)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.dspace.app.launcher.ScriptLauncher.runOneCommand(ScriptLauncher.java:229)
            at org.dspace.app.launcher.ScriptLauncher.main(ScriptLauncher.java:81)

- There are more in the DSpace log so I will raise it with Atmire immediately

## 2020-09-04

- I was checking the recent IITA data for duplicates when I noticed that one in CIFOR’s Archive and saw that CIFOR has updated a bunch of their website URLs, for example:
  - http://www.cifor.org/nc/online-library/browse/view-publication/publication/151.html → https://www.cifor.org/knowledge/publication/151
  - https://www.cifor.org/library/4033 → https://www.cifor.org/knowledge/publication/4033
  - https://www.cifor.org/pid/5087 → https://www.cifor.org/knowledge/publication/5087
- I will update our nearly 6,000 metadata values for CIFOR in the database accordingly:

    dspace=# UPDATE metadatavalue SET text_value = regexp_replace(text_value, '^(http://)?www\.cifor\.org/(nc/)?online-library/browse/view-publication/publication/([[:digit:]]+)\.html$', 'https://www.cifor.org/knowledge/publication/\3') WHERE metadata_field_id=219 AND text_value ~ 'www\.cifor\.org/(nc/)?online-library/browse/view-publication/publication/[[:digit:]]+';
    dspace=# UPDATE metadatavalue SET text_value = regexp_replace(text_value, '^https?://www\.cifor\.org/library/([[:digit:]]+)/?$', 'https://www.cifor.org/knowledge/publication/\1') WHERE metadata_field_id=219 AND text_value ~ 'https?://www\.cifor\.org/library/[[:digit:]]+/?';
    dspace=# UPDATE metadatavalue SET text_value = regexp_replace(text_value, '^https?://www\.cifor\.org/pid/([[:digit:]]+)/?$', 'https://www.cifor.org/knowledge/publication/\1') WHERE metadata_field_id=219 AND text_value ~ 'https?://www\.cifor\.org/pid/[[:digit:]]+';

- I did some cleanup on the author affiliations of the IITA data our 2019-04 list using reconcile-csv and OpenRefine:
  - `$ lein run ~/src/git/DSpace/2019-04-08-affiliations.csv name id`
  - I always forget how to copy the reconciled values in OpenRefine, but you need to make a new column and populate it using this GREL: `if(cell.recon.matched, cell.recon.match.name, value)`
- I mapped one duplicated from the CIFOR Archives and re-uploaded the 94 IITA items to a new collection on DSpace Test

## 2020-09-08

- I noticed that the “share” link in AReS wasn’t working properly because it excludes the “explorer” part of the URI

- I filed an issue on GitHub: https://github.com/ilri/OpenRXV/issues/41
- I uploaded the 94 IITA items that I had been working on last week to CGSpace
- RTB emailed to ask why they are getting HTTP 503 errors during harvesting to the RTB WordPress website
  - From the screenshot I can see they are requesting URLs like this:

    https://cgspace.cgiar.org/bitstream/handle/10568/82745/Characteristics-Silage.JPG

- So they end up getting rate limited due to the XMLUI rate limits
  - I told them to use the REST API bitstream retrieve links, because we don’t have any rate limits there

## 2020-09-09

- Wire up the systemd service/timer for the CGSpace Country Code Tagger curation task in the Ansible infrastructure scripts
  - For now it won’t work on DSpace 6 because the curation task invocation needs to be slightly different (minus the `-l` parameter) and for some reason the task isn’t working on DSpace Test (version 6) right now
  - I added DSpace 6 support to the playbook templates…
- Run system updates on DSpace Test (linode26), re-deploy the DSpace 6 test branch, and reboot the server
  - After rebooting I deleted old copies of the cgspace-java-helpers JAR in the DSpace lib directory and then the curation worked
  - To my great surprise the curation worked (and completed, albeit a few times slower) on my local DSpace 6 environment as well:

    $ ~/dspace63/bin/dspace curate -t countrycodetagger -i all -s object

## 2020-09-10

- I checked the country code tagger on CGSpace and DSpace Test and it ran fine from the systemd timer last night… w00t
- I started looking at Peter’s changes to the CGSpace regions that were proposed in 2020-07
  - The changes will be:

    $ cat 2020-09-10-fix-cgspace-regions.csv
    cg.coverage.region,correct
    EAST AFRICA,EASTERN AFRICA
    WEST AFRICA,WESTERN AFRICA
    SOUTHEAST ASIA,SOUTHEASTERN ASIA
    SOUTH ASIA,SOUTHERN ASIA
    AFRICA SOUTH OF SAHARA,SUB-SAHARAN AFRICA
    NORTH AFRICA,NORTHERN AFRICA
    WEST ASIA,WESTERN ASIA
    SOUTHWEST ASIA,SOUTHWESTERN ASIA
    $ ./fix-metadata-values.py -i 2020-09-10-fix-cgspace-regions.csv -db dspace -u dspace -p 'fuuu' -f cg.coverage.region -t 'correct' -m 227 -d -n
    Connected to database.
    Would fix 12227 occurences of: EAST AFRICA
    Would fix 7996 occurences of: WEST AFRICA
    Would fix 3515 occurences of: SOUTHEAST ASIA
    Would fix 3443 occurences of: SOUTH ASIA
    Would fix 1134 occurences of: AFRICA SOUTH OF SAHARA
    Would fix 357 occurences of: NORTH AFRICA
    Would fix 81 occurences of: WEST ASIA
    Would fix 3 occurences of: SOUTHWEST ASIA

- I think we need to wait for the web team, though, as they need to update their mappings
  - Not to mention that we’ll need to give WLE and CCAFS time to update their harvesters as well… hmmm
- Looking at the top user agents active on CGSpace in 2020-08 and I see:
  - `Delphi 2009`: 235353 (this is GARDIAN harvester I guess, as the IP is in Greece)
  - `Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)`: 57004 (IP is 18.196.100.94, and the requests seem to be for CTA’s content)
  - `RTB website BOT`: 12282
  - `ILRI Livestock Website Publications importer BOT`: 9393
- Shit, I meant to add Delphi to the DSpace spider agents list last month but I guess I didn’t commit the change
- HTTrack is in the agents list so I’m not sure why DSpace registers a hit from that request
- Also, I am surprised to see the RTB and ILRI bots here because they have “BOT” in the name and that should also be dropped
- I also see hits from `curl` and `Java/1.8.0_66` and `Apache-HttpClient` so WTF… those are supposed to be dropped by the default agents list
- Some IP `2607:f298:5:101d:f816:3eff:fed9:a484` made 9,000 requests with the `RI/1.0` user agent this year…
  - That’s on DreamHost…?
- I purged 448658 hits from these agents and added `Delphi` to our local agents overload for Solr as well as Tomcat’s Crawler Session Manager Valve so that it forces them to re-use a single session
- I made a pull request on the COUNTER-Robots project for the Daum robot: https://github.com/atmire/COUNTER-Robots/pull/38
  - This bot made 8,000 requests to CGSpace this year
  - I purged about 20,000 total requests from this bot from our Solr stats for the last few years

## 2020-09-11

- Peter noticed that an export from AReS shows some items with zero views and others with zero views/downloads, but on CGSpace and in the statistics API there are views/downloads
  - I need to ask Moayad…

## 2020-09-12

- Carlos Tejo from the LandPortal emailed to ask for advice about integrating their LandVoc vocabulary, which is a subset of AGROVOC, into DSpace
  - I told him that they could use the DSpace authority control framework and sent an example of the VIAFAuthority from the DSpace-CRIS project: https://github.com/4Science/DSpace/blob/dspace-6_x_x-cris/dspace-api/src/main/java/org/dspace/content/authority/VIAFAuthority.java
- Redeploy the latest `5_x-prod` branch on CGSpace, re-run the latest Ansible DSpace playbook, run all system updates, and reboot the server (linode18)
  - This will bring the latest bot lists for Solr and Tomcat
  - I had to restart Tomcat 7 three times before all Solr statistics cores came up OK
- Leroy and Carol from CIAT/Bioversity were asking for information about posting to the CGSpace REST API from Sharepoint
  - I told them that we don’t allow this yet, but that we need to check in the future whether content can be posted to a workflow

## 2020-09-15

- Charlotte from Altmetric said they had issues parsing the XML file I sent them last month
  - I told them that it was mimicking the same format that they had sent me (fourteen pages of XML responses concatenated together)!
- A few days ago IWMI asked us if we can add a new field on CGSpace for their library identifier
  - The IDs look like this: H049940
  - I suggested that we use `cg.identifier.iwmilibrary`
  - I added it to the input forms and push it to the `5_x-prod` and 6.x branches and will re-deploy it in the next few days
- Abenet asked me to import sixty-nine (69) CIP Annual Reports to CGSpace
  - I looked at the data in OpenRefine and it is very good quality
  - I only added descriptions to the filename field so that SAFBuilder will add them to the bitstreams on import:

    value + "__description:" + cells["dc.type"].value

- Then I created a SAF bundle with SAFBuilder:

    $ ./safbuilder.sh -c ~/Downloads/cip-annual-reports/cip-reports.csv

- And imported them into my local test instance of CGSpace:

    $ ~/dspace/bin/dspace import -a -e y.arrr@cgiar.org -m /tmp/2020-09-15-cip-annual-reports.map -s ~/Downloads/cip-annual-reports/SimpleArchiveFormat

- Then I uploaded them to CGSpace

## 2020-09-16

- Looking further into Carlos Tejos’s question about integrating LandVoc (the AGROVOC subset) into DSpace
  - I see that you can actually get LandVoc concepts directly from AGROVOC’s SPARQL, for example with this query

- So maybe we can query AGROVOC directly using a similar method to DSpace-CRIS’s GettyAuthority
- I wired up DSpace-CRIS’s VIAFAuthority to see how authorities for auto suggested names get stored
  - After submission you can see the item’s VIAF identifier:

- And this identifier is the ID on VIAF, pretty cool!

- I did a similar test with the Getty Thesaurus of Geographic Names (TGN) and it stores the concept URI in the authority:

- But the authority values are not exposed anywhere as metadata…
  - I need to play with it a bit more I guess…
- The nice thing is that the Getty example from DSpace-CRIS uses SPARQL as well, and the TGN authority extends it
  - We could use a similar model for AGROVOC/LandVoc very easily

## 2020-09-17

- Maria from Bioveristy asked about the ORCID identifier for one of her colleagues that seems to have been removed from our list
  - I re-added it to our controlled vocabulary and added the identifier to fifty-one of his existing items on CGSpace using my script:

    $ cat 2020-09-17-add-bioversity-orcids.csv
    dc.contributor.author,cg.creator.id
    "Etten, Jacob van","Jacob van Etten: 0000-0001-7554-2558"
    "van Etten, Jacob","Jacob van Etten: 0000-0001-7554-2558"
    $ ./add-orcid-identifiers-csv.py -i 2020-09-17-add-bioversity-orcids.csv -db dspace -u dspace -p 'dom@in34sniper'

- I sent a follow-up message to Atmire to look into the two remaining issues with the DSpace 6 upgrade
  - First is the fact that we have zero results in our Listings and Reports, for any search
  - Second is the error we get during CSV imports
- Help Natalia and Cathy from Bioversity-CIAT with their OpenSearch query on “trade offs” again
  - They wanted to build a search query with multiple filters (type, crpsubject, status) and the general query “trade offs”
  - I found a great reference for DSpace’s OpenSearch syntax (albeit in Finnish, but the example URLs show the syntax clearly)
  - We can use quotes and `AND` and `OR` and even group search parameters with parenthesis!
  - So now I built a query for Natalia which uses these (showing without URL encoding so you can see the syntax):

    https://cgspace.cgiar.org/open-search/discover?query=type:"Journal Article" AND status:"Open Access" AND crpsubject:"Water, Land and Ecosystems" AND "tradeoffs"&rpp=100

- I noticed that my `move-collections.sh` script didn’t work on DSpace 6 because of the change from IDs to UUIDs, so I modified it to quote the collection `resource_id` parameters in the PostgreSQL query

## 2020-09-18

- Help Natalia with her WLE “tradeoffs” search query again…

## 2020-09-20

- Deploy latest 5_x-prod branch on CGSpace, run all system updates, and reboot the server
  - To my great surprise, all the Solr statistics cores came up correctly after reboot
- Deploy latest 6_x-dev branch on DSpace Test, run all system updates and reboot the server

## 2020-09-22

- Abenet sent some feedback about AReS
  - The item views and downloads are still incorrect
  - I looked in the server’s API logs and there are no errors, and the database has many more views/downloads:

    dspacestatistics=# SELECT SUM(views) FROM items;
       sum
    ----------
     15714024
    (1 row)

    dspacestatistics=# SELECT SUM(downloads) FROM items;
       sum
    ----------
     13979911
    (1 row)

- I deleted “Report” from twelve items that had it in their peer review field:

    dspace=# BEGIN;
    BEGIN
    dspace=# DELETE FROM metadatavalue WHERE text_value='Report' AND resource_type_id=2 AND metadata_field_id=68;
    DELETE 12
    dspace=# COMMIT;

- I added all CG center- and CRP-specific subject fields and mapped them to `dc.subject` in AReS
- After forcing a re-harvesting now the review status is much cleaner and the missing subjects are available
- Last week Natalia from CIAT had asked me to download all the PDFs for a certain query:
  - items with status “Open Access”
  - items with type “Journal Article”
  - items containing any of the following words: water land and ecosystems & trade offs
  - The resulting OpenSearch query is: https://cgspace.cgiar.org/open-search/discover?query=type:"Journal Article" AND status:“Open Access” AND Water Land Ecosystems trade offs&rpp=1
  - There were 241 results with a total of 208 PDFs, which I downloaded with my `get-wle-pdfs.py` script and shared to her via bashupload.com

## 2020-09-23

- Peter said he was having problems submitting items to CGSpace
  - On a hunch I looked at the PostgreSQL locks in Munin and indeed the normal issue with locks is back (though I haven’t seen it in a few months?)

- Instead of restarting Tomcat I restarted the PostgreSQL service and then Peter said he was able to submit the item…
- Experiment with doing direct queries for items in the dspace-statistics-api
  - I tested querying a handful of item UUIDs with a date range and returning their hits faceted by `id`
  - Assuming a list of item UUIDs was posted to the REST API we could prepare them for a Solr query by joining them into a string with “OR” and escaping the hyphens:

    ...
    item_ids = ['0079470a-87a1-4373-beb1-b16e3f0c4d81', '007a9df1-0871-4612-8b28-5335982198cb']
    item_ids_str = ' OR '.join(item_ids).replace('-', '\-')
    ...
    solr_query_params = {
        "q": f"id:({item_ids_str})",
        "fq": "type:2 AND isBot:false AND statistics_type:view AND time:[2020-01-01T00:00:00Z TO 2020-09-02T00:00:00Z]",
        "facet": "true",
        "facet.field": "id",
        "facet.mincount": 1,
        "facet.limit": 1,
        "facet.offset": 0,
        "stats": "true",
        "stats.field": "id",
        "stats.calcdistinct": "true",
        "shards": shards,
        "rows": 0,
        "wt": "json",
    }

- The date range format for Solr is important, but it seems we only need to add `T00:00:00Z` to the normal ISO 8601 YYYY-MM-DD strings

## 2020-09-25

- I did some more work on the dspace-statistics-api and finalized the support for sending a POST to `/items`:

    $ curl -s -d @request.json https://dspacetest.cgiar.org/rest/statistics/items | json_pp
    {
       "currentPage" : 0,
       "limit" : 10,
       "statistics" : [
          {
             "downloads" : 3329,
             "id" : "b2c1bbfd-65b0-438c-9e49-d271c49b2696",
             "views" : 1565
          },
          {
             "downloads" : 3797,
             "id" : "f44cf173-2344-4eb2-8f00-ee55df32c76f",
             "views" : 48
          },
          {
             "downloads" : 11064,
             "id" : "8542f9da-9ce1-4614-abf4-f2e3fdb4b305",
             "views" : 26
          },
          {
             "downloads" : 6782,
             "id" : "2324aa41-e9de-4a2b-bc36-16241464683e",
             "views" : 19
          },
          {
             "downloads" : 48,
             "id" : "0fe573e7-042a-4240-a4d9-753b61233908",
             "views" : 12
          },
          {
             "downloads" : 0,
             "id" : "000e61ca-695d-43e5-9ab8-1f3fd7a67a32",
             "views" : 4
          },
          {
             "downloads" : 0,
             "id" : "000dc7cd-9485-424b-8ecf-78002613cc87",
             "views" : 1
          },
          {
             "downloads" : 0,
             "id" : "000e1616-3901-4431-80b1-c6bc67312d8c",
             "views" : 1
          },
          {
             "downloads" : 0,
             "id" : "000ea897-5557-49c7-9f54-9fa192c0f83b",
             "views" : 1
          },
          {
             "downloads" : 0,
             "id" : "000ec427-97e5-4766-85a5-e8dd62199ab5",
             "views" : 1
          }
       ],
       "totalPages" : 13
    }

- I deployed it on DSpace Test and sent a note to Salem so he can test it
- I still need to add tests…
- After that I will probably tag it as version 1.3.0

## 2020-09-25

- Atmire responded with some notes about the issues we’re having with CUA and L&R on DSpace Test
  - They think they have found the reason the issues are happening…

## 2020-09-29

- Atmire sent a pull request yesterday with a potential fix for the Listings and Reports (L&R) issue
  - I tried to build it on DSpace Test but I got an HTTP 401 Unauthorized for the artifact
  - I sent them a message…

## 2020-09-30

- Experiment with re-creating IWMI’s “Monthly Abstract” type report with an AReS template
  - The template library for reports is: https://docxtemplater.com
  - Conditions start with a pound and end with a slash: {#items} {/items}
  - An inverted section begins with a caret (hat) and ends with a slash: {^citation} No citation{/citation}
  - I found a bug: templates with a space in the file name don’t download
  - It would be nice if we could use angular expressions to make more complex templates
    - Ability to iterate over authors (to change the separator)
    - Ability to get item number in a loop (for a list)
    - To do things like checking if a CRP is “WLE”