Skip to content

Commit 6b188a4

Browse files
authored
Merge pull request IQSS#12145 from QualitativeDataRepository/IQSS/7956-show_original_file_format
IQSS/7956 show original file format
2 parents 7054b64 + a1bc4fd commit 6b188a4

11 files changed

Lines changed: 137 additions & 19 deletions

File tree

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+

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/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/editFilesFragment.xhtml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -424,13 +424,14 @@
424424
</div>
425425
</div>
426426
<div class="col-md-10 file-metadata-block">
427-
<label class="control-label" for="datasetForm:filesTable:#{rowNum}:fileName" style="margin-right:1em;margin-bottom:.5em;">
427+
<label class="control-label" jsf:for="fileName" style="margin-right:1em;margin-bottom:.5em;">
428428
#{bundle['file.fileName']}
429429
</label>
430-
<p:inputText id="fileName" value="#{fileMetadata.label}" style="width:60%; margin-bottom:.5em;" disabled="#{fileMetadata.dataFile.filePackage}"/>
430+
<p:inputText id="fileName" value="#{fileMetadata.labelNoExtension}" style="width:60%; margin-bottom:.5em;" disabled="#{fileMetadata.dataFile.filePackage}"/>
431+
<h:outputText value="#{fileMetadata.originalExtension}"/>
431432
<p:message for="datasetForm:filesTable:#{rowNum}:fileName"/>
432433

433-
<label class="control-label" for="datasetForm:filesTable:#{rowNum}:fileDirectoryName" style="margin-right:1em;margin-bottom:.5em;">
434+
<label class="control-label" jsf:for="fileDirectoryName" style="margin-right:1em;margin-bottom:.5em;">
434435
#{bundle['file.metadataTab.fileMetadata.hierarchy.label']}
435436
<span class="glyphicon glyphicon-question-sign tooltip-icon"
436437
data-toggle="tooltip" data-placement="auto right" data-original-title="#{bundle['file.metadataTab.fileMetadata.hierarchy.tip']}"></span>

src/main/webapp/file-info-fragment.xhtml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,19 @@
6767
<ui:fragment rendered="#{!editDatafilesPage}">
6868
<!-- conditional render in file page links, if file has global id, use that; if not, we use database id -->
6969
<a href="#{widgetWrapper.wrapURL('/file.xhtml?'.concat(fileIdParam).concat(fileIdValue).concat('&amp;version=').concat(fileMetadata.datasetVersion.friendlyVersionNumber))}">
70-
#{fileMetadata.label}
70+
#{fileMetadata.labelForOriginal}
7171
</a>
7272
</ui:fragment>
7373
<ui:fragment rendered="#{editDatafilesPage}">
74-
<span>#{fileMetadata.label}</span>
74+
<span>#{fileMetadata.labelForOriginal}</span>
7575
</ui:fragment>
7676
</div>
7777
<!-- HIERARCHY + TYPE + SIZE + DATE + CHECKSUM -->
7878
<div class="text-muted small">
79-
<!-- id:#{dataFile.id} -->
79+
<!-- id:#{fileMetadata.dataFile.id} -->
8080
<h:outputText id="fileHierarchy" styleClass="show" value="#{fileMetadata.directoryLabel}/" rendered="#{hasDirectoryLabel}"/>
81-
<h:outputText id="fileType" value="#{dataFile.tabularData ? bundle['file.type.tabularData'] : dataFile.friendlyType}"/>
82-
<h:outputText id="fileSize" value=" - #{dataFile.friendlySize}"/>
81+
<h:outputText id="fileType" value="#{dataFile.friendlyType}"/>
82+
<h:outputText id="fileSize" value=" - #{dataFile.friendlyOriginalFileSize}"/>
8383
<div class="dateCreatePublish-block">
8484
<h:outputText id="fileCreatePublishDate" value="#{isReleased ? ((dataFile.embargo!=null) ? bundle['metadatareleased'] : bundle['published']) : bundle['deposited']} #{fileMetadata.getFileDateToDisplay()}" rendered="#{hasFileId}"/>
8585
<h:outputText id="embargoDate" class="embargoright" value="#{isReleased ? ((dataFileServiceBean.isActivelyEmbargoed(fileMetadata)) ? bundle['embargoed.until'] : bundle['embargoed.wasthrough']):bundle['embargoed.willbeuntil']} #{dataFile.embargo.formattedDateAvailable}" rendered="#{hasEmbargo}"/>
@@ -91,7 +91,7 @@
9191
</h:outputFormat>
9292
</div>
9393
<!-- CHECKSUM -->
94-
<div class="checksum-block" jsf:rendered="#{!dataFile.tabularData and !(empty dataFile.checksumValue)}">
94+
<div class="checksum-block" jsf:rendered="#{!(empty dataFile.checksumValue)}">
9595
<span class="#{!editDatafilesPage ? 'checksum-truncate checksum-tooltip' : ''}" style="margin-right:3px;"
9696
data-toggle="tooltip" data-placement="top" data-html="true"
9797
data-clipboard-action="copy"
@@ -105,6 +105,7 @@
105105
</div>
106106
<!-- TABULAR VARIABLES, OBSERVATIONS + UNF -->
107107
<div class="unf-block" jsf:rendered="#{isTabularData}">
108+
<h:outputText value="#{bundle['file.type.tabularData']}: "/>
108109
<h:outputText id="fileNumVars" value="#{dataFile.dataTable.varQuantity} #{bundle['file.metaData.dataFile.dataTab.variables']}, "/>
109110
<h:outputText id="fileNumObs" value="#{dataFile.dataTable.caseQuantity} #{bundle['file.metaData.dataFile.dataTab.observations']} "/>
110111
<span jsf:id="fileUNF" class="#{!editDatafilesPage ? 'checksum-truncate checksum-tooltip' : ''}" style="margin-right:3px;"

