Skip to content

Commit d546a15

Browse files
authored
Merge branch 'develop' into dependabot/github_actions/github/codeql-action-4
2 parents 05e190b + 7c476e2 commit d546a15

29 files changed

+1221
-153
lines changed

conf/keycloak/builtin-users-spi/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100
</build>
101101

102102
<properties>
103-
<keycloak.version>26.3.2</keycloak.version>
103+
<keycloak.version>26.3.4</keycloak.version>
104104
<java.version>17</java.version>
105105
<jakarta.persistence.version>3.2.0</jakarta.persistence.version>
106106
<mindrot.jbcrypt.version>0.4</mindrot.jbcrypt.version>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
## Get Dataset/Dataverse Storage Driver API
2+
3+
### Changed Json response - breaking change!
4+
5+
The API for getting the Storage Driver info has been changed/extended.
6+
/api/datasets/{identifier}/storageDriver
7+
/api/admin/dataverse/{dataverse-alias}/storageDriver
8+
changed "message" to "name" and added "type" and "label"
9+
10+
Also added query param for /api/admin/dataverse/{dataverse-alias}/storageDriver?getEffective=true to recurse the chain of parents to find the effective storageDriver
11+
12+
See also [the guides](https://dataverse-guide--11664.org.readthedocs.build/en/11664/api/native-api.html#configure-a-dataset-to-store-all-new-files-in-a-specific-file-store), #11695, and #11664.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
### New API endpoint for retrieving a list of Dataverse Collections to which a given Dataset or Dataverse Collection may be linked
2+
3+
-The end point also takes in a search term which currently must be part of the collections' names.
4+
-The user calling this API must have Link Dataset or Link Dataverse permission on the Dataverse Collections returned.
5+
-If the Collection has already been linked to the given Dataset or Collection, it will not be returned.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Permission reindexing, which occurs, e.g., after a user has been granted a role on a collection, has been made faster and less memory intensive in this release.

doc/sphinx-guides/source/admin/dataverses-datasets.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ The current driver can be seen using::
6060

6161
curl -H "X-Dataverse-key: $API_TOKEN" http://$SERVER/api/admin/dataverse/$dataverse-alias/storageDriver
6262

63+
Or to recurse the chain of parents to find the effective storageDriver::
64+
65+
curl -H "X-Dataverse-key: $API_TOKEN" http://$SERVER/api/admin/dataverse/$dataverse-alias/storageDriver?getEffective=true
66+
6367
(Note that for ``dataverse.files.store1.label=MyLabel``, ``store1`` will be returned.)
6468

6569
and can be reset to the default store with::

doc/sphinx-guides/source/api/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ v6.8
1313
- For POST /api/files/{id}/metadata passing an empty string ("description":"") or array ("categories":[]) will no longer be ignored. Empty fields will now clear out the values in the file's metadata. To ignore the fields simply do not include them in the JSON string.
1414
- For PUT /api/datasets/{id}/editMetadata the query parameter "sourceInternalVersionNumber" has been removed and replaced with "sourceLastUpdateTime" to verify that the data being edited hasn't been modified and isn't stale.
1515
- For GET /api/dataverses/$dataverse-alias/links the Json response has changed breaking the backward compatibility of the API.
16+
- For GET /api/admin/dataverse/{dataverse-alias}/storageDriver and /api/datasets/{identifier}/storageDriver the driver name is no longer returned in data.message. This value is now returned in data.name.
1617
- For PUT /api/dataverses/$dataverse-alias/inputLevels custom input levels that had been previously set will no longer be deleted. To delete input levels send an empty list (deletes all), then send the new/modified list.
1718
- For GET /api/externalTools and /api/externalTools/{id} the responses are now formatted as JSON (previously the toolParameters and allowedApiCalls were a JSON object and array (respectively) that were serialized as JSON strings) and any configured "requirements" are included.
1819

doc/sphinx-guides/source/api/native-api.rst

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,50 @@ Note: you must have "Add Dataset" permission in the given collection to invoke t
732732

733733
.. _featured-collections:
734734

735+
List Dataverse Collections to Which a Given Dataset or Dataverse Collection May Be Linked
736+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
737+
738+
The user may provide a search term to limit the list of Dataverse Collections returned. The search term will be compared to the name of the Dataverse Collections.
739+
The response is a JSON array of the ids, aliases, and names of the Dataverse collections to which a given Dataset or Dataverse Collection may be linked:
740+
741+
For a given Dataverse Collection:
742+
743+
.. code-block:: bash
744+
745+
export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
746+
export SERVER_URL=https://demo.dataverse.org
747+
export OBJECT_TYPE=dataverse
748+
export ID=collectionAlias
749+
export SEARCH_TERM=searchOn
750+
751+
curl -H "X-Dataverse-key:$API_TOKEN" -X GET "$SERVER_URL/api/dataverses/$ID/$OBJECT_TYPE/linkingDataverses?searchTerm=$SEARCH_TERM"
752+
753+
The fully expanded example above (without environment variables) looks like this:
754+
755+
.. code-block:: bash
756+
757+
curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X GET "https://demo.dataverse.org/api/dataverses/collectionAlias/dataverse/linkingDataverses?searchTerm=searchOn"
758+
759+
For a given Dataset:
760+
761+
.. code-block:: bash
762+
763+
export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
764+
export SERVER_URL=https://demo.dataverse.org
765+
export OBJECT_TYPE=dataset
766+
export PERSISTENT_IDENTIFIER=doi:10.5072/FK2/J8SJZB
767+
export SEARCH_TERM=searchOn
768+
769+
curl -H "X-Dataverse-key:$API_TOKEN" -X GET "$SERVER_URL/api/dataverses/:persistentId/$OBJECT_TYPE/linkingDataverses?searchTerm=SEARCH_TERM&persistentId=$PERSISTENT_IDENTIFIER"
770+
771+
The fully expanded example above (without environment variables) looks like this:
772+
773+
.. code-block:: bash
774+
775+
curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X GET "https://demo.dataverse.org/api/dataverses/:persistentId/dataset/linkingDataverses?searchTerm=searchOn&persistentId=doi:10.5072/FK2/J8SJZB"
776+
777+
You may also add an optional "alreadyLinked=true" parameter to return collections which are already linked to the given Dataset or Dataverse Collection.
778+
735779
List Featured Collections for a Dataverse Collection
736780
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
737781

src/main/java/edu/harvard/iq/dataverse/DatasetLinkingDataverse.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import jakarta.persistence.Id;
1010
import jakarta.persistence.Index;
1111
import jakarta.persistence.JoinColumn;
12+
import jakarta.persistence.NamedNativeQuery;
1213
import jakarta.persistence.NamedQueries;
1314
import jakarta.persistence.NamedQuery;
1415
import jakarta.persistence.OneToOne;
@@ -35,6 +36,18 @@
3536
@NamedQuery(name = "DatasetLinkingDataverse.findIdsByLinkingDataverseId",
3637
query = "SELECT o.dataset.id FROM DatasetLinkingDataverse AS o WHERE o.linkingDataverse.id = :linkingDataverseId")
3738
})
39+
40+
@NamedNativeQuery(
41+
name = "DatasetLinkingDataverse.findByDatasetIdAndLinkingDataverseName",
42+
query = """
43+
select o.linkingDataverse_id from DatasetLinkingDataverse as o
44+
LEFT JOIN dataverse dv ON dv.id = o.linkingDataverse_id
45+
WHERE o.dataset_id =? AND ((LOWER(dv.name) LIKE ? and ((SUBSTRING(LOWER(dv.name),0,(LENGTH(dv.name)-9)) LIKE ?)
46+
or (SUBSTRING(LOWER(dv.name),0,(LENGTH(dv.name)-9)) LIKE ?)))
47+
or (LOWER(dv.name) NOT LIKE ? and ((LOWER(dv.name) LIKE ?)
48+
or (LOWER(dv.name) LIKE ?))))"""
49+
)
50+
3851
public class DatasetLinkingDataverse implements Serializable {
3952
private static final long serialVersionUID = 1L;
4053
@Id

src/main/java/edu/harvard/iq/dataverse/DatasetLinkingServiceBean.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package edu.harvard.iq.dataverse;
77

8+
import jakarta.ejb.EJB;
89
import java.util.ArrayList;
910
import java.util.List;
1011
import java.util.logging.Logger;
@@ -13,7 +14,6 @@
1314
import jakarta.persistence.EntityManager;
1415
import jakarta.persistence.NoResultException;
1516
import jakarta.persistence.PersistenceContext;
16-
import jakarta.persistence.Query;
1717
import jakarta.persistence.TypedQuery;
1818

1919
/**
@@ -28,6 +28,9 @@ public class DatasetLinkingServiceBean implements java.io.Serializable {
2828
@PersistenceContext(unitName = "VDCNet-ejbPU")
2929
private EntityManager em;
3030

31+
@EJB
32+
DataverseServiceBean dataverseService;
33+
3134

3235

3336
public List<Dataset> findLinkedDatasets(Long dataverseId) {
@@ -41,13 +44,42 @@ public List<Dataset> findLinkedDatasets(Long dataverseId) {
4144
}
4245

4346
public List<Dataverse> findLinkingDataverses(Long datasetId) {
47+
return findLinkingDataverses(datasetId, "");
48+
}
49+
50+
public List<Dataverse> findLinkingDataverses(Long datasetId, String searchTerm) {
4451
List<Dataverse> retList = new ArrayList<>();
45-
TypedQuery<DatasetLinkingDataverse> typedQuery = em.createNamedQuery("DatasetLinkingDataverse.findByDatasetId", DatasetLinkingDataverse.class)
46-
.setParameter("datasetId", datasetId);
47-
for (DatasetLinkingDataverse datasetLinkingDataverse : typedQuery.getResultList()) {
48-
retList.add(datasetLinkingDataverse.getLinkingDataverse());
52+
if (searchTerm == null || searchTerm.isEmpty()) {
53+
TypedQuery<DatasetLinkingDataverse> typedQuery = em.createNamedQuery("DatasetLinkingDataverse.findByDatasetId", DatasetLinkingDataverse.class)
54+
.setParameter("datasetId", datasetId);
55+
for (DatasetLinkingDataverse datasetLinkingDataverse : typedQuery.getResultList()) {
56+
retList.add(datasetLinkingDataverse.getLinkingDataverse());
57+
}
58+
return retList;
59+
60+
} else {
61+
62+
String pattern = searchTerm.toLowerCase();
63+
64+
String pattern1 = pattern + "%";
65+
String pattern2 = "% " + pattern + "%";
66+
67+
// Adjust the queries for very short, 1 and 2-character patterns:
68+
if (pattern.length() == 1) {
69+
pattern1 = pattern;
70+
pattern2 = pattern + " %";
71+
}
72+
TypedQuery<Long> typedQuery
73+
= em.createNamedQuery("DatasetLinkingDataverse.findByDatasetIdAndLinkingDataverseName", Long.class)
74+
.setParameter(1, datasetId).setParameter(2, "%dataverse").setParameter(3, pattern1)
75+
.setParameter(4, pattern2).setParameter(5, "%dataverse").setParameter(6, pattern1).setParameter(7, pattern2);
76+
77+
for (Long id : typedQuery.getResultList()) {
78+
retList.add(dataverseService.find(id));
79+
}
80+
return retList;
4981
}
50-
return retList;
82+
5183
}
5284

5385
public void save(DatasetLinkingDataverse datasetLinkingDataverse) {

src/main/java/edu/harvard/iq/dataverse/DataverseLinkingDataverse.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import jakarta.persistence.Id;
1414
import jakarta.persistence.Index;
1515
import jakarta.persistence.JoinColumn;
16+
import jakarta.persistence.NamedNativeQuery;
1617
import jakarta.persistence.NamedQueries;
1718
import jakarta.persistence.NamedQuery;
1819
import jakarta.persistence.OneToOne;
@@ -39,6 +40,16 @@
3940
@NamedQuery(name = "DataverseLinkingDataverse.findIdsByLinkingDataverseId",
4041
query = "SELECT o.dataverse.id FROM DataverseLinkingDataverse AS o WHERE o.linkingDataverse.id = :linkingDataverseId")
4142
})
43+
@NamedNativeQuery(
44+
name = "DataverseLinkingDataverse.findByDataverseIdAndLinkingDataverseName",
45+
query = """
46+
select o.linkingDataverse_id from DataverseLinkingDataverse as o
47+
LEFT JOIN dataverse dv ON dv.id = o.linkingDataverse_id
48+
WHERE o.dataverse_id =? AND ((LOWER(dv.name) LIKE ? and ((SUBSTRING(LOWER(dv.name),0,(LENGTH(dv.name)-9)) LIKE ?)
49+
or (SUBSTRING(LOWER(dv.name),0,(LENGTH(dv.name)-9)) LIKE ?)))
50+
or (LOWER(dv.name) NOT LIKE ? and ((LOWER(dv.name) LIKE ?)
51+
or (LOWER(dv.name) LIKE ?))))"""
52+
)
4253
public class DataverseLinkingDataverse implements Serializable {
4354
private static final long serialVersionUID = 1L;
4455
@Id

0 commit comments

Comments
 (0)