Skip to content

Commit 5727c1b

Browse files
committed
Merge branch 'develop' into 11912-edit-template-api
2 parents 0cebb9c + 6b188a4 commit 5727c1b

26 files changed

Lines changed: 178 additions & 47 deletions
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
This release changes the display behavior of the file, dataset and collection ("dataverse") pages for tabular files. They will show the original file name and information, and will allow editing of the original file name. The ingested *.tab version is still available from the download menu.
2+

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ This API changelog is experimental and we would love feedback on its usefulness.
1010
v6.11
1111
-----
1212

13-
- The Croissant :ref:`metadata export format <metadata-export-formats>` has been updated from version 1.0 to 1.1, which is reflected in the ``conformsTo`` property. ``@vocab`` and ``sc`` properties now use "http" as `recommended <https://github.com/mlcommons/croissant/pull/929#pullrequestreview-3079137662>`_. The unused ``wd`` property has been dropped.
13+
- The Croissant :ref:`metadata export format <metadata-export-formats>` has been updated from version 1.0 to 1.1, which is reflected in the ``conformsTo`` property. The unused ``wd`` property has been dropped.
1414

1515
v6.10
1616
-----

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public DataCitation(FileMetadata fm, boolean direct) {
141141
getCommonValuesFrom(dsv);
142142

143143
// file Title for direct File citation
144-
fileTitle = fm.getLabel();
144+
fileTitle = fm.getLabelForOriginal();
145145
DataFile df = fm.getDataFile();
146146

147147
// File description

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,11 @@ public Long getOriginalFileSize() {
547547
return null;
548548
}
549549

550+
public String getFriendlyOriginalFileSize() {
551+
Long size = (getOriginalFileSize()==null) ? filesize : getOriginalFileSize();
552+
return getFriendlySize(size);
553+
}
554+
550555
public String getOriginalFileName() {
551556
if (isTabularData()) {
552557
DataTable dataTable = getDataTable();
@@ -559,7 +564,7 @@ public String getOriginalFileName() {
559564
}
560565

561566

562-
private String getDerivedOriginalFileName() {
567+
public String getDerivedOriginalFileName() {
563568
FileMetadata fm = getFileMetadata();
564569
String filename = fm.getLabel();
565570
String originalExtension = FileUtil.generateOriginalExtension(getOriginalFileFormat());
@@ -709,8 +714,12 @@ public void setFilesize(long filesize) {
709714
* @return
710715
*/
711716
public String getFriendlySize() {
712-
if (filesize != null) {
713-
return FileSizeChecker.bytesToHumanReadable(filesize);
717+
return getFriendlySize(filesize);
718+
}
719+
720+
private String getFriendlySize(Long size) {
721+
if (size != null) {
722+
return FileSizeChecker.bytesToHumanReadable(size);
714723
} else {
715724
return BundleUtil.getStringFromBundle("file.sizeNotAvailable");
716725
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package edu.harvard.iq.dataverse;
2+
3+
import jakarta.validation.ConstraintValidator;
4+
import jakarta.validation.ConstraintValidatorContext;
5+
6+
import java.util.regex.Matcher;
7+
import java.util.regex.Pattern;
8+
9+
public class FileLabelValidator implements ConstraintValidator<ValidateDataFileLabel, String> {
10+
11+
@Override
12+
public void initialize(ValidateDataFileLabel constraintAnnotation) {
13+
14+
}
15+
16+
@Override
17+
public boolean isValid(String value, ConstraintValidatorContext context) {
18+
return isFileLabelValid(value, context);
19+
20+
}
21+
22+
public static boolean isFileLabelValid(String value, ConstraintValidatorContext context) {
23+
24+
if (value == null || value.isEmpty()) {
25+
return true;
26+
}
27+
String validCharacters = "^[^:<>;#/\"\\*\\|\\?\\\\]*$";
28+
Pattern p = Pattern.compile(validCharacters);
29+
Matcher m = p.matcher(value);
30+
return m.matches();
31+
32+
}
33+
34+
}

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import jakarta.persistence.NamedNativeQuery;
4040
import jakarta.persistence.OneToMany;
4141
import jakarta.persistence.OrderBy;
42+
import jakarta.persistence.PostLoad;
4243
import jakarta.persistence.SqlResultSetMapping;
4344
import jakarta.persistence.Table;
4445
import jakarta.persistence.Transient;
@@ -153,6 +154,18 @@ public class FileMetadata implements Serializable {
153154
@OneToMany (mappedBy="fileMetadata", cascade={ CascadeType.REMOVE, CascadeType.MERGE,CascadeType.PERSIST})
154155
private Collection<VariableMetadata> variableMetadatas;
155156

157+
// A transient field is needed for JSF UI - validation errors on label do not get routed directly to the input for labelNoExtension, causing rollback.
158+
// With a separate transient field kept in sync with label, the validation can be done on the labelNoExtension field, which avoids the issue and allows proper validation.
159+
@Transient
160+
@ValidateDataFileLabel(message = "{filename.illegalCharacters}")
161+
String labelNoExtension;
162+
163+
// Initialize the labelNoExtension from label after loading the entity
164+
@PostLoad
165+
public void postLoad() {
166+
getLabelNoExtension();
167+
}
168+
156169
/**
157170
* Creates a copy of {@code this}, with identical business logic fields, making the bi-drectional connections to the specified version.
158171
*
@@ -173,13 +186,46 @@ public FileMetadata createCopyInVersion(DatasetVersion dsv) {
173186
}
174187

175188
public String getLabel() {
189+
getLabelNoExtension();
176190
return label;
177191
}
178192

179193
public void setLabel(String label) {
180194
this.label = label;
195+
getLabelNoExtension();
196+
}
197+
198+
199+
public String getLabelNoExtension() {
200+
int last = label.lastIndexOf(".");
201+
labelNoExtension = (last == -1) ? label : label.substring(0, last);
202+
return labelNoExtension;
203+
}
204+
205+
public String getOriginalExtension() {
206+
String origFilename = getLabelForOriginal();
207+
int last = origFilename.lastIndexOf(".");
208+
return (last == -1) ? "" : origFilename.substring(last);
181209
}
182210

211+
public void setLabelNoExtension(String name) {
212+
labelNoExtension = name;
213+
int last = this.label.lastIndexOf(".");
214+
if (last == -1) {
215+
this.label = name;
216+
} else {
217+
this.label = name + this.label.substring(last);
218+
}
219+
}
220+
221+
public String getLabelForOriginal() {
222+
if(dataFile.isTabularData()) {
223+
return dataFile.getDerivedOriginalFileName();
224+
} else {
225+
return label;
226+
}
227+
}
228+
183229
public FileMetadata() {
184230
variableMetadatas = new ArrayList<VariableMetadata>();
185231
varGroups = new ArrayList<VarGroup>();
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package edu.harvard.iq.dataverse;
2+
3+
import jakarta.validation.Constraint;
4+
import jakarta.validation.Payload;
5+
6+
import java.lang.annotation.Documented;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.Target;
9+
10+
import static java.lang.annotation.ElementType.FIELD;
11+
import static java.lang.annotation.RetentionPolicy.RUNTIME;
12+
13+
@Target({FIELD})
14+
@Retention(RUNTIME)
15+
@Constraint(validatedBy = {FileLabelValidator.class})
16+
@Documented
17+
public @interface ValidateDataFileLabel {
18+
19+
String message() default "Failed Validation for Validate Data File Label";
20+
21+
Class<?>[] groups() default {};
22+
23+
Class<? extends Payload>[] payload() default {};
24+
25+
}

src/main/java/edu/harvard/iq/dataverse/export/croissant/CroissantExportUtil.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Map;
1919
import org.apache.commons.text.StringEscapeUtils;
2020

21+
// Validate with src/test/resources/croissant/validate.sh
2122
public class CroissantExportUtil {
2223

2324
public static void exportDataset(
@@ -31,7 +32,7 @@ public static void exportDataset(
3132
{
3233
"@context": {
3334
"@language": "en",
34-
"@vocab": "http://schema.org/",
35+
"@vocab": "https://schema.org/",
3536
"citeAs": "cr:citeAs",
3637
"column": "cr:column",
3738
"conformsTo": "dct:conformsTo",
@@ -70,7 +71,7 @@ public static void exportDataset(
7071
"repeated": "cr:repeated",
7172
"replace": "cr:replace",
7273
"samplingRate": "cr:samplingRate",
73-
"sc": "http://schema.org/",
74+
"sc": "https://schema.org/",
7475
"separator": "cr:separator",
7576
"source": "cr:source",
7677
"subField": "cr:subField",

src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1611,7 +1611,7 @@ public SolrInputDocuments toSolrDocs(IndexableDataset indexableDataset, Set<Long
16111611

16121612
String filenameCompleteFinal = "";
16131613
if (fileMetadata != null) {
1614-
String filenameComplete = fileMetadata.getLabel();
1614+
String filenameComplete = fileMetadata.getLabelForOriginal();
16151615
if (filenameComplete != null) {
16161616
String filenameWithoutExtension = "";
16171617
// String extension = "";

src/main/webapp/dataset.xhtml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2034,7 +2034,8 @@
20342034
<ui:fragment rendered="#{valid and settingsWrapper.isHasPublishDatasetDisclaimerText()}">
20352035
<div class="form-group">
20362036
<p:selectBooleanCheckbox class="text-danger" id="publishDisclaimer"
2037-
itemLabel="#{settingsWrapper.getPublishDatasetDisclaimerText()}"
2037+
itemLabel="#{MarkupChecker:sanitizeAdvancedHTML(settingsWrapper.getPublishDatasetDisclaimerText())}"
2038+
escape="false"
20382039
value="#{DatasetPage.publishDisclaimerAcknowledged}">
20392040
<p:ajax event="change" update="releaseDatasetButton"/>
20402041
</p:selectBooleanCheckbox>

0 commit comments

Comments
 (0)