From 600273f158cf1a331433dbe04d74355f1700501f Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 27 Sep 2023 12:17:31 -0400 Subject: [PATCH 001/507] 7956 - display original file when ingested --- src/main/java/edu/harvard/iq/dataverse/DataFile.java | 12 ++++++++++-- src/main/webapp/file-info-fragment.xhtml | 9 +++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 0f83ae3c5c8..032eeb2f9e6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -445,6 +445,10 @@ public Long getOriginalFileSize() { return null; } + public String getFriendlyOriginalFileSize() { + return getFriendlySize(getOriginalFileSize()); + } + public String getOriginalFileName() { if (isTabularData()) { DataTable dataTable = getDataTable(); @@ -607,8 +611,12 @@ public void setFilesize(long filesize) { * @return */ public String getFriendlySize() { - if (filesize != null) { - return FileSizeChecker.bytesToHumanReadable(filesize); + return getFriendlySize(filesize); + } + + private String getFriendlySize(Long size) { + if (size != null) { + return FileSizeChecker.bytesToHumanReadable(size); } else { return BundleUtil.getStringFromBundle("file.sizeNotAvailable"); } diff --git a/src/main/webapp/file-info-fragment.xhtml b/src/main/webapp/file-info-fragment.xhtml index 33a8d2c3ca5..c9c73474254 100644 --- a/src/main/webapp/file-info-fragment.xhtml +++ b/src/main/webapp/file-info-fragment.xhtml @@ -48,11 +48,11 @@ - #{fileMetadata.label} + #{fileMetadata.datafile.originalFileName} - #{fileMetadata.label} + #{fileMetadata.datafile.originalFileName} @@ -60,7 +60,7 @@ - +
@@ -71,7 +71,7 @@
-
+
+ Date: Wed, 27 Sep 2023 12:33:23 -0400 Subject: [PATCH 002/507] typo --- src/main/webapp/file-info-fragment.xhtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/file-info-fragment.xhtml b/src/main/webapp/file-info-fragment.xhtml index c9c73474254..314b5b0da50 100644 --- a/src/main/webapp/file-info-fragment.xhtml +++ b/src/main/webapp/file-info-fragment.xhtml @@ -48,11 +48,11 @@ - #{fileMetadata.datafile.originalFileName} + #{fileMetadata.dataFile.originalFileName} - #{fileMetadata.datafile.originalFileName} + #{fileMetadata.dataFile.originalFileName}
From db450ec60e844d26d12b0c92936e5f83a59eedf3 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 27 Sep 2023 13:03:56 -0400 Subject: [PATCH 003/507] fix name, size, update file page and file citation --- src/main/java/edu/harvard/iq/dataverse/DataCitation.java | 2 +- src/main/java/edu/harvard/iq/dataverse/DataFile.java | 5 +++-- src/main/java/edu/harvard/iq/dataverse/FileMetadata.java | 8 ++++++++ src/main/webapp/file-info-fragment.xhtml | 6 +++--- src/main/webapp/file.xhtml | 6 +++--- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DataCitation.java b/src/main/java/edu/harvard/iq/dataverse/DataCitation.java index 9b4b89db44f..7774d9326a1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataCitation.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataCitation.java @@ -108,7 +108,7 @@ public DataCitation(FileMetadata fm, boolean direct) { getCommonValuesFrom(dsv); // file Title for direct File citation - fileTitle = fm.getLabel(); + fileTitle = fm.getLabelForOriginal(); DataFile df = fm.getDataFile(); // File description diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 032eeb2f9e6..e51ee6c75c8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -446,7 +446,8 @@ public Long getOriginalFileSize() { } public String getFriendlyOriginalFileSize() { - return getFriendlySize(getOriginalFileSize()); + Long size = (getOriginalFileSize()==null) ? filesize : getOriginalFileSize(); + return getFriendlySize(size); } public String getOriginalFileName() { @@ -461,7 +462,7 @@ public String getOriginalFileName() { } - private String getDerivedOriginalFileName() { + public String getDerivedOriginalFileName() { FileMetadata fm = getFileMetadata(); String filename = fm.getLabel(); String originalExtension = FileUtil.generateOriginalExtension(getOriginalFileFormat()); diff --git a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java index 461c8b14e46..554a7451043 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java @@ -142,6 +142,14 @@ public void setLabel(String label) { this.label = label; } + public String getLabelForOriginal() { + if(dataFile.isTabularData()) { + return dataFile.getDerivedOriginalFileName(); + } else { + return label; + } + } + public FileMetadata() { variableMetadatas = new ArrayList(); varGroups = new ArrayList(); diff --git a/src/main/webapp/file-info-fragment.xhtml b/src/main/webapp/file-info-fragment.xhtml index 314b5b0da50..2427006c938 100644 --- a/src/main/webapp/file-info-fragment.xhtml +++ b/src/main/webapp/file-info-fragment.xhtml @@ -48,18 +48,18 @@ - #{fileMetadata.dataFile.originalFileName} + #{fileMetadata.labelForOriginal} - #{fileMetadata.dataFile.originalFileName} + #{fileMetadata.labelForOriginal}
- +
diff --git a/src/main/webapp/file.xhtml b/src/main/webapp/file.xhtml index 5a60afef60c..34c42860c17 100644 --- a/src/main/webapp/file.xhtml +++ b/src/main/webapp/file.xhtml @@ -42,7 +42,7 @@
- #{FilePage.fileMetadata.label} + #{FilePage.fileMetadata.labelForOriginal}
@@ -560,11 +560,11 @@ #{FilePage.file.embargo.reason} - + #{bundle['file.metadataTab.fileMetadata.size.label']} - #{FilePage.file.friendlySize} + #{FilePage.file.friendlyOriginalFileSize} From 7fbbfd06e26d8d3e75f0d831a5b20834ffed7b00 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 27 Sep 2023 13:17:01 -0400 Subject: [PATCH 004/507] add ': ' --- src/main/webapp/file-info-fragment.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/file-info-fragment.xhtml b/src/main/webapp/file-info-fragment.xhtml index 2427006c938..a6ce4d01737 100644 --- a/src/main/webapp/file-info-fragment.xhtml +++ b/src/main/webapp/file-info-fragment.xhtml @@ -85,7 +85,7 @@
- + Date: Wed, 21 May 2025 15:49:27 -0400 Subject: [PATCH 005/507] new geospatial block --- doc/sphinx-guides/source/user/appendix.rst | 3 +- .../data/metadatablocks/geospatial_new.tsv | 339 ++++++++++++++++++ 2 files changed, 341 insertions(+), 1 deletion(-) create mode 100644 scripts/api/data/metadatablocks/geospatial_new.tsv diff --git a/doc/sphinx-guides/source/user/appendix.rst b/doc/sphinx-guides/source/user/appendix.rst index 96b426a483c..91f6f7d6912 100755 --- a/doc/sphinx-guides/source/user/appendix.rst +++ b/doc/sphinx-guides/source/user/appendix.rst @@ -40,7 +40,8 @@ Unlike supported metadata, experimental metadata is not enabled by default in a - `CodeMeta Software Metadata `__: based on the `CodeMeta Software Metadata Schema, version 2.0 `__ (`see .tsv version `__) - Computational Workflow Metadata (`see .tsv `__): adapted from `Bioschemas Computational Workflow Profile, version 1.0 `__ and `Codemeta `__. - Archival Metadata (`see .tsv `__): Enables repositories to register metadata relating to the potential archiving of the dataset at a depositor archive, whether that be your own institutional archive or an external archive, i.e. a historical archive. - +- `New updated Geospatial Metadata block `__: adapted for ISO 19115-3 format. It substitutes and expands existing geospatial.tsv metadata block. (`see .tsv version `__) + Please note: these custom metadata schemas are not included in the Solr schema for indexing by default, you will need to add them as necessary for your custom metadata blocks. See "Update the Solr Schema" in :doc:`../admin/metadatacustomization`. diff --git a/scripts/api/data/metadatablocks/geospatial_new.tsv b/scripts/api/data/metadatablocks/geospatial_new.tsv new file mode 100644 index 00000000000..f93ccf88c3b --- /dev/null +++ b/scripts/api/data/metadatablocks/geospatial_new.tsv @@ -0,0 +1,339 @@ +#metadataBlock name dataverseAlias displayName + geospatial Geospatial Metadata +#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id + geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + country Country / Nation The country or nation that the Dataset is about. text 1 "#VALUE, " TRUE TRUE FALSE TRUE TRUE FALSE geographicCoverage geospatial + state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 "#VALUE, " TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial + city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 "#VALUE, " TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial + otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 "#VALUE, " FALSE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial + geographicUnit Geographic Unit "Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region." text 5 TRUE FALSE TRUE TRUE TRUE FALSE geospatial + geographicBoundingBox Geographic Bounding Box "The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. " none 6 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + westLongitude Westernmost (Left) Longitude "Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0." text 7 Longitude (W): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + eastLongitude Easternmost (Right) Longitude "Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0." text 8 Longitude (E): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + northLatitude Northernmost (Top) Latitude "Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0." text 9 Latitude (N): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + southLatitude Southernmost (Bottom) Latitude "Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0." text 10 Latitude (S): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + expandedGeospatialMetadata Geospatial Metadata - Expanded Expanded metadata for geospatial datasets (ISO 19115-3) none 11 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + geoResourceType Type of Geospatial Data Resource "The type of geospatial data resource (dataset, service, or series)." text 12 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial + geoReferenceDate Resource Reference Date A date which is used to help identify the resource (ISO 19115-3) none 13 TRUE FALSE TRUE FALSE TRUE FALSE geospatial + geoReferenceDateValue Date Other date as expressed in yyyy-mm-dd date 14 #VALUE TRUE FALSE FALSE TRUE TRUE FALSE geoReferenceDate geospatial + geoReferenceDateType Type The type of date text 15 (#VALUE) TRUE TRUE FALSE FALSE TRUE FALSE geoReferenceDate geospatial + dataLineage Data Lineage Information none 16 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + lineageStatement Statement General explanation of the data producer’s knowledge of the dataset lineage. textbox 17 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial + sourceDescription Data Source Description Statement that describes the source data. textbox 19 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial + processStep Process Step Description Description of the processes performed on the data. textbox 20 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial + referenceSystemInfo Reference System Information none 21 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + referenceSystemCode Code Alphanumeric value identifying the source reference system. Alphanumeric value identifying the source reference system. text 22 #VALUE FALSE FALSE FALSE TRUE TRUE FALSE referenceSystemInfo geospatial + referenceSystemCodeSpace Code Space Identifier/ namespace of the system in which the code is valid. Identifier/ namespace of the system in which the code is valid. text 23 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE referenceSystemInfo geospatial + spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 24 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + spatialResolutionValue Value "Level of detail expressed as a scale factor, a distance or an angle" "Level of detail expressed as a scale factor, a distance or an angle" int 25 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE spatialResolution geospatial + spatialResolutionType Type "distance, vertical, angularDistance, levelOfDetail" "distance, vertical, angularDistance, levelOfDetail" text 26 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE spatialResolution geospatial + spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic information. text 27 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial + distribution Distribution Link Distribution Links none 28 TRUE FALSE TRUE FALSE TRUE FALSE geospatial + distributionLinkLabel Label A descriptive label for the distribution link A descriptive label for the distribution link text 29 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial + distributionLink URL URL to access the dataset (e.g. via a geospatial web service) URL to access the dataset (e.g. via a geospatial web service) text 30 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial + protocol Protocol The service or transfer protocol associated with the distribution link URL The service or transfer protocol associated with the distribution link URL text 31 (#VALUE) TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial + vectorSpatialRepresentation Vector Spatial Representation none 32 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + geometricObjectCount Geometric Object Count Total number of point or vector objects in the dataset. Number of point or vector objects in the dataset int 33 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial + geometricObjectTypeCode Geometric Object Type Code "Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset." "Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset." text 34 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE geospatial + gridSpatialRepresentation Raster Spatial Representation none 35 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + numberOfDimensions Number of Dimensions The number of independent spatio-temporal axes. The number of independent spatio-temporal axes. int 36 TRUE FALSE FALSE FALSE TRUE FALSE geospatial + cellGeometryCode Cell Geometry Code Identification of grid data as point or cell. Identification of grid data as point or cell. text 37 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial + axisDimensionProperties Axis Dimension Properties none 38 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + dimensionNameTypeCode Name Type Code Axis name. Axis name. text 39 #VALUE FALSE TRUE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial + dimensionSize Size Number of elements along the axis. Number of elements along the axis. int 40 FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial + resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. int 41 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial + resolutionUnitOfMeasure Resolution Unit of Measure "Resolution unit of measure (e.g. 'm', 'km', etc.)" "Resolution unit of measure (e.g. 'm', 'km', etc.)" text 42 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial +#controlledVocabulary DatasetField Value identifier displayOrder + country Afghanistan 0 + country Albania 1 + country Algeria 2 + country American Samoa 3 + country Andorra 4 + country Angola 5 + country Anguilla 6 + country Antarctica 7 + country Antigua and Barbuda 8 + country Argentina 9 + country Armenia 10 + country Aruba 11 + country Australia 12 + country Austria 13 + country Azerbaijan 14 + country Bahamas 15 + country Bahrain 16 + country Bangladesh 17 + country Barbados 18 + country Belarus 19 + country Belgium 20 + country Belize 21 + country Benin 22 + country Bermuda 23 + country Bhutan 24 + country "Bolivia, Plurinational State of" 25 + country "Bonaire, Sint Eustatius and Saba" 26 + country Bosnia and Herzegovina 27 + country Botswana 28 BOTSWANA + country Bouvet Island 29 + country Brazil 30 Brasil + country British Indian Ocean Territory 31 + country Brunei Darussalam 32 + country Bulgaria 33 + country Burkina Faso 34 + country Burundi 35 + country Cambodia 36 + country Cameroon 37 + country Canada 38 + country Cape Verde 39 + country Cayman Islands 40 + country Central African Republic 41 + country Chad 42 + country Chile 43 + country China 44 + country Christmas Island 45 + country Cocos (Keeling) Islands 46 + country Colombia 47 + country Comoros 48 + country Congo 49 + country "Congo, the Democratic Republic of the" 50 + country Cook Islands 51 + country Costa Rica 52 + country Croatia 53 + country Cuba 54 + country Curaçao 55 + country Cyprus 56 + country Czech Republic 57 + country Côte d'Ivoire 58 + country Denmark 59 + country Djibouti 60 + country Dominica 61 + country Dominican Republic 62 + country Ecuador 63 + country Egypt 64 + country El Salvador 65 + country Equatorial Guinea 66 + country Eritrea 67 + country Estonia 68 + country Ethiopia 69 + country Falkland Islands (Malvinas) 70 + country Faroe Islands 71 + country Fiji 72 + country Finland 73 + country France 74 + country French Guiana 75 + country French Polynesia 76 + country French Southern Territories 77 + country Gabon 78 + country Gambia 79 "Gambia, The" + country Georgia 80 + country Germany 81 Germany (Federal Republic of) + country Ghana 82 GHANA + country Gibraltar 83 + country Greece 84 + country Greenland 85 + country Grenada 86 + country Guadeloupe 87 + country Guam 88 + country Guatemala 89 + country Guernsey 90 + country Guinea 91 + country Guinea-Bissau 92 + country Guyana 93 + country Haiti 94 + country Heard Island and Mcdonald Islands 95 + country Holy See (Vatican City State) 96 + country Honduras 97 + country Hong Kong 98 + country Hungary 99 + country Iceland 100 + country India 101 INDIA + country Indonesia 102 Sumatra + country "Iran, Islamic Republic of" 103 Iran Iran (Islamic Republic of) + country Iraq 104 IRAQ + country Ireland 105 + country Isle of Man 106 + country Israel 107 + country Italy 108 + country Jamaica 109 + country Japan 110 + country Jersey 111 + country Jordan 112 + country Kazakhstan 113 + country Kenya 114 + country Kiribati 115 + country "Korea, Democratic People's Republic of" 116 + country "Korea, Republic of" 117 + country Kuwait 118 + country Kyrgyzstan 119 + country Lao People's Democratic Republic 120 Laos + country Latvia 121 + country Lebanon 122 + country Lesotho 123 LESOTHO + country Liberia 124 + country Libya 125 + country Liechtenstein 126 + country Lithuania 127 + country Luxembourg 128 + country Macao 129 + country "Macedonia, the Former Yugoslav Republic of" 130 + country Madagascar 131 + country Malawi 132 + country Malaysia 133 + country Maldives 134 + country Mali 135 + country Malta 136 + country Marshall Islands 137 + country Martinique 138 + country Mauritania 139 + country Mauritius 140 + country Mayotte 141 + country Mexico 142 + country "Micronesia, Federated States of" 143 + country "Moldova, Republic of" 144 + country Monaco 145 + country Mongolia 146 + country Montenegro 147 + country Montserrat 148 + country Morocco 149 + country Mozambique 150 MOZAMBIQUE + country Myanmar 151 + country Namibia 152 NAMIBIA + country Nauru 153 + country Nepal 154 + country Netherlands 155 + country New Caledonia 156 + country New Zealand 157 + country Nicaragua 158 + country Niger 159 + country Nigeria 160 + country Niue 161 + country Norfolk Island 162 + country Northern Mariana Islands 163 + country Norway 164 + country Oman 165 + country Pakistan 166 + country Palau 167 + country "Palestine, State of" 168 + country Panama 169 + country Papua New Guinea 170 + country Paraguay 171 + country Peru 172 + country Philippines 173 + country Pitcairn 174 + country Poland 175 + country Portugal 176 + country Puerto Rico 177 + country Qatar 178 + country Romania 179 + country Russian Federation 180 + country Rwanda 181 + country Réunion 182 + country Saint Barthélemy 183 + country "Saint Helena, Ascension and Tristan da Cunha" 184 + country Saint Kitts and Nevis 185 + country Saint Lucia 186 + country Saint Martin (French part) 187 + country Saint Pierre and Miquelon 188 + country Saint Vincent and the Grenadines 189 + country Samoa 190 + country San Marino 191 + country Sao Tome and Principe 192 + country Saudi Arabia 193 + country Senegal 194 + country Serbia 195 + country Seychelles 196 + country Sierra Leone 197 + country Singapore 198 + country Sint Maarten (Dutch part) 199 + country Slovakia 200 + country Slovenia 201 + country Solomon Islands 202 + country Somalia 203 + country South Africa 204 + country South Georgia and the South Sandwich Islands 205 + country South Sudan 206 + country Spain 207 + country Sri Lanka 208 + country Sudan 209 + country Suriname 210 + country Svalbard and Jan Mayen 211 + country Swaziland 212 SWAZILAND + country Sweden 213 + country Switzerland 214 + country Syrian Arab Republic 215 + country "Taiwan, Province of China" 216 Taiwan + country Tajikistan 217 + country "Tanzania, United Republic of" 218 Tanzania + country Thailand 219 + country Timor-Leste 220 + country Togo 221 + country Tokelau 222 + country Tonga 223 + country Trinidad and Tobago 224 + country Tunisia 225 + country Turkey 226 + country Turkmenistan 227 + country Turks and Caicos Islands 228 + country Tuvalu 229 + country Uganda 230 + country Ukraine 231 + country United Arab Emirates 232 UAE + country United Kingdom 233 + country United States 234 U.S.A USA United States of America U.S.A. + country United States Minor Outlying Islands 235 + country Uruguay 236 + country Uzbekistan 237 + country Vanuatu 238 + country "Venezuela, Bolivarian Republic of" 239 + country Viet Nam 240 + country "Virgin Islands, British" 241 + country "Virgin Islands, U.S." 242 + country Wallis and Futuna 243 + country Western Sahara 244 + country Yemen 245 YEMEN + country Zambia 246 + country Zimbabwe 247 + country Ã…land Islands 248 + geometricObjectTypeCode curve curve 0 + geometricObjectTypeCode composite composite 1 + geometricObjectTypeCode complex complex 2 + geometricObjectTypeCode point point 3 + geometricObjectTypeCode solid solid 4 + geometricObjectTypeCode surface surface 5 + cellGeometryCode point point 0 + cellGeometryCode area area 1 + cellGeometryCode voxel voxel 2 + dimensionNameTypeCode row row 0 + dimensionNameTypeCode column column 1 + dimensionNameTypeCode vertical vertical 2 + dimensionNameTypeCode track track 3 + dimensionNameTypeCode crossTrack crossTrack 4 + dimensionNameTypeCode line line 5 + dimensionNameTypeCode sample sample 6 + dimensionNameTypeCode time time 7 + spatialRepresentationType stereoModel stereoModel 0 + spatialRepresentationType video video 1 + spatialRepresentationType tin tin 2 + spatialRepresentationType textTable textTable 3 + spatialRepresentationType grid grid 4 + spatialRepresentationType vector vector 5 + dataQualityScope dataset dataset 0 + dataQualityScope service service 1 + geoResourceType dataset dataset 0 + geoResourceType service service 1 + geoResourceType series series 2 + geoReferenceDateType revision revision 0 + geoReferenceDateType expiry expiry 1 + geoReferenceDateType lastUpdate lastUpdate 2 + geoReferenceDateType lastRevision lastRevision 3 + geoReferenceDateType nextUpdate nextUpdate 4 + geoReferenceDateType unavailable unavailable 5 + geoReferenceDateType inForce inForce 6 + geoReferenceDateType adopted adopted 7 + geoReferenceDateType deprecated deprecated 8 + geoReferenceDateType superseded superseded 9 + geoReferenceDateType publication publication 10 + spatialResolutionType equivalentScale equivalentScale 0 + spatialResolutionType distance distance 1 + spatialResolutionType vertical vertical 2 + spatialResolutionType angularDistance angularDistance 3 + spatialResolutionType levelOfDetail levelOfDetail 4 From e17a01bb4259a6f6097cbe7e4359341ba272279b Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Wed, 21 May 2025 16:45:45 -0400 Subject: [PATCH 006/507] remove block --- doc/sphinx-guides/source/user/appendix.rst | 10 +- .../data/metadatablocks/geospatial_new.tsv | 339 ------------------ 2 files changed, 9 insertions(+), 340 deletions(-) delete mode 100644 scripts/api/data/metadatablocks/geospatial_new.tsv diff --git a/doc/sphinx-guides/source/user/appendix.rst b/doc/sphinx-guides/source/user/appendix.rst index 91f6f7d6912..f1b980ab782 100755 --- a/doc/sphinx-guides/source/user/appendix.rst +++ b/doc/sphinx-guides/source/user/appendix.rst @@ -40,7 +40,15 @@ Unlike supported metadata, experimental metadata is not enabled by default in a - `CodeMeta Software Metadata `__: based on the `CodeMeta Software Metadata Schema, version 2.0 `__ (`see .tsv version `__) - Computational Workflow Metadata (`see .tsv `__): adapted from `Bioschemas Computational Workflow Profile, version 1.0 `__ and `Codemeta `__. - Archival Metadata (`see .tsv `__): Enables repositories to register metadata relating to the potential archiving of the dataset at a depositor archive, whether that be your own institutional archive or an external archive, i.e. a historical archive. -- `New updated Geospatial Metadata block `__: adapted for ISO 19115-3 format. It substitutes and expands existing geospatial.tsv metadata block. (`see .tsv version `__) +- `New updated Geospatial Metadata block `__: adapted for ISO 19115-3 format. It substitutes and expands existing geospatial.tsv metadata block. To use it, replace existing geospatial.tsv with the new one. To upload the block to the existing installation: + +.. code-block:: javascript + + curl http://localhost:8080/api/admin/datasetfield/load -H "Content-type: text/tab-separated-values" -X POST --upload-file geospatial_new.tsv + curl "http://localhost:8080/api/admin/index/solr/schema" > new.xml + ./dataverse/conf/solr/update-fields.sh /usr/local/solr/solr-9.8.0/server/solr/collection1/conf/schema.xml new.xml + curl "http://localhost:8983/solr/admin/cores?action=RELOAD&core=collection1" + Please note: these custom metadata schemas are not included in the Solr schema for indexing by default, you will need to add them as necessary for your custom metadata blocks. See "Update the Solr Schema" in :doc:`../admin/metadatacustomization`. diff --git a/scripts/api/data/metadatablocks/geospatial_new.tsv b/scripts/api/data/metadatablocks/geospatial_new.tsv deleted file mode 100644 index f93ccf88c3b..00000000000 --- a/scripts/api/data/metadatablocks/geospatial_new.tsv +++ /dev/null @@ -1,339 +0,0 @@ -#metadataBlock name dataverseAlias displayName - geospatial Geospatial Metadata -#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id - geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - country Country / Nation The country or nation that the Dataset is about. text 1 "#VALUE, " TRUE TRUE FALSE TRUE TRUE FALSE geographicCoverage geospatial - state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 "#VALUE, " TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial - city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 "#VALUE, " TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial - otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 "#VALUE, " FALSE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial - geographicUnit Geographic Unit "Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region." text 5 TRUE FALSE TRUE TRUE TRUE FALSE geospatial - geographicBoundingBox Geographic Bounding Box "The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. " none 6 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - westLongitude Westernmost (Left) Longitude "Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0." text 7 Longitude (W): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - eastLongitude Easternmost (Right) Longitude "Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0." text 8 Longitude (E): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - northLatitude Northernmost (Top) Latitude "Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0." text 9 Latitude (N): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - southLatitude Southernmost (Bottom) Latitude "Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0." text 10 Latitude (S): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - expandedGeospatialMetadata Geospatial Metadata - Expanded Expanded metadata for geospatial datasets (ISO 19115-3) none 11 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - geoResourceType Type of Geospatial Data Resource "The type of geospatial data resource (dataset, service, or series)." text 12 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial - geoReferenceDate Resource Reference Date A date which is used to help identify the resource (ISO 19115-3) none 13 TRUE FALSE TRUE FALSE TRUE FALSE geospatial - geoReferenceDateValue Date Other date as expressed in yyyy-mm-dd date 14 #VALUE TRUE FALSE FALSE TRUE TRUE FALSE geoReferenceDate geospatial - geoReferenceDateType Type The type of date text 15 (#VALUE) TRUE TRUE FALSE FALSE TRUE FALSE geoReferenceDate geospatial - dataLineage Data Lineage Information none 16 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - lineageStatement Statement General explanation of the data producer’s knowledge of the dataset lineage. textbox 17 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial - sourceDescription Data Source Description Statement that describes the source data. textbox 19 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial - processStep Process Step Description Description of the processes performed on the data. textbox 20 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial - referenceSystemInfo Reference System Information none 21 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - referenceSystemCode Code Alphanumeric value identifying the source reference system. Alphanumeric value identifying the source reference system. text 22 #VALUE FALSE FALSE FALSE TRUE TRUE FALSE referenceSystemInfo geospatial - referenceSystemCodeSpace Code Space Identifier/ namespace of the system in which the code is valid. Identifier/ namespace of the system in which the code is valid. text 23 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE referenceSystemInfo geospatial - spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 24 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - spatialResolutionValue Value "Level of detail expressed as a scale factor, a distance or an angle" "Level of detail expressed as a scale factor, a distance or an angle" int 25 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE spatialResolution geospatial - spatialResolutionType Type "distance, vertical, angularDistance, levelOfDetail" "distance, vertical, angularDistance, levelOfDetail" text 26 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE spatialResolution geospatial - spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic information. text 27 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial - distribution Distribution Link Distribution Links none 28 TRUE FALSE TRUE FALSE TRUE FALSE geospatial - distributionLinkLabel Label A descriptive label for the distribution link A descriptive label for the distribution link text 29 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial - distributionLink URL URL to access the dataset (e.g. via a geospatial web service) URL to access the dataset (e.g. via a geospatial web service) text 30 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial - protocol Protocol The service or transfer protocol associated with the distribution link URL The service or transfer protocol associated with the distribution link URL text 31 (#VALUE) TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial - vectorSpatialRepresentation Vector Spatial Representation none 32 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - geometricObjectCount Geometric Object Count Total number of point or vector objects in the dataset. Number of point or vector objects in the dataset int 33 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial - geometricObjectTypeCode Geometric Object Type Code "Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset." "Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset." text 34 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE geospatial - gridSpatialRepresentation Raster Spatial Representation none 35 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - numberOfDimensions Number of Dimensions The number of independent spatio-temporal axes. The number of independent spatio-temporal axes. int 36 TRUE FALSE FALSE FALSE TRUE FALSE geospatial - cellGeometryCode Cell Geometry Code Identification of grid data as point or cell. Identification of grid data as point or cell. text 37 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial - axisDimensionProperties Axis Dimension Properties none 38 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - dimensionNameTypeCode Name Type Code Axis name. Axis name. text 39 #VALUE FALSE TRUE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial - dimensionSize Size Number of elements along the axis. Number of elements along the axis. int 40 FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial - resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. int 41 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial - resolutionUnitOfMeasure Resolution Unit of Measure "Resolution unit of measure (e.g. 'm', 'km', etc.)" "Resolution unit of measure (e.g. 'm', 'km', etc.)" text 42 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial -#controlledVocabulary DatasetField Value identifier displayOrder - country Afghanistan 0 - country Albania 1 - country Algeria 2 - country American Samoa 3 - country Andorra 4 - country Angola 5 - country Anguilla 6 - country Antarctica 7 - country Antigua and Barbuda 8 - country Argentina 9 - country Armenia 10 - country Aruba 11 - country Australia 12 - country Austria 13 - country Azerbaijan 14 - country Bahamas 15 - country Bahrain 16 - country Bangladesh 17 - country Barbados 18 - country Belarus 19 - country Belgium 20 - country Belize 21 - country Benin 22 - country Bermuda 23 - country Bhutan 24 - country "Bolivia, Plurinational State of" 25 - country "Bonaire, Sint Eustatius and Saba" 26 - country Bosnia and Herzegovina 27 - country Botswana 28 BOTSWANA - country Bouvet Island 29 - country Brazil 30 Brasil - country British Indian Ocean Territory 31 - country Brunei Darussalam 32 - country Bulgaria 33 - country Burkina Faso 34 - country Burundi 35 - country Cambodia 36 - country Cameroon 37 - country Canada 38 - country Cape Verde 39 - country Cayman Islands 40 - country Central African Republic 41 - country Chad 42 - country Chile 43 - country China 44 - country Christmas Island 45 - country Cocos (Keeling) Islands 46 - country Colombia 47 - country Comoros 48 - country Congo 49 - country "Congo, the Democratic Republic of the" 50 - country Cook Islands 51 - country Costa Rica 52 - country Croatia 53 - country Cuba 54 - country Curaçao 55 - country Cyprus 56 - country Czech Republic 57 - country Côte d'Ivoire 58 - country Denmark 59 - country Djibouti 60 - country Dominica 61 - country Dominican Republic 62 - country Ecuador 63 - country Egypt 64 - country El Salvador 65 - country Equatorial Guinea 66 - country Eritrea 67 - country Estonia 68 - country Ethiopia 69 - country Falkland Islands (Malvinas) 70 - country Faroe Islands 71 - country Fiji 72 - country Finland 73 - country France 74 - country French Guiana 75 - country French Polynesia 76 - country French Southern Territories 77 - country Gabon 78 - country Gambia 79 "Gambia, The" - country Georgia 80 - country Germany 81 Germany (Federal Republic of) - country Ghana 82 GHANA - country Gibraltar 83 - country Greece 84 - country Greenland 85 - country Grenada 86 - country Guadeloupe 87 - country Guam 88 - country Guatemala 89 - country Guernsey 90 - country Guinea 91 - country Guinea-Bissau 92 - country Guyana 93 - country Haiti 94 - country Heard Island and Mcdonald Islands 95 - country Holy See (Vatican City State) 96 - country Honduras 97 - country Hong Kong 98 - country Hungary 99 - country Iceland 100 - country India 101 INDIA - country Indonesia 102 Sumatra - country "Iran, Islamic Republic of" 103 Iran Iran (Islamic Republic of) - country Iraq 104 IRAQ - country Ireland 105 - country Isle of Man 106 - country Israel 107 - country Italy 108 - country Jamaica 109 - country Japan 110 - country Jersey 111 - country Jordan 112 - country Kazakhstan 113 - country Kenya 114 - country Kiribati 115 - country "Korea, Democratic People's Republic of" 116 - country "Korea, Republic of" 117 - country Kuwait 118 - country Kyrgyzstan 119 - country Lao People's Democratic Republic 120 Laos - country Latvia 121 - country Lebanon 122 - country Lesotho 123 LESOTHO - country Liberia 124 - country Libya 125 - country Liechtenstein 126 - country Lithuania 127 - country Luxembourg 128 - country Macao 129 - country "Macedonia, the Former Yugoslav Republic of" 130 - country Madagascar 131 - country Malawi 132 - country Malaysia 133 - country Maldives 134 - country Mali 135 - country Malta 136 - country Marshall Islands 137 - country Martinique 138 - country Mauritania 139 - country Mauritius 140 - country Mayotte 141 - country Mexico 142 - country "Micronesia, Federated States of" 143 - country "Moldova, Republic of" 144 - country Monaco 145 - country Mongolia 146 - country Montenegro 147 - country Montserrat 148 - country Morocco 149 - country Mozambique 150 MOZAMBIQUE - country Myanmar 151 - country Namibia 152 NAMIBIA - country Nauru 153 - country Nepal 154 - country Netherlands 155 - country New Caledonia 156 - country New Zealand 157 - country Nicaragua 158 - country Niger 159 - country Nigeria 160 - country Niue 161 - country Norfolk Island 162 - country Northern Mariana Islands 163 - country Norway 164 - country Oman 165 - country Pakistan 166 - country Palau 167 - country "Palestine, State of" 168 - country Panama 169 - country Papua New Guinea 170 - country Paraguay 171 - country Peru 172 - country Philippines 173 - country Pitcairn 174 - country Poland 175 - country Portugal 176 - country Puerto Rico 177 - country Qatar 178 - country Romania 179 - country Russian Federation 180 - country Rwanda 181 - country Réunion 182 - country Saint Barthélemy 183 - country "Saint Helena, Ascension and Tristan da Cunha" 184 - country Saint Kitts and Nevis 185 - country Saint Lucia 186 - country Saint Martin (French part) 187 - country Saint Pierre and Miquelon 188 - country Saint Vincent and the Grenadines 189 - country Samoa 190 - country San Marino 191 - country Sao Tome and Principe 192 - country Saudi Arabia 193 - country Senegal 194 - country Serbia 195 - country Seychelles 196 - country Sierra Leone 197 - country Singapore 198 - country Sint Maarten (Dutch part) 199 - country Slovakia 200 - country Slovenia 201 - country Solomon Islands 202 - country Somalia 203 - country South Africa 204 - country South Georgia and the South Sandwich Islands 205 - country South Sudan 206 - country Spain 207 - country Sri Lanka 208 - country Sudan 209 - country Suriname 210 - country Svalbard and Jan Mayen 211 - country Swaziland 212 SWAZILAND - country Sweden 213 - country Switzerland 214 - country Syrian Arab Republic 215 - country "Taiwan, Province of China" 216 Taiwan - country Tajikistan 217 - country "Tanzania, United Republic of" 218 Tanzania - country Thailand 219 - country Timor-Leste 220 - country Togo 221 - country Tokelau 222 - country Tonga 223 - country Trinidad and Tobago 224 - country Tunisia 225 - country Turkey 226 - country Turkmenistan 227 - country Turks and Caicos Islands 228 - country Tuvalu 229 - country Uganda 230 - country Ukraine 231 - country United Arab Emirates 232 UAE - country United Kingdom 233 - country United States 234 U.S.A USA United States of America U.S.A. - country United States Minor Outlying Islands 235 - country Uruguay 236 - country Uzbekistan 237 - country Vanuatu 238 - country "Venezuela, Bolivarian Republic of" 239 - country Viet Nam 240 - country "Virgin Islands, British" 241 - country "Virgin Islands, U.S." 242 - country Wallis and Futuna 243 - country Western Sahara 244 - country Yemen 245 YEMEN - country Zambia 246 - country Zimbabwe 247 - country Ã…land Islands 248 - geometricObjectTypeCode curve curve 0 - geometricObjectTypeCode composite composite 1 - geometricObjectTypeCode complex complex 2 - geometricObjectTypeCode point point 3 - geometricObjectTypeCode solid solid 4 - geometricObjectTypeCode surface surface 5 - cellGeometryCode point point 0 - cellGeometryCode area area 1 - cellGeometryCode voxel voxel 2 - dimensionNameTypeCode row row 0 - dimensionNameTypeCode column column 1 - dimensionNameTypeCode vertical vertical 2 - dimensionNameTypeCode track track 3 - dimensionNameTypeCode crossTrack crossTrack 4 - dimensionNameTypeCode line line 5 - dimensionNameTypeCode sample sample 6 - dimensionNameTypeCode time time 7 - spatialRepresentationType stereoModel stereoModel 0 - spatialRepresentationType video video 1 - spatialRepresentationType tin tin 2 - spatialRepresentationType textTable textTable 3 - spatialRepresentationType grid grid 4 - spatialRepresentationType vector vector 5 - dataQualityScope dataset dataset 0 - dataQualityScope service service 1 - geoResourceType dataset dataset 0 - geoResourceType service service 1 - geoResourceType series series 2 - geoReferenceDateType revision revision 0 - geoReferenceDateType expiry expiry 1 - geoReferenceDateType lastUpdate lastUpdate 2 - geoReferenceDateType lastRevision lastRevision 3 - geoReferenceDateType nextUpdate nextUpdate 4 - geoReferenceDateType unavailable unavailable 5 - geoReferenceDateType inForce inForce 6 - geoReferenceDateType adopted adopted 7 - geoReferenceDateType deprecated deprecated 8 - geoReferenceDateType superseded superseded 9 - geoReferenceDateType publication publication 10 - spatialResolutionType equivalentScale equivalentScale 0 - spatialResolutionType distance distance 1 - spatialResolutionType vertical vertical 2 - spatialResolutionType angularDistance angularDistance 3 - spatialResolutionType levelOfDetail levelOfDetail 4 From f85e079413a85c4f2f878c3bba91471d10f98c8b Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Wed, 28 May 2025 10:54:39 -0400 Subject: [PATCH 007/507] expanded geospatial block --- .../api/data/metadatablocks/geospatial.tsv | 603 ++++++++++-------- 1 file changed, 339 insertions(+), 264 deletions(-) diff --git a/scripts/api/data/metadatablocks/geospatial.tsv b/scripts/api/data/metadatablocks/geospatial.tsv index 11408317410..7c34df42899 100644 --- a/scripts/api/data/metadatablocks/geospatial.tsv +++ b/scripts/api/data/metadatablocks/geospatial.tsv @@ -1,264 +1,339 @@ -#metadataBlock name dataverseAlias displayName - geospatial Geospatial Metadata -#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id - geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE FALSE FALSE geospatial - country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE FALSE FALSE geographicCoverage geospatial - state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial - city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial - otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 #VALUE, FALSE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial - geographicUnit Geographic Unit Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region. text 5 TRUE FALSE TRUE TRUE FALSE FALSE geospatial - geographicBoundingBox Geographic Bounding Box The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. none 6 FALSE FALSE TRUE FALSE FALSE FALSE geospatial - westLongitude Westernmost (Left) Longitude Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0. text 7 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial - eastLongitude Easternmost (Right) Longitude Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0. text 8 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial - northLatitude Northernmost (Top) Latitude Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0. text 9 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial - southLatitude Southernmost (Bottom) Latitude Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0. text 10 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial -#controlledVocabulary DatasetField Value identifier displayOrder - country Afghanistan 0 - country Albania 1 - country Algeria 2 - country American Samoa 3 - country Andorra 4 - country Angola 5 - country Anguilla 6 - country Antarctica 7 - country Antigua and Barbuda 8 - country Argentina 9 - country Armenia 10 - country Aruba 11 - country Australia 12 - country Austria 13 - country Azerbaijan 14 - country Bahamas 15 - country Bahrain 16 - country Bangladesh 17 - country Barbados 18 - country Belarus 19 - country Belgium 20 - country Belize 21 - country Benin 22 - country Bermuda 23 - country Bhutan 24 - country Bolivia, Plurinational State of 25 - country Bonaire, Sint Eustatius and Saba 26 - country Bosnia and Herzegovina 27 - country Botswana 28 BOTSWANA - country Bouvet Island 29 - country Brazil 30 Brasil - country British Indian Ocean Territory 31 - country Brunei Darussalam 32 - country Bulgaria 33 - country Burkina Faso 34 - country Burundi 35 - country Cambodia 36 - country Cameroon 37 - country Canada 38 - country Cape Verde 39 - country Cayman Islands 40 - country Central African Republic 41 - country Chad 42 - country Chile 43 - country China 44 - country Christmas Island 45 - country Cocos (Keeling) Islands 46 - country Colombia 47 - country Comoros 48 - country Congo 49 - country Congo, the Democratic Republic of the 50 - country Cook Islands 51 - country Costa Rica 52 - country Croatia 53 - country Cuba 54 - country Curaçao 55 - country Cyprus 56 - country Czech Republic 57 - country Côte d'Ivoire 58 - country Denmark 59 - country Djibouti 60 - country Dominica 61 - country Dominican Republic 62 - country Ecuador 63 - country Egypt 64 - country El Salvador 65 - country Equatorial Guinea 66 - country Eritrea 67 - country Estonia 68 - country Ethiopia 69 - country Falkland Islands (Malvinas) 70 - country Faroe Islands 71 - country Fiji 72 - country Finland 73 - country France 74 - country French Guiana 75 - country French Polynesia 76 - country French Southern Territories 77 - country Gabon 78 - country Gambia 79 Gambia, The - country Georgia 80 - country Germany 81 Germany (Federal Republic of) - country Ghana 82 GHANA - country Gibraltar 83 - country Greece 84 - country Greenland 85 - country Grenada 86 - country Guadeloupe 87 - country Guam 88 - country Guatemala 89 - country Guernsey 90 - country Guinea 91 - country Guinea-Bissau 92 - country Guyana 93 - country Haiti 94 - country Heard Island and Mcdonald Islands 95 - country Holy See (Vatican City State) 96 - country Honduras 97 - country Hong Kong 98 - country Hungary 99 - country Iceland 100 - country India 101 INDIA - country Indonesia 102 Sumatra - country Iran, Islamic Republic of 103 Iran Iran (Islamic Republic of) - country Iraq 104 IRAQ - country Ireland 105 - country Isle of Man 106 - country Israel 107 - country Italy 108 - country Jamaica 109 - country Japan 110 - country Jersey 111 - country Jordan 112 - country Kazakhstan 113 - country Kenya 114 - country Kiribati 115 - country Korea, Democratic People's Republic of 116 - country Korea, Republic of 117 - country Kuwait 118 - country Kyrgyzstan 119 - country Lao People's Democratic Republic 120 Laos - country Latvia 121 - country Lebanon 122 - country Lesotho 123 LESOTHO - country Liberia 124 - country Libya 125 - country Liechtenstein 126 - country Lithuania 127 - country Luxembourg 128 - country Macao 129 - country Macedonia, the Former Yugoslav Republic of 130 - country Madagascar 131 - country Malawi 132 - country Malaysia 133 - country Maldives 134 - country Mali 135 - country Malta 136 - country Marshall Islands 137 - country Martinique 138 - country Mauritania 139 - country Mauritius 140 - country Mayotte 141 - country Mexico 142 - country Micronesia, Federated States of 143 - country Moldova, Republic of 144 - country Monaco 145 - country Mongolia 146 - country Montenegro 147 - country Montserrat 148 - country Morocco 149 - country Mozambique 150 MOZAMBIQUE - country Myanmar 151 - country Namibia 152 NAMIBIA - country Nauru 153 - country Nepal 154 - country Netherlands 155 - country New Caledonia 156 - country New Zealand 157 - country Nicaragua 158 - country Niger 159 - country Nigeria 160 - country Niue 161 - country Norfolk Island 162 - country Northern Mariana Islands 163 - country Norway 164 - country Oman 165 - country Pakistan 166 - country Palau 167 - country Palestine, State of 168 - country Panama 169 - country Papua New Guinea 170 - country Paraguay 171 - country Peru 172 - country Philippines 173 - country Pitcairn 174 - country Poland 175 - country Portugal 176 - country Puerto Rico 177 - country Qatar 178 - country Romania 179 - country Russian Federation 180 - country Rwanda 181 - country Réunion 182 - country Saint Barthélemy 183 - country Saint Helena, Ascension and Tristan da Cunha 184 - country Saint Kitts and Nevis 185 - country Saint Lucia 186 - country Saint Martin (French part) 187 - country Saint Pierre and Miquelon 188 - country Saint Vincent and the Grenadines 189 - country Samoa 190 - country San Marino 191 - country Sao Tome and Principe 192 - country Saudi Arabia 193 - country Senegal 194 - country Serbia 195 - country Seychelles 196 - country Sierra Leone 197 - country Singapore 198 - country Sint Maarten (Dutch part) 199 - country Slovakia 200 - country Slovenia 201 - country Solomon Islands 202 - country Somalia 203 - country South Africa 204 - country South Georgia and the South Sandwich Islands 205 - country South Sudan 206 - country Spain 207 - country Sri Lanka 208 - country Sudan 209 - country Suriname 210 - country Svalbard and Jan Mayen 211 - country Swaziland 212 SWAZILAND - country Sweden 213 - country Switzerland 214 - country Syrian Arab Republic 215 - country Taiwan, Province of China 216 Taiwan - country Tajikistan 217 - country Tanzania, United Republic of 218 Tanzania - country Thailand 219 - country Timor-Leste 220 - country Togo 221 - country Tokelau 222 - country Tonga 223 - country Trinidad and Tobago 224 - country Tunisia 225 - country Turkey 226 - country Turkmenistan 227 - country Turks and Caicos Islands 228 - country Tuvalu 229 - country Uganda 230 - country Ukraine 231 - country United Arab Emirates 232 UAE - country United Kingdom 233 - country United States 234 U.S.A USA United States of America U.S.A. - country United States Minor Outlying Islands 235 - country Uruguay 236 - country Uzbekistan 237 - country Vanuatu 238 - country Venezuela, Bolivarian Republic of 239 - country Viet Nam 240 - country Virgin Islands, British 241 - country Virgin Islands, U.S. 242 - country Wallis and Futuna 243 - country Western Sahara 244 - country Yemen 245 YEMEN - country Zambia 246 - country Zimbabwe 247 - country Åland Islands 248 +#metadataBlock name dataverseAlias displayName + geospatial Geospatial Metadata +#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id + geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE TRUE FALSE geographicCoverage geospatial + state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial + city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 #VALUE, TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial + otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 #VALUE, FALSE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial + geographicUnit Geographic Unit Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region. text 5 TRUE FALSE TRUE TRUE TRUE FALSE geospatial + geographicBoundingBox Geographic Bounding Box The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. none 6 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + westLongitude Westernmost (Left) Longitude Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0. text 7 Longitude (W): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + eastLongitude Easternmost (Right) Longitude Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0. text 8 Longitude (E): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + northLatitude Northernmost (Top) Latitude Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0. text 9 Latitude (N): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + southLatitude Southernmost (Bottom) Latitude Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0. text 10 Latitude (S): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + expandedGeospatialMetadata Geospatial Metadata - Expanded Expanded metadata for geospatial datasets (ISO 19115-3) none 11 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + geoResourceType Type of Geospatial Data Resource The type of geospatial data resource (dataset, service, or series). text 12 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial + geoReferenceDate Resource Reference Date A date which is used to help identify the resource (ISO 19115-3) none 13 TRUE FALSE TRUE FALSE TRUE FALSE geospatial + geoReferenceDateValue Date Other date as expressed in yyyy-mm-dd date 14 #VALUE TRUE FALSE FALSE TRUE TRUE FALSE geoReferenceDate geospatial + geoReferenceDateType Type The type of date text 15 (#VALUE) TRUE TRUE FALSE FALSE TRUE FALSE geoReferenceDate geospatial + dataLineage Data Lineage Information none 16 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + lineageStatement Statement General explanation of the data producer’s knowledge of the dataset lineage. textbox 17 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial + sourceDescription Data Source Description Statement that describes the source data. textbox 19 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial + processStep Process Step Description Description of the processes performed on the data. textbox 20 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial + referenceSystemInfo Reference System Information none 21 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + referenceSystemCode Code Alphanumeric value identifying the source reference system. Alphanumeric value identifying the source reference system. text 22 #VALUE FALSE FALSE FALSE TRUE TRUE FALSE referenceSystemInfo geospatial + referenceSystemCodeSpace Code Space Identifier/ namespace of the system in which the code is valid. Identifier/ namespace of the system in which the code is valid. text 23 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE referenceSystemInfo geospatial + spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 24 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + spatialResolutionValue Value Level of detail expressed as a scale factor, a distance or an angle Level of detail expressed as a scale factor, a distance or an angle int 25 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE spatialResolution geospatial + spatialResolutionType Type distance, vertical, angularDistance, levelOfDetail distance, vertical, angularDistance, levelOfDetail text 26 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE spatialResolution geospatial + spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic information. text 27 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial + distribution Distribution Link Distribution Links none 28 TRUE FALSE TRUE FALSE TRUE FALSE geospatial + distributionLinkLabel Label A descriptive label for the distribution link A descriptive label for the distribution link text 29 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial + distributionLink URL URL to access the dataset (e.g. via a geospatial web service) URL to access the dataset (e.g. via a geospatial web service) text 30 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial + protocol Protocol The service or transfer protocol associated with the distribution link URL The service or transfer protocol associated with the distribution link URL text 31 (#VALUE) TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial + vectorSpatialRepresentation Vector Spatial Representation none 32 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + geometricObjectCount Geometric Object Count Total number of point or vector objects in the dataset. Number of point or vector objects in the dataset int 33 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial + geometricObjectTypeCode Geometric Object Type Code Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. text 34 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE geospatial + gridSpatialRepresentation Raster Spatial Representation none 35 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + numberOfDimensions Number of Dimensions The number of independent spatio-temporal axes. The number of independent spatio-temporal axes. int 36 TRUE FALSE FALSE FALSE TRUE FALSE geospatial + cellGeometryCode Cell Geometry Code Identification of grid data as point or cell. Identification of grid data as point or cell. text 37 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial + axisDimensionProperties Axis Dimension Properties none 38 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + dimensionNameTypeCode Name Type Code Axis name. Axis name. text 39 #VALUE FALSE TRUE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial + dimensionSize Size Number of elements along the axis. Number of elements along the axis. int 40 FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial + resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. int 41 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial + resolutionUnitOfMeasure Resolution Unit of Measure Resolution unit of measure (e.g. 'm', 'km', etc.) Resolution unit of measure (e.g. 'm', 'km', etc.) text 42 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial +#controlledVocabulary DatasetField Value identifier displayOrder + country Afghanistan 0 + country Albania 1 + country Algeria 2 + country American Samoa 3 + country Andorra 4 + country Angola 5 + country Anguilla 6 + country Antarctica 7 + country Antigua and Barbuda 8 + country Argentina 9 + country Armenia 10 + country Aruba 11 + country Australia 12 + country Austria 13 + country Azerbaijan 14 + country Bahamas 15 + country Bahrain 16 + country Bangladesh 17 + country Barbados 18 + country Belarus 19 + country Belgium 20 + country Belize 21 + country Benin 22 + country Bermuda 23 + country Bhutan 24 + country Bolivia, Plurinational State of 25 + country Bonaire, Sint Eustatius and Saba 26 + country Bosnia and Herzegovina 27 + country Botswana 28 BOTSWANA + country Bouvet Island 29 + country Brazil 30 Brasil + country British Indian Ocean Territory 31 + country Brunei Darussalam 32 + country Bulgaria 33 + country Burkina Faso 34 + country Burundi 35 + country Cambodia 36 + country Cameroon 37 + country Canada 38 + country Cape Verde 39 + country Cayman Islands 40 + country Central African Republic 41 + country Chad 42 + country Chile 43 + country China 44 + country Christmas Island 45 + country Cocos (Keeling) Islands 46 + country Colombia 47 + country Comoros 48 + country Congo 49 + country Congo, the Democratic Republic of the 50 + country Cook Islands 51 + country Costa Rica 52 + country Croatia 53 + country Cuba 54 + country Curaçao 55 + country Cyprus 56 + country Czech Republic 57 + country Côte d'Ivoire 58 + country Denmark 59 + country Djibouti 60 + country Dominica 61 + country Dominican Republic 62 + country Ecuador 63 + country Egypt 64 + country El Salvador 65 + country Equatorial Guinea 66 + country Eritrea 67 + country Estonia 68 + country Ethiopia 69 + country Falkland Islands (Malvinas) 70 + country Faroe Islands 71 + country Fiji 72 + country Finland 73 + country France 74 + country French Guiana 75 + country French Polynesia 76 + country French Southern Territories 77 + country Gabon 78 + country Gambia 79 Gambia, The + country Georgia 80 + country Germany 81 Germany (Federal Republic of) + country Ghana 82 GHANA + country Gibraltar 83 + country Greece 84 + country Greenland 85 + country Grenada 86 + country Guadeloupe 87 + country Guam 88 + country Guatemala 89 + country Guernsey 90 + country Guinea 91 + country Guinea-Bissau 92 + country Guyana 93 + country Haiti 94 + country Heard Island and Mcdonald Islands 95 + country Holy See (Vatican City State) 96 + country Honduras 97 + country Hong Kong 98 + country Hungary 99 + country Iceland 100 + country India 101 INDIA + country Indonesia 102 Sumatra + country Iran, Islamic Republic of 103 Iran Iran (Islamic Republic of) + country Iraq 104 IRAQ + country Ireland 105 + country Isle of Man 106 + country Israel 107 + country Italy 108 + country Jamaica 109 + country Japan 110 + country Jersey 111 + country Jordan 112 + country Kazakhstan 113 + country Kenya 114 + country Kiribati 115 + country Korea, Democratic People's Republic of 116 + country Korea, Republic of 117 + country Kuwait 118 + country Kyrgyzstan 119 + country Lao People's Democratic Republic 120 Laos + country Latvia 121 + country Lebanon 122 + country Lesotho 123 LESOTHO + country Liberia 124 + country Libya 125 + country Liechtenstein 126 + country Lithuania 127 + country Luxembourg 128 + country Macao 129 + country Macedonia, the Former Yugoslav Republic of 130 + country Madagascar 131 + country Malawi 132 + country Malaysia 133 + country Maldives 134 + country Mali 135 + country Malta 136 + country Marshall Islands 137 + country Martinique 138 + country Mauritania 139 + country Mauritius 140 + country Mayotte 141 + country Mexico 142 + country Micronesia, Federated States of 143 + country Moldova, Republic of 144 + country Monaco 145 + country Mongolia 146 + country Montenegro 147 + country Montserrat 148 + country Morocco 149 + country Mozambique 150 MOZAMBIQUE + country Myanmar 151 + country Namibia 152 NAMIBIA + country Nauru 153 + country Nepal 154 + country Netherlands 155 + country New Caledonia 156 + country New Zealand 157 + country Nicaragua 158 + country Niger 159 + country Nigeria 160 + country Niue 161 + country Norfolk Island 162 + country Northern Mariana Islands 163 + country Norway 164 + country Oman 165 + country Pakistan 166 + country Palau 167 + country Palestine, State of 168 + country Panama 169 + country Papua New Guinea 170 + country Paraguay 171 + country Peru 172 + country Philippines 173 + country Pitcairn 174 + country Poland 175 + country Portugal 176 + country Puerto Rico 177 + country Qatar 178 + country Romania 179 + country Russian Federation 180 + country Rwanda 181 + country Réunion 182 + country Saint Barthélemy 183 + country Saint Helena, Ascension and Tristan da Cunha 184 + country Saint Kitts and Nevis 185 + country Saint Lucia 186 + country Saint Martin (French part) 187 + country Saint Pierre and Miquelon 188 + country Saint Vincent and the Grenadines 189 + country Samoa 190 + country San Marino 191 + country Sao Tome and Principe 192 + country Saudi Arabia 193 + country Senegal 194 + country Serbia 195 + country Seychelles 196 + country Sierra Leone 197 + country Singapore 198 + country Sint Maarten (Dutch part) 199 + country Slovakia 200 + country Slovenia 201 + country Solomon Islands 202 + country Somalia 203 + country South Africa 204 + country South Georgia and the South Sandwich Islands 205 + country South Sudan 206 + country Spain 207 + country Sri Lanka 208 + country Sudan 209 + country Suriname 210 + country Svalbard and Jan Mayen 211 + country Swaziland 212 SWAZILAND + country Sweden 213 + country Switzerland 214 + country Syrian Arab Republic 215 + country Taiwan, Province of China 216 Taiwan + country Tajikistan 217 + country Tanzania, United Republic of 218 Tanzania + country Thailand 219 + country Timor-Leste 220 + country Togo 221 + country Tokelau 222 + country Tonga 223 + country Trinidad and Tobago 224 + country Tunisia 225 + country Turkey 226 + country Turkmenistan 227 + country Turks and Caicos Islands 228 + country Tuvalu 229 + country Uganda 230 + country Ukraine 231 + country United Arab Emirates 232 UAE + country United Kingdom 233 + country United States 234 U.S.A USA United States of America U.S.A. + country United States Minor Outlying Islands 235 + country Uruguay 236 + country Uzbekistan 237 + country Vanuatu 238 + country Venezuela, Bolivarian Republic of 239 + country Viet Nam 240 + country Virgin Islands, British 241 + country Virgin Islands, U.S. 242 + country Wallis and Futuna 243 + country Western Sahara 244 + country Yemen 245 YEMEN + country Zambia 246 + country Zimbabwe 247 + country Ã…land Islands 248 + geometricObjectTypeCode curve curve 0 + geometricObjectTypeCode composite composite 1 + geometricObjectTypeCode complex complex 2 + geometricObjectTypeCode point point 3 + geometricObjectTypeCode solid solid 4 + geometricObjectTypeCode surface surface 5 + cellGeometryCode point point 0 + cellGeometryCode area area 1 + cellGeometryCode voxel voxel 2 + dimensionNameTypeCode row row 0 + dimensionNameTypeCode column column 1 + dimensionNameTypeCode vertical vertical 2 + dimensionNameTypeCode track track 3 + dimensionNameTypeCode crossTrack crossTrack 4 + dimensionNameTypeCode line line 5 + dimensionNameTypeCode sample sample 6 + dimensionNameTypeCode time time 7 + spatialRepresentationType stereoModel stereoModel 0 + spatialRepresentationType video video 1 + spatialRepresentationType tin tin 2 + spatialRepresentationType textTable textTable 3 + spatialRepresentationType grid grid 4 + spatialRepresentationType vector vector 5 + dataQualityScope dataset dataset 0 + dataQualityScope service service 1 + geoResourceType dataset dataset 0 + geoResourceType service service 1 + geoResourceType series series 2 + geoReferenceDateType revision revision 0 + geoReferenceDateType expiry expiry 1 + geoReferenceDateType lastUpdate lastUpdate 2 + geoReferenceDateType lastRevision lastRevision 3 + geoReferenceDateType nextUpdate nextUpdate 4 + geoReferenceDateType unavailable unavailable 5 + geoReferenceDateType inForce inForce 6 + geoReferenceDateType adopted adopted 7 + geoReferenceDateType deprecated deprecated 8 + geoReferenceDateType superseded superseded 9 + geoReferenceDateType publication publication 10 + spatialResolutionType equivalentScale equivalentScale 0 + spatialResolutionType distance distance 1 + spatialResolutionType vertical vertical 2 + spatialResolutionType angularDistance angularDistance 3 + spatialResolutionType levelOfDetail levelOfDetail 4 \ No newline at end of file From 81e7459e5afe46509c05f30610311383437da7f7 Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Wed, 28 May 2025 12:04:43 -0400 Subject: [PATCH 008/507] geospatial properties --- .../java/propertyFiles/geospatial.properties | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/src/main/java/propertyFiles/geospatial.properties b/src/main/java/propertyFiles/geospatial.properties index abfbf252e37..dc1ce5372ed 100644 --- a/src/main/java/propertyFiles/geospatial.properties +++ b/src/main/java/propertyFiles/geospatial.properties @@ -34,6 +34,78 @@ datasetfieldtype.westLongitude.watermark= datasetfieldtype.eastLongitude.watermark= datasetfieldtype.northLatitude.watermark= datasetfieldtype.southLatitude.watermark= +datasetfieldtype.expandedGeospatialMetadata.title=Geospatial Metadata - Expanded +datasetfieldtype.expandedGeospatialMetadata.description=Expanded metadata for geospatial datasets (ISO 19115-3). +datasetfieldtype.geoResourceType.title=Type of Geospatial Data Resource +datasetfieldtype.geoResourceType.description=The type of geospatial data resource (dataset, service, or series). +datasetfieldtype.geoReferenceDate.title=Resource Reference Date +datasetfieldtype.geoReferenceDate.title=A date which is used to help identify the resource (ISO 19115-3) +datasetfieldtype.geoReferenceDateValue.title=Date +datasetfieldtype.geoReferenceDateValue.description=Other date as expressed in yyyy-mm-dd +datasetfieldtype.geoReferenceDateType.title=Type +datasetfieldtype.geoReferenceDateType.description=The type of date +datasetfieldtype.dataLineage.title=Data Lineage Information +datasetfieldtype.lineageStatement.title=Statement +datasetfieldtype.lineageStatement.description=General explanation of the data producer's knowledge of the dataset lineage. +datasetfieldtype.sourceDescription.title=Data Source Description +datasetfieldtype.sourceDescription.description=Statement that describes the source data. +datasetfieldtype.processStep.title=Process Step Description +datasetfieldtype.processStep.description=Description of the processes performed on the data. +datasetfieldtype.referenceSystemInfo.title=Reference System Information +datasetfieldtype.referenceSystemCode.title=Code +datasetfieldtype.referenceSystemCode.description=Alphanumeric value identifying the source reference system. +datasetfieldtype.referenceSystemCode.watermark=Alphanumeric value identifying the source reference system. +datasetfieldtype.referenceSystemCodeSpace.title=Code Space +datasetfieldtype.referenceSystemCodeSpace.description=Identifier/ namespace of the system in which the code is valid. +datasetfieldtype.referenceSystemCodeSpace.watermark=Identifier/ namespace of the system in which the code is valid. +datasetfieldtype.spatialResolution.title=Spatial Resolution +datasetfieldtype.spatialResolution.description=Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. +datasetfieldtype.spatialResolutionValue.title=Value +datasetfieldtype.spatialResolutionValue.description=Level of detail expressed as a scale factor, a distance or an angle. +datasetfieldtype.spatialResolutionValue.watermark=Level of detail expressed as a scale factor, a distance or an angle. +datasetfieldtype.spatialResolutionType.title=Type +datasetfieldtype.spatialResolutionType.description=distance, vertical, angularDistance, levelOfDetail +datasetfieldtype.spatialResolutionType.watermark=distance, vertical, angularDistance, levelOfDetail +datasetfieldtype.spatialRepresentationType.title=Spatial Representation Type +datasetfieldtype.spatialRepresentationType.description=Object(s) used to represent the geographic information. +datasetfieldtype.distribution.title=Distribution Link +datasetfieldtype.distribution.description=Distribution Links +datasetfieldtype.distributionLinkLabel.title=Label +datasetfieldtype.distributionLinkLabel.description=A descriptive label for the distribution link. +datasetfieldtype.distributionLinkLabel.watermark=A descriptive label for the distribution link. +datasetfieldtype.distributionLink.title=URL +datasetfieldtype.distributionLink.description=URL to access the dataset (e.g. via a geospatial web service) +datasetfieldtype.distributionLink.watermark=URL to access the dataset (e.g. via a geospatial web service) +datasetfieldtype.protocol.title=Protocol +datasetfieldtype.protocol.description=The service or transfer protocol associated with the distribution link URL +datasetfieldtype.protocol.watermark=The service or transfer protocol associated with the distribution link URL +datasetfieldtype.vectorSpatialRepresentation.title=Vector Spatial Representation +datasetfieldtype.geometricObjectCount.title=Geometric Object Count +datasetfieldtype.geometricObjectCount.description=Total number of point or vector objects in the dataset. +datasetfieldtype.geometricObjectCount.watermark=Number of point or vector objects in the dataset. +datasetfieldtype.geometricObjectTypeCode.title=Geometric Object Type Code +datasetfieldtype.geometricObjectTypeCode.description=Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. +datasetfieldtype.geometricObjectTypeCode.watermark=Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. +datasetfieldtype.gridSpatialRepresentation.title=Raster Spatial Representation +datasetfieldtype.numberOfDimensions.title=Number of Dimensions +datasetfieldtype.numberOfDimensions.description=The number of independent spatio-temporal axes. +datasetfieldtype.numberOfDimensions.watermark=The number of independent spatio-temporal axes. +datasetfieldtype.cellGeometryCode.title=Cell Geometry Code +datasetfieldtype.cellGeometryCode.description=Identification of grid data as point or cell. +datasetfieldtype.cellGeometryCode.watermark=Identification of grid data as point or cell. +datasetfieldtype.axisDimensionProperties.title=Axis Dimension Properties +datasetfieldtype.dimensionNameTypeCode.title=Name Type Code +datasetfieldtype.dimensionNameTypeCode.description=Axis name. +datasetfieldtype.dimensionNameTypeCode.watermark=Axis name. +datasetfieldtype.dimensionSize.title=Size +datasetfieldtype.dimensionSize.description=Number of elements along the axis. +datasetfieldtype.dimensionSize.watermark=Number of elements along the axis. +datasetfieldtype.resolution.title=Resolution +datasetfieldtype.resolution.description=Degree of detail in the grid dataset. +datasetfieldtype.resolution.watermark=Degree of detail in the grid dataset. +datasetfieldtype.resolutionUnitOfMeasure.title=Resolution Unit of Measure +datasetfieldtype.resolutionUnitOfMeasure.description=Resolution unit of measure (e.g. 'm', 'km', etc.) +datasetfieldtype.resolutionUnitOfMeasure.watermark=Resolution unit of measure (e.g. 'm', 'km', etc.) controlledvocabulary.country.afghanistan=Afghanistan controlledvocabulary.country.albania=Albania controlledvocabulary.country.algeria=Algeria @@ -283,3 +355,47 @@ controlledvocabulary.country.yemen=Yemen controlledvocabulary.country.zambia=Zambia controlledvocabulary.country.zimbabwe=Zimbabwe controlledvocabulary.country.aland_islands=Åland Islands +controlledvocabulary.geometricObjectTypeCode.curve=curve +controlledvocabulary.geometricObjectTypeCode.composite=composite +controlledvocabulary.geometricObjectTypeCode.complex=complex +controlledvocabulary.geometricObjectTypeCode.point=point +controlledvocabulary.geometricObjectTypeCode.solid=solid +controlledvocabulary.geometricObjectTypeCode.surface=surface +controlledvocabulary.cellGeometryCode.point=point +controlledvocabulary.cellGeometryCode.area=area +controlledvocabulary.cellGeometryCode.voxel=voxel +controlledvocabulary.dimensionNameTypeCode.row=row +controlledvocabulary.dimensionNameTypeCode.column=column +controlledvocabulary.dimensionNameTypeCode.vertical=vertical +controlledvocabulary.dimensionNameTypeCode.track=track +controlledvocabulary.dimensionNameTypeCode.crossTrack=crossTrack +controlledvocabulary.dimensionNameTypeCode.line=line +controlledvocabulary.dimensionNameTypeCode.sample=sample +controlledvocabulary.dimensionNameTypeCode.time=time +controlledvocabulary.spatialRepresentationType.stereoModel=stereoModel +controlledvocabulary.spatialRepresentationType.video=video +controlledvocabulary.spatialRepresentationType.tin=tin +controlledvocabulary.spatialRepresentationType.textTable=textTable +controlledvocabulary.spatialRepresentationType.grid=grid +controlledvocabulary.spatialRepresentationType.vector=vector +controlledvocabulary.dataQualityScope.dataset=dataset +controlledvocabulary.dataQualityScope.service=service +controlledvocabulary.geoResourceType.dataset=dataset +controlledvocabulary.geoResourceType.service=service +controlledvocabulary.geoResourceType.series=series +controlledvocabulary.geoReferenceDateType.revision=revision +controlledvocabulary.geoReferenceDateType.expiry=expiry +controlledvocabulary.geoReferenceDateType.lastUpdate=lastUpdate +controlledvocabulary.geoReferenceDateType.lastRevision=lastRevision +controlledvocabulary.geoReferenceDateType.nextUpdate=nextUpdate +controlledvocabulary.geoReferenceDateType.unavailable=unavailable +controlledvocabulary.geoReferenceDateType.inForce=inForce +controlledvocabulary.geoReferenceDateType.adopted=adopted +controlledvocabulary.geoReferenceDateType.deprecated=deprecated +controlledvocabulary.geoReferenceDateType.superseded=superseded +controlledvocabulary.geoReferenceDateType.publication=publication +controlledvocabulary.spatialResolutionType.equivalentScale=equivalentScale +controlledvocabulary.spatialResolutionType.distance=distance +controlledvocabulary.spatialResolutionType.vertical=vertical +controlledvocabulary.spatialResolutionType.angularDistance=angularDistance +controlledvocabulary.spatialResolutionType.levelOfDetail=levelOfDetail From 9b343cde62d90b0642aacd6f6024f630c54c292f Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Wed, 28 May 2025 12:07:57 -0400 Subject: [PATCH 009/507] geospatial properties fix --- src/main/java/propertyFiles/geospatial.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/propertyFiles/geospatial.properties b/src/main/java/propertyFiles/geospatial.properties index dc1ce5372ed..1e9f52060cb 100644 --- a/src/main/java/propertyFiles/geospatial.properties +++ b/src/main/java/propertyFiles/geospatial.properties @@ -39,7 +39,7 @@ datasetfieldtype.expandedGeospatialMetadata.description=Expanded metadata for ge datasetfieldtype.geoResourceType.title=Type of Geospatial Data Resource datasetfieldtype.geoResourceType.description=The type of geospatial data resource (dataset, service, or series). datasetfieldtype.geoReferenceDate.title=Resource Reference Date -datasetfieldtype.geoReferenceDate.title=A date which is used to help identify the resource (ISO 19115-3) +datasetfieldtype.geoReferenceDate.description=A date which is used to help identify the resource (ISO 19115-3) datasetfieldtype.geoReferenceDateValue.title=Date datasetfieldtype.geoReferenceDateValue.description=Other date as expressed in yyyy-mm-dd datasetfieldtype.geoReferenceDateType.title=Type From e724514680eb3bf67aa91ac23086c2df0394e5f4 Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Wed, 28 May 2025 12:31:42 -0400 Subject: [PATCH 010/507] geospatial properties fix --- .../java/propertyFiles/geospatial.properties | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/main/java/propertyFiles/geospatial.properties b/src/main/java/propertyFiles/geospatial.properties index 1e9f52060cb..d51450539b6 100644 --- a/src/main/java/propertyFiles/geospatial.properties +++ b/src/main/java/propertyFiles/geospatial.properties @@ -36,22 +36,34 @@ datasetfieldtype.northLatitude.watermark= datasetfieldtype.southLatitude.watermark= datasetfieldtype.expandedGeospatialMetadata.title=Geospatial Metadata - Expanded datasetfieldtype.expandedGeospatialMetadata.description=Expanded metadata for geospatial datasets (ISO 19115-3). +datasetfieldtype.expandedGeospatialMetadata.watermark= datasetfieldtype.geoResourceType.title=Type of Geospatial Data Resource datasetfieldtype.geoResourceType.description=The type of geospatial data resource (dataset, service, or series). +datasetfieldtype.geoResourceType.watermark= datasetfieldtype.geoReferenceDate.title=Resource Reference Date datasetfieldtype.geoReferenceDate.description=A date which is used to help identify the resource (ISO 19115-3) +datasetfieldtype.geoReferenceDate.watermark= datasetfieldtype.geoReferenceDateValue.title=Date datasetfieldtype.geoReferenceDateValue.description=Other date as expressed in yyyy-mm-dd +datasetfieldtype.geoReferenceDateValue.watermark= datasetfieldtype.geoReferenceDateType.title=Type datasetfieldtype.geoReferenceDateType.description=The type of date +datasetfieldtype.geoReferenceDateType.watermark= datasetfieldtype.dataLineage.title=Data Lineage Information +datasetfieldtype.dataLineage.description= +datasetfieldtype.dataLineage.watermark= datasetfieldtype.lineageStatement.title=Statement datasetfieldtype.lineageStatement.description=General explanation of the data producer's knowledge of the dataset lineage. +datasetfieldtype.lineageStatement.watermark= datasetfieldtype.sourceDescription.title=Data Source Description datasetfieldtype.sourceDescription.description=Statement that describes the source data. +datasetfieldtype.sourceDescription.watermark= datasetfieldtype.processStep.title=Process Step Description datasetfieldtype.processStep.description=Description of the processes performed on the data. +datasetfieldtype.processStep.watermark= datasetfieldtype.referenceSystemInfo.title=Reference System Information +datasetfieldtype.referenceSystemInfo.description= +datasetfieldtype.referenceSystemInfo.watermark= datasetfieldtype.referenceSystemCode.title=Code datasetfieldtype.referenceSystemCode.description=Alphanumeric value identifying the source reference system. datasetfieldtype.referenceSystemCode.watermark=Alphanumeric value identifying the source reference system. @@ -60,6 +72,7 @@ datasetfieldtype.referenceSystemCodeSpace.description=Identifier/ namespace of t datasetfieldtype.referenceSystemCodeSpace.watermark=Identifier/ namespace of the system in which the code is valid. datasetfieldtype.spatialResolution.title=Spatial Resolution datasetfieldtype.spatialResolution.description=Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. +datasetfieldtype.spatialResolution.watermark= datasetfieldtype.spatialResolutionValue.title=Value datasetfieldtype.spatialResolutionValue.description=Level of detail expressed as a scale factor, a distance or an angle. datasetfieldtype.spatialResolutionValue.watermark=Level of detail expressed as a scale factor, a distance or an angle. @@ -68,8 +81,10 @@ datasetfieldtype.spatialResolutionType.description=distance, vertical, angularDi datasetfieldtype.spatialResolutionType.watermark=distance, vertical, angularDistance, levelOfDetail datasetfieldtype.spatialRepresentationType.title=Spatial Representation Type datasetfieldtype.spatialRepresentationType.description=Object(s) used to represent the geographic information. +datasetfieldtype.spatialRepresentationType.watermark= datasetfieldtype.distribution.title=Distribution Link datasetfieldtype.distribution.description=Distribution Links +datasetfieldtype.distribution.watermark= datasetfieldtype.distributionLinkLabel.title=Label datasetfieldtype.distributionLinkLabel.description=A descriptive label for the distribution link. datasetfieldtype.distributionLinkLabel.watermark=A descriptive label for the distribution link. @@ -80,6 +95,8 @@ datasetfieldtype.protocol.title=Protocol datasetfieldtype.protocol.description=The service or transfer protocol associated with the distribution link URL datasetfieldtype.protocol.watermark=The service or transfer protocol associated with the distribution link URL datasetfieldtype.vectorSpatialRepresentation.title=Vector Spatial Representation +datasetfieldtype.vectorSpatialRepresentation.description= +datasetfieldtype.vectorSpatialRepresentation.watermark= datasetfieldtype.geometricObjectCount.title=Geometric Object Count datasetfieldtype.geometricObjectCount.description=Total number of point or vector objects in the dataset. datasetfieldtype.geometricObjectCount.watermark=Number of point or vector objects in the dataset. @@ -87,6 +104,8 @@ datasetfieldtype.geometricObjectTypeCode.title=Geometric Object Type Code datasetfieldtype.geometricObjectTypeCode.description=Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. datasetfieldtype.geometricObjectTypeCode.watermark=Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. datasetfieldtype.gridSpatialRepresentation.title=Raster Spatial Representation +datasetfieldtype.gridSpatialRepresentation.description= +datasetfieldtype.gridSpatialRepresentation.watermark= datasetfieldtype.numberOfDimensions.title=Number of Dimensions datasetfieldtype.numberOfDimensions.description=The number of independent spatio-temporal axes. datasetfieldtype.numberOfDimensions.watermark=The number of independent spatio-temporal axes. @@ -94,6 +113,8 @@ datasetfieldtype.cellGeometryCode.title=Cell Geometry Code datasetfieldtype.cellGeometryCode.description=Identification of grid data as point or cell. datasetfieldtype.cellGeometryCode.watermark=Identification of grid data as point or cell. datasetfieldtype.axisDimensionProperties.title=Axis Dimension Properties +datasetfieldtype.axisDimensionProperties.description= +datasetfieldtype.axisDimensionProperties.watermark= datasetfieldtype.dimensionNameTypeCode.title=Name Type Code datasetfieldtype.dimensionNameTypeCode.description=Axis name. datasetfieldtype.dimensionNameTypeCode.watermark=Axis name. @@ -368,14 +389,14 @@ controlledvocabulary.dimensionNameTypeCode.row=row controlledvocabulary.dimensionNameTypeCode.column=column controlledvocabulary.dimensionNameTypeCode.vertical=vertical controlledvocabulary.dimensionNameTypeCode.track=track -controlledvocabulary.dimensionNameTypeCode.crossTrack=crossTrack +controlledvocabulary.dimensionNameTypeCode.crosstrack=crossTrack controlledvocabulary.dimensionNameTypeCode.line=line controlledvocabulary.dimensionNameTypeCode.sample=sample controlledvocabulary.dimensionNameTypeCode.time=time -controlledvocabulary.spatialRepresentationType.stereoModel=stereoModel +controlledvocabulary.spatialRepresentationType.stereomodel=stereoModel controlledvocabulary.spatialRepresentationType.video=video controlledvocabulary.spatialRepresentationType.tin=tin -controlledvocabulary.spatialRepresentationType.textTable=textTable +controlledvocabulary.spatialRepresentationType.texttable=textTable controlledvocabulary.spatialRepresentationType.grid=grid controlledvocabulary.spatialRepresentationType.vector=vector controlledvocabulary.dataQualityScope.dataset=dataset @@ -385,17 +406,17 @@ controlledvocabulary.geoResourceType.service=service controlledvocabulary.geoResourceType.series=series controlledvocabulary.geoReferenceDateType.revision=revision controlledvocabulary.geoReferenceDateType.expiry=expiry -controlledvocabulary.geoReferenceDateType.lastUpdate=lastUpdate -controlledvocabulary.geoReferenceDateType.lastRevision=lastRevision -controlledvocabulary.geoReferenceDateType.nextUpdate=nextUpdate +controlledvocabulary.geoReferenceDateType.lastupdate=lastUpdate +controlledvocabulary.geoReferenceDateType.lastrevision=lastRevision +controlledvocabulary.geoReferenceDateType.nextupdate=nextUpdate controlledvocabulary.geoReferenceDateType.unavailable=unavailable -controlledvocabulary.geoReferenceDateType.inForce=inForce +controlledvocabulary.geoReferenceDateType.inforce=inForce controlledvocabulary.geoReferenceDateType.adopted=adopted controlledvocabulary.geoReferenceDateType.deprecated=deprecated controlledvocabulary.geoReferenceDateType.superseded=superseded controlledvocabulary.geoReferenceDateType.publication=publication -controlledvocabulary.spatialResolutionType.equivalentScale=equivalentScale +controlledvocabulary.spatialResolutionType.equivalentscale=equivalentScale controlledvocabulary.spatialResolutionType.distance=distance controlledvocabulary.spatialResolutionType.vertical=vertical -controlledvocabulary.spatialResolutionType.angularDistance=angularDistance -controlledvocabulary.spatialResolutionType.levelOfDetail=levelOfDetail +controlledvocabulary.spatialResolutionType.angulardistance=angularDistance +controlledvocabulary.spatialResolutionType.levelofdetail=levelOfDetail From ab6d9a107e90a979e7c040dc527cebcfaa05c1a2 Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Wed, 28 May 2025 12:49:02 -0400 Subject: [PATCH 011/507] geospatial.tsv --- .../api/data/metadatablocks/geospatial.tsv | 678 +++++++++--------- 1 file changed, 339 insertions(+), 339 deletions(-) diff --git a/scripts/api/data/metadatablocks/geospatial.tsv b/scripts/api/data/metadatablocks/geospatial.tsv index 7c34df42899..99da8b9e290 100644 --- a/scripts/api/data/metadatablocks/geospatial.tsv +++ b/scripts/api/data/metadatablocks/geospatial.tsv @@ -1,339 +1,339 @@ -#metadataBlock name dataverseAlias displayName - geospatial Geospatial Metadata -#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id - geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE TRUE FALSE geographicCoverage geospatial - state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial - city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 #VALUE, TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial - otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 #VALUE, FALSE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial - geographicUnit Geographic Unit Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region. text 5 TRUE FALSE TRUE TRUE TRUE FALSE geospatial - geographicBoundingBox Geographic Bounding Box The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. none 6 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - westLongitude Westernmost (Left) Longitude Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0. text 7 Longitude (W): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - eastLongitude Easternmost (Right) Longitude Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0. text 8 Longitude (E): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - northLatitude Northernmost (Top) Latitude Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0. text 9 Latitude (N): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - southLatitude Southernmost (Bottom) Latitude Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0. text 10 Latitude (S): #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - expandedGeospatialMetadata Geospatial Metadata - Expanded Expanded metadata for geospatial datasets (ISO 19115-3) none 11 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - geoResourceType Type of Geospatial Data Resource The type of geospatial data resource (dataset, service, or series). text 12 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial - geoReferenceDate Resource Reference Date A date which is used to help identify the resource (ISO 19115-3) none 13 TRUE FALSE TRUE FALSE TRUE FALSE geospatial - geoReferenceDateValue Date Other date as expressed in yyyy-mm-dd date 14 #VALUE TRUE FALSE FALSE TRUE TRUE FALSE geoReferenceDate geospatial - geoReferenceDateType Type The type of date text 15 (#VALUE) TRUE TRUE FALSE FALSE TRUE FALSE geoReferenceDate geospatial - dataLineage Data Lineage Information none 16 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - lineageStatement Statement General explanation of the data producer’s knowledge of the dataset lineage. textbox 17 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial - sourceDescription Data Source Description Statement that describes the source data. textbox 19 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial - processStep Process Step Description Description of the processes performed on the data. textbox 20 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial - referenceSystemInfo Reference System Information none 21 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - referenceSystemCode Code Alphanumeric value identifying the source reference system. Alphanumeric value identifying the source reference system. text 22 #VALUE FALSE FALSE FALSE TRUE TRUE FALSE referenceSystemInfo geospatial - referenceSystemCodeSpace Code Space Identifier/ namespace of the system in which the code is valid. Identifier/ namespace of the system in which the code is valid. text 23 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE referenceSystemInfo geospatial - spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 24 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - spatialResolutionValue Value Level of detail expressed as a scale factor, a distance or an angle Level of detail expressed as a scale factor, a distance or an angle int 25 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE spatialResolution geospatial - spatialResolutionType Type distance, vertical, angularDistance, levelOfDetail distance, vertical, angularDistance, levelOfDetail text 26 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE spatialResolution geospatial - spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic information. text 27 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial - distribution Distribution Link Distribution Links none 28 TRUE FALSE TRUE FALSE TRUE FALSE geospatial - distributionLinkLabel Label A descriptive label for the distribution link A descriptive label for the distribution link text 29 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial - distributionLink URL URL to access the dataset (e.g. via a geospatial web service) URL to access the dataset (e.g. via a geospatial web service) text 30 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial - protocol Protocol The service or transfer protocol associated with the distribution link URL The service or transfer protocol associated with the distribution link URL text 31 (#VALUE) TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial - vectorSpatialRepresentation Vector Spatial Representation none 32 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - geometricObjectCount Geometric Object Count Total number of point or vector objects in the dataset. Number of point or vector objects in the dataset int 33 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial - geometricObjectTypeCode Geometric Object Type Code Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. text 34 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE geospatial - gridSpatialRepresentation Raster Spatial Representation none 35 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - numberOfDimensions Number of Dimensions The number of independent spatio-temporal axes. The number of independent spatio-temporal axes. int 36 TRUE FALSE FALSE FALSE TRUE FALSE geospatial - cellGeometryCode Cell Geometry Code Identification of grid data as point or cell. Identification of grid data as point or cell. text 37 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial - axisDimensionProperties Axis Dimension Properties none 38 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - dimensionNameTypeCode Name Type Code Axis name. Axis name. text 39 #VALUE FALSE TRUE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial - dimensionSize Size Number of elements along the axis. Number of elements along the axis. int 40 FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial - resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. int 41 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial - resolutionUnitOfMeasure Resolution Unit of Measure Resolution unit of measure (e.g. 'm', 'km', etc.) Resolution unit of measure (e.g. 'm', 'km', etc.) text 42 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial -#controlledVocabulary DatasetField Value identifier displayOrder - country Afghanistan 0 - country Albania 1 - country Algeria 2 - country American Samoa 3 - country Andorra 4 - country Angola 5 - country Anguilla 6 - country Antarctica 7 - country Antigua and Barbuda 8 - country Argentina 9 - country Armenia 10 - country Aruba 11 - country Australia 12 - country Austria 13 - country Azerbaijan 14 - country Bahamas 15 - country Bahrain 16 - country Bangladesh 17 - country Barbados 18 - country Belarus 19 - country Belgium 20 - country Belize 21 - country Benin 22 - country Bermuda 23 - country Bhutan 24 - country Bolivia, Plurinational State of 25 - country Bonaire, Sint Eustatius and Saba 26 - country Bosnia and Herzegovina 27 - country Botswana 28 BOTSWANA - country Bouvet Island 29 - country Brazil 30 Brasil - country British Indian Ocean Territory 31 - country Brunei Darussalam 32 - country Bulgaria 33 - country Burkina Faso 34 - country Burundi 35 - country Cambodia 36 - country Cameroon 37 - country Canada 38 - country Cape Verde 39 - country Cayman Islands 40 - country Central African Republic 41 - country Chad 42 - country Chile 43 - country China 44 - country Christmas Island 45 - country Cocos (Keeling) Islands 46 - country Colombia 47 - country Comoros 48 - country Congo 49 - country Congo, the Democratic Republic of the 50 - country Cook Islands 51 - country Costa Rica 52 - country Croatia 53 - country Cuba 54 - country Curaçao 55 - country Cyprus 56 - country Czech Republic 57 - country Côte d'Ivoire 58 - country Denmark 59 - country Djibouti 60 - country Dominica 61 - country Dominican Republic 62 - country Ecuador 63 - country Egypt 64 - country El Salvador 65 - country Equatorial Guinea 66 - country Eritrea 67 - country Estonia 68 - country Ethiopia 69 - country Falkland Islands (Malvinas) 70 - country Faroe Islands 71 - country Fiji 72 - country Finland 73 - country France 74 - country French Guiana 75 - country French Polynesia 76 - country French Southern Territories 77 - country Gabon 78 - country Gambia 79 Gambia, The - country Georgia 80 - country Germany 81 Germany (Federal Republic of) - country Ghana 82 GHANA - country Gibraltar 83 - country Greece 84 - country Greenland 85 - country Grenada 86 - country Guadeloupe 87 - country Guam 88 - country Guatemala 89 - country Guernsey 90 - country Guinea 91 - country Guinea-Bissau 92 - country Guyana 93 - country Haiti 94 - country Heard Island and Mcdonald Islands 95 - country Holy See (Vatican City State) 96 - country Honduras 97 - country Hong Kong 98 - country Hungary 99 - country Iceland 100 - country India 101 INDIA - country Indonesia 102 Sumatra - country Iran, Islamic Republic of 103 Iran Iran (Islamic Republic of) - country Iraq 104 IRAQ - country Ireland 105 - country Isle of Man 106 - country Israel 107 - country Italy 108 - country Jamaica 109 - country Japan 110 - country Jersey 111 - country Jordan 112 - country Kazakhstan 113 - country Kenya 114 - country Kiribati 115 - country Korea, Democratic People's Republic of 116 - country Korea, Republic of 117 - country Kuwait 118 - country Kyrgyzstan 119 - country Lao People's Democratic Republic 120 Laos - country Latvia 121 - country Lebanon 122 - country Lesotho 123 LESOTHO - country Liberia 124 - country Libya 125 - country Liechtenstein 126 - country Lithuania 127 - country Luxembourg 128 - country Macao 129 - country Macedonia, the Former Yugoslav Republic of 130 - country Madagascar 131 - country Malawi 132 - country Malaysia 133 - country Maldives 134 - country Mali 135 - country Malta 136 - country Marshall Islands 137 - country Martinique 138 - country Mauritania 139 - country Mauritius 140 - country Mayotte 141 - country Mexico 142 - country Micronesia, Federated States of 143 - country Moldova, Republic of 144 - country Monaco 145 - country Mongolia 146 - country Montenegro 147 - country Montserrat 148 - country Morocco 149 - country Mozambique 150 MOZAMBIQUE - country Myanmar 151 - country Namibia 152 NAMIBIA - country Nauru 153 - country Nepal 154 - country Netherlands 155 - country New Caledonia 156 - country New Zealand 157 - country Nicaragua 158 - country Niger 159 - country Nigeria 160 - country Niue 161 - country Norfolk Island 162 - country Northern Mariana Islands 163 - country Norway 164 - country Oman 165 - country Pakistan 166 - country Palau 167 - country Palestine, State of 168 - country Panama 169 - country Papua New Guinea 170 - country Paraguay 171 - country Peru 172 - country Philippines 173 - country Pitcairn 174 - country Poland 175 - country Portugal 176 - country Puerto Rico 177 - country Qatar 178 - country Romania 179 - country Russian Federation 180 - country Rwanda 181 - country Réunion 182 - country Saint Barthélemy 183 - country Saint Helena, Ascension and Tristan da Cunha 184 - country Saint Kitts and Nevis 185 - country Saint Lucia 186 - country Saint Martin (French part) 187 - country Saint Pierre and Miquelon 188 - country Saint Vincent and the Grenadines 189 - country Samoa 190 - country San Marino 191 - country Sao Tome and Principe 192 - country Saudi Arabia 193 - country Senegal 194 - country Serbia 195 - country Seychelles 196 - country Sierra Leone 197 - country Singapore 198 - country Sint Maarten (Dutch part) 199 - country Slovakia 200 - country Slovenia 201 - country Solomon Islands 202 - country Somalia 203 - country South Africa 204 - country South Georgia and the South Sandwich Islands 205 - country South Sudan 206 - country Spain 207 - country Sri Lanka 208 - country Sudan 209 - country Suriname 210 - country Svalbard and Jan Mayen 211 - country Swaziland 212 SWAZILAND - country Sweden 213 - country Switzerland 214 - country Syrian Arab Republic 215 - country Taiwan, Province of China 216 Taiwan - country Tajikistan 217 - country Tanzania, United Republic of 218 Tanzania - country Thailand 219 - country Timor-Leste 220 - country Togo 221 - country Tokelau 222 - country Tonga 223 - country Trinidad and Tobago 224 - country Tunisia 225 - country Turkey 226 - country Turkmenistan 227 - country Turks and Caicos Islands 228 - country Tuvalu 229 - country Uganda 230 - country Ukraine 231 - country United Arab Emirates 232 UAE - country United Kingdom 233 - country United States 234 U.S.A USA United States of America U.S.A. - country United States Minor Outlying Islands 235 - country Uruguay 236 - country Uzbekistan 237 - country Vanuatu 238 - country Venezuela, Bolivarian Republic of 239 - country Viet Nam 240 - country Virgin Islands, British 241 - country Virgin Islands, U.S. 242 - country Wallis and Futuna 243 - country Western Sahara 244 - country Yemen 245 YEMEN - country Zambia 246 - country Zimbabwe 247 - country Ã…land Islands 248 - geometricObjectTypeCode curve curve 0 - geometricObjectTypeCode composite composite 1 - geometricObjectTypeCode complex complex 2 - geometricObjectTypeCode point point 3 - geometricObjectTypeCode solid solid 4 - geometricObjectTypeCode surface surface 5 - cellGeometryCode point point 0 - cellGeometryCode area area 1 - cellGeometryCode voxel voxel 2 - dimensionNameTypeCode row row 0 - dimensionNameTypeCode column column 1 - dimensionNameTypeCode vertical vertical 2 - dimensionNameTypeCode track track 3 - dimensionNameTypeCode crossTrack crossTrack 4 - dimensionNameTypeCode line line 5 - dimensionNameTypeCode sample sample 6 - dimensionNameTypeCode time time 7 - spatialRepresentationType stereoModel stereoModel 0 - spatialRepresentationType video video 1 - spatialRepresentationType tin tin 2 - spatialRepresentationType textTable textTable 3 - spatialRepresentationType grid grid 4 - spatialRepresentationType vector vector 5 - dataQualityScope dataset dataset 0 - dataQualityScope service service 1 - geoResourceType dataset dataset 0 - geoResourceType service service 1 - geoResourceType series series 2 - geoReferenceDateType revision revision 0 - geoReferenceDateType expiry expiry 1 - geoReferenceDateType lastUpdate lastUpdate 2 - geoReferenceDateType lastRevision lastRevision 3 - geoReferenceDateType nextUpdate nextUpdate 4 - geoReferenceDateType unavailable unavailable 5 - geoReferenceDateType inForce inForce 6 - geoReferenceDateType adopted adopted 7 - geoReferenceDateType deprecated deprecated 8 - geoReferenceDateType superseded superseded 9 - geoReferenceDateType publication publication 10 - spatialResolutionType equivalentScale equivalentScale 0 - spatialResolutionType distance distance 1 - spatialResolutionType vertical vertical 2 - spatialResolutionType angularDistance angularDistance 3 - spatialResolutionType levelOfDetail levelOfDetail 4 \ No newline at end of file +#metadataBlock name dataverseAlias displayName + geospatial Geospatial Metadata +#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id + geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE FALSE FALSE geographicCoverage geospatial + state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial + city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial + otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 #VALUE, FALSE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial + geographicUnit Geographic Unit Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region. text 5 TRUE FALSE TRUE TRUE FALSE FALSE geospatial + geographicBoundingBox Geographic Bounding Box The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. none 6 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + westLongitude Westernmost (Left) Longitude Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0. text 7 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial + eastLongitude Easternmost (Right) Longitude Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0. text 8 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial + northLatitude Northernmost (Top) Latitude Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0. text 9 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial + southLatitude Southernmost (Bottom) Latitude Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0. text 10 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial + expandedGeospatialMetadata Geospatial Metadata - Expanded Expanded metadata for geospatial datasets (ISO 19115-3) none 11 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + geoResourceType Type of Geospatial Data Resource The type of geospatial data resource (dataset, service, or series). text 12 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial + geoReferenceDate Resource Reference Date A date which is used to help identify the resource (ISO 19115-3) none 13 TRUE FALSE TRUE FALSE TRUE FALSE geospatial + geoReferenceDateValue Date Other date as expressed in yyyy-mm-dd date 14 #VALUE TRUE FALSE FALSE TRUE TRUE FALSE geoReferenceDate geospatial + geoReferenceDateType Type The type of date text 15 (#VALUE) TRUE TRUE FALSE FALSE TRUE FALSE geoReferenceDate geospatial + dataLineage Data Lineage Information none 16 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + lineageStatement Statement General explanation of the data producer’s knowledge of the dataset lineage. textbox 17 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial + sourceDescription Data Source Description Statement that describes the source data. textbox 19 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial + processStep Process Step Description Description of the processes performed on the data. textbox 20 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial + referenceSystemInfo Reference System Information none 21 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + referenceSystemCode Code Alphanumeric value identifying the source reference system. Alphanumeric value identifying the source reference system. text 22 #VALUE FALSE FALSE FALSE TRUE TRUE FALSE referenceSystemInfo geospatial + referenceSystemCodeSpace Code Space Identifier/ namespace of the system in which the code is valid. Identifier/ namespace of the system in which the code is valid. text 23 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE referenceSystemInfo geospatial + spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 24 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + spatialResolutionValue Value Level of detail expressed as a scale factor, a distance or an angle Level of detail expressed as a scale factor, a distance or an angle int 25 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE spatialResolution geospatial + spatialResolutionType Type distance, vertical, angularDistance, levelOfDetail distance, vertical, angularDistance, levelOfDetail text 26 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE spatialResolution geospatial + spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic information. text 27 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial + distribution Distribution Link Distribution Links none 28 TRUE FALSE TRUE FALSE TRUE FALSE geospatial + distributionLinkLabel Label A descriptive label for the distribution link A descriptive label for the distribution link text 29 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial + distributionLink URL URL to access the dataset (e.g. via a geospatial web service) URL to access the dataset (e.g. via a geospatial web service) text 30 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial + protocol Protocol The service or transfer protocol associated with the distribution link URL The service or transfer protocol associated with the distribution link URL text 31 (#VALUE) TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial + vectorSpatialRepresentation Vector Spatial Representation none 32 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + geometricObjectCount Geometric Object Count Total number of point or vector objects in the dataset. Number of point or vector objects in the dataset int 33 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial + geometricObjectTypeCode Geometric Object Type Code Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. text 34 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE geospatial + gridSpatialRepresentation Raster Spatial Representation none 35 FALSE FALSE FALSE FALSE TRUE FALSE geospatial + numberOfDimensions Number of Dimensions The number of independent spatio-temporal axes. The number of independent spatio-temporal axes. int 36 TRUE FALSE FALSE FALSE TRUE FALSE geospatial + cellGeometryCode Cell Geometry Code Identification of grid data as point or cell. Identification of grid data as point or cell. text 37 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial + axisDimensionProperties Axis Dimension Properties none 38 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + dimensionNameTypeCode Name Type Code Axis name. Axis name. text 39 #VALUE FALSE TRUE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial + dimensionSize Size Number of elements along the axis. Number of elements along the axis. int 40 FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial + resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. int 41 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial + resolutionUnitOfMeasure Resolution Unit of Measure Resolution unit of measure (e.g. 'm', 'km', etc.) Resolution unit of measure (e.g. 'm', 'km', etc.) text 42 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial +#controlledVocabulary DatasetField Value identifier displayOrder + country Afghanistan 0 + country Albania 1 + country Algeria 2 + country American Samoa 3 + country Andorra 4 + country Angola 5 + country Anguilla 6 + country Antarctica 7 + country Antigua and Barbuda 8 + country Argentina 9 + country Armenia 10 + country Aruba 11 + country Australia 12 + country Austria 13 + country Azerbaijan 14 + country Bahamas 15 + country Bahrain 16 + country Bangladesh 17 + country Barbados 18 + country Belarus 19 + country Belgium 20 + country Belize 21 + country Benin 22 + country Bermuda 23 + country Bhutan 24 + country Bolivia, Plurinational State of 25 + country Bonaire, Sint Eustatius and Saba 26 + country Bosnia and Herzegovina 27 + country Botswana 28 BOTSWANA + country Bouvet Island 29 + country Brazil 30 Brasil + country British Indian Ocean Territory 31 + country Brunei Darussalam 32 + country Bulgaria 33 + country Burkina Faso 34 + country Burundi 35 + country Cambodia 36 + country Cameroon 37 + country Canada 38 + country Cape Verde 39 + country Cayman Islands 40 + country Central African Republic 41 + country Chad 42 + country Chile 43 + country China 44 + country Christmas Island 45 + country Cocos (Keeling) Islands 46 + country Colombia 47 + country Comoros 48 + country Congo 49 + country Congo, the Democratic Republic of the 50 + country Cook Islands 51 + country Costa Rica 52 + country Croatia 53 + country Cuba 54 + country Curaçao 55 + country Cyprus 56 + country Czech Republic 57 + country Côte d'Ivoire 58 + country Denmark 59 + country Djibouti 60 + country Dominica 61 + country Dominican Republic 62 + country Ecuador 63 + country Egypt 64 + country El Salvador 65 + country Equatorial Guinea 66 + country Eritrea 67 + country Estonia 68 + country Ethiopia 69 + country Falkland Islands (Malvinas) 70 + country Faroe Islands 71 + country Fiji 72 + country Finland 73 + country France 74 + country French Guiana 75 + country French Polynesia 76 + country French Southern Territories 77 + country Gabon 78 + country Gambia 79 Gambia, The + country Georgia 80 + country Germany 81 Germany (Federal Republic of) + country Ghana 82 GHANA + country Gibraltar 83 + country Greece 84 + country Greenland 85 + country Grenada 86 + country Guadeloupe 87 + country Guam 88 + country Guatemala 89 + country Guernsey 90 + country Guinea 91 + country Guinea-Bissau 92 + country Guyana 93 + country Haiti 94 + country Heard Island and Mcdonald Islands 95 + country Holy See (Vatican City State) 96 + country Honduras 97 + country Hong Kong 98 + country Hungary 99 + country Iceland 100 + country India 101 INDIA + country Indonesia 102 Sumatra + country Iran, Islamic Republic of 103 Iran Iran (Islamic Republic of) + country Iraq 104 IRAQ + country Ireland 105 + country Isle of Man 106 + country Israel 107 + country Italy 108 + country Jamaica 109 + country Japan 110 + country Jersey 111 + country Jordan 112 + country Kazakhstan 113 + country Kenya 114 + country Kiribati 115 + country Korea, Democratic People's Republic of 116 + country Korea, Republic of 117 + country Kuwait 118 + country Kyrgyzstan 119 + country Lao People's Democratic Republic 120 Laos + country Latvia 121 + country Lebanon 122 + country Lesotho 123 LESOTHO + country Liberia 124 + country Libya 125 + country Liechtenstein 126 + country Lithuania 127 + country Luxembourg 128 + country Macao 129 + country Macedonia, the Former Yugoslav Republic of 130 + country Madagascar 131 + country Malawi 132 + country Malaysia 133 + country Maldives 134 + country Mali 135 + country Malta 136 + country Marshall Islands 137 + country Martinique 138 + country Mauritania 139 + country Mauritius 140 + country Mayotte 141 + country Mexico 142 + country Micronesia, Federated States of 143 + country Moldova, Republic of 144 + country Monaco 145 + country Mongolia 146 + country Montenegro 147 + country Montserrat 148 + country Morocco 149 + country Mozambique 150 MOZAMBIQUE + country Myanmar 151 + country Namibia 152 NAMIBIA + country Nauru 153 + country Nepal 154 + country Netherlands 155 + country New Caledonia 156 + country New Zealand 157 + country Nicaragua 158 + country Niger 159 + country Nigeria 160 + country Niue 161 + country Norfolk Island 162 + country Northern Mariana Islands 163 + country Norway 164 + country Oman 165 + country Pakistan 166 + country Palau 167 + country Palestine, State of 168 + country Panama 169 + country Papua New Guinea 170 + country Paraguay 171 + country Peru 172 + country Philippines 173 + country Pitcairn 174 + country Poland 175 + country Portugal 176 + country Puerto Rico 177 + country Qatar 178 + country Romania 179 + country Russian Federation 180 + country Rwanda 181 + country Réunion 182 + country Saint Barthélemy 183 + country Saint Helena, Ascension and Tristan da Cunha 184 + country Saint Kitts and Nevis 185 + country Saint Lucia 186 + country Saint Martin (French part) 187 + country Saint Pierre and Miquelon 188 + country Saint Vincent and the Grenadines 189 + country Samoa 190 + country San Marino 191 + country Sao Tome and Principe 192 + country Saudi Arabia 193 + country Senegal 194 + country Serbia 195 + country Seychelles 196 + country Sierra Leone 197 + country Singapore 198 + country Sint Maarten (Dutch part) 199 + country Slovakia 200 + country Slovenia 201 + country Solomon Islands 202 + country Somalia 203 + country South Africa 204 + country South Georgia and the South Sandwich Islands 205 + country South Sudan 206 + country Spain 207 + country Sri Lanka 208 + country Sudan 209 + country Suriname 210 + country Svalbard and Jan Mayen 211 + country Swaziland 212 SWAZILAND + country Sweden 213 + country Switzerland 214 + country Syrian Arab Republic 215 + country Taiwan, Province of China 216 Taiwan + country Tajikistan 217 + country Tanzania, United Republic of 218 Tanzania + country Thailand 219 + country Timor-Leste 220 + country Togo 221 + country Tokelau 222 + country Tonga 223 + country Trinidad and Tobago 224 + country Tunisia 225 + country Turkey 226 + country Turkmenistan 227 + country Turks and Caicos Islands 228 + country Tuvalu 229 + country Uganda 230 + country Ukraine 231 + country United Arab Emirates 232 UAE + country United Kingdom 233 + country United States 234 U.S.A USA United States of America U.S.A. + country United States Minor Outlying Islands 235 + country Uruguay 236 + country Uzbekistan 237 + country Vanuatu 238 + country Venezuela, Bolivarian Republic of 239 + country Viet Nam 240 + country Virgin Islands, British 241 + country Virgin Islands, U.S. 242 + country Wallis and Futuna 243 + country Western Sahara 244 + country Yemen 245 YEMEN + country Zambia 246 + country Zimbabwe 247 + country Åland Islands 248 + geometricObjectTypeCode curve curve 0 + geometricObjectTypeCode composite composite 1 + geometricObjectTypeCode complex complex 2 + geometricObjectTypeCode point point 3 + geometricObjectTypeCode solid solid 4 + geometricObjectTypeCode surface surface 5 + cellGeometryCode point point 0 + cellGeometryCode area area 1 + cellGeometryCode voxel voxel 2 + dimensionNameTypeCode row row 0 + dimensionNameTypeCode column column 1 + dimensionNameTypeCode vertical vertical 2 + dimensionNameTypeCode track track 3 + dimensionNameTypeCode crossTrack crossTrack 4 + dimensionNameTypeCode line line 5 + dimensionNameTypeCode sample sample 6 + dimensionNameTypeCode time time 7 + spatialRepresentationType stereoModel stereoModel 0 + spatialRepresentationType video video 1 + spatialRepresentationType tin tin 2 + spatialRepresentationType textTable textTable 3 + spatialRepresentationType grid grid 4 + spatialRepresentationType vector vector 5 + dataQualityScope dataset dataset 0 + dataQualityScope service service 1 + geoResourceType dataset dataset 0 + geoResourceType service service 1 + geoResourceType series series 2 + geoReferenceDateType revision revision 0 + geoReferenceDateType expiry expiry 1 + geoReferenceDateType lastUpdate lastUpdate 2 + geoReferenceDateType lastRevision lastRevision 3 + geoReferenceDateType nextUpdate nextUpdate 4 + geoReferenceDateType unavailable unavailable 5 + geoReferenceDateType inForce inForce 6 + geoReferenceDateType adopted adopted 7 + geoReferenceDateType deprecated deprecated 8 + geoReferenceDateType superseded superseded 9 + geoReferenceDateType publication publication 10 + spatialResolutionType equivalentScale equivalentScale 0 + spatialResolutionType distance distance 1 + spatialResolutionType vertical vertical 2 + spatialResolutionType angularDistance angularDistance 3 + spatialResolutionType levelOfDetail levelOfDetail 4 From 93f55512ce41448ef2dd0ad8baffd8c36f15e1ce Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Wed, 28 May 2025 14:14:33 -0400 Subject: [PATCH 012/507] updated schema --- conf/solr/schema.xml | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/conf/solr/schema.xml b/conf/solr/schema.xml index 50835957b04..77f674bd4a5 100644 --- a/conf/solr/schema.xml +++ b/conf/solr/schema.xml @@ -284,6 +284,8 @@ + + @@ -313,6 +315,7 @@ + @@ -325,7 +328,12 @@ + + + + + @@ -336,13 +344,21 @@ + + + + + + + + @@ -355,8 +371,10 @@ + + @@ -364,6 +382,7 @@ + @@ -372,6 +391,7 @@ + @@ -379,13 +399,18 @@ + + + + + @@ -399,8 +424,13 @@ + + + + + @@ -430,6 +460,7 @@ + @@ -541,6 +572,8 @@ + + @@ -570,6 +603,7 @@ + @@ -582,7 +616,12 @@ + + + + + @@ -593,13 +632,21 @@ + + + + + + + + @@ -612,8 +659,10 @@ + + @@ -621,6 +670,7 @@ + @@ -629,6 +679,7 @@ + @@ -636,13 +687,18 @@ + + + + + @@ -656,7 +712,12 @@ + + + + + @@ -688,6 +749,7 @@ + From 96be72245f3f34d9e35ea584163b7ff3777abdd5 Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Wed, 28 May 2025 17:56:31 -0400 Subject: [PATCH 013/507] fix geospatial.tsv --- .../api/data/metadatablocks/geospatial.tsv | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/scripts/api/data/metadatablocks/geospatial.tsv b/scripts/api/data/metadatablocks/geospatial.tsv index 99da8b9e290..fea47e717e5 100644 --- a/scripts/api/data/metadatablocks/geospatial.tsv +++ b/scripts/api/data/metadatablocks/geospatial.tsv @@ -1,17 +1,17 @@ #metadataBlock name dataverseAlias displayName geospatial Geospatial Metadata #datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id - geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE FALSE FALSE geospatial - country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE FALSE FALSE geographicCoverage geospatial - state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial - city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial - otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 #VALUE, FALSE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial - geographicUnit Geographic Unit Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region. text 5 TRUE FALSE TRUE TRUE FALSE FALSE geospatial - geographicBoundingBox Geographic Bounding Box The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. none 6 FALSE FALSE TRUE FALSE FALSE FALSE geospatial - westLongitude Westernmost (Left) Longitude Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0. text 7 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial - eastLongitude Easternmost (Right) Longitude Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0. text 8 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial - northLatitude Northernmost (Top) Latitude Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0. text 9 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial - southLatitude Southernmost (Bottom) Latitude Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0. text 10 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial + geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE TRUE FALSE geographicCoverage geospatial + state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial + city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 #VALUE, TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial + otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 #VALUE, FALSE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial + geographicUnit Geographic Unit Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region. text 5 TRUE FALSE TRUE TRUE TRUE FALSE geospatial + geographicBoundingBox Geographic Bounding Box The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. none 6 FALSE FALSE TRUE FALSE TRUE FALSE geospatial + westLongitude Westernmost (Left) Longitude Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0. text 7 FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + eastLongitude Easternmost (Right) Longitude Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0. text 8 FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + northLatitude Northernmost (Top) Latitude Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0. text 9 FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial + southLatitude Southernmost (Bottom) Latitude Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0. text 10 FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial expandedGeospatialMetadata Geospatial Metadata - Expanded Expanded metadata for geospatial datasets (ISO 19115-3) none 11 FALSE FALSE FALSE FALSE TRUE FALSE geospatial geoResourceType Type of Geospatial Data Resource The type of geospatial data resource (dataset, service, or series). text 12 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial geoReferenceDate Resource Reference Date A date which is used to help identify the resource (ISO 19115-3) none 13 TRUE FALSE TRUE FALSE TRUE FALSE geospatial From fd7072c204bd3033c98e3dfd6d89b738654018f8 Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Thu, 5 Jun 2025 16:35:15 -0400 Subject: [PATCH 014/507] geo false on creation --- .../api/data/metadatablocks/geospatial.tsv | 678 +++++++++--------- 1 file changed, 339 insertions(+), 339 deletions(-) diff --git a/scripts/api/data/metadatablocks/geospatial.tsv b/scripts/api/data/metadatablocks/geospatial.tsv index fea47e717e5..fc59f1a9a6a 100644 --- a/scripts/api/data/metadatablocks/geospatial.tsv +++ b/scripts/api/data/metadatablocks/geospatial.tsv @@ -1,339 +1,339 @@ -#metadataBlock name dataverseAlias displayName - geospatial Geospatial Metadata -#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id - geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE TRUE FALSE geographicCoverage geospatial - state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial - city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 #VALUE, TRUE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial - otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 #VALUE, FALSE FALSE FALSE TRUE TRUE FALSE geographicCoverage geospatial - geographicUnit Geographic Unit Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region. text 5 TRUE FALSE TRUE TRUE TRUE FALSE geospatial - geographicBoundingBox Geographic Bounding Box The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. none 6 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - westLongitude Westernmost (Left) Longitude Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0. text 7 FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - eastLongitude Easternmost (Right) Longitude Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0. text 8 FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - northLatitude Northernmost (Top) Latitude Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0. text 9 FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - southLatitude Southernmost (Bottom) Latitude Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0. text 10 FALSE FALSE FALSE FALSE TRUE FALSE geographicBoundingBox geospatial - expandedGeospatialMetadata Geospatial Metadata - Expanded Expanded metadata for geospatial datasets (ISO 19115-3) none 11 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - geoResourceType Type of Geospatial Data Resource The type of geospatial data resource (dataset, service, or series). text 12 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial - geoReferenceDate Resource Reference Date A date which is used to help identify the resource (ISO 19115-3) none 13 TRUE FALSE TRUE FALSE TRUE FALSE geospatial - geoReferenceDateValue Date Other date as expressed in yyyy-mm-dd date 14 #VALUE TRUE FALSE FALSE TRUE TRUE FALSE geoReferenceDate geospatial - geoReferenceDateType Type The type of date text 15 (#VALUE) TRUE TRUE FALSE FALSE TRUE FALSE geoReferenceDate geospatial - dataLineage Data Lineage Information none 16 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - lineageStatement Statement General explanation of the data producer’s knowledge of the dataset lineage. textbox 17 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial - sourceDescription Data Source Description Statement that describes the source data. textbox 19 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial - processStep Process Step Description Description of the processes performed on the data. textbox 20 #VALUE FALSE FALSE TRUE FALSE TRUE FALSE geospatial - referenceSystemInfo Reference System Information none 21 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - referenceSystemCode Code Alphanumeric value identifying the source reference system. Alphanumeric value identifying the source reference system. text 22 #VALUE FALSE FALSE FALSE TRUE TRUE FALSE referenceSystemInfo geospatial - referenceSystemCodeSpace Code Space Identifier/ namespace of the system in which the code is valid. Identifier/ namespace of the system in which the code is valid. text 23 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE referenceSystemInfo geospatial - spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 24 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - spatialResolutionValue Value Level of detail expressed as a scale factor, a distance or an angle Level of detail expressed as a scale factor, a distance or an angle int 25 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE spatialResolution geospatial - spatialResolutionType Type distance, vertical, angularDistance, levelOfDetail distance, vertical, angularDistance, levelOfDetail text 26 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE spatialResolution geospatial - spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic information. text 27 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial - distribution Distribution Link Distribution Links none 28 TRUE FALSE TRUE FALSE TRUE FALSE geospatial - distributionLinkLabel Label A descriptive label for the distribution link A descriptive label for the distribution link text 29 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial - distributionLink URL URL to access the dataset (e.g. via a geospatial web service) URL to access the dataset (e.g. via a geospatial web service) text 30 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial - protocol Protocol The service or transfer protocol associated with the distribution link URL The service or transfer protocol associated with the distribution link URL text 31 (#VALUE) TRUE FALSE FALSE FALSE TRUE FALSE distribution geospatial - vectorSpatialRepresentation Vector Spatial Representation none 32 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - geometricObjectCount Geometric Object Count Total number of point or vector objects in the dataset. Number of point or vector objects in the dataset int 33 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE geospatial - geometricObjectTypeCode Geometric Object Type Code Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. text 34 (#VALUE) FALSE TRUE FALSE TRUE TRUE FALSE geospatial - gridSpatialRepresentation Raster Spatial Representation none 35 FALSE FALSE FALSE FALSE TRUE FALSE geospatial - numberOfDimensions Number of Dimensions The number of independent spatio-temporal axes. The number of independent spatio-temporal axes. int 36 TRUE FALSE FALSE FALSE TRUE FALSE geospatial - cellGeometryCode Cell Geometry Code Identification of grid data as point or cell. Identification of grid data as point or cell. text 37 #VALUE TRUE TRUE FALSE TRUE TRUE FALSE geospatial - axisDimensionProperties Axis Dimension Properties none 38 FALSE FALSE TRUE FALSE TRUE FALSE geospatial - dimensionNameTypeCode Name Type Code Axis name. Axis name. text 39 #VALUE FALSE TRUE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial - dimensionSize Size Number of elements along the axis. Number of elements along the axis. int 40 FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial - resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. int 41 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial - resolutionUnitOfMeasure Resolution Unit of Measure Resolution unit of measure (e.g. 'm', 'km', etc.) Resolution unit of measure (e.g. 'm', 'km', etc.) text 42 (#VALUE) FALSE FALSE FALSE FALSE TRUE FALSE axisDimensionProperties geospatial -#controlledVocabulary DatasetField Value identifier displayOrder - country Afghanistan 0 - country Albania 1 - country Algeria 2 - country American Samoa 3 - country Andorra 4 - country Angola 5 - country Anguilla 6 - country Antarctica 7 - country Antigua and Barbuda 8 - country Argentina 9 - country Armenia 10 - country Aruba 11 - country Australia 12 - country Austria 13 - country Azerbaijan 14 - country Bahamas 15 - country Bahrain 16 - country Bangladesh 17 - country Barbados 18 - country Belarus 19 - country Belgium 20 - country Belize 21 - country Benin 22 - country Bermuda 23 - country Bhutan 24 - country Bolivia, Plurinational State of 25 - country Bonaire, Sint Eustatius and Saba 26 - country Bosnia and Herzegovina 27 - country Botswana 28 BOTSWANA - country Bouvet Island 29 - country Brazil 30 Brasil - country British Indian Ocean Territory 31 - country Brunei Darussalam 32 - country Bulgaria 33 - country Burkina Faso 34 - country Burundi 35 - country Cambodia 36 - country Cameroon 37 - country Canada 38 - country Cape Verde 39 - country Cayman Islands 40 - country Central African Republic 41 - country Chad 42 - country Chile 43 - country China 44 - country Christmas Island 45 - country Cocos (Keeling) Islands 46 - country Colombia 47 - country Comoros 48 - country Congo 49 - country Congo, the Democratic Republic of the 50 - country Cook Islands 51 - country Costa Rica 52 - country Croatia 53 - country Cuba 54 - country Curaçao 55 - country Cyprus 56 - country Czech Republic 57 - country Côte d'Ivoire 58 - country Denmark 59 - country Djibouti 60 - country Dominica 61 - country Dominican Republic 62 - country Ecuador 63 - country Egypt 64 - country El Salvador 65 - country Equatorial Guinea 66 - country Eritrea 67 - country Estonia 68 - country Ethiopia 69 - country Falkland Islands (Malvinas) 70 - country Faroe Islands 71 - country Fiji 72 - country Finland 73 - country France 74 - country French Guiana 75 - country French Polynesia 76 - country French Southern Territories 77 - country Gabon 78 - country Gambia 79 Gambia, The - country Georgia 80 - country Germany 81 Germany (Federal Republic of) - country Ghana 82 GHANA - country Gibraltar 83 - country Greece 84 - country Greenland 85 - country Grenada 86 - country Guadeloupe 87 - country Guam 88 - country Guatemala 89 - country Guernsey 90 - country Guinea 91 - country Guinea-Bissau 92 - country Guyana 93 - country Haiti 94 - country Heard Island and Mcdonald Islands 95 - country Holy See (Vatican City State) 96 - country Honduras 97 - country Hong Kong 98 - country Hungary 99 - country Iceland 100 - country India 101 INDIA - country Indonesia 102 Sumatra - country Iran, Islamic Republic of 103 Iran Iran (Islamic Republic of) - country Iraq 104 IRAQ - country Ireland 105 - country Isle of Man 106 - country Israel 107 - country Italy 108 - country Jamaica 109 - country Japan 110 - country Jersey 111 - country Jordan 112 - country Kazakhstan 113 - country Kenya 114 - country Kiribati 115 - country Korea, Democratic People's Republic of 116 - country Korea, Republic of 117 - country Kuwait 118 - country Kyrgyzstan 119 - country Lao People's Democratic Republic 120 Laos - country Latvia 121 - country Lebanon 122 - country Lesotho 123 LESOTHO - country Liberia 124 - country Libya 125 - country Liechtenstein 126 - country Lithuania 127 - country Luxembourg 128 - country Macao 129 - country Macedonia, the Former Yugoslav Republic of 130 - country Madagascar 131 - country Malawi 132 - country Malaysia 133 - country Maldives 134 - country Mali 135 - country Malta 136 - country Marshall Islands 137 - country Martinique 138 - country Mauritania 139 - country Mauritius 140 - country Mayotte 141 - country Mexico 142 - country Micronesia, Federated States of 143 - country Moldova, Republic of 144 - country Monaco 145 - country Mongolia 146 - country Montenegro 147 - country Montserrat 148 - country Morocco 149 - country Mozambique 150 MOZAMBIQUE - country Myanmar 151 - country Namibia 152 NAMIBIA - country Nauru 153 - country Nepal 154 - country Netherlands 155 - country New Caledonia 156 - country New Zealand 157 - country Nicaragua 158 - country Niger 159 - country Nigeria 160 - country Niue 161 - country Norfolk Island 162 - country Northern Mariana Islands 163 - country Norway 164 - country Oman 165 - country Pakistan 166 - country Palau 167 - country Palestine, State of 168 - country Panama 169 - country Papua New Guinea 170 - country Paraguay 171 - country Peru 172 - country Philippines 173 - country Pitcairn 174 - country Poland 175 - country Portugal 176 - country Puerto Rico 177 - country Qatar 178 - country Romania 179 - country Russian Federation 180 - country Rwanda 181 - country Réunion 182 - country Saint Barthélemy 183 - country Saint Helena, Ascension and Tristan da Cunha 184 - country Saint Kitts and Nevis 185 - country Saint Lucia 186 - country Saint Martin (French part) 187 - country Saint Pierre and Miquelon 188 - country Saint Vincent and the Grenadines 189 - country Samoa 190 - country San Marino 191 - country Sao Tome and Principe 192 - country Saudi Arabia 193 - country Senegal 194 - country Serbia 195 - country Seychelles 196 - country Sierra Leone 197 - country Singapore 198 - country Sint Maarten (Dutch part) 199 - country Slovakia 200 - country Slovenia 201 - country Solomon Islands 202 - country Somalia 203 - country South Africa 204 - country South Georgia and the South Sandwich Islands 205 - country South Sudan 206 - country Spain 207 - country Sri Lanka 208 - country Sudan 209 - country Suriname 210 - country Svalbard and Jan Mayen 211 - country Swaziland 212 SWAZILAND - country Sweden 213 - country Switzerland 214 - country Syrian Arab Republic 215 - country Taiwan, Province of China 216 Taiwan - country Tajikistan 217 - country Tanzania, United Republic of 218 Tanzania - country Thailand 219 - country Timor-Leste 220 - country Togo 221 - country Tokelau 222 - country Tonga 223 - country Trinidad and Tobago 224 - country Tunisia 225 - country Turkey 226 - country Turkmenistan 227 - country Turks and Caicos Islands 228 - country Tuvalu 229 - country Uganda 230 - country Ukraine 231 - country United Arab Emirates 232 UAE - country United Kingdom 233 - country United States 234 U.S.A USA United States of America U.S.A. - country United States Minor Outlying Islands 235 - country Uruguay 236 - country Uzbekistan 237 - country Vanuatu 238 - country Venezuela, Bolivarian Republic of 239 - country Viet Nam 240 - country Virgin Islands, British 241 - country Virgin Islands, U.S. 242 - country Wallis and Futuna 243 - country Western Sahara 244 - country Yemen 245 YEMEN - country Zambia 246 - country Zimbabwe 247 - country Åland Islands 248 - geometricObjectTypeCode curve curve 0 - geometricObjectTypeCode composite composite 1 - geometricObjectTypeCode complex complex 2 - geometricObjectTypeCode point point 3 - geometricObjectTypeCode solid solid 4 - geometricObjectTypeCode surface surface 5 - cellGeometryCode point point 0 - cellGeometryCode area area 1 - cellGeometryCode voxel voxel 2 - dimensionNameTypeCode row row 0 - dimensionNameTypeCode column column 1 - dimensionNameTypeCode vertical vertical 2 - dimensionNameTypeCode track track 3 - dimensionNameTypeCode crossTrack crossTrack 4 - dimensionNameTypeCode line line 5 - dimensionNameTypeCode sample sample 6 - dimensionNameTypeCode time time 7 - spatialRepresentationType stereoModel stereoModel 0 - spatialRepresentationType video video 1 - spatialRepresentationType tin tin 2 - spatialRepresentationType textTable textTable 3 - spatialRepresentationType grid grid 4 - spatialRepresentationType vector vector 5 - dataQualityScope dataset dataset 0 - dataQualityScope service service 1 - geoResourceType dataset dataset 0 - geoResourceType service service 1 - geoResourceType series series 2 - geoReferenceDateType revision revision 0 - geoReferenceDateType expiry expiry 1 - geoReferenceDateType lastUpdate lastUpdate 2 - geoReferenceDateType lastRevision lastRevision 3 - geoReferenceDateType nextUpdate nextUpdate 4 - geoReferenceDateType unavailable unavailable 5 - geoReferenceDateType inForce inForce 6 - geoReferenceDateType adopted adopted 7 - geoReferenceDateType deprecated deprecated 8 - geoReferenceDateType superseded superseded 9 - geoReferenceDateType publication publication 10 - spatialResolutionType equivalentScale equivalentScale 0 - spatialResolutionType distance distance 1 - spatialResolutionType vertical vertical 2 - spatialResolutionType angularDistance angularDistance 3 - spatialResolutionType levelOfDetail levelOfDetail 4 +#metadataBlock name dataverseAlias displayName + geospatial Geospatial Metadata +#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id + geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE FALSE FALSE geographicCoverage geospatial + state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial + city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial + otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 #VALUE, FALSE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial + geographicUnit Geographic Unit Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region. text 5 TRUE FALSE TRUE TRUE FALSE FALSE geospatial + geographicBoundingBox Geographic Bounding Box The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. none 6 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + westLongitude Westernmost (Left) Longitude Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0. text 7 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial + eastLongitude Easternmost (Right) Longitude Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0. text 8 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial + northLatitude Northernmost (Top) Latitude Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0. text 9 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial + southLatitude Southernmost (Bottom) Latitude Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0. text 10 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial + expandedGeospatialMetadata Geospatial Metadata - Expanded Expanded metadata for geospatial datasets (ISO 19115-3) none 11 FALSE FALSE FALSE FALSE FALSE FALSE geospatial + geoResourceType Type of Geospatial Data Resource The type of geospatial data resource (dataset, service, or series). text 12 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial + geoReferenceDate Resource Reference Date A date which is used to help identify the resource (ISO 19115-3) none 13 TRUE FALSE TRUE FALSE FALSE FALSE geospatial + geoReferenceDateValue Date Other date as expressed in yyyy-mm-dd date 14 #VALUE TRUE FALSE FALSE TRUE FALSE FALSE geoReferenceDate geospatial + geoReferenceDateType Type The type of date text 15 (#VALUE) TRUE TRUE FALSE FALSE FALSE FALSE geoReferenceDate geospatial + dataLineage Data Lineage Information none 16 FALSE FALSE FALSE FALSE FALSE FALSE geospatial + lineageStatement Statement General explanation of the data producer’s knowledge of the dataset lineage. textbox 17 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE geospatial + sourceDescription Data Source Description Statement that describes the source data. textbox 19 #VALUE FALSE FALSE TRUE FALSE FALSE FALSE geospatial + processStep Process Step Description Description of the processes performed on the data. textbox 20 #VALUE FALSE FALSE TRUE FALSE FALSE FALSE geospatial + referenceSystemInfo Reference System Information none 21 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + referenceSystemCode Code Alphanumeric value identifying the source reference system. Alphanumeric value identifying the source reference system. text 22 #VALUE FALSE FALSE FALSE TRUE FALSE FALSE referenceSystemInfo geospatial + referenceSystemCodeSpace Code Space Identifier/ namespace of the system in which the code is valid. Identifier/ namespace of the system in which the code is valid. text 23 (#VALUE) FALSE FALSE FALSE FALSE FALSE FALSE referenceSystemInfo geospatial + spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 24 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + spatialResolutionValue Value Level of detail expressed as a scale factor, a distance or an angle Level of detail expressed as a scale factor, a distance or an angle int 25 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE spatialResolution geospatial + spatialResolutionType Type distance, vertical, angularDistance, levelOfDetail distance, vertical, angularDistance, levelOfDetail text 26 (#VALUE) FALSE TRUE FALSE TRUE FALSE FALSE spatialResolution geospatial + spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic information. text 27 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial + distribution Distribution Link Distribution Links none 28 TRUE FALSE TRUE FALSE FALSE FALSE geospatial + distributionLinkLabel Label A descriptive label for the distribution link A descriptive label for the distribution link text 29 #VALUE TRUE FALSE FALSE FALSE FALSE FALSE distribution geospatial + distributionLink URL URL to access the dataset (e.g. via a geospatial web service) URL to access the dataset (e.g. via a geospatial web service) text 30 #VALUE TRUE FALSE FALSE FALSE FALSE FALSE distribution geospatial + protocol Protocol The service or transfer protocol associated with the distribution link URL The service or transfer protocol associated with the distribution link URL text 31 (#VALUE) TRUE FALSE FALSE FALSE FALSE FALSE distribution geospatial + vectorSpatialRepresentation Vector Spatial Representation none 32 FALSE FALSE FALSE FALSE FALSE FALSE geospatial + geometricObjectCount Geometric Object Count Total number of point or vector objects in the dataset. Number of point or vector objects in the dataset int 33 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE geospatial + geometricObjectTypeCode Geometric Object Type Code Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. text 34 (#VALUE) FALSE TRUE FALSE TRUE FALSE FALSE geospatial + gridSpatialRepresentation Raster Spatial Representation none 35 FALSE FALSE FALSE FALSE FALSE FALSE geospatial + numberOfDimensions Number of Dimensions The number of independent spatio-temporal axes. The number of independent spatio-temporal axes. int 36 TRUE FALSE FALSE FALSE FALSE FALSE geospatial + cellGeometryCode Cell Geometry Code Identification of grid data as point or cell. Identification of grid data as point or cell. text 37 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial + axisDimensionProperties Axis Dimension Properties none 38 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + dimensionNameTypeCode Name Type Code Axis name. Axis name. text 39 #VALUE FALSE TRUE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial + dimensionSize Size Number of elements along the axis. Number of elements along the axis. int 40 FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial + resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. int 41 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial + resolutionUnitOfMeasure Resolution Unit of Measure Resolution unit of measure (e.g. 'm', 'km', etc.) Resolution unit of measure (e.g. 'm', 'km', etc.) text 42 (#VALUE) FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial +#controlledVocabulary DatasetField Value identifier displayOrder + country Afghanistan 0 + country Albania 1 + country Algeria 2 + country American Samoa 3 + country Andorra 4 + country Angola 5 + country Anguilla 6 + country Antarctica 7 + country Antigua and Barbuda 8 + country Argentina 9 + country Armenia 10 + country Aruba 11 + country Australia 12 + country Austria 13 + country Azerbaijan 14 + country Bahamas 15 + country Bahrain 16 + country Bangladesh 17 + country Barbados 18 + country Belarus 19 + country Belgium 20 + country Belize 21 + country Benin 22 + country Bermuda 23 + country Bhutan 24 + country Bolivia, Plurinational State of 25 + country Bonaire, Sint Eustatius and Saba 26 + country Bosnia and Herzegovina 27 + country Botswana 28 BOTSWANA + country Bouvet Island 29 + country Brazil 30 Brasil + country British Indian Ocean Territory 31 + country Brunei Darussalam 32 + country Bulgaria 33 + country Burkina Faso 34 + country Burundi 35 + country Cambodia 36 + country Cameroon 37 + country Canada 38 + country Cape Verde 39 + country Cayman Islands 40 + country Central African Republic 41 + country Chad 42 + country Chile 43 + country China 44 + country Christmas Island 45 + country Cocos (Keeling) Islands 46 + country Colombia 47 + country Comoros 48 + country Congo 49 + country Congo, the Democratic Republic of the 50 + country Cook Islands 51 + country Costa Rica 52 + country Croatia 53 + country Cuba 54 + country Curaçao 55 + country Cyprus 56 + country Czech Republic 57 + country Côte d'Ivoire 58 + country Denmark 59 + country Djibouti 60 + country Dominica 61 + country Dominican Republic 62 + country Ecuador 63 + country Egypt 64 + country El Salvador 65 + country Equatorial Guinea 66 + country Eritrea 67 + country Estonia 68 + country Ethiopia 69 + country Falkland Islands (Malvinas) 70 + country Faroe Islands 71 + country Fiji 72 + country Finland 73 + country France 74 + country French Guiana 75 + country French Polynesia 76 + country French Southern Territories 77 + country Gabon 78 + country Gambia 79 Gambia, The + country Georgia 80 + country Germany 81 Germany (Federal Republic of) + country Ghana 82 GHANA + country Gibraltar 83 + country Greece 84 + country Greenland 85 + country Grenada 86 + country Guadeloupe 87 + country Guam 88 + country Guatemala 89 + country Guernsey 90 + country Guinea 91 + country Guinea-Bissau 92 + country Guyana 93 + country Haiti 94 + country Heard Island and Mcdonald Islands 95 + country Holy See (Vatican City State) 96 + country Honduras 97 + country Hong Kong 98 + country Hungary 99 + country Iceland 100 + country India 101 INDIA + country Indonesia 102 Sumatra + country Iran, Islamic Republic of 103 Iran Iran (Islamic Republic of) + country Iraq 104 IRAQ + country Ireland 105 + country Isle of Man 106 + country Israel 107 + country Italy 108 + country Jamaica 109 + country Japan 110 + country Jersey 111 + country Jordan 112 + country Kazakhstan 113 + country Kenya 114 + country Kiribati 115 + country Korea, Democratic People's Republic of 116 + country Korea, Republic of 117 + country Kuwait 118 + country Kyrgyzstan 119 + country Lao People's Democratic Republic 120 Laos + country Latvia 121 + country Lebanon 122 + country Lesotho 123 LESOTHO + country Liberia 124 + country Libya 125 + country Liechtenstein 126 + country Lithuania 127 + country Luxembourg 128 + country Macao 129 + country Macedonia, the Former Yugoslav Republic of 130 + country Madagascar 131 + country Malawi 132 + country Malaysia 133 + country Maldives 134 + country Mali 135 + country Malta 136 + country Marshall Islands 137 + country Martinique 138 + country Mauritania 139 + country Mauritius 140 + country Mayotte 141 + country Mexico 142 + country Micronesia, Federated States of 143 + country Moldova, Republic of 144 + country Monaco 145 + country Mongolia 146 + country Montenegro 147 + country Montserrat 148 + country Morocco 149 + country Mozambique 150 MOZAMBIQUE + country Myanmar 151 + country Namibia 152 NAMIBIA + country Nauru 153 + country Nepal 154 + country Netherlands 155 + country New Caledonia 156 + country New Zealand 157 + country Nicaragua 158 + country Niger 159 + country Nigeria 160 + country Niue 161 + country Norfolk Island 162 + country Northern Mariana Islands 163 + country Norway 164 + country Oman 165 + country Pakistan 166 + country Palau 167 + country Palestine, State of 168 + country Panama 169 + country Papua New Guinea 170 + country Paraguay 171 + country Peru 172 + country Philippines 173 + country Pitcairn 174 + country Poland 175 + country Portugal 176 + country Puerto Rico 177 + country Qatar 178 + country Romania 179 + country Russian Federation 180 + country Rwanda 181 + country Réunion 182 + country Saint Barthélemy 183 + country Saint Helena, Ascension and Tristan da Cunha 184 + country Saint Kitts and Nevis 185 + country Saint Lucia 186 + country Saint Martin (French part) 187 + country Saint Pierre and Miquelon 188 + country Saint Vincent and the Grenadines 189 + country Samoa 190 + country San Marino 191 + country Sao Tome and Principe 192 + country Saudi Arabia 193 + country Senegal 194 + country Serbia 195 + country Seychelles 196 + country Sierra Leone 197 + country Singapore 198 + country Sint Maarten (Dutch part) 199 + country Slovakia 200 + country Slovenia 201 + country Solomon Islands 202 + country Somalia 203 + country South Africa 204 + country South Georgia and the South Sandwich Islands 205 + country South Sudan 206 + country Spain 207 + country Sri Lanka 208 + country Sudan 209 + country Suriname 210 + country Svalbard and Jan Mayen 211 + country Swaziland 212 SWAZILAND + country Sweden 213 + country Switzerland 214 + country Syrian Arab Republic 215 + country Taiwan, Province of China 216 Taiwan + country Tajikistan 217 + country Tanzania, United Republic of 218 Tanzania + country Thailand 219 + country Timor-Leste 220 + country Togo 221 + country Tokelau 222 + country Tonga 223 + country Trinidad and Tobago 224 + country Tunisia 225 + country Turkey 226 + country Turkmenistan 227 + country Turks and Caicos Islands 228 + country Tuvalu 229 + country Uganda 230 + country Ukraine 231 + country United Arab Emirates 232 UAE + country United Kingdom 233 + country United States 234 U.S.A USA United States of America U.S.A. + country United States Minor Outlying Islands 235 + country Uruguay 236 + country Uzbekistan 237 + country Vanuatu 238 + country Venezuela, Bolivarian Republic of 239 + country Viet Nam 240 + country Virgin Islands, British 241 + country Virgin Islands, U.S. 242 + country Wallis and Futuna 243 + country Western Sahara 244 + country Yemen 245 YEMEN + country Zambia 246 + country Zimbabwe 247 + country Ã…land Islands 248 + geometricObjectTypeCode curve curve 0 + geometricObjectTypeCode composite composite 1 + geometricObjectTypeCode complex complex 2 + geometricObjectTypeCode point point 3 + geometricObjectTypeCode solid solid 4 + geometricObjectTypeCode surface surface 5 + cellGeometryCode point point 0 + cellGeometryCode area area 1 + cellGeometryCode voxel voxel 2 + dimensionNameTypeCode row row 0 + dimensionNameTypeCode column column 1 + dimensionNameTypeCode vertical vertical 2 + dimensionNameTypeCode track track 3 + dimensionNameTypeCode crossTrack crossTrack 4 + dimensionNameTypeCode line line 5 + dimensionNameTypeCode sample sample 6 + dimensionNameTypeCode time time 7 + spatialRepresentationType stereoModel stereoModel 0 + spatialRepresentationType video video 1 + spatialRepresentationType tin tin 2 + spatialRepresentationType textTable textTable 3 + spatialRepresentationType grid grid 4 + spatialRepresentationType vector vector 5 + dataQualityScope dataset dataset 0 + dataQualityScope service service 1 + geoResourceType dataset dataset 0 + geoResourceType service service 1 + geoResourceType series series 2 + geoReferenceDateType revision revision 0 + geoReferenceDateType expiry expiry 1 + geoReferenceDateType lastUpdate lastUpdate 2 + geoReferenceDateType lastRevision lastRevision 3 + geoReferenceDateType nextUpdate nextUpdate 4 + geoReferenceDateType unavailable unavailable 5 + geoReferenceDateType inForce inForce 6 + geoReferenceDateType adopted adopted 7 + geoReferenceDateType deprecated deprecated 8 + geoReferenceDateType superseded superseded 9 + geoReferenceDateType publication publication 10 + spatialResolutionType equivalentScale equivalentScale 0 + spatialResolutionType distance distance 1 + spatialResolutionType vertical vertical 2 + spatialResolutionType angularDistance angularDistance 3 + spatialResolutionType levelOfDetail levelOfDetail 4 \ No newline at end of file From 9640193115c61165741903b2d520abe8b3ded33e Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Thu, 5 Jun 2025 16:45:30 -0400 Subject: [PATCH 015/507] geo fix --- scripts/api/data/metadatablocks/geospatial.tsv | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/api/data/metadatablocks/geospatial.tsv b/scripts/api/data/metadatablocks/geospatial.tsv index fc59f1a9a6a..38b6cea41da 100644 --- a/scripts/api/data/metadatablocks/geospatial.tsv +++ b/scripts/api/data/metadatablocks/geospatial.tsv @@ -99,10 +99,10 @@ country Costa Rica 52 country Croatia 53 country Cuba 54 - country Curaçao 55 + country Curaçao 55 country Cyprus 56 country Czech Republic 57 - country Côte d'Ivoire 58 + country Côte d'Ivoire 58 country Denmark 59 country Djibouti 60 country Dominica 61 @@ -226,8 +226,8 @@ country Romania 179 country Russian Federation 180 country Rwanda 181 - country Réunion 182 - country Saint Barthélemy 183 + country Réunion 182 + country Saint Barthélemy 183 country Saint Helena, Ascension and Tristan da Cunha 184 country Saint Kitts and Nevis 185 country Saint Lucia 186 @@ -292,7 +292,7 @@ country Yemen 245 YEMEN country Zambia 246 country Zimbabwe 247 - country Ã…land Islands 248 + country Åland Islands 248 geometricObjectTypeCode curve curve 0 geometricObjectTypeCode composite composite 1 geometricObjectTypeCode complex complex 2 @@ -336,4 +336,4 @@ spatialResolutionType distance distance 1 spatialResolutionType vertical vertical 2 spatialResolutionType angularDistance angularDistance 3 - spatialResolutionType levelOfDetail levelOfDetail 4 \ No newline at end of file + spatialResolutionType levelOfDetail levelOfDetail 4 From ea4327f152ae27e76d7d1d733aff24746c8b4c47 Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Fri, 6 Jun 2025 15:42:19 -0400 Subject: [PATCH 016/507] int test naumber of fields --- src/test/java/edu/harvard/iq/dataverse/api/DatasetFieldsIT.java | 2 +- src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java | 2 +- src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetFieldsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetFieldsIT.java index b70ef04d4c0..9581dd3fff5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetFieldsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetFieldsIT.java @@ -19,7 +19,7 @@ public static void setUpClass() { void testListAllFacetableDatasetFields() { Response listAllFacetableDatasetFieldsResponse = UtilIT.listAllFacetableDatasetFields(); listAllFacetableDatasetFieldsResponse.then().assertThat().statusCode(OK.getStatusCode()); - int expectedNumberOfFacetableDatasetFields = 64; + int expectedNumberOfFacetableDatasetFields = 71; listAllFacetableDatasetFieldsResponse.then().assertThat() .statusCode(OK.getStatusCode()) .body("data[0].name", equalTo("authorName")) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java index 205725822ff..17182c84854 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java @@ -499,7 +499,7 @@ public void testUpdateDatasetTypeLinksWithMetadataBlocks() { .body("data[0].name", is("citation")) .body("data[1].name", is("geospatial")) .body("data[0].fields.size()", is(35)) - .body("data[1].fields.size()", is(3)); + .body("data[1].fields.size()", is(21)); System.out.println("listing " + dataverseAlias + " collection blocks and inner dataset field types, with display on create and return dataset field types set to true using dataset type " + randomName); listBlocks = UtilIT.listMetadataBlocks(dataverseAlias, true, true, randomName, apiToken); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index 0fee23e2b6c..1cd09d0026c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -1036,7 +1036,7 @@ public void testListMetadataBlocks() { // Since the included property of geographicCoverage is set to false, we should retrieve the total number of fields minus one listMetadataBlocksResponse.then().assertThat() - .body(String.format("data[%d].fields.size()", geospatialMetadataBlockIndex), equalTo(2)); + .body(String.format("data[%d].fields.size()", geospatialMetadataBlockIndex), equalTo(20)); listMetadataBlocksResponse = UtilIT.getMetadataBlock("geospatial"); String actualGeospatialMetadataField1 = listMetadataBlocksResponse.then().extract().path(String.format("data.fields['geographicCoverage'].name")); From 3d4c1254c632c4ae355b2f4330b037b72dbdb0e6 Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Fri, 6 Jun 2025 15:54:49 -0400 Subject: [PATCH 017/507] upgrade snippet --- doc/release-notes/10398-geospatial-block.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/release-notes/10398-geospatial-block.md diff --git a/doc/release-notes/10398-geospatial-block.md b/doc/release-notes/10398-geospatial-block.md new file mode 100644 index 00000000000..50b71d1551e --- /dev/null +++ b/doc/release-notes/10398-geospatial-block.md @@ -0,0 +1,8 @@ +### Update geospatial metadata block in existing installation (PR #11507) + +.. code-block:: javascript + + curl http://localhost:8080/api/admin/datasetfield/load -H "Content-type: text/tab-separated-values" -X POST --upload-file geospatial.tsv + curl "http://localhost:8080/api/admin/index/solr/schema" > new.xml + ./dataverse/conf/solr/update-fields.sh /usr/local/solr/solr-9.8.0/server/solr/collection1/conf/schema.xml new.xml + curl "http://localhost:8983/solr/admin/cores?action=RELOAD&core=collection1" From 41ba53b1c84c7d079ba762949a55b4d69ab1695f Mon Sep 17 00:00:00 2001 From: Victoria Lubitch <43550154+lubitchv@users.noreply.github.com> Date: Thu, 4 Sep 2025 11:54:41 -0400 Subject: [PATCH 018/507] Remove empy line --- doc/sphinx-guides/source/user/appendix.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/sphinx-guides/source/user/appendix.rst b/doc/sphinx-guides/source/user/appendix.rst index 21656e497a8..d1c46a93fdf 100755 --- a/doc/sphinx-guides/source/user/appendix.rst +++ b/doc/sphinx-guides/source/user/appendix.rst @@ -44,7 +44,6 @@ Unlike supported metadata, experimental metadata is not enabled by default in a - Archival Metadata (`see .tsv `__): Enables repositories to register metadata relating to the potential archiving of the dataset at a depositor archive, whether that be your own institutional archive or an external archive, i.e. a historical archive. - Local Contexts Metadata (`see .tsv `__): Supports integration with the `Local Contexts `__ platform, enabling the use of Traditional Knowledge and Biocultural Labels, and Notices. For more information on setup and configuration, see :doc:`../installation/localcontexts`. - Please note: these custom metadata schemas are not included in the Solr schema for indexing by default, you will need to add them as necessary for your custom metadata blocks. See "Update the Solr Schema" in :doc:`../admin/metadatacustomization`. From 11fb9f66309454dc58edf51685ab1d3ae5096681 Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Thu, 4 Sep 2025 17:22:59 -0400 Subject: [PATCH 019/507] Updated geoblock --- conf/solr/schema.xml | 34 ++--- .../api/data/metadatablocks/geospatial.tsv | 128 +++++++++--------- .../java/propertyFiles/geospatial.properties | 124 ++++++++--------- 3 files changed, 138 insertions(+), 148 deletions(-) diff --git a/conf/solr/schema.xml b/conf/solr/schema.xml index 339e01fc35f..cb1b4b0f552 100644 --- a/conf/solr/schema.xml +++ b/conf/solr/schema.xml @@ -287,7 +287,7 @@ - + @@ -317,7 +317,7 @@ - + @@ -330,7 +330,7 @@ - + @@ -348,15 +348,11 @@ - - - - - + @@ -401,6 +397,9 @@ + + + @@ -413,6 +412,7 @@ + @@ -429,7 +429,7 @@ - + @@ -575,7 +575,7 @@ - + @@ -605,7 +605,7 @@ - + @@ -618,7 +618,7 @@ - + @@ -636,15 +636,11 @@ - - - - - + @@ -689,6 +685,9 @@ + + + @@ -701,6 +700,7 @@ + diff --git a/scripts/api/data/metadatablocks/geospatial.tsv b/scripts/api/data/metadatablocks/geospatial.tsv index 38b6cea41da..e634bc01e91 100644 --- a/scripts/api/data/metadatablocks/geospatial.tsv +++ b/scripts/api/data/metadatablocks/geospatial.tsv @@ -1,6 +1,6 @@ #metadataBlock name dataverseAlias displayName geospatial Geospatial Metadata -#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id +#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE FALSE FALSE geospatial country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE FALSE FALSE geographicCoverage geospatial state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial @@ -13,36 +13,34 @@ northLatitude Northernmost (Top) Latitude Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0. text 9 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial southLatitude Southernmost (Bottom) Latitude Southernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= South Bounding Latitude Value <= 90.0. text 10 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial expandedGeospatialMetadata Geospatial Metadata - Expanded Expanded metadata for geospatial datasets (ISO 19115-3) none 11 FALSE FALSE FALSE FALSE FALSE FALSE geospatial - geoResourceType Type of Geospatial Data Resource The type of geospatial data resource (dataset, service, or series). text 12 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial - geoReferenceDate Resource Reference Date A date which is used to help identify the resource (ISO 19115-3) none 13 TRUE FALSE TRUE FALSE FALSE FALSE geospatial - geoReferenceDateValue Date Other date as expressed in yyyy-mm-dd date 14 #VALUE TRUE FALSE FALSE TRUE FALSE FALSE geoReferenceDate geospatial - geoReferenceDateType Type The type of date text 15 (#VALUE) TRUE TRUE FALSE FALSE FALSE FALSE geoReferenceDate geospatial - dataLineage Data Lineage Information none 16 FALSE FALSE FALSE FALSE FALSE FALSE geospatial - lineageStatement Statement General explanation of the data producer’s knowledge of the dataset lineage. textbox 17 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE geospatial - sourceDescription Data Source Description Statement that describes the source data. textbox 19 #VALUE FALSE FALSE TRUE FALSE FALSE FALSE geospatial - processStep Process Step Description Description of the processes performed on the data. textbox 20 #VALUE FALSE FALSE TRUE FALSE FALSE FALSE geospatial - referenceSystemInfo Reference System Information none 21 FALSE FALSE TRUE FALSE FALSE FALSE geospatial - referenceSystemCode Code Alphanumeric value identifying the source reference system. Alphanumeric value identifying the source reference system. text 22 #VALUE FALSE FALSE FALSE TRUE FALSE FALSE referenceSystemInfo geospatial - referenceSystemCodeSpace Code Space Identifier/ namespace of the system in which the code is valid. Identifier/ namespace of the system in which the code is valid. text 23 (#VALUE) FALSE FALSE FALSE FALSE FALSE FALSE referenceSystemInfo geospatial - spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 24 FALSE FALSE TRUE FALSE FALSE FALSE geospatial - spatialResolutionValue Value Level of detail expressed as a scale factor, a distance or an angle Level of detail expressed as a scale factor, a distance or an angle int 25 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE spatialResolution geospatial - spatialResolutionType Type distance, vertical, angularDistance, levelOfDetail distance, vertical, angularDistance, levelOfDetail text 26 (#VALUE) FALSE TRUE FALSE TRUE FALSE FALSE spatialResolution geospatial - spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic information. text 27 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial - distribution Distribution Link Distribution Links none 28 TRUE FALSE TRUE FALSE FALSE FALSE geospatial - distributionLinkLabel Label A descriptive label for the distribution link A descriptive label for the distribution link text 29 #VALUE TRUE FALSE FALSE FALSE FALSE FALSE distribution geospatial - distributionLink URL URL to access the dataset (e.g. via a geospatial web service) URL to access the dataset (e.g. via a geospatial web service) text 30 #VALUE TRUE FALSE FALSE FALSE FALSE FALSE distribution geospatial - protocol Protocol The service or transfer protocol associated with the distribution link URL The service or transfer protocol associated with the distribution link URL text 31 (#VALUE) TRUE FALSE FALSE FALSE FALSE FALSE distribution geospatial - vectorSpatialRepresentation Vector Spatial Representation none 32 FALSE FALSE FALSE FALSE FALSE FALSE geospatial - geometricObjectCount Geometric Object Count Total number of point or vector objects in the dataset. Number of point or vector objects in the dataset int 33 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE geospatial - geometricObjectTypeCode Geometric Object Type Code Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. text 34 (#VALUE) FALSE TRUE FALSE TRUE FALSE FALSE geospatial - gridSpatialRepresentation Raster Spatial Representation none 35 FALSE FALSE FALSE FALSE FALSE FALSE geospatial - numberOfDimensions Number of Dimensions The number of independent spatio-temporal axes. The number of independent spatio-temporal axes. int 36 TRUE FALSE FALSE FALSE FALSE FALSE geospatial - cellGeometryCode Cell Geometry Code Identification of grid data as point or cell. Identification of grid data as point or cell. text 37 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial - axisDimensionProperties Axis Dimension Properties none 38 FALSE FALSE TRUE FALSE FALSE FALSE geospatial - dimensionNameTypeCode Name Type Code Axis name. Axis name. text 39 #VALUE FALSE TRUE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial - dimensionSize Size Number of elements along the axis. Number of elements along the axis. int 40 FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial - resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. int 41 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial - resolutionUnitOfMeasure Resolution Unit of Measure Resolution unit of measure (e.g. 'm', 'km', etc.) Resolution unit of measure (e.g. 'm', 'km', etc.) text 42 (#VALUE) FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial + resourceType Type of Geospatial Data Resource The type of geospatial data resource (dataset, service, or series). text 12 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial + referenceDate Resource Reference Date A date which is used to help identify the resource (ISO 19115-3) none 13 TRUE FALSE TRUE FALSE FALSE FALSE geospatial + referenceDateValue Date Other date as expressed in yyyy-mm-dd date 14 #VALUE TRUE FALSE FALSE TRUE FALSE FALSE referenceDate geospatial + referenceDateType Type The type of date text 15 (#VALUE) TRUE TRUE FALSE FALSE FALSE FALSE referenceDate geospatial + dataLineageStatement Data Lineage Statement General explanation of the data producer’s knowledge of the dataset lineage. textbox 16 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE geospatial + processStep Process Step Description Description of the processes performed on the data. textbox 17 #VALUE FALSE FALSE TRUE FALSE FALSE FALSE geospatial + referenceSystemInfo Reference System Information Description of the spatial and temporal reference systems used in the resource. none 18 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + referenceSystemCode Code Alphanumeric value identifying the source reference system. Alphanumeric value identifying the source reference system. text 19 #VALUE FALSE FALSE FALSE TRUE FALSE FALSE referenceSystemInfo geospatial + referenceSystemCodeSpace Code Space Identifier/ namespace of the system in which the code is valid. Identifier/ namespace of the system in which the code is valid. text 20 (#VALUE) FALSE FALSE FALSE FALSE FALSE FALSE referenceSystemInfo geospatial + spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 21 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + spatialResolutionValue Value Level of detail expressed as a scale factor, a distance or an angle Level of detail expressed as a scale factor, a distance or an angle int 22 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE spatialResolution geospatial + spatialResolutionType Type distance, vertical, angularDistance, levelOfDetail distance, vertical, angularDistance, levelOfDetail text 23 (#VALUE) FALSE TRUE FALSE TRUE FALSE FALSE spatialResolution geospatial + spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic (spatial) information. text 24 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial + vectorSpatialRepresentation Vector Spatial Representation Information about vector spatial objects in the resource. none 25 FALSE FALSE FALSE FALSE FALSE FALSE geospatial + geometricObjectCount Geometric Object Count Total number of point or vector objects in the dataset. Number of point or vector objects in the dataset int 26 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE geospatial + geometricObjectType Geometric Object Type Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. text 27 (#VALUE) FALSE TRUE FALSE TRUE FALSE FALSE geospatial + gridSpatialRepresentation Raster Spatial Representation Information about grid (raster) spatial objects in the resource. none 28 FALSE FALSE FALSE FALSE FALSE FALSE geospatial + numberOfDimensions Number of Dimensions The number of independent spatio-temporal axes. The number of independent spatio-temporal axes. int 29 TRUE FALSE FALSE FALSE FALSE FALSE geospatial + cellGeometry Cell Geometry Identification of grid data as point or cell. Identification of grid data as point or cell. text 30 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial + axisDimensionProperties Axis Dimension Properties Information about spatial-temporal axis properties (dimensions). none 31 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + dimensionNameType Name Type Axis name. Axis name. text 32 #VALUE FALSE TRUE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial + dimensionSize Size Number of elements along the axis. Number of elements along the axis. int 33 FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial + resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. int 34 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial + resolutionUnitOfMeasure Resolution Unit of Measure Resolution unit of measure (e.g. 'cm', 'm', 'km', etc.) Resolution unit of measure (e.g. 'm', 'km', etc.) text 35 (#VALUE) FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial + distribution Distribution Link Distribution Links none 36 TRUE FALSE TRUE FALSE FALSE FALSE geospatial + distributionLinkLabel Label A descriptive label for the distribution link A descriptive label for the distribution link text 37 #VALUE TRUE FALSE FALSE FALSE FALSE FALSE distribution geospatial + distributionLink URL URL to access the dataset (e.g. via a geospatial web service) URL to access the dataset (e.g. via a geospatial web service) text 38 #VALUE TRUE FALSE FALSE FALSE FALSE FALSE distribution geospatial + protocol Protocol The service or transfer protocol associated with the distribution link URL The service or transfer protocol associated with the distribution link URL text 39 (#VALUE) TRUE FALSE FALSE FALSE FALSE FALSE distribution geospatial #controlledVocabulary DatasetField Value identifier displayOrder country Afghanistan 0 country Albania 1 @@ -292,48 +290,46 @@ country Yemen 245 YEMEN country Zambia 246 country Zimbabwe 247 - country Åland Islands 248 - geometricObjectTypeCode curve curve 0 - geometricObjectTypeCode composite composite 1 - geometricObjectTypeCode complex complex 2 - geometricObjectTypeCode point point 3 - geometricObjectTypeCode solid solid 4 - geometricObjectTypeCode surface surface 5 - cellGeometryCode point point 0 - cellGeometryCode area area 1 - cellGeometryCode voxel voxel 2 - dimensionNameTypeCode row row 0 - dimensionNameTypeCode column column 1 - dimensionNameTypeCode vertical vertical 2 - dimensionNameTypeCode track track 3 - dimensionNameTypeCode crossTrack crossTrack 4 - dimensionNameTypeCode line line 5 - dimensionNameTypeCode sample sample 6 - dimensionNameTypeCode time time 7 + country Åland Islands 248 + geometricObjectType curve curve 0 + geometricObjectType composite composite 1 + geometricObjectType complex complex 2 + geometricObjectType point point 3 + geometricObjectType solid solid 4 + geometricObjectType surface surface 5 + cellGeometry point point 0 + cellGeometry area area 1 + cellGeometry voxel voxel 2 + dimensionNameType row row 0 + dimensionNameType column column 1 + dimensionNameType vertical vertical 2 + dimensionNameType track track 3 + dimensionNameType crossTrack crossTrack 4 + dimensionNameType line line 5 + dimensionNameType sample sample 6 + dimensionNameType time time 7 spatialRepresentationType stereoModel stereoModel 0 spatialRepresentationType video video 1 spatialRepresentationType tin tin 2 spatialRepresentationType textTable textTable 3 spatialRepresentationType grid grid 4 spatialRepresentationType vector vector 5 - dataQualityScope dataset dataset 0 - dataQualityScope service service 1 - geoResourceType dataset dataset 0 - geoResourceType service service 1 - geoResourceType series series 2 - geoReferenceDateType revision revision 0 - geoReferenceDateType expiry expiry 1 - geoReferenceDateType lastUpdate lastUpdate 2 - geoReferenceDateType lastRevision lastRevision 3 - geoReferenceDateType nextUpdate nextUpdate 4 - geoReferenceDateType unavailable unavailable 5 - geoReferenceDateType inForce inForce 6 - geoReferenceDateType adopted adopted 7 - geoReferenceDateType deprecated deprecated 8 - geoReferenceDateType superseded superseded 9 - geoReferenceDateType publication publication 10 + resourceType dataset dataset 0 + resourceType service service 1 + resourceType series series 2 + referenceDateType revision revision 0 + referenceDateType expiry expiry 1 + referenceDateType lastUpdate lastUpdate 2 + referenceDateType lastRevision lastRevision 3 + referenceDateType nextUpdate nextUpdate 4 + referenceDateType unavailable unavailable 5 + referenceDateType inForce inForce 6 + referenceDateType adopted adopted 7 + referenceDateType deprecated deprecated 8 + referenceDateType superseded superseded 9 + referenceDateType publication publication 10 spatialResolutionType equivalentScale equivalentScale 0 spatialResolutionType distance distance 1 spatialResolutionType vertical vertical 2 spatialResolutionType angularDistance angularDistance 3 - spatialResolutionType levelOfDetail levelOfDetail 4 + spatialResolutionType levelOfDetail levelOfDetail 4 \ No newline at end of file diff --git a/src/main/java/propertyFiles/geospatial.properties b/src/main/java/propertyFiles/geospatial.properties index d51450539b6..1f50a491907 100644 --- a/src/main/java/propertyFiles/geospatial.properties +++ b/src/main/java/propertyFiles/geospatial.properties @@ -37,32 +37,26 @@ datasetfieldtype.southLatitude.watermark= datasetfieldtype.expandedGeospatialMetadata.title=Geospatial Metadata - Expanded datasetfieldtype.expandedGeospatialMetadata.description=Expanded metadata for geospatial datasets (ISO 19115-3). datasetfieldtype.expandedGeospatialMetadata.watermark= -datasetfieldtype.geoResourceType.title=Type of Geospatial Data Resource -datasetfieldtype.geoResourceType.description=The type of geospatial data resource (dataset, service, or series). -datasetfieldtype.geoResourceType.watermark= -datasetfieldtype.geoReferenceDate.title=Resource Reference Date -datasetfieldtype.geoReferenceDate.description=A date which is used to help identify the resource (ISO 19115-3) -datasetfieldtype.geoReferenceDate.watermark= -datasetfieldtype.geoReferenceDateValue.title=Date -datasetfieldtype.geoReferenceDateValue.description=Other date as expressed in yyyy-mm-dd -datasetfieldtype.geoReferenceDateValue.watermark= -datasetfieldtype.geoReferenceDateType.title=Type -datasetfieldtype.geoReferenceDateType.description=The type of date -datasetfieldtype.geoReferenceDateType.watermark= -datasetfieldtype.dataLineage.title=Data Lineage Information -datasetfieldtype.dataLineage.description= -datasetfieldtype.dataLineage.watermark= -datasetfieldtype.lineageStatement.title=Statement -datasetfieldtype.lineageStatement.description=General explanation of the data producer's knowledge of the dataset lineage. -datasetfieldtype.lineageStatement.watermark= -datasetfieldtype.sourceDescription.title=Data Source Description -datasetfieldtype.sourceDescription.description=Statement that describes the source data. -datasetfieldtype.sourceDescription.watermark= +datasetfieldtype.resourceType.title=Type of Geospatial Data Resource +datasetfieldtype.resourceType.description=The type of geospatial data resource (dataset, service, or series). +datasetfieldtype.resourceType.watermark= +datasetfieldtype.referenceDate.title=Resource Reference Date +datasetfieldtype.referenceDate.description=A date which is used to help identify the resource (ISO 19115-3) +datasetfieldtype.referenceDate.watermark= +datasetfieldtype.referenceDateValue.title=Date +datasetfieldtype.referenceDateValue.description=Other date as expressed in yyyy-mm-dd +datasetfieldtype.referenceDateValue.watermark= +datasetfieldtype.referenceDateType.title=Type +datasetfieldtype.referenceDateType.description=The type of date +datasetfieldtype.referenceDateType.watermark= +datasetfieldtype.dataLineageStatement.title=Data Lineage Statement +datasetfieldtype.dataLineageStatement.description=General explanation of the data producer's knowledge of the dataset lineage. +datasetfieldtype.dataLineageStatement.watermark= datasetfieldtype.processStep.title=Process Step Description datasetfieldtype.processStep.description=Description of the processes performed on the data. datasetfieldtype.processStep.watermark= datasetfieldtype.referenceSystemInfo.title=Reference System Information -datasetfieldtype.referenceSystemInfo.description= +datasetfieldtype.referenceSystemInfo.description=Description of the spatial and temporal reference systems used in the resource. datasetfieldtype.referenceSystemInfo.watermark= datasetfieldtype.referenceSystemCode.title=Code datasetfieldtype.referenceSystemCode.description=Alphanumeric value identifying the source reference system. @@ -95,29 +89,29 @@ datasetfieldtype.protocol.title=Protocol datasetfieldtype.protocol.description=The service or transfer protocol associated with the distribution link URL datasetfieldtype.protocol.watermark=The service or transfer protocol associated with the distribution link URL datasetfieldtype.vectorSpatialRepresentation.title=Vector Spatial Representation -datasetfieldtype.vectorSpatialRepresentation.description= +datasetfieldtype.vectorSpatialRepresentation.description=Information about vector spatial objects in the resource. datasetfieldtype.vectorSpatialRepresentation.watermark= datasetfieldtype.geometricObjectCount.title=Geometric Object Count datasetfieldtype.geometricObjectCount.description=Total number of point or vector objects in the dataset. datasetfieldtype.geometricObjectCount.watermark=Number of point or vector objects in the dataset. -datasetfieldtype.geometricObjectTypeCode.title=Geometric Object Type Code -datasetfieldtype.geometricObjectTypeCode.description=Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. -datasetfieldtype.geometricObjectTypeCode.watermark=Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. +datasetfieldtype.geometricObjectType.title=Geometric Object Type +datasetfieldtype.geometricObjectType.description=Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. +datasetfieldtype.geometricObjectType.watermark=Name of point or vector objects to locate zero, one, two or three dimensional locations on the dataset. datasetfieldtype.gridSpatialRepresentation.title=Raster Spatial Representation -datasetfieldtype.gridSpatialRepresentation.description= +datasetfieldtype.gridSpatialRepresentation.description=Information about grid (raster) spatial objects in the resource. datasetfieldtype.gridSpatialRepresentation.watermark= datasetfieldtype.numberOfDimensions.title=Number of Dimensions datasetfieldtype.numberOfDimensions.description=The number of independent spatio-temporal axes. datasetfieldtype.numberOfDimensions.watermark=The number of independent spatio-temporal axes. -datasetfieldtype.cellGeometryCode.title=Cell Geometry Code -datasetfieldtype.cellGeometryCode.description=Identification of grid data as point or cell. -datasetfieldtype.cellGeometryCode.watermark=Identification of grid data as point or cell. +datasetfieldtype.cellGeometry.title=Cell Geometry +datasetfieldtype.cellGeometry.description=Identification of grid data as point or cell. +datasetfieldtype.cellGeometry.watermark=Identification of grid data as point or cell. datasetfieldtype.axisDimensionProperties.title=Axis Dimension Properties -datasetfieldtype.axisDimensionProperties.description= +datasetfieldtype.axisDimensionProperties.description=Information about spatial-temporal axis properties (dimensions). datasetfieldtype.axisDimensionProperties.watermark= -datasetfieldtype.dimensionNameTypeCode.title=Name Type Code -datasetfieldtype.dimensionNameTypeCode.description=Axis name. -datasetfieldtype.dimensionNameTypeCode.watermark=Axis name. +datasetfieldtype.dimensionNameType.title=Name Type +datasetfieldtype.dimensionNameType.description=Axis name +datasetfieldtype.dimensionNameType.watermark=Axis name datasetfieldtype.dimensionSize.title=Size datasetfieldtype.dimensionSize.description=Number of elements along the axis. datasetfieldtype.dimensionSize.watermark=Number of elements along the axis. @@ -376,23 +370,23 @@ controlledvocabulary.country.yemen=Yemen controlledvocabulary.country.zambia=Zambia controlledvocabulary.country.zimbabwe=Zimbabwe controlledvocabulary.country.aland_islands=Åland Islands -controlledvocabulary.geometricObjectTypeCode.curve=curve -controlledvocabulary.geometricObjectTypeCode.composite=composite -controlledvocabulary.geometricObjectTypeCode.complex=complex -controlledvocabulary.geometricObjectTypeCode.point=point -controlledvocabulary.geometricObjectTypeCode.solid=solid -controlledvocabulary.geometricObjectTypeCode.surface=surface -controlledvocabulary.cellGeometryCode.point=point -controlledvocabulary.cellGeometryCode.area=area -controlledvocabulary.cellGeometryCode.voxel=voxel -controlledvocabulary.dimensionNameTypeCode.row=row -controlledvocabulary.dimensionNameTypeCode.column=column -controlledvocabulary.dimensionNameTypeCode.vertical=vertical -controlledvocabulary.dimensionNameTypeCode.track=track -controlledvocabulary.dimensionNameTypeCode.crosstrack=crossTrack -controlledvocabulary.dimensionNameTypeCode.line=line -controlledvocabulary.dimensionNameTypeCode.sample=sample -controlledvocabulary.dimensionNameTypeCode.time=time +controlledvocabulary.geometricObjectType.curve=curve +controlledvocabulary.geometricObjectType.composite=composite +controlledvocabulary.geometricObjectType.complex=complex +controlledvocabulary.geometricObjectType.point=point +controlledvocabulary.geometricObjectType.solid=solid +controlledvocabulary.geometricObjectType.surface=surface +controlledvocabulary.cellGeometry.point=point +controlledvocabulary.cellGeometry.area=area +controlledvocabulary.cellGeometry.voxel=voxel +controlledvocabulary.dimensionNameType.row=row +controlledvocabulary.dimensionNameType.column=column +controlledvocabulary.dimensionNameType.vertical=vertical +controlledvocabulary.dimensionNameType.track=track +controlledvocabulary.dimensionNameType.crosstrack=crossTrack +controlledvocabulary.dimensionNameType.line=line +controlledvocabulary.dimensionNameType.sample=sample +controlledvocabulary.dimensionNameType.time=time controlledvocabulary.spatialRepresentationType.stereomodel=stereoModel controlledvocabulary.spatialRepresentationType.video=video controlledvocabulary.spatialRepresentationType.tin=tin @@ -401,20 +395,20 @@ controlledvocabulary.spatialRepresentationType.grid=grid controlledvocabulary.spatialRepresentationType.vector=vector controlledvocabulary.dataQualityScope.dataset=dataset controlledvocabulary.dataQualityScope.service=service -controlledvocabulary.geoResourceType.dataset=dataset -controlledvocabulary.geoResourceType.service=service -controlledvocabulary.geoResourceType.series=series -controlledvocabulary.geoReferenceDateType.revision=revision -controlledvocabulary.geoReferenceDateType.expiry=expiry -controlledvocabulary.geoReferenceDateType.lastupdate=lastUpdate -controlledvocabulary.geoReferenceDateType.lastrevision=lastRevision -controlledvocabulary.geoReferenceDateType.nextupdate=nextUpdate -controlledvocabulary.geoReferenceDateType.unavailable=unavailable -controlledvocabulary.geoReferenceDateType.inforce=inForce -controlledvocabulary.geoReferenceDateType.adopted=adopted -controlledvocabulary.geoReferenceDateType.deprecated=deprecated -controlledvocabulary.geoReferenceDateType.superseded=superseded -controlledvocabulary.geoReferenceDateType.publication=publication +controlledvocabulary.resourceType.dataset=dataset +controlledvocabulary.resourceType.service=service +controlledvocabulary.resourceType.series=series +controlledvocabulary.referenceDateType.revision=revision +controlledvocabulary.referenceDateType.expiry=expiry +controlledvocabulary.referenceDateType.lastupdate=lastUpdate +controlledvocabulary.referenceDateType.lastrevision=lastRevision +controlledvocabulary.referenceDateType.nextupdate=nextUpdate +controlledvocabulary.referenceDateType.unavailable=unavailable +controlledvocabulary.referenceDateType.inforce=inForce +controlledvocabulary.referenceDateType.adopted=adopted +controlledvocabulary.referenceDateType.deprecated=deprecated +controlledvocabulary.referenceDateType.superseded=superseded +controlledvocabulary.referenceDateType.publication=publication controlledvocabulary.spatialResolutionType.equivalentscale=equivalentScale controlledvocabulary.spatialResolutionType.distance=distance controlledvocabulary.spatialResolutionType.vertical=vertical From d8920e1182e584fbe815a7aea89a4b39ff5bdc44 Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Thu, 4 Sep 2025 20:28:39 -0400 Subject: [PATCH 020/507] integration tests --- src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java | 2 +- src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java index 17182c84854..c0069acb458 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java @@ -499,7 +499,7 @@ public void testUpdateDatasetTypeLinksWithMetadataBlocks() { .body("data[0].name", is("citation")) .body("data[1].name", is("geospatial")) .body("data[0].fields.size()", is(35)) - .body("data[1].fields.size()", is(21)); + .body("data[1].fields.size()", is(19)); System.out.println("listing " + dataverseAlias + " collection blocks and inner dataset field types, with display on create and return dataset field types set to true using dataset type " + randomName); listBlocks = UtilIT.listMetadataBlocks(dataverseAlias, true, true, randomName, apiToken); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index a36f964c7b7..95173e2d226 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -1039,7 +1039,7 @@ public void testListMetadataBlocks() { // Since the included property of geographicCoverage is set to false, we should retrieve the total number of fields minus one listMetadataBlocksResponse.then().assertThat() - .body(String.format("data[%d].fields.size()", geospatialMetadataBlockIndex), equalTo(20)); + .body(String.format("data[%d].fields.size()", geospatialMetadataBlockIndex), equalTo(18)); listMetadataBlocksResponse = UtilIT.getMetadataBlock("geospatial"); String actualGeospatialMetadataField1 = listMetadataBlocksResponse.then().extract().path(String.format("data.fields['geographicCoverage'].name")); From 2302973bcf7d4b720f8c354f8e1b8c84627a803a Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Wed, 15 Oct 2025 13:15:29 -0400 Subject: [PATCH 021/507] change to reolution --- conf/solr/schema.xml | 4 ++-- .../api/data/metadatablocks/geospatial.tsv | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/conf/solr/schema.xml b/conf/solr/schema.xml index cb1b4b0f552..adbcb5d4cd6 100644 --- a/conf/solr/schema.xml +++ b/conf/solr/schema.xml @@ -406,7 +406,7 @@ - + @@ -432,7 +432,7 @@ - + diff --git a/scripts/api/data/metadatablocks/geospatial.tsv b/scripts/api/data/metadatablocks/geospatial.tsv index e634bc01e91..45745a6f2e7 100644 --- a/scripts/api/data/metadatablocks/geospatial.tsv +++ b/scripts/api/data/metadatablocks/geospatial.tsv @@ -1,13 +1,13 @@ #metadataBlock name dataverseAlias displayName geospatial Geospatial Metadata -#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id +#datasetField name title description watermark fieldType display order displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id geographicCoverage Geographic Coverage Information on the geographic coverage of the data. Includes the total geographic scope of the data. none 0 FALSE FALSE TRUE FALSE FALSE FALSE geospatial - country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE FALSE FALSE geographicCoverage geospatial - state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial - city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial - otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 #VALUE, FALSE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial + country Country / Nation The country or nation that the Dataset is about. text 1 #VALUE, TRUE TRUE FALSE TRUE FALSE FALSE geographicCoverage geospatial + state State / Province The state or province that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 2 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial + city City The name of the city that the Dataset is about. Use GeoNames for correct spelling and avoid abbreviations. text 3 #VALUE, TRUE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial + otherGeographicCoverage Other Other information on the geographic coverage of the data. text 4 #VALUE, FALSE FALSE FALSE TRUE FALSE FALSE geographicCoverage geospatial geographicUnit Geographic Unit Lowest level of geographic aggregation covered by the Dataset, e.g., village, county, region. text 5 TRUE FALSE TRUE TRUE FALSE FALSE geospatial - geographicBoundingBox Geographic Bounding Box The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. none 6 FALSE FALSE TRUE FALSE FALSE FALSE geospatial + geographicBoundingBox Geographic Bounding Box The fundamental geometric description for any Dataset that models geography is the geographic bounding box. It describes the minimum box, defined by west and east longitudes and north and south latitudes, which includes the largest geographic extent of the Dataset's geographic coverage. This element is used in the first pass of a coordinate-based search. Inclusion of this element in the codebook is recommended, but is required if the bound polygon box is included. none 6 FALSE FALSE TRUE FALSE FALSE FALSE geospatial westLongitude Westernmost (Left) Longitude Westernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= West Bounding Longitude Value <= 180.0. text 7 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial eastLongitude Easternmost (Right) Longitude Easternmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -180.0 <= East Bounding Longitude Value <= 180.0. text 8 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial northLatitude Northernmost (Top) Latitude Northernmost coordinate delimiting the geographic extent of the Dataset. A valid range of values, expressed in decimal degrees, is -90.0 <= North Bounding Latitude Value <= 90.0. text 9 FALSE FALSE FALSE FALSE FALSE FALSE geographicBoundingBox geospatial @@ -23,7 +23,7 @@ referenceSystemCode Code Alphanumeric value identifying the source reference system. Alphanumeric value identifying the source reference system. text 19 #VALUE FALSE FALSE FALSE TRUE FALSE FALSE referenceSystemInfo geospatial referenceSystemCodeSpace Code Space Identifier/ namespace of the system in which the code is valid. Identifier/ namespace of the system in which the code is valid. text 20 (#VALUE) FALSE FALSE FALSE FALSE FALSE FALSE referenceSystemInfo geospatial spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 21 FALSE FALSE TRUE FALSE FALSE FALSE geospatial - spatialResolutionValue Value Level of detail expressed as a scale factor, a distance or an angle Level of detail expressed as a scale factor, a distance or an angle int 22 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE spatialResolution geospatial + spatialResolutionValue Value Level of detail expressed as a scale factor, a distance or an angle Level of detail expressed as a scale factor, a distance or an angle text 22 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE spatialResolution geospatial spatialResolutionType Type distance, vertical, angularDistance, levelOfDetail distance, vertical, angularDistance, levelOfDetail text 23 (#VALUE) FALSE TRUE FALSE TRUE FALSE FALSE spatialResolution geospatial spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic (spatial) information. text 24 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial vectorSpatialRepresentation Vector Spatial Representation Information about vector spatial objects in the resource. none 25 FALSE FALSE FALSE FALSE FALSE FALSE geospatial @@ -35,7 +35,7 @@ axisDimensionProperties Axis Dimension Properties Information about spatial-temporal axis properties (dimensions). none 31 FALSE FALSE TRUE FALSE FALSE FALSE geospatial dimensionNameType Name Type Axis name. Axis name. text 32 #VALUE FALSE TRUE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial dimensionSize Size Number of elements along the axis. Number of elements along the axis. int 33 FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial - resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. int 34 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial + resolution Resolution Degree of detail in the grid dataset. Degree of detail in the grid dataset. float 34 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial resolutionUnitOfMeasure Resolution Unit of Measure Resolution unit of measure (e.g. 'cm', 'm', 'km', etc.) Resolution unit of measure (e.g. 'm', 'km', etc.) text 35 (#VALUE) FALSE FALSE FALSE FALSE FALSE FALSE axisDimensionProperties geospatial distribution Distribution Link Distribution Links none 36 TRUE FALSE TRUE FALSE FALSE FALSE geospatial distributionLinkLabel Label A descriptive label for the distribution link A descriptive label for the distribution link text 37 #VALUE TRUE FALSE FALSE FALSE FALSE FALSE distribution geospatial @@ -145,7 +145,7 @@ country Iceland 100 country India 101 INDIA country Indonesia 102 Sumatra - country Iran, Islamic Republic of 103 Iran Iran (Islamic Republic of) + country Iran, Islamic Republic of 103 Iran country Iraq 104 IRAQ country Ireland 105 country Isle of Man 106 @@ -276,7 +276,7 @@ country Ukraine 231 country United Arab Emirates 232 UAE country United Kingdom 233 - country United States 234 U.S.A USA United States of America U.S.A. + country United States 234 U.S.A United States of America U.S.A. country United States Minor Outlying Islands 235 country Uruguay 236 country Uzbekistan 237 @@ -290,7 +290,7 @@ country Yemen 245 YEMEN country Zambia 246 country Zimbabwe 247 - country Åland Islands 248 + country Åland Islands 248 geometricObjectType curve curve 0 geometricObjectType composite composite 1 geometricObjectType complex complex 2 @@ -332,4 +332,4 @@ spatialResolutionType distance distance 1 spatialResolutionType vertical vertical 2 spatialResolutionType angularDistance angularDistance 3 - spatialResolutionType levelOfDetail levelOfDetail 4 \ No newline at end of file + spatialResolutionType levelOfDetail levelOfDetail 4 \ No newline at end of file From b425f76fef93f1bdab6a9286022c2d98131932c7 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Wed, 22 Oct 2025 17:32:43 +0200 Subject: [PATCH 022/507] feat: let APIs return more info about role assignments --- .../edu/harvard/iq/dataverse/DvObject.java | 2 ++ .../iq/dataverse/util/json/JsonPrinter.java | 33 ++++++++++++++----- .../util/json/JsonPrinterHelper.java | 11 ++++--- .../dataverse/util/json/JsonPrinterTest.java | 17 ++++++++-- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObject.java b/src/main/java/edu/harvard/iq/dataverse/DvObject.java index 68ff739a77f..f8d031b8b4a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObject.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObject.java @@ -140,6 +140,8 @@ public String visit(DataFile df) { @Column(insertable = false, updatable = false) private String dtype; + public String getDtype() { return dtype; } + @OneToMany(mappedBy="dvobject",fetch = FetchType.LAZY,cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) private List dataverseFeaturedItems; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 8b0ea201aa3..802bb23d2a1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -84,18 +84,23 @@ public class JsonPrinter { @EJB static InAppNotificationsJsonPrinter inAppNotificationsJsonPrinter; + + @EJB + static RoleAssigneeServiceBean roleAssigneeService; public static void injectSettingsService(SettingsServiceBean ssb, DatasetFieldServiceBean dfsb, DataverseFieldTypeInputLevelServiceBean dfils, DatasetServiceBean ds, MailServiceBean ms, - InAppNotificationsJsonPrinter njp) { + InAppNotificationsJsonPrinter njp, + RoleAssigneeServiceBean ras) { settingsService = ssb; datasetFieldService = dfsb; datasetService = ds; mailService = ms; inAppNotificationsJsonPrinter = njp; + roleAssigneeService = ras; } public JsonPrinter() { @@ -150,14 +155,24 @@ public static JsonArrayBuilder jsonRoleAssignments(List roleAssi } public static JsonObjectBuilder json(RoleAssignment ra) { - return jsonObjectBuilder() - .add("id", ra.getId()) - .add("assignee", ra.getAssigneeIdentifier()) - .add("roleId", ra.getRole().getId()) - .add("roleName", ra.getRole().getName()) - .add("_roleAlias", ra.getRole().getAlias()) - .add("privateUrlToken", ra.getPrivateUrlToken()) - .add("definitionPointId", ra.getDefinitionPoint().getId()); + JsonObjectBuilder job = jsonObjectBuilder() + .add("id", ra.getId()) + .add("assignee", ra.getAssigneeIdentifier()) + .add("assigneeName", roleAssigneeService.getRoleAssignee(ra.getAssigneeIdentifier()).getDisplayInfo().getTitle()) + .add("roleId", ra.getRole().getId()) + .add("roleName", ra.getRole().getName()) + .add("roleDescription", ra.getRole().getDescription()) + .add("_roleAlias", ra.getRole().getAlias()) + .add("privateUrlToken", ra.getPrivateUrlToken()) + .add("definitionPointId", ra.getDefinitionPoint().getId()) + .add("definitionPointName", ra.getDefinitionPoint().getDisplayName()) + .add("definitionPointType", ra.getDefinitionPoint().getDtype()); + + if (ra.getDefinitionPoint().getGlobalId() != null) { + job.add("definitionPointGlobalId", ra.getDefinitionPoint().getGlobalId().toString()); + } + + return job; } public static JsonArrayBuilder json(Set permissions) { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinterHelper.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinterHelper.java index a9a05f1b699..5b75f41ad00 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinterHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinterHelper.java @@ -1,9 +1,6 @@ package edu.harvard.iq.dataverse.util.json; -import edu.harvard.iq.dataverse.DatasetFieldServiceBean; -import edu.harvard.iq.dataverse.DatasetServiceBean; -import edu.harvard.iq.dataverse.DataverseFieldTypeInputLevelServiceBean; -import edu.harvard.iq.dataverse.MailServiceBean; +import edu.harvard.iq.dataverse.*; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import jakarta.annotation.PostConstruct; @@ -37,6 +34,9 @@ public class JsonPrinterHelper { @EJB InAppNotificationsJsonPrinter inAppNotificationsJsonPrinter; + @EJB + RoleAssigneeServiceBean roleAssigneeService; + @PostConstruct public void injectService() { JsonPrinter.injectSettingsService( @@ -45,7 +45,8 @@ public void injectService() { datasetFieldInpuLevelSvc, datasetSvc, mailSvc, - inAppNotificationsJsonPrinter + inAppNotificationsJsonPrinter, + roleAssigneeService ); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java index c17529fb6ac..56e4b017fc4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java @@ -105,6 +105,7 @@ public void setUp() { @Test public void testJson_RoleAssignment() { + JsonPrinter.injectSettingsService(null, null, null, null, null, null, new MockRoleAssigneeService()); DataverseRole aRole = new DataverseRole(); PrivateUrlUser privateUrlUserIn = new PrivateUrlUser(42); RoleAssignee anAssignee = privateUrlUserIn; @@ -122,6 +123,7 @@ public void testJson_RoleAssignment() { @Test public void testJson_PrivateUrl() { + JsonPrinter.injectSettingsService(null, null, null, null, null, null, new MockRoleAssigneeService()); DataverseRole aRole = new DataverseRole(); PrivateUrlUser privateUrlUserIn = new PrivateUrlUser(42); RoleAssignee anAssignee = privateUrlUserIn; @@ -205,7 +207,7 @@ public void testDatasetContactOutOfBoxNoPrivacy() { datasetContactField.setDatasetFieldCompoundValues(vals); fields.add(datasetContactField); - JsonPrinter.injectSettingsService(null, null, null, null, null, null); + JsonPrinter.injectSettingsService(null, null, null, null, null, null, null); JsonObject jsonObject = JsonPrinter.json(block, fields).build(); assertNotNull(jsonObject); @@ -246,7 +248,7 @@ public void testDatasetContactWithPrivacy() { datasetContactField.setDatasetFieldCompoundValues(vals); fields.add(datasetContactField); - JsonPrinter.injectSettingsService(new MockSettingsSvc(), null, null, null, null, null); + JsonPrinter.injectSettingsService(new MockSettingsSvc(), null, null, null, null, null, null); JsonObject jsonObject = JsonPrinter.json(block, fields).build(); assertNotNull(jsonObject); @@ -296,7 +298,7 @@ public void testDatasetFieldTypesWithChildren() { block.setDatasetFieldTypes(datasetFieldTypes); - JsonPrinter.injectSettingsService(new MockSettingsSvc(), null, null ,null, null, null); + JsonPrinter.injectSettingsService(new MockSettingsSvc(), null, null ,null, null, null, null); JsonObject jsonObject = JsonPrinter.json(block).build(); assertNotNull(jsonObject); @@ -361,6 +363,15 @@ public boolean isTrueForKey(SettingsServiceBean.Key key, boolean defaultValue) { } + private static class MockRoleAssigneeService extends RoleAssigneeServiceBean { + + @Override + public RoleAssignee getRoleAssignee(String identifier) { + return new PrivateUrlUser(42); + } + + } + @Test public void testEnum() throws JsonParseException { JsonArrayBuilder arr = JsonPrinter.enumsToJson(Arrays.asList(Type.REVOKEROLE, Type.ASSIGNROLE)); From 2c1c64b7c471edc4b335f9f421282d16be3f348e Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Wed, 22 Oct 2025 17:46:04 +0200 Subject: [PATCH 023/507] docs: add release note for #11920 --- doc/release-notes/11920-more-ra-info.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/release-notes/11920-more-ra-info.md diff --git a/doc/release-notes/11920-more-ra-info.md b/doc/release-notes/11920-more-ra-info.md new file mode 100644 index 00000000000..7ef12e06fea --- /dev/null +++ b/doc/release-notes/11920-more-ra-info.md @@ -0,0 +1 @@ +All API endpoints that return information about role assignments (such as `/api/dataverses/$ID/assignments`) now include additional fields in their JSON responses: `assigneeName`, `roleDescription`, `definitionPointName`, `definitionPointType`, and `definitionPointGlobalId` (if available). \ No newline at end of file From ae5a7abdbe200662c0b834b7026debc2e472fe30 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Wed, 22 Oct 2025 17:46:33 +0200 Subject: [PATCH 024/507] fix: fix style error in DvObject.java --- src/main/java/edu/harvard/iq/dataverse/DvObject.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObject.java b/src/main/java/edu/harvard/iq/dataverse/DvObject.java index f8d031b8b4a..f9f35cedc80 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObject.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObject.java @@ -140,7 +140,9 @@ public String visit(DataFile df) { @Column(insertable = false, updatable = false) private String dtype; - public String getDtype() { return dtype; } + public String getDtype() { + return dtype; + } @OneToMany(mappedBy="dvobject",fetch = FetchType.LAZY,cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) private List dataverseFeaturedItems; From 92af4780d2c26d6ca8b9a85d3c4587200cb50679 Mon Sep 17 00:00:00 2001 From: Victoria Lubitch Date: Thu, 23 Oct 2025 18:05:59 -0400 Subject: [PATCH 025/507] update geo block --- conf/solr/schema.xml | 2 ++ scripts/api/data/metadatablocks/geospatial.tsv | 1 + src/main/java/propertyFiles/geospatial.properties | 3 +++ 3 files changed, 6 insertions(+) diff --git a/conf/solr/schema.xml b/conf/solr/schema.xml index adbcb5d4cd6..b45e60477ae 100644 --- a/conf/solr/schema.xml +++ b/conf/solr/schema.xml @@ -433,6 +433,7 @@ + @@ -719,6 +720,7 @@ + diff --git a/scripts/api/data/metadatablocks/geospatial.tsv b/scripts/api/data/metadatablocks/geospatial.tsv index 45745a6f2e7..29cdab99136 100644 --- a/scripts/api/data/metadatablocks/geospatial.tsv +++ b/scripts/api/data/metadatablocks/geospatial.tsv @@ -25,6 +25,7 @@ spatialResolution Spatial Resolution Factor which provides a general understanding of the density of spatial data in the resource or describes the range of resolutions in which a digital resource may be used. NOTE: This element should be repeated when describing upper and lower range. none 21 FALSE FALSE TRUE FALSE FALSE FALSE geospatial spatialResolutionValue Value Level of detail expressed as a scale factor, a distance or an angle Level of detail expressed as a scale factor, a distance or an angle text 22 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE spatialResolution geospatial spatialResolutionType Type distance, vertical, angularDistance, levelOfDetail distance, vertical, angularDistance, levelOfDetail text 23 (#VALUE) FALSE TRUE FALSE TRUE FALSE FALSE spatialResolution geospatial + spatialResolutionUnitOfMeasure Spatial Resolution Unit of Measure Spatial resolution unit of measure (e.g. 'cm', 'm', 'km', etc.) Resolution unit of measure (e.g. 'm', 'km', etc.) text 40 (#VALUE) FALSE FALSE FALSE FALSE FALSE FALSE spatialResolution geospatial spatialRepresentationType Spatial Representation Type Object(s) used to represent the geographic (spatial) information. text 24 #VALUE TRUE TRUE FALSE TRUE FALSE FALSE geospatial vectorSpatialRepresentation Vector Spatial Representation Information about vector spatial objects in the resource. none 25 FALSE FALSE FALSE FALSE FALSE FALSE geospatial geometricObjectCount Geometric Object Count Total number of point or vector objects in the dataset. Number of point or vector objects in the dataset int 26 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE geospatial diff --git a/src/main/java/propertyFiles/geospatial.properties b/src/main/java/propertyFiles/geospatial.properties index 1f50a491907..4d25a097ee3 100644 --- a/src/main/java/propertyFiles/geospatial.properties +++ b/src/main/java/propertyFiles/geospatial.properties @@ -76,6 +76,9 @@ datasetfieldtype.spatialResolutionType.watermark=distance, vertical, angularDist datasetfieldtype.spatialRepresentationType.title=Spatial Representation Type datasetfieldtype.spatialRepresentationType.description=Object(s) used to represent the geographic information. datasetfieldtype.spatialRepresentationType.watermark= +datasetfieldtype.spatialResolutionUnitOfMeasure.title=Spatial Resolution Unit of Measure +datasetfieldtype.spatialResolutionUnitOfMeasure.description=Spatial Resolution unit of measure (e.g. 'm', 'km', etc.) +datasetfieldtype.spatialResolutionUnitOfMeasure.watermark=Spatial Resolution unit of measure (e.g. 'm', 'km', etc.) datasetfieldtype.distribution.title=Distribution Link datasetfieldtype.distribution.description=Distribution Links datasetfieldtype.distribution.watermark= From c830614e7d9373158a171591296908363388421e Mon Sep 17 00:00:00 2001 From: Eryk Kullikowski Date: Tue, 4 Nov 2025 11:33:16 +0100 Subject: [PATCH 026/507] BugFix: controlled vocab values validation --- .../harvard/iq/dataverse/DatasetVersion.java | 14 +++-- .../DatasetVersionValidationTest.java | 55 +++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 src/test/java/edu/harvard/iq/dataverse/DatasetVersionValidationTest.java diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index cfd4c886bf3..52c5224f886 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -1788,11 +1788,18 @@ private void removeEmptyValues() { private void removeEmptyValues(DatasetField dsf) { if (dsf.getDatasetFieldType().isPrimitive()) { // primitive + final boolean isControlledVocabulary = dsf.getDatasetFieldType().isControlledVocabulary(); final Iterator i = dsf.getDatasetFieldValues().iterator(); while (i.hasNext()) { - final String v = i.next().getValue(); + final DatasetFieldValue fieldValue = i.next(); + final String v = fieldValue.getValue(); if (StringUtils.isBlank(v) || DatasetField.NA_VALUE.equals(v)) { i.remove(); + continue; + } + if (isControlledVocabulary && dsf.getDatasetFieldType().getControlledVocabularyValue(v) == null) { + // Drop placeholders that never matched an allowed vocabulary value. + i.remove(); } } } else { @@ -1800,9 +1807,8 @@ private void removeEmptyValues(DatasetField dsf) { } } - public Set validate() { - Set returnSet = new HashSet<>(); - + public Set> validate() { + Set> returnSet = new HashSet<>(); for (DatasetField dsf : this.getFlatDatasetFields()) { dsf.setValidationMessage(null); // clear out any existing validation message diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetVersionValidationTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetVersionValidationTest.java new file mode 100644 index 00000000000..74ccb44d9ad --- /dev/null +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetVersionValidationTest.java @@ -0,0 +1,55 @@ +package edu.harvard.iq.dataverse; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertFalse; + +class DatasetVersionValidationTest { + + @Test + void requiredControlledVocabularyWithEmptyValueRemainsInvalid() { + DatasetFieldType subjectType = new DatasetFieldType(); + subjectType.setName("subject"); + subjectType.setAllowControlledVocabulary(true); + subjectType.setRequired(true); + subjectType.setAllowMultiples(false); + subjectType.setFieldType(DatasetFieldType.FieldType.TEXT); + subjectType.setControlledVocabularyValues(new ArrayList<>()); + subjectType.setChildDatasetFieldTypes(new ArrayList<>()); + + MetadataBlock citation = new MetadataBlock(); + citation.setName("citation"); + citation.setDisplayName("Citation"); + citation.setDatasetFieldTypes(List.of(subjectType)); + subjectType.setMetadataBlock(citation); + + Dataverse dataverse = new Dataverse(); + dataverse.setMetadataBlockRoot(true); + dataverse.setMetadataBlocks(List.of(citation)); + + Dataset dataset = new Dataset(); + dataset.setOwner(dataverse); + + DatasetVersion version = new DatasetVersion(); + version.setVersionState(DatasetVersion.VersionState.DRAFT); + version.setDataset(dataset); + dataset.getVersions().add(version); + + DatasetField subjectField = new DatasetField(); + subjectField.setDatasetFieldType(subjectType); + subjectField.setDatasetFieldValues(new ArrayList<>()); + subjectField.setControlledVocabularyValues(new ArrayList<>()); + + DatasetFieldValue orphanValue = new DatasetFieldValue(subjectField); + orphanValue.setValue("__placeholder__"); + subjectField.getDatasetFieldValues().add(orphanValue); + + version.setDatasetFields(new ArrayList<>(List.of(subjectField))); + + assertFalse(version.isValid(), + "Controlled vocabulary fields without a selected term should keep dataset version invalid"); + } +} From 6d4e043ce90e57bb2a1c3c97119e323c0ef0e8c0 Mon Sep 17 00:00:00 2001 From: Eryk Kullikowski Date: Tue, 4 Nov 2025 13:14:21 +0100 Subject: [PATCH 027/507] fixed build issue --- src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 52c5224f886..4d2d9e00472 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -1807,8 +1807,8 @@ private void removeEmptyValues(DatasetField dsf) { } } - public Set> validate() { - Set> returnSet = new HashSet<>(); + public Set validate() { + Set returnSet = new HashSet<>(); for (DatasetField dsf : this.getFlatDatasetFields()) { dsf.setValidationMessage(null); // clear out any existing validation message From 2a939ff1216901087e94664b93b43057e8565742 Mon Sep 17 00:00:00 2001 From: Eryk Kullikowski Date: Tue, 4 Nov 2025 13:49:06 +0100 Subject: [PATCH 028/507] Improved the detection of incomplete metadata when saving a dataset in UI (JSF) --- src/main/java/edu/harvard/iq/dataverse/DatasetPage.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index b41e8d4ac35..19adcbc35ec 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -3981,8 +3981,7 @@ public String save() { dataset.setOwner(ownerId != null ? dataverseService.find(ownerId) : null); } // Validate - Set constraintViolations = workingVersion.validate(); - if (!constraintViolations.isEmpty()) { + if (!workingVersion.isValid()) { FacesContext.getCurrentInstance().validationFailed(); return ""; } From 751e56dff7ea8f8046ddd70f7c0101f41ce0bed0 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 6 Nov 2025 13:41:49 -0500 Subject: [PATCH 029/507] new table for LF assignments --- .../edu/harvard/iq/dataverse/Dataverse.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java index 98f52b705a8..3484d0621fb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java @@ -15,7 +15,9 @@ import java.util.Objects; import java.util.Set; import jakarta.persistence.CascadeType; +import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; @@ -105,7 +107,39 @@ public enum DataverseType { @NotNull(message = "{dataverse.category}") @Column( nullable = false ) private DataverseType dataverseType; - + + + @ElementCollection + @CollectionTable(name = "dataverse_locallyfairassignees", + joinColumns = @JoinColumn(name = "dataverse_id")) + @Column(name = "assigneeidentifier") + private Set locallyFAIRRoleAssigneeIdentifiers = new HashSet<>(); + + public Set getRoleAssigneeIdentifiers() { + return locallyFAIRRoleAssigneeIdentifiers; + } + + public void setRoleAssigneeIdentifiers(Set roleAssigneeIdentifiers) { + this.locallyFAIRRoleAssigneeIdentifiers = roleAssigneeIdentifiers; + } + + public void addRoleAssignee(String assigneeIdentifier) { + if (locallyFAIRRoleAssigneeIdentifiers == null) { + locallyFAIRRoleAssigneeIdentifiers = new HashSet<>(); + } + locallyFAIRRoleAssigneeIdentifiers.add(assigneeIdentifier); + } + + public void removeRoleAssignee(String assigneeIdentifier) { + if (locallyFAIRRoleAssigneeIdentifiers != null) { + locallyFAIRRoleAssigneeIdentifiers.remove(assigneeIdentifier); + } + } + + public boolean hasRoleAssignee(String assigneeIdentifier) { + return locallyFAIRRoleAssigneeIdentifiers != null && locallyFAIRRoleAssigneeIdentifiers.contains(assigneeIdentifier); + } + /** * When {@code true}, users are not granted permissions the got for parent * dataverses. From 12a2c9e55b5e48536a865273b155ee568b4c7595 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 6 Nov 2025 13:44:23 -0500 Subject: [PATCH 030/507] update method names --- src/main/java/edu/harvard/iq/dataverse/Dataverse.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java index 3484d0621fb..00c8ee92be1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java @@ -115,28 +115,28 @@ public enum DataverseType { @Column(name = "assigneeidentifier") private Set locallyFAIRRoleAssigneeIdentifiers = new HashSet<>(); - public Set getRoleAssigneeIdentifiers() { + public Set getLocallyFAIRRoleAssigneeIdentifiers() { return locallyFAIRRoleAssigneeIdentifiers; } - public void setRoleAssigneeIdentifiers(Set roleAssigneeIdentifiers) { + public void setLocallyFAIRRoleAssigneeIdentifiers(Set roleAssigneeIdentifiers) { this.locallyFAIRRoleAssigneeIdentifiers = roleAssigneeIdentifiers; } - public void addRoleAssignee(String assigneeIdentifier) { + public void addLocallyFAIRRoleAssignee(String assigneeIdentifier) { if (locallyFAIRRoleAssigneeIdentifiers == null) { locallyFAIRRoleAssigneeIdentifiers = new HashSet<>(); } locallyFAIRRoleAssigneeIdentifiers.add(assigneeIdentifier); } - public void removeRoleAssignee(String assigneeIdentifier) { + public void removeLocallyFAIRRoleAssignee(String assigneeIdentifier) { if (locallyFAIRRoleAssigneeIdentifiers != null) { locallyFAIRRoleAssigneeIdentifiers.remove(assigneeIdentifier); } } - public boolean hasRoleAssignee(String assigneeIdentifier) { + public boolean LocallyFAIR(String assigneeIdentifier) { return locallyFAIRRoleAssigneeIdentifiers != null && locallyFAIRRoleAssigneeIdentifiers.contains(assigneeIdentifier); } From e77c84d0b0fd4f7e84c7f9570e149736d512964e Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 6 Nov 2025 14:06:59 -0500 Subject: [PATCH 031/507] add LF assignees to perms doc used when dataverse.feature.add-publicobject-solr-field is not set --- .../iq/dataverse/search/IndexServiceBean.java | 11 ++-------- .../search/SearchPermissionsServiceBean.java | 18 +++++++++++++--- .../search/SolrIndexServiceBean.java | 21 ++++++++++++++++--- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java index 63ae3625a96..cc07701f566 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java @@ -69,7 +69,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; @@ -112,8 +111,6 @@ import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.sax.BodyContentHandler; -import org.eclipse.microprofile.config.Config; -import org.eclipse.microprofile.config.ConfigProvider; import org.eclipse.microprofile.metrics.MetricUnits; import org.eclipse.microprofile.metrics.Timer; import org.eclipse.microprofile.metrics.annotation.Metric; @@ -124,7 +121,6 @@ public class IndexServiceBean { private static final Logger logger = Logger.getLogger(IndexServiceBean.class.getCanonicalName()); - private static final Config config = ConfigProvider.getConfig(); @PersistenceContext(unitName = "VDCNet-ejbPU") private EntityManager em; @@ -176,7 +172,6 @@ public class IndexServiceBean { public static final String discoverabilityPermissionSuffix = "_permission"; private static final String groupPrefix = "group_"; private static final String groupPerUserPrefix = "group_user"; - private static final String publicGroupIdString = "public"; private static final String publicGroupString = groupPrefix + "public"; public static final String PUBLISHED_STRING = "Published"; private static final String UNPUBLISHED_STRING = "Unpublished"; @@ -186,8 +181,6 @@ public class IndexServiceBean { public static final String HARVESTED = "Harvested"; private Dataverse rootDataverseCached; - private VariableMetadataUtil variableMetadataUtil; - @TransactionAttribute(REQUIRES_NEW) public Future indexDataverseInNewTransaction(Dataverse dataverse) throws SolrServerException, IOException{ return indexDataverse(dataverse, false); @@ -2124,7 +2117,7 @@ private void updatePathForExistingSolrDocs(DvObject object) throws SolrServerExc sid.removeField(SearchFields.SUBTREE); sid.addField(SearchFields.SUBTREE, paths); - UpdateResponse addResponse = solrClientIndexService.getSolrClient().add(sid); + solrClientIndexService.getSolrClient().add(sid); if (object.isInstanceofDataset()) { for (DataFile df : dataset.getFiles()) { solrQuery.setQuery(SearchUtil.constructQuery(SearchFields.ENTITY_ID, df.getId().toString())); @@ -2137,7 +2130,7 @@ private void updatePathForExistingSolrDocs(DvObject object) throws SolrServerExc } sid.removeField(SearchFields.SUBTREE); sid.addField(SearchFields.SUBTREE, paths); - addResponse = solrClientIndexService.getSolrClient().add(sid); + solrClientIndexService.getSolrClient().add(sid); } } } diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java index c25a462efab..d8f84ba9571 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java @@ -21,6 +21,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Logger; import jakarta.ejb.EJB; import jakarta.ejb.Stateless; @@ -60,16 +61,27 @@ public class SearchPermissionsServiceBean { public List findDataversePerms(Dataverse dataverse) { List permStrings = new ArrayList<>(); if (hasBeenPublished(dataverse)) { - permStrings.add(IndexServiceBean.getPublicGroupString()); + Set raIds = dataverse.getLocallyFAIRRoleAssigneeIdentifiers(); + if (raIds.isEmpty()) { + permStrings.add(IndexServiceBean.getPublicGroupString()); + } else { + permStrings.addAll(raIds); + } } permStrings.addAll(findDvObjectPerms(dataverse)); return permStrings; } - + public List findDatasetVersionPerms(DatasetVersion version) { List perms = new ArrayList<>(); if (version.isReleased()) { - perms.add(IndexServiceBean.getPublicGroupString()); + Set raIds = version.getDataset().getOwner().getLocallyFAIRRoleAssigneeIdentifiers(); + if (raIds.isEmpty()) { + perms.add(IndexServiceBean.getPublicGroupString()); + } else { + perms.addAll(raIds); + } + } perms.addAll(findDvObjectPerms(version.getDataset())); diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java index aec352a615b..6bbeeb97f30 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java @@ -121,7 +121,12 @@ private List determineSolrDocsForFilesFromDataset(Map.Entry perms = new ArrayList<>(); if (dataverse.isReleased()) { - perms.add(IndexServiceBean.getPublicGroupString()); + Set raIds = dataverse.getLocallyFAIRRoleAssigneeIdentifiers(); + if (raIds.isEmpty()) { + perms.add(IndexServiceBean.getPublicGroupString()); + } else { + perms.addAll(raIds); + } } else { perms = searchPermissionsService.findDataversePerms(dataverse); } @@ -158,13 +163,18 @@ private DvObjectSolrDoc constructDatafileSolrDoc(DataFileProxy fileProxy, List constructDatafileSolrDocsFromDataset(Dataset dataset) { List datafileSolrDocs = new ArrayList<>(); + Set raIds = dataset.getOwner().getLocallyFAIRRoleAssigneeIdentifiers(); Map desiredCards = searchPermissionsService.getDesiredCards(dataset); for (DatasetVersion datasetVersionFileIsAttachedTo : datasetVersionsToBuildCardsFor(dataset)) { boolean cardShouldExist = desiredCards.get(datasetVersionFileIsAttachedTo.getVersionState()); if (cardShouldExist) { List perms = new ArrayList<>(); if (datasetVersionFileIsAttachedTo.isReleased()) { - perms.add(IndexServiceBean.getPublicGroupString()); + if (raIds.isEmpty()) { + perms.add(IndexServiceBean.getPublicGroupString()); + } else { + perms.addAll(raIds); + } } else { perms = searchPermissionsService.findDatasetVersionPerms(datasetVersionFileIsAttachedTo); } @@ -203,7 +213,12 @@ private DvObjectSolrDoc makeDatasetSolrDoc(DatasetVersion version) { String name = version.getTitle(); List perms = new ArrayList<>(); if (version.isReleased()) { - perms.add(IndexServiceBean.getPublicGroupString()); + Set raIds = version.getDataset().getOwner().getLocallyFAIRRoleAssigneeIdentifiers(); + if (raIds.isEmpty()) { + perms.add(IndexServiceBean.getPublicGroupString()); + } else { + perms.addAll(raIds); + } } else { perms = searchPermissionsService.findDatasetVersionPerms(version); } From 10d3c2cd7cd2a30c634e16bf1233778ef16f67be Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 6 Nov 2025 16:46:49 -0500 Subject: [PATCH 032/507] update to index correct user/group strings --- .../search/SearchPermissionsServiceBean.java | 47 ++++++++++++++++++- .../search/SolrIndexServiceBean.java | 15 ++++-- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java index d8f84ba9571..cb47779c96e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java @@ -65,7 +65,10 @@ public List findDataversePerms(Dataverse dataverse) { if (raIds.isEmpty()) { permStrings.add(IndexServiceBean.getPublicGroupString()); } else { - permStrings.addAll(raIds); + raIds.stream() + .map(this::convertToIndexableString) + .filter(s -> s != null) + .forEach(permStrings::add); } } permStrings.addAll(findDvObjectPerms(dataverse)); @@ -79,7 +82,10 @@ public List findDatasetVersionPerms(DatasetVersion version) { if (raIds.isEmpty()) { perms.add(IndexServiceBean.getPublicGroupString()); } else { - perms.addAll(raIds); + raIds.stream() + .map(this::convertToIndexableString) + .filter(s -> s != null) + .forEach(perms::add); } } @@ -193,5 +199,42 @@ private String getIndexableStringForUserOrGroup(RoleAssignee userOrGroup) { return null; } } + + +/** + * Converts a single role assignee identifier (e.g., "@john.doe", "&admins") to its + * indexable form for Solr (e.g., "user_1", "group_admins") w/o any db lookup for groups. + * + * @param identifier Identifier prefixed with @ (user) or & (group) + * @return Indexable string for Solr, or null if conversion fails + */ +public String convertToIndexableString(String identifier) { + if (identifier == null || identifier.isEmpty()) { + return null; + } + + char prefix = identifier.charAt(0); + String value = identifier.substring(1); + + if (prefix == '@') { + // User identifier - need to extract the numeric ID + // Format: @userIdentifier -> user_ + AuthenticatedUser user = authSvc.getAuthenticatedUser(value); + if (user != null) { + return IndexServiceBean.getGroupPerUserPrefix() + user.getId(); + } else { + logger.fine("Could not find user for identifier: " + identifier); + return null; + } + } else if (prefix == '&') { + // Group alias - can use directly + // Format: &groupAlias -> group_groupAlias + return IndexServiceBean.getGroupPrefix() + value; + } else { + logger.warning("Unknown role assignee identifier format: " + identifier); + return null; + } +} + } diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java index 6bbeeb97f30..4d1f9b9efdd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java @@ -125,7 +125,10 @@ private DvObjectSolrDoc constructDataverseSolrDoc(Dataverse dataverse) { if (raIds.isEmpty()) { perms.add(IndexServiceBean.getPublicGroupString()); } else { - perms.addAll(raIds); + raIds.stream() + .map(searchPermissionsService::convertToIndexableString) + .filter(s -> s != null) + .forEach(perms::add); } } else { perms = searchPermissionsService.findDataversePerms(dataverse); @@ -173,7 +176,10 @@ private List constructDatafileSolrDocsFromDataset(Dataset datas if (raIds.isEmpty()) { perms.add(IndexServiceBean.getPublicGroupString()); } else { - perms.addAll(raIds); + raIds.stream() + .map(searchPermissionsService::convertToIndexableString) + .filter(s -> s != null) + .forEach(perms::add); } } else { perms = searchPermissionsService.findDatasetVersionPerms(datasetVersionFileIsAttachedTo); @@ -217,7 +223,10 @@ private DvObjectSolrDoc makeDatasetSolrDoc(DatasetVersion version) { if (raIds.isEmpty()) { perms.add(IndexServiceBean.getPublicGroupString()); } else { - perms.addAll(raIds); + raIds.stream() + .map(searchPermissionsService::convertToIndexableString) + .filter(s -> s != null) + .forEach(perms::add); } } else { perms = searchPermissionsService.findDatasetVersionPerms(version); From 8cfa31bc66a4aa4861192d5928172d3e26060bb6 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 6 Nov 2025 17:07:05 -0500 Subject: [PATCH 033/507] allow people who can view unpublished to still see published items --- .../iq/dataverse/search/SearchPermissionsServiceBean.java | 4 ++++ .../harvard/iq/dataverse/search/SolrIndexServiceBean.java | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java index cb47779c96e..75b992eca10 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java @@ -69,6 +69,8 @@ public List findDataversePerms(Dataverse dataverse) { .map(this::convertToIndexableString) .filter(s -> s != null) .forEach(permStrings::add); + // And anyone who has permission to view the unpublished version + permStrings.addAll(findDvObjectPerms(dataverse)); } } permStrings.addAll(findDvObjectPerms(dataverse)); @@ -86,6 +88,8 @@ public List findDatasetVersionPerms(DatasetVersion version) { .map(this::convertToIndexableString) .filter(s -> s != null) .forEach(perms::add); + // And anyone who has permission to view the unpublished version + perms.addAll(findDvObjectPerms(version.getDataset())); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java index 4d1f9b9efdd..43bac303441 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java @@ -129,6 +129,8 @@ private DvObjectSolrDoc constructDataverseSolrDoc(Dataverse dataverse) { .map(searchPermissionsService::convertToIndexableString) .filter(s -> s != null) .forEach(perms::add); + // Also allow people who can view the unpublished dataverse + perms.addAll(searchPermissionsService.findDataversePerms(dataverse)); } } else { perms = searchPermissionsService.findDataversePerms(dataverse); @@ -180,6 +182,8 @@ private List constructDatafileSolrDocsFromDataset(Dataset datas .map(searchPermissionsService::convertToIndexableString) .filter(s -> s != null) .forEach(perms::add); + //Also allow people who can view the unpublished dataset + perms.addAll(searchPermissionsService.findDatasetVersionPerms(datasetVersionFileIsAttachedTo)); } } else { perms = searchPermissionsService.findDatasetVersionPerms(datasetVersionFileIsAttachedTo); @@ -227,6 +231,8 @@ private DvObjectSolrDoc makeDatasetSolrDoc(DatasetVersion version) { .map(searchPermissionsService::convertToIndexableString) .filter(s -> s != null) .forEach(perms::add); + // Also allow people who can view the unpublished dataset + perms.addAll(searchPermissionsService.findDatasetVersionPerms(version)); } } else { perms = searchPermissionsService.findDatasetVersionPerms(version); From e09c7f7a9691c60ae451ffb587ba1585891bad20 Mon Sep 17 00:00:00 2001 From: Eryk Kullikowski Date: Fri, 7 Nov 2025 12:37:42 +0100 Subject: [PATCH 034/507] Add fast-redeploy scripts for container-based development (#10156) Introduces three scripts for rapid iteration during Dataverse development: - dev-start-frd.sh: One-time setup with exploded WAR deployment - dev-frd.sh: Fast redeploy after code changes (~12s vs ~54s, 4.5x faster) - dev-down-frd.sh: Clean shutdown of dev environment Also adds docker-compose.override.yml to remove the 2GB memory limit which is insufficient for local development (set for GitHub Actions CI). The workflow complements existing IDE-based hot reload options and provides a fast feedback loop for CLI-based development. --- .../10156-fast-redeploy-scripts.md | 48 ++++++++++++ .../source/container/dev-usage.rst | 74 +++++++++++++++++++ docker-compose.override.yml | 12 +++ scripts/dev/dev-down-frd.sh | 19 +++++ scripts/dev/dev-frd.sh | 43 +++++++++++ scripts/dev/dev-start-frd.sh | 67 +++++++++++++++++ 6 files changed, 263 insertions(+) create mode 100644 doc/release-notes/10156-fast-redeploy-scripts.md create mode 100644 docker-compose.override.yml create mode 100755 scripts/dev/dev-down-frd.sh create mode 100755 scripts/dev/dev-frd.sh create mode 100755 scripts/dev/dev-start-frd.sh diff --git a/doc/release-notes/10156-fast-redeploy-scripts.md b/doc/release-notes/10156-fast-redeploy-scripts.md new file mode 100644 index 00000000000..28b65248745 --- /dev/null +++ b/doc/release-notes/10156-fast-redeploy-scripts.md @@ -0,0 +1,48 @@ +## Fast Redeploy Scripts for Container-Based Development + +Three new shell scripts in `scripts/dev/` enable fast iterative development for Dataverse contributors working with the container-based development environment: + +- **`dev-start-frd.sh`**: One-time setup to build and deploy an exploded WAR in the dev stack +- **`dev-frd.sh`**: Incremental recompile + redeploy (~12s vs. ~54s for full rebuilds, 4.5x faster) +- **`dev-down-frd.sh`**: Stop and remove dev containers + +This command-line workflow provides a fast feedback loop for developers who prefer CLI-based development or use lightweight editors like VS Code or Vim, complementing the existing IDE-based hot reload options (IntelliJ Ultimate, NetBeans). + +# New Scripts + +- **`dev-start-frd.sh`**: Initial setup (full build → exploded WAR → start containers) +- **`dev-frd.sh`**: Incremental recompile + redeploy (~12s vs. ~54s for traditional full rebuild workflow, 4.5x faster) +- **`dev-down-frd.sh`**: Clean shutdown of dev environment + +# New Files + +- **`docker-compose.override.yml`**: Removes the 2GB memory limit (set for GitHub Actions CI) which is insufficient for local development. Automatically used by the fast-redeploy scripts. + +# Key Features + +- No infrastructure changes (works with existing docker-compose-dev.yml) +- Optional workflow (doesn't affect other development approaches) +- Completes in ~12 seconds instead of ~54 seconds after code changes (4.5x faster) + +**Note:** Performance timings may vary depending on your hardware configuration. + +### Typical Workflow + +```bash +# One-time setup +./scripts/dev/dev-start-frd.sh + +# Make code changes... + +# Fast redeploy +./scripts/dev/dev-frd.sh + +# Repeat as needed + +# When finished +./scripts/dev/dev-down-frd.sh +``` + +### Documentation + +See the [Fast Redeploy (Command-Line)](https://guides.dataverse.org/en/latest/container/dev-usage.html#dev-fast-redeploy) section in the Container Guide for complete usage instructions and limitations. diff --git a/doc/sphinx-guides/source/container/dev-usage.rst b/doc/sphinx-guides/source/container/dev-usage.rst index a2a49b28259..93e3dcc60bf 100644 --- a/doc/sphinx-guides/source/container/dev-usage.rst +++ b/doc/sphinx-guides/source/container/dev-usage.rst @@ -403,6 +403,80 @@ The steps below describe options to enable the later in different IDEs. **IMPORTANT**: This tool uses a Bash shell script and is thus limited to Mac and Linux OS. +.. _dev-fast-redeploy: + +Fast Redeploy (Command-Line) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers who prefer command-line workflows over IDE integration, Dataverse provides scripts for fast iterative development without full container rebuilds. + +**Initial Setup** + +Run once per development session: + +.. code-block:: bash + + ./scripts/dev/dev-start-frd.sh + +This command: + +- Builds the full Dataverse WAR with ``mvn package`` +- Extracts it into ``target/dataverse/`` as an exploded WAR +- Configures JPA settings for development (``ddl-generation=none``) +- Starts the dev stack with ``SKIP_DEPLOY=1`` +- Manually deploys the application via ``asadmin`` + +**Iterative Development** + +After making code changes, run: + +.. code-block:: bash + + ./scripts/dev/dev-frd.sh + +This script: + +- Compiles Java sources incrementally (``mvn compile``, ~5-10s) +- Syncs updated classes and webapp resources into the mounted exploded WAR +- Forces Payara to redeploy the application without restarting containers +- Key features: + - Skips full Maven rebuilds (only compiles changed Java files) + - Avoids container restarts (uses hot-redeployment) + - Completes in ~12 seconds vs. ~54s for traditional full rebuild workflow (4.5x faster) + - Preserves database state between deployments + +**Typical Workflow** + +.. code-block:: bash + + # Start dev environment once + ./scripts/dev/dev-start-frd.sh + + # Edit Java or XHTML files... + + # Fast redeploy + ./scripts/dev/dev-frd.sh + + # Repeat as needed + + # When finished, stop containers + ./scripts/dev/dev-down-frd.sh + +**Memory Configuration** + +The fast-redeploy workflow includes ``docker-compose.override.yml`` that removes the default 2GB memory limit +(set for GitHub Actions CI) which is insufficient for local Dataverse development. The override file is +automatically used by the scripts and enables running the full development stack without memory constraints. + +**Limitations** + +- Does not update dependencies (run full ``mvn package`` + restart if ``pom.xml`` changes) +- Static resources (CSS, JS) may require browser cache clear +- For database schema changes, use ``dev-rebuild.sh`` instead +- Performance timings may vary depending on your hardware configuration + +**Note**: This workflow complements IDE-based redeployment. Use whichever fits your development style. + Exploring the Database ---------------------- diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 00000000000..1056bad4525 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,12 @@ +version: "2.4" + +# Local development overrides for docker-compose-dev.yml +# This file is used by the fast-redeploy scripts (dev-start-frd.sh, dev-down-frd.sh) +# and can be used manually with: docker compose -f docker-compose-dev.yml -f docker-compose.override.yml up + +services: + dev_dataverse: + # Remove memory limits for local development + # (upstream has 2GB limit for GitHub Actions CI, which is too restrictive for local dev) + mem_limit: 0 + mem_reservation: 0 diff --git a/scripts/dev/dev-down-frd.sh b/scripts/dev/dev-down-frd.sh new file mode 100755 index 00000000000..13eba9420f5 --- /dev/null +++ b/scripts/dev/dev-down-frd.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Ensure we're in project root +cd "$(dirname "${BASH_SOURCE[0]}")/../.." + +echo "Stopping and removing dev containers..." + +# Use override file if it exists (for local customizations like memory limits) +if [ -f docker-compose.override.yml ]; then + docker compose -f docker-compose-dev.yml -f docker-compose.override.yml down +else + docker compose -f docker-compose-dev.yml down +fi + +echo "" +echo "✓ Dev environment stopped" +echo " To restart: ./scripts/dev/dev-start-frd.sh" +echo " To clean volumes: sudo rm -rf docker-dev-volumes/" diff --git a/scripts/dev/dev-frd.sh b/scripts/dev/dev-frd.sh new file mode 100755 index 00000000000..39b97de16fa --- /dev/null +++ b/scripts/dev/dev-frd.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")/../.." + +# Verify dev environment is running +if ! docker ps --filter "name=dev_dataverse" --filter "status=running" -q | grep -q .; then + echo "Error: dev_dataverse container not running." >&2 + echo "Run './scripts/dev/dev-start-frd.sh' first to set up the environment." >&2 + exit 1 +fi + +echo "Compiling Dataverse sources..." +mvn -T 1C -DskipTests -DskipUnitTests -DskipIntegrationTests compile >/dev/null + +if [ ! -d "target/classes" ]; then + echo "ERROR: target/classes missing after compile." >&2 + exit 1 +fi + +echo "Syncing compiled classes..." +rsync -a --delete --exclude 'META-INF/persistence.xml' \ + target/classes/ target/dataverse/WEB-INF/classes/ + +if [ -d "src/main/webapp" ]; then + echo "Syncing webapp resources..." + rsync -a --delete \ + --exclude 'WEB-INF/classes' --exclude 'WEB-INF/classes/**' \ + --exclude 'WEB-INF/lib' --exclude 'WEB-INF/lib/**' \ + src/main/webapp/ target/dataverse/ +fi + +echo "Redeploying to Payara..." +docker exec dev_dataverse /bin/bash -lc ' + printf "AS_ADMIN_PASSWORD=%s\n" admin > /tmp/pwdfile; + asadmin --user admin --passwordfile /tmp/pwdfile \ + deploy --force --upload=false /opt/payara/deployments/dataverse 2>&1 \ + | grep -v "PER01001\|PER01003\|Command deploy completed with warnings"; + rm /tmp/pwdfile' + +echo "" +echo "✓ Fast redeploy complete (~12s)" +echo " Test your changes at http://localhost:8080" diff --git a/scripts/dev/dev-start-frd.sh b/scripts/dev/dev-start-frd.sh new file mode 100755 index 00000000000..6cb0b2f7add --- /dev/null +++ b/scripts/dev/dev-start-frd.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Ensure we're in project root +cd "$(dirname "${BASH_SOURCE[0]}")/../.." + +echo "Building Dataverse WAR for fast redeploy..." +mvn -T 1C -DskipTests -DskipUnitTests -DskipIntegrationTests clean package + +echo "Extracting WAR into target/dataverse/..." +mkdir -p target/dataverse +unzip -oq target/dataverse-*.war -d target/dataverse/ + +# Check if database is already initialized (before creating directories) +# If postgres has initialized, the data dir will have restrictive permissions (0700) +# On first run, the directory either doesn't exist or has default permissions +DB_INITIALIZED=false +if [ -d "docker-dev-volumes/postgresql/data" ]; then + # Try to list the directory - if permission denied, it means postgres owns it (initialized) + if ! ls docker-dev-volumes/postgresql/data >/dev/null 2>&1; then + DB_INITIALIZED=true + fi +fi + +echo "Ensuring docker volume mount points exist..." +mkdir -p docker-dev-volumes/app/data +mkdir -p docker-dev-volumes/app/secrets +mkdir -p docker-dev-volumes/postgresql/data +mkdir -p docker-dev-volumes/solr/data +mkdir -p docker-dev-volumes/solr/conf +mkdir -p docker-dev-volumes/minio_storage + +# Only disable DDL generation if database is already initialized +# (on first run, we need create-tables to bootstrap the schema) +if [ "$DB_INITIALIZED" = true ]; then + echo "Detected existing database - disabling DDL generation to preserve schema..." + sed -i.bak 's/\(eclipselink.ddl-generation" value="\)create-tables/\1none/' \ + target/dataverse/WEB-INF/classes/META-INF/persistence.xml +else + echo "First-time setup detected - keeping DDL generation enabled for schema creation..." +fi + +echo "Starting dev stack (SKIP_DEPLOY=1)..." +export SKIP_DEPLOY=1 +# Use override file if it exists (for local customizations like memory limits) +if [ -f docker-compose.override.yml ]; then + docker compose -f docker-compose-dev.yml -f docker-compose.override.yml up -d +else + docker compose -f docker-compose-dev.yml up -d +fi + +echo "Waiting for Payara to be ready..." +until curl -sf http://localhost:8080/ >/dev/null 2>&1; do + sleep 2 +done + +echo "Deploying exploded WAR..." +docker exec dev_dataverse /bin/bash -lc ' + printf "AS_ADMIN_PASSWORD=%s\n" admin > /tmp/pwdfile; + asadmin --user admin --passwordfile /tmp/pwdfile \ + deploy --upload=false /opt/payara/deployments/dataverse 2>&1 \ + | grep -v "PER01001\|PER01003\|Command deploy completed with warnings"; + rm /tmp/pwdfile' + +echo "" +echo "✓ Fast redeploy environment ready!" +echo " Next: Make code changes, then run './scripts/dev/dev-frd.sh' to redeploy (~12s)" From 7fd6125434f71d1c55f5afef2162d73b22349b15 Mon Sep 17 00:00:00 2001 From: Eryk Kulikowski <101262459+ErykKul@users.noreply.github.com> Date: Fri, 7 Nov 2025 13:26:58 +0100 Subject: [PATCH 035/507] Update scripts/dev/dev-frd.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- scripts/dev/dev-frd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/dev/dev-frd.sh b/scripts/dev/dev-frd.sh index 39b97de16fa..dbb9a6d6e8a 100755 --- a/scripts/dev/dev-frd.sh +++ b/scripts/dev/dev-frd.sh @@ -25,7 +25,7 @@ rsync -a --delete --exclude 'META-INF/persistence.xml' \ if [ -d "src/main/webapp" ]; then echo "Syncing webapp resources..." rsync -a --delete \ - --exclude 'WEB-INF/classes' --exclude 'WEB-INF/classes/**' \ + --exclude 'WEB-INF/classes' \ --exclude 'WEB-INF/lib' --exclude 'WEB-INF/lib/**' \ src/main/webapp/ target/dataverse/ fi From 7448408a748e1538e6f56a9bc34982fa23ed068a Mon Sep 17 00:00:00 2001 From: Eryk Kulikowski <101262459+ErykKul@users.noreply.github.com> Date: Fri, 7 Nov 2025 13:27:25 +0100 Subject: [PATCH 036/507] Update scripts/dev/dev-frd.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- scripts/dev/dev-frd.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/dev/dev-frd.sh b/scripts/dev/dev-frd.sh index dbb9a6d6e8a..d06a62f7b07 100755 --- a/scripts/dev/dev-frd.sh +++ b/scripts/dev/dev-frd.sh @@ -19,6 +19,9 @@ if [ ! -d "target/classes" ]; then fi echo "Syncing compiled classes..." +# WARNING: The --delete flag will remove files from target/dataverse/WEB-INF/classes/ +# that do not exist in target/classes/. Any files manually added for debugging +# purposes will be deleted. Consider this before adding files to the destination. rsync -a --delete --exclude 'META-INF/persistence.xml' \ target/classes/ target/dataverse/WEB-INF/classes/ From 4c0be560bf9a76d499062b5e5a35f709883c0a80 Mon Sep 17 00:00:00 2001 From: Eryk Kulikowski <101262459+ErykKul@users.noreply.github.com> Date: Fri, 7 Nov 2025 13:27:37 +0100 Subject: [PATCH 037/507] Update scripts/dev/dev-start-frd.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- scripts/dev/dev-start-frd.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/dev/dev-start-frd.sh b/scripts/dev/dev-start-frd.sh index 6cb0b2f7add..d113f677bad 100755 --- a/scripts/dev/dev-start-frd.sh +++ b/scripts/dev/dev-start-frd.sh @@ -36,6 +36,7 @@ if [ "$DB_INITIALIZED" = true ]; then echo "Detected existing database - disabling DDL generation to preserve schema..." sed -i.bak 's/\(eclipselink.ddl-generation" value="\)create-tables/\1none/' \ target/dataverse/WEB-INF/classes/META-INF/persistence.xml + rm -f target/dataverse/WEB-INF/classes/META-INF/persistence.xml.bak else echo "First-time setup detected - keeping DDL generation enabled for schema creation..." fi From 7fec4cad5a5739c0a1f058ded5f5f0a46cc51172 Mon Sep 17 00:00:00 2001 From: Eryk Kullikowski Date: Fri, 7 Nov 2025 13:32:36 +0100 Subject: [PATCH 038/507] Increase memory limits in docker-compose.override.yml for local development --- doc/release-notes/10156-fast-redeploy-scripts.md | 2 +- doc/sphinx-guides/source/container/dev-usage.rst | 6 +++--- docker-compose.override.yml | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/release-notes/10156-fast-redeploy-scripts.md b/doc/release-notes/10156-fast-redeploy-scripts.md index 28b65248745..61176b3262b 100644 --- a/doc/release-notes/10156-fast-redeploy-scripts.md +++ b/doc/release-notes/10156-fast-redeploy-scripts.md @@ -16,7 +16,7 @@ This command-line workflow provides a fast feedback loop for developers who pref # New Files -- **`docker-compose.override.yml`**: Removes the 2GB memory limit (set for GitHub Actions CI) which is insufficient for local development. Automatically used by the fast-redeploy scripts. +- **`docker-compose.override.yml`**: Increases memory limits to 8GB (from the 2GB limit set for GitHub Actions CI) for local development. Automatically used by the fast-redeploy scripts. # Key Features diff --git a/doc/sphinx-guides/source/container/dev-usage.rst b/doc/sphinx-guides/source/container/dev-usage.rst index 93e3dcc60bf..5492ced7067 100644 --- a/doc/sphinx-guides/source/container/dev-usage.rst +++ b/doc/sphinx-guides/source/container/dev-usage.rst @@ -464,9 +464,9 @@ This script: **Memory Configuration** -The fast-redeploy workflow includes ``docker-compose.override.yml`` that removes the default 2GB memory limit -(set for GitHub Actions CI) which is insufficient for local Dataverse development. The override file is -automatically used by the scripts and enables running the full development stack without memory constraints. +The fast-redeploy workflow includes ``docker-compose.override.yml`` that increases the memory limit to 8GB +(from the default 2GB limit set for GitHub Actions CI) which is insufficient for local Dataverse development. +The override file is automatically used by the scripts. **Limitations** diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 1056bad4525..68ac8e778aa 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -6,7 +6,7 @@ version: "2.4" services: dev_dataverse: - # Remove memory limits for local development + # Increase memory limits for local development # (upstream has 2GB limit for GitHub Actions CI, which is too restrictive for local dev) - mem_limit: 0 - mem_reservation: 0 + mem_limit: 8g + mem_reservation: 4g From 2039ae0282cf999a4cf230d3d43c39872ae5c998 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 10 Nov 2025 17:13:04 -0500 Subject: [PATCH 039/507] refactored LF check in dataset page --- .../edu/harvard/iq/dataverse/DatasetPage.java | 11 +++++-- .../iq/dataverse/PermissionServiceBean.java | 31 +++++++++++++++++++ .../iq/dataverse/PermissionsWrapper.java | 10 ++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index b41e8d4ac35..0bb0b246dc9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -2112,8 +2112,15 @@ private String init(boolean initFull) { } // Check permisisons - if (!(workingVersion.isReleased() || workingVersion.isDeaccessioned()) && !this.canViewUnpublishedDataset()) { - return permissionsWrapper.notAuthorized(); + Set locallyFAIRraIds = dataset.getOwner().getLocallyFAIRRoleAssigneeIdentifiers(); + boolean releasedAndCanView = workingVersion.isReleased() && locallyFAIRraIds.isEmpty() || permissionsWrapper + .hasLocallyFAIRAccess(dvRequestService.getDataverseRequest(), locallyFAIRraIds); + if (!(releasedAndCanView || workingVersion.isDeaccessioned()) && !this.canViewUnpublishedDataset()) { + if (locallyFAIRraIds.isEmpty()) { + return permissionsWrapper.notAuthorized(); + } else { + return permissionsWrapper.notFound(); + } } if (retrieveDatasetVersionResponse != null && !retrieveDatasetVersionResponse.wasRequestedVersionRetrieved()) { diff --git a/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java index d492991bb62..1276fe1ebe4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java @@ -1070,5 +1070,36 @@ public List getEffectiveRoleAssignments(AuthenticatedUser user, return Stream.concat(directAssignments, groupAssignments) .collect(Collectors.toList()); } + + /** + * Determines if a user can view a dataset version based on its release status + * and the supplied Locally FAIR role assignees. + * + * @param DataversRequest The request containing the user and Ip info (for IPgroups) + * @param Set locallyFairAssignees a non-null but possibly empty set of locally FAIR role assignees + * @return true if the user has locally FAIR access + */ + public boolean isALocallyFAIRAssignee(DataverseRequest req, Set locallyFairAssignees) { + + // If no locally FAIR restrictions, it's publicly viewable + if (locallyFairAssignees.isEmpty()) { + return false; + } + + // Check if user is in the locally FAIR assignee list + Set userAndGroups = new HashSet<>(groupService.groupsFor(req)); + User user = req.getUser(); + if (user.isAuthenticated()) { + userAndGroups.add(user); + } + + for (RoleAssignee ra : userAndGroups) { + if (locallyFairAssignees.contains(ra.getIdentifier())) { + return true; + } + } + + return false; + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java b/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java index 2c6f8ff2fb1..365dfb0c5da 100644 --- a/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java @@ -13,6 +13,7 @@ import edu.harvard.iq.dataverse.engine.command.impl.*; import java.util.HashMap; import java.util.Map; +import java.util.Set; import java.util.logging.Logger; import jakarta.ejb.EJB; import jakarta.faces.view.ViewScoped; @@ -55,6 +56,7 @@ public class PermissionsWrapper implements java.io.Serializable { private final Map fileDownloadPermissionMap = new HashMap<>(); // { DvObject.id : Boolean } private final Map datasetPermissionMap = new HashMap<>(); // { Permission human_name : Boolean } + Boolean hasLocallyFAIRAccess; /** * Check if the current Dataset can Issue Commands * @@ -297,4 +299,12 @@ public String notAuthorized(){ public String notFound() { return navigationWrapper.notFound(); } + + // The locallyFAIRraIds should not change within a given view (they are set in the parent Dataverse of whatever object the view is for) + public boolean hasLocallyFAIRAccess(DataverseRequest req, Set locallyFAIRraIds) { + if(hasLocallyFAIRAccess == null ) { + hasLocallyFAIRAccess = permissionService.isALocallyFAIRAssignee(req, locallyFAIRraIds); + } + return hasLocallyFAIRAccess; + } } From 839364f26b84e0ceb70d444b5a3f8cfdc2f96874 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Mon, 17 Nov 2025 16:08:47 -0500 Subject: [PATCH 040/507] change language for deaccession not valid reason --- doc/release-notes/360-modify-notvalid-deaccession-reason.md | 2 ++ src/main/java/propertyFiles/Bundle.properties | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 doc/release-notes/360-modify-notvalid-deaccession-reason.md diff --git a/doc/release-notes/360-modify-notvalid-deaccession-reason.md b/doc/release-notes/360-modify-notvalid-deaccession-reason.md new file mode 100644 index 00000000000..7e7868e499e --- /dev/null +++ b/doc/release-notes/360-modify-notvalid-deaccession-reason.md @@ -0,0 +1,2 @@ +Language change for file.deaccessionDialog.reason.selectItem.notValid +"Not a valid dataset." has been changed to "Not valid. The dataset does not comply with repository policies." diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 3254c26ed22..016b55fcd99 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2172,7 +2172,7 @@ file.deaccessionDialog.reason.selectItem.beRetracted=The research article has be file.deaccessionDialog.reason.selectItem.beTransferred=The dataset has been transferred to another repository. file.deaccessionDialog.reason.selectItem.IRB=IRB request. file.deaccessionDialog.reason.selectItem.legalIssue=Legal issue or Data Usage Agreement. -file.deaccessionDialog.reason.selectItem.notValid=Not a valid dataset. +file.deaccessionDialog.reason.selectItem.notValid=Not valid. The dataset does not comply with repository policies. file.deaccessionDialog.reason.selectItem.other=Other (Please type reason in space provided below) file.deaccessionDialog.enterInfo=Please enter additional information about the reason for deaccession. file.deaccessionDialog.leaveURL=If applicable, please leave a URL where this dataset can be accessed after deaccessioning. From 0f5806e8daf61573aef6f64f9c27292d90e6fc30 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Mon, 17 Nov 2025 16:29:15 -0500 Subject: [PATCH 041/507] change 'The' to 'This' --- doc/release-notes/360-modify-notvalid-deaccession-reason.md | 2 +- src/main/java/propertyFiles/Bundle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/release-notes/360-modify-notvalid-deaccession-reason.md b/doc/release-notes/360-modify-notvalid-deaccession-reason.md index 7e7868e499e..5d323ab2da8 100644 --- a/doc/release-notes/360-modify-notvalid-deaccession-reason.md +++ b/doc/release-notes/360-modify-notvalid-deaccession-reason.md @@ -1,2 +1,2 @@ Language change for file.deaccessionDialog.reason.selectItem.notValid -"Not a valid dataset." has been changed to "Not valid. The dataset does not comply with repository policies." +"Not a valid dataset." has been changed to "Not valid. This dataset does not comply with repository policies." diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 016b55fcd99..72b055cb45a 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2172,7 +2172,7 @@ file.deaccessionDialog.reason.selectItem.beRetracted=The research article has be file.deaccessionDialog.reason.selectItem.beTransferred=The dataset has been transferred to another repository. file.deaccessionDialog.reason.selectItem.IRB=IRB request. file.deaccessionDialog.reason.selectItem.legalIssue=Legal issue or Data Usage Agreement. -file.deaccessionDialog.reason.selectItem.notValid=Not valid. The dataset does not comply with repository policies. +file.deaccessionDialog.reason.selectItem.notValid=Not valid. This dataset does not comply with repository policies. file.deaccessionDialog.reason.selectItem.other=Other (Please type reason in space provided below) file.deaccessionDialog.enterInfo=Please enter additional information about the reason for deaccession. file.deaccessionDialog.leaveURL=If applicable, please leave a URL where this dataset can be accessed after deaccessioning. From 5c0113b18df2dff2b07bf173f95d28958c3ff41b Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Mon, 17 Nov 2025 16:37:51 -0500 Subject: [PATCH 042/507] typo --- src/main/java/propertyFiles/Bundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 72b055cb45a..c4d2bd52e16 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2178,7 +2178,7 @@ file.deaccessionDialog.enterInfo=Please enter additional information about the r file.deaccessionDialog.leaveURL=If applicable, please leave a URL where this dataset can be accessed after deaccessioning. file.deaccessionDialog.leaveURL.watermark=Optional dataset site, http://... file.deaccessionDialog.deaccession.tip=Are you sure you want to deaccession? This is permanent and the selected version(s) will no longer be viewable by the public. -file.deaccessionDialog.deaccessionDataset.tip=Are you sure you want to deaccession this dataset? This is permanent an it will no longer be viewable by the public. +file.deaccessionDialog.deaccessionDataset.tip=Are you sure you want to deaccession this dataset? This is permanent, and it will no longer be viewable by the public. file.deaccessionDialog.dialog.selectVersion.error=Please select version(s) for deaccessioning. file.deaccessionDialog.dialog.reason.error=Please select reason for deaccessioning. file.deaccessionDialog.dialog.url.error=Please enter valid forwarding URL. From 9428336628099af0f3356f58e439fbaea8be5413 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 18 Nov 2025 15:17:39 -0500 Subject: [PATCH 043/507] flyway script and documentation --- .../360-modify-notvalid-deaccession-reason.md | 14 ++++++++++++-- src/main/resources/db/migration/V6.8.0.1.sql | 3 +++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/db/migration/V6.8.0.1.sql diff --git a/doc/release-notes/360-modify-notvalid-deaccession-reason.md b/doc/release-notes/360-modify-notvalid-deaccession-reason.md index 5d323ab2da8..ee640aea79b 100644 --- a/doc/release-notes/360-modify-notvalid-deaccession-reason.md +++ b/doc/release-notes/360-modify-notvalid-deaccession-reason.md @@ -1,2 +1,12 @@ -Language change for file.deaccessionDialog.reason.selectItem.notValid -"Not a valid dataset." has been changed to "Not valid. This dataset does not comply with repository policies." +# Language change for file.deaccessionDialog.reason.selectItem.notValid + +"Not a valid dataset." is being changed to "Not valid. This dataset does not comply with repository policies." +This is the default English language version. For installations using customized languages, replacing the Bundle.properties file, please follow these manual instructions to make this modification, if desired. + +The SQL statements to modify the datasets is: +UPDATE dvobject SET indextime=null WHERE id in (SELECT dataset_id FROM datasetversion WHERE deaccessionnote='Not a valid dataset.'); +UPDATE datasetversion SET deaccessionnote='Not valid. This dataset does not comply with repository policies.' WHERE deaccessionnote='Not a valid dataset.'; + +Once the database is updated the Solr indexes need to be rebuilt using the following Admin API: + +curl http://localhost:8080/api/admin/index/continue diff --git a/src/main/resources/db/migration/V6.8.0.1.sql b/src/main/resources/db/migration/V6.8.0.1.sql new file mode 100644 index 00000000000..a0fcf62abaa --- /dev/null +++ b/src/main/resources/db/migration/V6.8.0.1.sql @@ -0,0 +1,3 @@ +-- modify datasetversion.deaccessionnote entries with new Bundle string 'file.deaccessionDialog.reason.selectItem.notValid' +UPDATE dvobject SET indextime=null WHERE id in (SELECT dataset_id FROM datasetversion WHERE deaccessionnote='Not a valid dataset.'); +UPDATE datasetversion SET deaccessionnote='Not valid. This dataset does not comply with repository policies.' WHERE deaccessionnote='Not a valid dataset.'; From c82156f1dc4a4e8147284eee53e58d30b3c7ae63 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 18 Nov 2025 15:50:23 -0500 Subject: [PATCH 044/507] doc change --- .../360-modify-notvalid-deaccession-reason.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/doc/release-notes/360-modify-notvalid-deaccession-reason.md b/doc/release-notes/360-modify-notvalid-deaccession-reason.md index ee640aea79b..152b3b777f4 100644 --- a/doc/release-notes/360-modify-notvalid-deaccession-reason.md +++ b/doc/release-notes/360-modify-notvalid-deaccession-reason.md @@ -3,10 +3,14 @@ "Not a valid dataset." is being changed to "Not valid. This dataset does not comply with repository policies." This is the default English language version. For installations using customized languages, replacing the Bundle.properties file, please follow these manual instructions to make this modification, if desired. +Make the change to the Bundle_##.properties file with the new verbiage. Either locally or as an update to [dataverse-language-packs Repo](https://github.com/GlobalDataverseCommunityConsortium/dataverse-language-packs/tree/develop) + The SQL statements to modify the datasets is: -UPDATE dvobject SET indextime=null WHERE id in (SELECT dataset_id FROM datasetversion WHERE deaccessionnote='Not a valid dataset.'); -UPDATE datasetversion SET deaccessionnote='Not valid. This dataset does not comply with repository policies.' WHERE deaccessionnote='Not a valid dataset.'; + +- `UPDATE dvobject SET indextime=null WHERE id in (SELECT dataset_id FROM datasetversion WHERE deaccessionnote='Not a valid dataset.');` + +- `UPDATE datasetversion SET deaccessionnote='Not valid. This dataset does not comply with repository policies.' WHERE deaccessionnote='Not a valid dataset.';` Once the database is updated the Solr indexes need to be rebuilt using the following Admin API: -curl http://localhost:8080/api/admin/index/continue +- `curl http://localhost:8080/api/admin/index/continue` From ff4c9d46217c9cab19be963d42a52110be867c4e Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Thu, 20 Nov 2025 11:10:20 -0500 Subject: [PATCH 045/507] sql conflict --- src/main/resources/db/migration/V6.8.0.3.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/main/resources/db/migration/V6.8.0.3.sql diff --git a/src/main/resources/db/migration/V6.8.0.3.sql b/src/main/resources/db/migration/V6.8.0.3.sql new file mode 100644 index 00000000000..7c5df131e72 --- /dev/null +++ b/src/main/resources/db/migration/V6.8.0.3.sql @@ -0,0 +1,3 @@ +modify datasetversion.deaccessionnote entries with new Bundle string 'file.deaccessionDialog.reason.selectItem.notValid' +UPDATE dvobject SET indextime=null WHERE id in (SELECT dataset_id FROM datasetversion WHERE deaccessionnote='Not a valid dataset.'); +UPDATE datasetversion SET deaccessionnote='Not valid. This dataset does not comply with repository policies.' WHERE deaccessionnote='Not a valid dataset.'; From e7ba59b27bf559d93732acf3d24de34eed2303ec Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Sat, 22 Nov 2025 10:29:43 -0500 Subject: [PATCH 046/507] move the list of features into the guides #11998 --- doc/sphinx-guides/source/admin/features.md | 229 +++++++++++++++++++++ doc/sphinx-guides/source/admin/index.rst | 1 + scripts/issues/11998/tsv2md.py | 55 +++++ 3 files changed, 285 insertions(+) create mode 100644 doc/sphinx-guides/source/admin/features.md create mode 100755 scripts/issues/11998/tsv2md.py diff --git a/doc/sphinx-guides/source/admin/features.md b/doc/sphinx-guides/source/admin/features.md new file mode 100644 index 00000000000..5a80771058b --- /dev/null +++ b/doc/sphinx-guides/source/admin/features.md @@ -0,0 +1,229 @@ +# Features + +An overview of Dataverse features can be found at . This is a more comprehensive list. + +```{contents} Contents: +:local: +:depth: 3 +``` + + +## Support for FAIR Data Principles + +Findable, Accessible, Interoperable, Reusable. +[More information.](https://scholar.harvard.edu/mercecrosas/presentations/fair-guiding-principles-implementation-dataverse) +## Data citation for datasets and files + +EndNote XML, RIS, or BibTeX format at the dataset or file level. +{doc}`More information.` + +## OAI-PMH (Harvesting) + +Gather and expose metadata from and to other systems using standardized metadata formats: Dublin Core, Data Document Initiative (DDI), OpenAIRE, etc. +{doc}`More information.` + +## APIs for interoperability and custom integrations + +Search API, Data Deposit (SWORD) API, Data Access API, Metrics API, Migration API, etc. +{doc}`More information.` + +## API client libraries + +Interact with Dataverse APIs from Python, R, Javascript, Java, and Ruby +{doc}`More information.` + +## DataCite integration + +DOIs are reserved, and when datasets are published, their metadata is published to DataCite. +{doc}`More information.` + +## Login via Shibboleth + +Single Sign On (SSO) using your institution's credentials. +{doc}`More information.` + +## Login via ORCID, Google, GitHub, or Microsoft + +Log in using popular OAuth2 providers. +{doc}`More information.` + +## Login via OpenID Connect (OIDC) + +Log in using your institution's identity provider or a third party. +{doc}`More information.` + +## Internationalization + +The Dataverse software has been translated into multiple languages. +{ref}`More information.` + +## Versioning + +History of changes to datasets and files are preserved. +{doc}`More information.` + +## Restricted files + +Control who can download files and choose whether or not to enable a "Request Access" button. +{ref}`More information.` + +## Embargo + +Make content inaccessible until an embargo end date. +{ref}`More information.` + +## Custom licenses + +CC0 by default but add as many standard licenses as you like or create your own. +{ref}`More information.` + +## Custom terms of use + +Custom terms of use can be used in place of a license or disabled by an administrator. +{ref}`More information.` + +## Publishing workflow support + +Datasets start as drafts and can be submitted for review before publication. +{ref}`More information.` + +## File hierarchy + +Users are able to control dataset file hierarchy and directory structure. +{doc}`More information.` + +## File previews + +A preview is available for text, tabular, image, audio, video, and geospatial files. +{ref}`More information.` + +## Preview and analysis of tabular files + +Data Explorer allows for searching, charting and cross tabulation analysis +{ref}`More information.` + +## Usage statistics and metrics + +Download counters, support for Make Data Count. +{doc}`More information.` + +## Guestbook + +Optionally collect data about who is downloading the files from your datasets. +{ref}`More information.` + +## Fixity checks for files + +MD5, SHA-1, SHA-256, SHA-512, UNF. +{ref}`More information.<:FileFixityChecksumAlgorithm>` + +## File download in R and TSV format + +Proprietary tabular formats are converted into RData and TSV. +{doc}`More information.` + +## Faceted search + +Facets are data driven and customizable per collection. +{doc}`More information.` + +## Customization of collections + +Each personal or organizational collection can be customized and branded. +{ref}`More information.` + +## Private URL + +Create a URL for reviewers to view an unpublished (and optionally anonymized) dataset. +{ref}`More information.` + +## Widgets + +Embed listings of data in external websites. +{ref}`More information.` + +## Notifications + +In app and email notifications for access requests, requests for review, etc. +{ref}`More information.` + +## Schema.org JSON-LD + +Used by Google Dataset Search and other services for discoverability. +{ref}`More information.` + +## External tools + +Enable additional features not built in to the Dataverse software. +{doc}`More information.` + +## External vocabulary + +Let users pick from external vocabularies (provided via API/SKOSMOS) when filling in metadata. +{ref}`More information.` + +## Dropbox integration + +Upload files stored on Dropbox. +{doc}`More information.` + +## GitHub integration + +A GitHub Action is available to upload files from GitHub to a dataset. +{doc}`More information.` + +## Integration with Jupyter notebooks + +Datasets can be opened in Binder to run code in Jupyter notebooks, RStudio, and other computation environments. +{ref}`More information.` + +## User management + +Dashboard for common user-related tasks. +{doc}`More information.` + +## Curation status labels + +Let curators mark datasets with a status label customized to your needs. +{ref}`More information.<:AllowedCurationLabels>` + +## Branding + +Your installation can be branded with a custom homepage, header, footer, CSS, etc. +{ref}`More information.` + +## Backend storage on S3 or Swift + +Choose between filesystem or object storage, configurable per collection and per dataset. +{doc}`More information.` + +## Direct upload and download for S3 + +After a permission check, files can pass freely and directly between a client computer and S3. +{doc}`More information.` + +## Export data in BagIt format + +For preservation, bags can be sent to the local filesystem, Duraclound, and Google Cloud. +{ref}`More information.` + +## Post-publication automation (workflows) + +Allow publication of a dataset to kick off external processes and integrations. +{doc}`More information.` + +## Pull header metadata from Astronomy (FITS) files + +Dataset metadata prepopulated from FITS file metadata. +{ref}`More information.` + +## Provenance + +Upload standard W3C provenance files or enter free text instead. +{ref}`More information.` + +## Auxiliary files for data files + +Each data file can have any number of auxiliary files for documentation or other purposes (experimental). +{doc}`More information.` + diff --git a/doc/sphinx-guides/source/admin/index.rst b/doc/sphinx-guides/source/admin/index.rst index a8a543571a7..c6522475088 100755 --- a/doc/sphinx-guides/source/admin/index.rst +++ b/doc/sphinx-guides/source/admin/index.rst @@ -13,6 +13,7 @@ This guide documents the functionality only available to superusers (such as "da .. toctree:: :maxdepth: 2 + features dashboard external-tools discoverability diff --git a/scripts/issues/11998/tsv2md.py b/scripts/issues/11998/tsv2md.py new file mode 100755 index 00000000000..888cb9b1595 --- /dev/null +++ b/scripts/issues/11998/tsv2md.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# +# Download features.tsv like this: +# curl -L "https://docs.google.com/spreadsheets/d/1EIFGAfDfZAboFa3_ShRfgoT6xSDpKohDH2_iCyO5MtA/export?gid=729532473&format=tsv" > features.tsv +# +# The gid above is a specific tab in this spreadsheet: +# https://docs.google.com/spreadsheets/d/1EIFGAfDfZAboFa3_ShRfgoT6xSDpKohDH2_iCyO5MtA/edit?usp=sharing +# +# Here's the README for the spreadsheet: +# https://docs.google.com/document/d/1wqLVoEpnD93Y_wQtA2cQEkAuC0QstC6XVs9XlA7yvbM/edit?usp=sharing +import sys +from optparse import OptionParser +import csv + +parser = OptionParser() +options, args = parser.parse_args() + +if args: + tsv_file = open(args[0]) +else: + tsv_file = sys.stdin + +print("""# Features + +An overview of Dataverse features can be found at . This is a more comprehensive list. + +```{contents} Contents: +:local: +:depth: 3 +``` + +""") + +reader = csv.DictReader(tsv_file, delimiter="\t") +rows = [row for row in reader] +missing = [] +for row in rows: + title = row["Title"] + description = row["Description"] + url = row["URL"] + dtype = row["DocLinkType"] + target = row["DocLinkTarget"] + print("## %s" % title) + print() + print("%s" % description) + if target == 'url': + print("[More information.](%s)" % (url)) + elif target != '': + print("{%s}`More information.<%s>`" % (dtype, target)) + print() + else: + missing.append(url) +tsv_file.close() +for item in missing: + print(item) From 1159bfd89e02a6b082929f1650f3d20352e6cc90 Mon Sep 17 00:00:00 2001 From: Eryk Kullikowski Date: Fri, 28 Nov 2025 09:27:45 +0100 Subject: [PATCH 047/507] revert removing non-existing vocab values --- .../java/edu/harvard/iq/dataverse/DatasetVersion.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 4d2d9e00472..cfd4c886bf3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -1788,18 +1788,11 @@ private void removeEmptyValues() { private void removeEmptyValues(DatasetField dsf) { if (dsf.getDatasetFieldType().isPrimitive()) { // primitive - final boolean isControlledVocabulary = dsf.getDatasetFieldType().isControlledVocabulary(); final Iterator i = dsf.getDatasetFieldValues().iterator(); while (i.hasNext()) { - final DatasetFieldValue fieldValue = i.next(); - final String v = fieldValue.getValue(); + final String v = i.next().getValue(); if (StringUtils.isBlank(v) || DatasetField.NA_VALUE.equals(v)) { i.remove(); - continue; - } - if (isControlledVocabulary && dsf.getDatasetFieldType().getControlledVocabularyValue(v) == null) { - // Drop placeholders that never matched an allowed vocabulary value. - i.remove(); } } } else { @@ -1810,6 +1803,7 @@ private void removeEmptyValues(DatasetField dsf) { public Set validate() { Set returnSet = new HashSet<>(); + for (DatasetField dsf : this.getFlatDatasetFields()) { dsf.setValidationMessage(null); // clear out any existing validation message Set> constraintViolations = validator.validate(dsf); From fd10dd120c4fe177e4496f21b2287239f3fbd044 Mon Sep 17 00:00:00 2001 From: Eryk Kullikowski Date: Fri, 28 Nov 2025 09:43:02 +0100 Subject: [PATCH 048/507] removed the unit test --- .../DatasetVersionValidationTest.java | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 src/test/java/edu/harvard/iq/dataverse/DatasetVersionValidationTest.java diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetVersionValidationTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetVersionValidationTest.java deleted file mode 100644 index 74ccb44d9ad..00000000000 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetVersionValidationTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package edu.harvard.iq.dataverse; - -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertFalse; - -class DatasetVersionValidationTest { - - @Test - void requiredControlledVocabularyWithEmptyValueRemainsInvalid() { - DatasetFieldType subjectType = new DatasetFieldType(); - subjectType.setName("subject"); - subjectType.setAllowControlledVocabulary(true); - subjectType.setRequired(true); - subjectType.setAllowMultiples(false); - subjectType.setFieldType(DatasetFieldType.FieldType.TEXT); - subjectType.setControlledVocabularyValues(new ArrayList<>()); - subjectType.setChildDatasetFieldTypes(new ArrayList<>()); - - MetadataBlock citation = new MetadataBlock(); - citation.setName("citation"); - citation.setDisplayName("Citation"); - citation.setDatasetFieldTypes(List.of(subjectType)); - subjectType.setMetadataBlock(citation); - - Dataverse dataverse = new Dataverse(); - dataverse.setMetadataBlockRoot(true); - dataverse.setMetadataBlocks(List.of(citation)); - - Dataset dataset = new Dataset(); - dataset.setOwner(dataverse); - - DatasetVersion version = new DatasetVersion(); - version.setVersionState(DatasetVersion.VersionState.DRAFT); - version.setDataset(dataset); - dataset.getVersions().add(version); - - DatasetField subjectField = new DatasetField(); - subjectField.setDatasetFieldType(subjectType); - subjectField.setDatasetFieldValues(new ArrayList<>()); - subjectField.setControlledVocabularyValues(new ArrayList<>()); - - DatasetFieldValue orphanValue = new DatasetFieldValue(subjectField); - orphanValue.setValue("__placeholder__"); - subjectField.getDatasetFieldValues().add(orphanValue); - - version.setDatasetFields(new ArrayList<>(List.of(subjectField))); - - assertFalse(version.isValid(), - "Controlled vocabulary fields without a selected term should keep dataset version invalid"); - } -} From c548e477a890161b23de31d3acd061055417c9e6 Mon Sep 17 00:00:00 2001 From: Eryk Kullikowski Date: Fri, 28 Nov 2025 09:52:05 +0100 Subject: [PATCH 049/507] added validation call for working version in DatasetPage --- src/main/java/edu/harvard/iq/dataverse/DatasetPage.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index c9a60cff77d..0563d7d64cd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -4005,6 +4005,7 @@ public String save() { dataset.setOwner(ownerId != null ? dataverseService.find(ownerId) : null); } // Validate + workingVersion.validate(); // and validation messages to dataset fields if (!workingVersion.isValid()) { FacesContext.getCurrentInstance().validationFailed(); return ""; From f51c670c0e077544cbda7e4805e7b5c7fe933569 Mon Sep 17 00:00:00 2001 From: Eryk Kullikowski Date: Fri, 28 Nov 2025 09:56:37 +0100 Subject: [PATCH 050/507] typo fix --- src/main/java/edu/harvard/iq/dataverse/DatasetPage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 0563d7d64cd..5168c03a675 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -4005,7 +4005,7 @@ public String save() { dataset.setOwner(ownerId != null ? dataverseService.find(ownerId) : null); } // Validate - workingVersion.validate(); // and validation messages to dataset fields + workingVersion.validate(); // add validation messages to dataset fields if (!workingVersion.isValid()) { FacesContext.getCurrentInstance().validationFailed(); return ""; From 0fb5356a1ab26f280b62a76c2937284b4d6cf04c Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 1 Dec 2025 10:46:31 -0500 Subject: [PATCH 051/507] group by category #11998 --- doc/sphinx-guides/source/admin/features.md | 264 +++++++++++---------- scripts/issues/11998/tsv2md.py | 37 +-- 2 files changed, 163 insertions(+), 138 deletions(-) diff --git a/doc/sphinx-guides/source/admin/features.md b/doc/sphinx-guides/source/admin/features.md index 5a80771058b..9aa6cafe6c2 100644 --- a/doc/sphinx-guides/source/admin/features.md +++ b/doc/sphinx-guides/source/admin/features.md @@ -8,222 +8,238 @@ An overview of Dataverse features can be found at ` +Single Sign On (SSO) using your institution's credentials. +{doc}`More information.` -## OAI-PMH (Harvesting) +### Login via ORCID, Google, GitHub, or Microsoft -Gather and expose metadata from and to other systems using standardized metadata formats: Dublin Core, Data Document Initiative (DDI), OpenAIRE, etc. -{doc}`More information.` +Log in using popular OAuth2 providers. +{doc}`More information.` -## APIs for interoperability and custom integrations +### Login via OpenID Connect (OIDC) -Search API, Data Deposit (SWORD) API, Data Access API, Metrics API, Migration API, etc. -{doc}`More information.` +Log in using your institution's identity provider or a third party. +{doc}`More information.` -## API client libraries +### Versioning -Interact with Dataverse APIs from Python, R, Javascript, Java, and Ruby -{doc}`More information.` +History of changes to datasets and files are preserved. +{doc}`More information.` -## DataCite integration +### File previews -DOIs are reserved, and when datasets are published, their metadata is published to DataCite. -{doc}`More information.` +A preview is available for text, tabular, image, audio, video, and geospatial files. +{ref}`More information.` -## Login via Shibboleth +### Preview and analysis of tabular files -Single Sign On (SSO) using your institution's credentials. -{doc}`More information.` +Data Explorer allows for searching, charting and cross tabulation analysis +{ref}`More information.` -## Login via ORCID, Google, GitHub, or Microsoft +### Guestbook -Log in using popular OAuth2 providers. -{doc}`More information.` +Optionally collect data about who is downloading the files from your datasets. +{ref}`More information.` -## Login via OpenID Connect (OIDC) +### File download in R and TSV format -Log in using your institution's identity provider or a third party. -{doc}`More information.` +Proprietary tabular formats are converted into RData and TSV. +{doc}`More information.` -## Internationalization +### Faceted search -The Dataverse software has been translated into multiple languages. -{ref}`More information.` +Facets are data driven and customizable per collection. +{doc}`More information.` -## Versioning +## Administration -History of changes to datasets and files are preserved. -{doc}`More information.` +### Usage statistics and metrics -## Restricted files +Download counters, support for Make Data Count. +{doc}`More information.` -Control who can download files and choose whether or not to enable a "Request Access" button. -{ref}`More information.` +### Private URL -## Embargo +Create a URL for reviewers to view an unpublished (and optionally anonymized) dataset. +{ref}`More information.` -Make content inaccessible until an embargo end date. -{ref}`More information.` +### Notifications -## Custom licenses +In app and email notifications for access requests, requests for review, etc. +{ref}`More information.` -CC0 by default but add as many standard licenses as you like or create your own. -{ref}`More information.` +### User management -## Custom terms of use +Dashboard for common user-related tasks. +{doc}`More information.` -Custom terms of use can be used in place of a license or disabled by an administrator. -{ref}`More information.` +### Curation status labels -## Publishing workflow support +Let curators mark datasets with a status label customized to your needs. +{ref}`More information.<:AllowedCurationLabels>` -Datasets start as drafts and can be submitted for review before publication. -{ref}`More information.` +## Customization -## File hierarchy +### Internationalization -Users are able to control dataset file hierarchy and directory structure. -{doc}`More information.` +The Dataverse software has been translated into multiple languages. +{ref}`More information.` -## File previews +### Customization of collections -A preview is available for text, tabular, image, audio, video, and geospatial files. -{ref}`More information.` +Each personal or organizational collection can be customized and branded. +{ref}`More information.` -## Preview and analysis of tabular files +### Widgets -Data Explorer allows for searching, charting and cross tabulation analysis -{ref}`More information.` +Embed listings of data in external websites. +{ref}`More information.` -## Usage statistics and metrics +### Branding -Download counters, support for Make Data Count. -{doc}`More information.` +Your installation can be branded with a custom homepage, header, footer, CSS, etc. +{ref}`More information.` -## Guestbook +## FAIR data publication -Optionally collect data about who is downloading the files from your datasets. -{ref}`More information.` +### Support for FAIR Data Principles -## Fixity checks for files +Findable, Accessible, Interoperable, Reusable. +[More information.](https://scholar.harvard.edu/mercecrosas/presentations/fair-guiding-principles-implementation-dataverse) +### Publishing workflow support -MD5, SHA-1, SHA-256, SHA-512, UNF. -{ref}`More information.<:FileFixityChecksumAlgorithm>` +Datasets start as drafts and can be submitted for review before publication. +{ref}`More information.` -## File download in R and TSV format +## File management -Proprietary tabular formats are converted into RData and TSV. -{doc}`More information.` +### Restricted files -## Faceted search +Control who can download files and choose whether or not to enable a "Request Access" button. +{ref}`More information.` -Facets are data driven and customizable per collection. -{doc}`More information.` +### Embargo -## Customization of collections +Make content inaccessible until an embargo end date. +{ref}`More information.` -Each personal or organizational collection can be customized and branded. -{ref}`More information.` +### File hierarchy -## Private URL +Users are able to control dataset file hierarchy and directory structure. +{doc}`More information.` -Create a URL for reviewers to view an unpublished (and optionally anonymized) dataset. -{ref}`More information.` +### Fixity checks for files -## Widgets +MD5, SHA-1, SHA-256, SHA-512, UNF. +{ref}`More information.<:FileFixityChecksumAlgorithm>` -Embed listings of data in external websites. -{ref}`More information.` +### Backend storage on S3 or Swift -## Notifications +Choose between filesystem or object storage, configurable per collection and per dataset. +{doc}`More information.` -In app and email notifications for access requests, requests for review, etc. -{ref}`More information.` +### Direct upload and download for S3 -## Schema.org JSON-LD +After a permission check, files can pass freely and directly between a client computer and S3. +{doc}`More information.` -Used by Google Dataset Search and other services for discoverability. -{ref}`More information.` +### Pull header metadata from Astronomy (FITS) files -## External tools +Dataset metadata prepopulated from FITS file metadata. +{ref}`More information.` -Enable additional features not built in to the Dataverse software. -{doc}`More information.` +### Auxiliary files for data files -## External vocabulary +Each data file can have any number of auxiliary files for documentation or other purposes (experimental). +{doc}`More information.` -Let users pick from external vocabularies (provided via API/SKOSMOS) when filling in metadata. -{ref}`More information.` +## Integrations + +### DataCite integration + +DOIs are reserved, and when datasets are published, their metadata is published to DataCite. +{doc}`More information.` + +### External tools + +Enable additional features not built in to the Dataverse software. +{doc}`More information.` -## Dropbox integration +### Dropbox integration Upload files stored on Dropbox. {doc}`More information.` -## GitHub integration +### GitHub integration A GitHub Action is available to upload files from GitHub to a dataset. {doc}`More information.` -## Integration with Jupyter notebooks +### Integration with Jupyter notebooks Datasets can be opened in Binder to run code in Jupyter notebooks, RStudio, and other computation environments. {ref}`More information.` -## User management +## Interoperability -Dashboard for common user-related tasks. -{doc}`More information.` +### OAI-PMH (Harvesting) -## Curation status labels +Gather and expose metadata from and to other systems using standardized metadata formats: Dublin Core, Data Document Initiative (DDI), OpenAIRE, etc. +{doc}`More information.` -Let curators mark datasets with a status label customized to your needs. -{ref}`More information.<:AllowedCurationLabels>` +### APIs for interoperability and custom integrations -## Branding +Search API, Data Deposit (SWORD) API, Data Access API, Metrics API, Migration API, etc. +{doc}`More information.` -Your installation can be branded with a custom homepage, header, footer, CSS, etc. -{ref}`More information.` +### API client libraries -## Backend storage on S3 or Swift +Interact with Dataverse APIs from Python, R, Javascript, Java, and Ruby +{doc}`More information.` -Choose between filesystem or object storage, configurable per collection and per dataset. -{doc}`More information.` +### Schema.org JSON-LD + +Used by Google Dataset Search and other services for discoverability. +{ref}`More information.` -## Direct upload and download for S3 +### External vocabulary -After a permission check, files can pass freely and directly between a client computer and S3. -{doc}`More information.` +Let users pick from external vocabularies (provided via API/SKOSMOS) when filling in metadata. +{ref}`More information.` -## Export data in BagIt format +### Export data in BagIt format For preservation, bags can be sent to the local filesystem, Duraclound, and Google Cloud. {ref}`More information.` -## Post-publication automation (workflows) +## Reusability -Allow publication of a dataset to kick off external processes and integrations. -{doc}`More information.` +### Data citation for datasets and files -## Pull header metadata from Astronomy (FITS) files +EndNote XML, RIS, or BibTeX format at the dataset or file level. +{doc}`More information.` -Dataset metadata prepopulated from FITS file metadata. -{ref}`More information.` +### Custom licenses -## Provenance +CC0 by default but add as many standard licenses as you like or create your own. +{ref}`More information.` -Upload standard W3C provenance files or enter free text instead. -{ref}`More information.` +### Custom terms of use -## Auxiliary files for data files +Custom terms of use can be used in place of a license or disabled by an administrator. +{ref}`More information.` -Each data file can have any number of auxiliary files for documentation or other purposes (experimental). -{doc}`More information.` +### Post-publication automation (workflows) + +Allow publication of a dataset to kick off external processes and integrations. +{doc}`More information.` + +### Provenance + +Upload standard W3C provenance files or enter free text instead. +{ref}`More information.` diff --git a/scripts/issues/11998/tsv2md.py b/scripts/issues/11998/tsv2md.py index 888cb9b1595..47c65e51f6c 100755 --- a/scripts/issues/11998/tsv2md.py +++ b/scripts/issues/11998/tsv2md.py @@ -11,6 +11,7 @@ import sys from optparse import OptionParser import csv +from itertools import groupby parser = OptionParser() options, args = parser.parse_args() @@ -34,22 +35,30 @@ reader = csv.DictReader(tsv_file, delimiter="\t") rows = [row for row in reader] missing = [] -for row in rows: - title = row["Title"] - description = row["Description"] - url = row["URL"] - dtype = row["DocLinkType"] - target = row["DocLinkTarget"] - print("## %s" % title) +# Sort rows by category +rows.sort(key=lambda x: x["Categories"]) + +# Group by category +for category, group in groupby(rows, key=lambda x: x["Categories"]): + # print('BEGIN') + print("## %s" % category) print() - print("%s" % description) - if target == 'url': - print("[More information.](%s)" % (url)) - elif target != '': - print("{%s}`More information.<%s>`" % (dtype, target)) + for row in group: + title = row["Title"] + description = row["Description"] + url = row["URL"] + dtype = row["DocLinkType"] + target = row["DocLinkTarget"] + print("### %s" % title) print() - else: - missing.append(url) + print("%s" % description) + if target == 'url': + print("[More information.](%s)" % (url)) + elif target != '': + print("{%s}`More information.<%s>`" % (dtype, target)) + print() + else: + missing.append(url) tsv_file.close() for item in missing: print(item) From b4058a3a4590308757d69e01717dae6b299a84a7 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 2 Dec 2025 12:14:19 -0500 Subject: [PATCH 052/507] Show history of Access Requests via API --- ...ory-of-access-request-available-via-api.md | 8 ++ doc/sphinx-guides/source/api/dataaccess.rst | 15 ++++ .../edu/harvard/iq/dataverse/DataFile.java | 23 +++++- .../iq/dataverse/FileAccessRequest.java | 17 +++- .../dataverse/ManageFilePermissionsPage.java | 33 +++++++- .../edu/harvard/iq/dataverse/api/Access.java | 28 ++++++- .../iq/dataverse/util/json/JsonPrinter.java | 15 ++++ src/main/java/propertyFiles/Bundle.properties | 4 + .../webapp/permissions-manage-files.xhtml | 14 ++-- .../harvard/iq/dataverse/api/AccessIT.java | 79 ++++++++++++++++++- .../edu/harvard/iq/dataverse/api/UtilIT.java | 26 ++++-- 11 files changed, 236 insertions(+), 26 deletions(-) create mode 100644 doc/release-notes/8013-history-of-access-request-available-via-api.md diff --git a/doc/release-notes/8013-history-of-access-request-available-via-api.md b/doc/release-notes/8013-history-of-access-request-available-via-api.md new file mode 100644 index 00000000000..14ebe52f9f7 --- /dev/null +++ b/doc/release-notes/8013-history-of-access-request-available-via-api.md @@ -0,0 +1,8 @@ +### Feature: Extend List File Access Requests API ### + +Added ability to get access request history via the `/datafile/{id}/listRequests` API. The API returns a list of users/groups where the request for access is waiting for an accept or reject. Already accepted or rejected requests are not returned. + +By adding the flag 'includeHistory=true' all of the requests will be returned. Pagination is also implemented in this feature. Adding a start page parameter and max list size (`&start=0` and `&per_page=20`) can limit the amount of data being returned. + +See https://guides.dataverse.org/en/latest/api/dataaccess.html#list-file-access-requests + diff --git a/doc/sphinx-guides/source/api/dataaccess.rst b/doc/sphinx-guides/source/api/dataaccess.rst index 0782665776d..1fa19d65688 100755 --- a/doc/sphinx-guides/source/api/dataaccess.rst +++ b/doc/sphinx-guides/source/api/dataaccess.rst @@ -406,6 +406,21 @@ A curl example using an ``id``:: curl -H "X-Dataverse-key:$API_TOKEN" -X GET http://$SERVER/api/access/datafile/{id}/listRequests +Query parameters have been added to retrieve the historical list of "created", "granted", and "rejected" requests: + +* `includeHistory` When `true` this will force the return of all requests and not just the "created" ones. +* `start` For pagination, use this to request a specific page. +* `per_page` For pagination, use this to limit the number of items in each paged list. + +.. note:: Pagination is only available when `includeHistory` is `true` + +If requesting a page beyond the last page this API will return a 404 "There are no access requests for this file:..." +If requesting a page before page 0 or requesting the number of items to be 0 or less this API will ignore these parameters and return the entire list. + +A curl example using an ``id``:: + + curl -H "X-Dataverse-key:$API_TOKEN" -X GET http://$SERVER/api/access/datafile/{id}/listRequests?includeHistory=true&start=0&per_page=20 + User Has Requested Access to a File: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 45604a5472b..138df5b49b1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -35,6 +35,7 @@ import jakarta.persistence.*; import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.NotBlank; +import org.apache.commons.compress.utils.Lists; /** * @@ -226,11 +227,25 @@ public String toString() { inverseJoinColumns = @JoinColumn(name = "authenticated_user_id")) private List fileAccessRequesters; - - public List getFileAccessRequests(){ - return fileAccessRequests; + public List getFileAccessRequests() { + return getFileAccessRequests(0, 0); } - + + public List getFileAccessRequests(int numResultsPerPageRequested, int paginationStart) { + if (numResultsPerPageRequested <= 0 || paginationStart < 0) { + return fileAccessRequests; + } else { + int startIndex = paginationStart * numResultsPerPageRequested; + int endIndex = startIndex + numResultsPerPageRequested; + if (startIndex >= fileAccessRequests.size()) { + return List.of(); + } else if (endIndex > fileAccessRequests.size()) { + endIndex = fileAccessRequests.size(); + } + return fileAccessRequests.subList(startIndex, endIndex); + } + } + public List getFileAccessRequests(FileAccessRequest.RequestState state){ return fileAccessRequests.stream().filter(far -> far.getState() == state).collect(Collectors.toList()); } diff --git a/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java b/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java index 43463e0cb91..6f9213f5658 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java @@ -4,6 +4,7 @@ import java.util.Date; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; +import edu.harvard.iq.dataverse.util.BundleUtil; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -143,6 +144,20 @@ public String getStateLabel() { } return null; } + + // For use by UI to allow for internationalization + public String getStateLabelNationalized() { + if(isStateCreated()){ + return BundleUtil.getStringFromBundle("permission.fileAccess.created"); + } + if(isStateGranted()) { + return BundleUtil.getStringFromBundle("permission.fileAccess.granted"); + } + if(isStateRejected()) { + return BundleUtil.getStringFromBundle("permission.fileAccess.rejected"); + } + return null; + } public void setStateCreated() { this.requestState = RequestState.CREATED; @@ -197,4 +212,4 @@ public boolean equals(Object object) { } -} \ No newline at end of file +} diff --git a/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java b/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java index a23b41cb1d1..984d60eb15f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java @@ -116,6 +116,15 @@ public boolean isShowDeleted() { public void setShowDeleted(boolean showDeleted) { this.showDeleted = showDeleted; } + private boolean showHistory = false; + + public boolean isShowHistory() { + return showHistory; + } + + public void setShowHistory(boolean showHistory) { + this.showHistory = showHistory; + } public Dataset getDataset() { return dataset; @@ -143,6 +152,13 @@ public void showDeletedCheckboxChange() { } } + private boolean backingShowHistory = false; + public void showHistoryCheckboxChange() { + if (backingShowHistory != showHistory) { + initMaps(); + backingShowHistory = showHistory; + } + } public String init() { if (dataset.getId() != null) { @@ -199,7 +215,7 @@ private void initMaps() { fileMap.put(file, raList); // populate the file access requests map - for (FileAccessRequest fileAccessRequest : file.getFileAccessRequests(FileAccessRequest.RequestState.CREATED)) { + for (FileAccessRequest fileAccessRequest : !showHistory ? file.getFileAccessRequests(FileAccessRequest.RequestState.CREATED) : file.getFileAccessRequests()) { List fileAccessRequestList = fileAccessRequestMap.get(fileAccessRequest.getRequester()); if (fileAccessRequestList == null) { fileAccessRequestList = new ArrayList<>(); @@ -250,6 +266,21 @@ public String formatAccessRequestTimestamp(List fileAccessReq return Util.getDateTimeFormat().format(date); } + public String getAccessRequestStates(List fileAccessRequests) { + String result = ""; + if (fileAccessRequests != null) { + Map items = fileAccessRequests.stream() + .sorted(Comparator.comparing(FileAccessRequest::getState)) + .collect(Collectors.groupingBy( + FileAccessRequest::getStateLabelNationalized, + Collectors.counting())); + + result = items.entrySet().stream().map(entry -> entry.getKey() + ":" + entry.getValue()) + .collect(Collectors.joining(", ", "[ ", " ]")); + } + return result; + } + private void addFileToRoleAssignee(RoleAssignment assignment, boolean fileDeleted) { RoleAssignee ra = roleAssigneeService.getRoleAssignee(assignment.getAssigneeIdentifier()); List assignments = roleAssigneeMap.get(ra); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Access.java b/src/main/java/edu/harvard/iq/dataverse/api/Access.java index 89a4cd743d7..0c8e8c23e3e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Access.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Access.java @@ -41,6 +41,7 @@ import edu.harvard.iq.dataverse.util.FileUtil; import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.SystemConfig; +import edu.harvard.iq.dataverse.util.json.JsonPrinter; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import java.util.logging.Logger; @@ -62,6 +63,7 @@ import jakarta.json.Json; import java.net.URI; import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; import jakarta.persistence.TypedQuery; import jakarta.ws.rs.GET; @@ -1467,8 +1469,11 @@ public Response requestFileAccess(@Context ContainerRequestContext crc, @PathPar @GET @AuthRequired @Path("/datafile/{id}/listRequests") - public Response listFileAccessRequests(@Context ContainerRequestContext crc, @PathParam("id") String fileToRequestAccessId, @Context HttpHeaders headers) { - + public Response listFileAccessRequests(@Context ContainerRequestContext crc, @PathParam("id") String fileToRequestAccessId, + @QueryParam("includeHistory") boolean includeHistory, + @QueryParam("per_page") final int numResultsPerPageRequested, + @QueryParam("start") final int paginationStart, + @Context HttpHeaders headers) { DataverseRequest dataverseRequest; DataFile dataFile; @@ -1489,7 +1494,8 @@ public Response listFileAccessRequests(@Context ContainerRequestContext crc, @Pa return error(FORBIDDEN, BundleUtil.getStringFromBundle("access.api.rejectAccess.failure.noPermissions")); } - List requests = dataFile.getFileAccessRequests(FileAccessRequest.RequestState.CREATED); + List requests = !includeHistory ? dataFile.getFileAccessRequests(FileAccessRequest.RequestState.CREATED) : + dataFile.getFileAccessRequests(numResultsPerPageRequested, paginationStart); if (requests == null || requests.isEmpty()) { List args = Arrays.asList(dataFile.getDisplayName()); @@ -1499,7 +1505,21 @@ public Response listFileAccessRequests(@Context ContainerRequestContext crc, @Pa JsonArrayBuilder userArray = Json.createArrayBuilder(); for (FileAccessRequest fileAccessRequest : requests) { - userArray.add(json(fileAccessRequest.getRequester())); + userArray.add(json(fileAccessRequest)); + } + + // Check for pagination request + if (includeHistory && numResultsPerPageRequested > 0 && paginationStart >= 0) { + JsonObjectBuilder builder = Json.createObjectBuilder() + .add("status", ApiConstants.STATUS_OK) + .add("data", userArray); + + builder = JsonPrinter.jsonAddPagination(builder, paginationStart, numResultsPerPageRequested, + requests.size(), dataFile.getFileAccessRequests().size()); + + return Response.ok( builder.build() ) + .type(MediaType.APPLICATION_JSON) + .build(); } return ok(userArray); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 654154c5b64..7c6e827e878 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -146,6 +146,21 @@ public static JsonObjectBuilder json(AuthenticatedUser authenticatedUser) { .add("authenticationProviderId", authenticatedUser.getAuthenticatedUserLookup().getAuthenticationProviderId()); return builder; } + public static JsonObjectBuilder json(FileAccessRequest fileAccessRequest) { + JsonObjectBuilder builder = json(fileAccessRequest.getRequester()) + .add("requestState", fileAccessRequest.getStateLabel()); + return builder; + } + + public static JsonObjectBuilder jsonAddPagination(JsonObjectBuilder objectBuilder, int pageRequested, int numResultsPerPageRequested, int pageCount, int totalCount) { + objectBuilder + .add("selectedPage", pageRequested) + .add("pageCount", pageCount) + .add("totalCount", totalCount) + .add("hasPrevPage", pageRequested > 0) + .add("hasNextPage", pageCount < numResultsPerPageRequested ? false : totalCount > (pageRequested + 1) * pageCount); + return objectBuilder; + } public static JsonArrayBuilder jsonRoleAssignments(List roleAssignments) { JsonArrayBuilder bld = Json.createArrayBuilder(); diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 4f823449118..72fc258584c 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -1252,6 +1252,7 @@ dataverse.permissionsFiles.files.invalidMsg=There are no restricted files in thi dataverse.permissionsFiles.files.requested=Requested Files dataverse.permissionsFiles.files.selected=Selecting {0} of {1} {2} dataverse.permissionsFiles.files.includeDeleted=Include Deleted Files +dataverse.permissionsFiles.files.showHistory=Show Historical Requests dataverse.permissionsFiles.files.draftUnpublished=Draft/Unpublished dataverse.permissionsFiles.viewRemoveDialog.header=File Access dataverse.permissionsFiles.viewRemoveDialog.removeBtn=Remove Access @@ -2753,6 +2754,9 @@ permission.roleNotAbleToBeRemoved=The role assignment was not able to be removed permission.fileAccessGranted=File Access request by {0} was granted. permission.fileAccessRejected=File Access request by {0} was rejected. permission.roleNotAbleToBeAssigned=The role was not able to be assigned. +permission.fileAccess.created=Requested +permission.fileAccess.granted=Granted +permission.fileAccess.rejected=Rejected #ManageGroupsPage.java dataverse.manageGroups.create.success=Successfully created group {0}. Refresh to update your page. diff --git a/src/main/webapp/permissions-manage-files.xhtml b/src/main/webapp/permissions-manage-files.xhtml index cc04af6c022..7c76e281111 100644 --- a/src/main/webapp/permissions-manage-files.xhtml +++ b/src/main/webapp/permissions-manage-files.xhtml @@ -52,6 +52,9 @@ + + +
@@ -88,8 +91,8 @@ rendered="#{manageFilePermissionsPage.formatAccessRequestDate(access.value) == null}" /> -
- + #{bundle['dataverse.permissionsFiles.assignDialog.grantBtn']} - #{bundle['dataverse.permissionsFiles.assignDialog.rejectBtn']} +
@@ -399,13 +403,13 @@ - - diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java index dd8ddd2d315..ea3f796f9dc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java @@ -13,7 +13,6 @@ import java.io.IOException; import java.util.zip.ZipInputStream; -import jakarta.json.Json; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -27,9 +26,8 @@ import org.hamcrest.collection.IsMapContaining; import static jakarta.ws.rs.core.Response.Status.*; +import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; import static org.junit.jupiter.api.Assertions.*; /** @@ -547,6 +545,12 @@ public void testRequestAccess() throws InterruptedException { Response rejectFileAccessResponse = UtilIT.rejectFileAccessRequest(tabFile3IdRestrictedNew.toString(), "@" + apiIdentifierRando, apiToken); assertEquals(200, rejectFileAccessResponse.getStatusCode()); + // including history includes "rejected" + Response listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, Boolean.TRUE); + listAccessRequestWithHistoryResponse.prettyPrint(); + assertEquals(200, listAccessRequestWithHistoryResponse.getStatusCode()); + assertTrue(listAccessRequestWithHistoryResponse.prettyPrint().contains("\"requestState\": \"rejected\"")); + requestFileAccessResponse = UtilIT.requestFileAccess(tabFile3IdRestrictedNew.toString(), apiTokenRando); //grant file access Response grantFileAccessResponse = UtilIT.grantFileAccess(tabFile3IdRestrictedNew.toString(), "@" + apiIdentifierRando, apiToken); @@ -571,6 +575,75 @@ public void testRequestAccess() throws InterruptedException { listAccessRequestResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken); assertEquals(404, listAccessRequestResponse.getStatusCode()); + + // create multiple users and grant some access and reject the others + for (int i=0 ; i <15; i++) { + Response createUserResponse = UtilIT.createRandomUser(); + createUserResponse.prettyPrint(); + assertEquals(200, createUserResponse.getStatusCode()); + String token = UtilIT.getApiTokenFromResponse(createUserResponse); + String apiIdentifier = UtilIT.getUsernameFromResponse(createUserResponse); + Response fileAccessResponse = UtilIT.requestFileAccess(tabFile3IdRestrictedNew.toString(), token); + assertEquals(200, fileAccessResponse.getStatusCode()); + if (i % 2 == 0) { + fileAccessResponse = UtilIT.grantFileAccess(tabFile3IdRestrictedNew.toString(), "@" + apiIdentifier, apiToken); + assertEquals(200, fileAccessResponse.getStatusCode()); + } else { + fileAccessResponse = UtilIT.rejectFileAccessRequest(tabFile3IdRestrictedNew.toString(), "@" + apiIdentifier, apiToken); + assertEquals(200, fileAccessResponse.getStatusCode()); + } + } + + // include full history + listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, Boolean.TRUE); + listAccessRequestWithHistoryResponse.prettyPrint(); + listAccessRequestWithHistoryResponse.then() + .assertThat() + .statusCode(OK.getStatusCode()) + .body("data.size()", equalTo(17)); + + // include paginated history + for (int page = 0; page <= 8; page++) { + // There are 9 pages (0 though 8). The first 8 pages should have 2 entries each. The last page should have 1 entry. (Total 17) + int expectedCount = page < 8 ? 2 : 1; + listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, page, 2); + listAccessRequestWithHistoryResponse.prettyPrint(); + listAccessRequestWithHistoryResponse.then() + .assertThat() + .statusCode(OK.getStatusCode()) + .body("selectedPage", equalTo(page)) + .body("pageCount", equalTo(expectedCount)) + .body("totalCount", equalTo(17)) + .body("hasPrevPage", equalTo(page > 0)) + .body("hasNextPage", equalTo(page < 8)) + .body("data.size()", equalTo(expectedCount)); + } + // Edge cases. + // Return 404 if requesting a page to high. + // Gets the entire list if requesting page = negative index or number of items <= 0 + listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, 99, 2); + listAccessRequestWithHistoryResponse.prettyPrint(); + listAccessRequestWithHistoryResponse.then() + .assertThat() + .statusCode(NOT_FOUND.getStatusCode()); + listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, -1, 2); + listAccessRequestWithHistoryResponse.prettyPrint(); + listAccessRequestWithHistoryResponse.then() + .assertThat() + .statusCode(OK.getStatusCode()) + .body("selectedPage", nullValue()) + .body("pageCount", nullValue()) + .body("totalCount", nullValue()) + .body("data.size()", equalTo(17)); + listAccessRequestWithHistoryResponse = UtilIT.getAccessRequestList(tabFile3IdRestrictedNew.toString(), apiToken, 0, 0); + listAccessRequestWithHistoryResponse.prettyPrint(); + listAccessRequestWithHistoryResponse.then() + .assertThat() + .statusCode(OK.getStatusCode()) + .body("selectedPage", nullValue()) + .body("pageCount", nullValue()) + .body("totalCount", nullValue()) + .body("data.size()", equalTo(17)); } // This is a round trip test of uploading a zipped archive, with some folder diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 4dcea10cfe6..d685c8fcede 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -2087,19 +2087,29 @@ static Response grantFileAccess(String fileIdOrPersistentId, String identifier, } static Response getAccessRequestList(String fileIdOrPersistentId, String apiToken) { + return getAccessRequestList(fileIdOrPersistentId, apiToken, null); + } + static Response getAccessRequestList(String fileIdOrPersistentId, String apiToken, int pageStart, int pageNumItems) { + return getAccessRequestList(fileIdOrPersistentId, apiToken, Boolean.TRUE, pageStart, pageNumItems); + } + static Response getAccessRequestList(String fileIdOrPersistentId, String apiToken, Boolean includeHistory) { + return getAccessRequestList(fileIdOrPersistentId, apiToken, includeHistory, 0, 0); + } + static Response getAccessRequestList(String fileIdOrPersistentId, String apiToken, Boolean includeHistory, int pageStart, int pageNumItems) { + RequestSpecification requestSpecification = given(); + String idInPath = fileIdOrPersistentId; // Assume it's a number. - String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. if (!NumberUtils.isCreatable(fileIdOrPersistentId)) { idInPath = ":persistentId"; - optionalQueryParam = "?persistentId=" + fileIdOrPersistentId; + requestSpecification.queryParam("persistentId", fileIdOrPersistentId); } - String keySeparator = "&"; - if (optionalQueryParam.isEmpty()) { - keySeparator = "?"; + if (includeHistory != null) { + requestSpecification.queryParam("includeHistory", includeHistory); + requestSpecification.queryParam("start", pageStart); + requestSpecification.queryParam("per_page", pageNumItems); } - Response response = given() - .get("/api/access/datafile/" + idInPath + "/listRequests/" + optionalQueryParam + keySeparator + "key=" + apiToken); - return response; + requestSpecification.queryParam("key", apiToken); + return requestSpecification.get("/api/access/datafile/" + idInPath + "/listRequests"); } static Response rejectFileAccessRequest(String fileIdOrPersistentId, String identifier, String apiToken) { From 5155a1f2b818da16b218ea918a7af67d4f8ea949 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 2 Dec 2025 16:59:04 -0500 Subject: [PATCH 053/507] ui work --- src/main/java/edu/harvard/iq/dataverse/DataFile.java | 9 +++++++++ .../java/edu/harvard/iq/dataverse/FileAccessRequest.java | 2 +- src/main/webapp/permissions-manage-files.xhtml | 7 ++++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 138df5b49b1..43bbb6be1d3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -843,6 +843,15 @@ public void addFileAccessRequest(FileAccessRequest request) { this.fileAccessRequests.add(request); } + public List getAccessRequestsForAssignee(RoleAssignee roleAssignee) { + if (this.fileAccessRequests == null) { + return null; + } + + return this.fileAccessRequests.stream() + .filter(fileAccessRequest -> fileAccessRequest.getRequester().equals(roleAssignee)).toList(); + } + public FileAccessRequest getAccessRequestForAssignee(RoleAssignee roleAssignee) { if (this.fileAccessRequests == null) { return null; diff --git a/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java b/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java index 6f9213f5658..c918c539c40 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java @@ -147,7 +147,7 @@ public String getStateLabel() { // For use by UI to allow for internationalization public String getStateLabelNationalized() { - if(isStateCreated()){ + if(isStateCreated()) { return BundleUtil.getStringFromBundle("permission.fileAccess.created"); } if(isStateGranted()) { diff --git a/src/main/webapp/permissions-manage-files.xhtml b/src/main/webapp/permissions-manage-files.xhtml index 7c76e281111..301167aecf5 100644 --- a/src/main/webapp/permissions-manage-files.xhtml +++ b/src/main/webapp/permissions-manage-files.xhtml @@ -328,7 +328,7 @@
-

#{bundle['dataverse.permissionsFiles.assignDialog.description']}

+

#{manageFilePermissionsPage.showHistory ? '' : bundle['dataverse.permissionsFiles.assignDialog.description']}