src/main/webapp/file.xhtml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
<h:body>
1717
<ui:composition template="/dataverse_template.xhtml">
18-
<ui:param name="pageTitle" value="#{FilePage.fileMetadata.dataFile.displayName} - #{FilePage.file.owner.owner.displayName}"/>
18+
<ui:param name="pageTitle" value="#{FilePage.fileMetadata.labelForOriginal} - #{FilePage.file.owner.owner.displayName}"/>
1919
<ui:param name="dataverse" value="#{FilePage.file.owner.owner}"/>
2020
<ui:param name="showDataverseHeader" value="#{!FilePage.isAnonymizedAccess()}"/>
2121
<ui:param name="showMessagePanel" value="#{true}"/>
@@ -45,7 +45,7 @@
4545
<div class="col-xs-12">
4646
<div class="row">
4747
<div id="file-title-block" class="col-xs-12 margin-bottom-half">
48-
<span class="file-title-label">#{FilePage.fileMetadata.label}</span>
48+
<span class="file-title-label">#{FilePage.fileMetadata.labelForOriginal}</span>
4949

5050
<!-- FILE LEVEL MSGs -->
5151
<div class="bg-info text-info text-center margin-bottom-half" jsf:rendered="#{FilePage.fileMetadata.dataFile.ingestProblem and FilePage.canUpdateDataset()}">
@@ -590,11 +590,11 @@
590590
<td>#{FilePage.file.retention.reason}
591591
</td>
592592
</tr>
593-
<tr id="fileSizeBlock" jsf:rendered="#{!(empty FilePage.file.friendlySize)}">
593+
<tr id="fileSizeBlock" jsf:rendered="#{!(empty FilePage.file.friendlyOriginalFileSize)}">
594594
<th scope="row">
595595
#{bundle['file.metadataTab.fileMetadata.size.label']}
596596
</th>
597-
<td>#{FilePage.file.friendlySize}</td>
597+
<td>#{FilePage.file.friendlyOriginalFileSize}</td>
598598
</tr>
599599
<tr id="fileTypeBlock" jsf:rendered="#{!(empty FilePage.file.friendlyType)}">
600600
<th scope="row">

0 commit comments

Comments
 (0)