Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,9 @@ public class SubmissionController {
@Value("${app.documentType.rename:}")
private String documentTypesToRename;

@Value("${app.secondaryDelimiter:|}")
private String secondaryDelimiter;

@RequestMapping("/all")
@PreAuthorize("hasRole('ADMIN')")
public ApiResponse getAll() {
Expand Down Expand Up @@ -597,7 +600,7 @@ private void processBatchExport(

// Stream data rows
for (Submission submission : submissions) {
ExportPackage exportPackage = packagerUtility.packageExport(packager, submission, columns);
ExportPackage exportPackage = packagerUtility.packageExport(packager, submission, columns, secondaryDelimiter);
if (exportPackage.isMap()) {
Map<String, String> rowData = (Map<String, String>) exportPackage.getPayload();
Row row = worksheet.createRow(rowCount++);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ public EP packageExport(Submission submission, List<SubmissionListColumn> column
throw new UnsupportedFormatterException("Exporter does not support submission list columns!");
}

public EP packageExport(Submission submission, List<SubmissionListColumn> columns, String delimiter) throws UnsupportedFormatterException {
throw new UnsupportedFormatterException("Exporter does not support submission list columns and delimiter!");
}

public EP packageExport(Submission submission, Map<String, String> ds_docs) throws UnsupportedFormatterException {
throw new UnsupportedFormatterException("Exporter does not support multiple docs !");
}
Expand Down
36 changes: 27 additions & 9 deletions src/main/java/org/tdl/vireo/model/packager/ExcelPackager.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,18 +64,21 @@ public ExcelExportPackage packageExport(Submission submission, String manifest)

@Override
public ExcelExportPackage packageExport(Submission submission, List<SubmissionListColumn> columns) {
return new ExcelExportPackage(submission, "Excel", buildRow(submission, columns, ", "));
}

@Override
public ExcelExportPackage packageExport(Submission submission, List<SubmissionListColumn> columns, String delimiter) {
return new ExcelExportPackage(submission, "Excel", buildRow(submission, columns, delimiter));
}

private Map<String, String> buildRow(Submission submission, List<SubmissionListColumn> columns, String fieldValueDelimiter) {
Map<String, String> row = new HashMap<String, String>();
columns.forEach(column -> {
Optional<String> predicate = Optional.ofNullable(column.getPredicate());
if (predicate.isPresent()) {
List<String> fieldValues = new ArrayList<String>();
for (FieldValue fieldValue : submission.getFieldValues()) {
if (fieldValue.getFieldPredicate().getValue().equals(predicate.get().trim())) {
fieldValues.add(fieldValue.getValue());
row.put(column.getTitle(), String.join(", ", fieldValues));
} else {
row.put(column.getTitle(), String.join(", ", fieldValues)); }
}
List<String> fieldValues = getFieldValues(submission, predicate.get().trim());
row.put(column.getTitle(), String.join(fieldValueDelimiter, fieldValues));
} else {
if (column.getValuePath().size() > 0) {
String[] valuePath = column.getValuePath().toArray(new String[column.getValuePath().size()]);
Expand Down Expand Up @@ -137,7 +140,22 @@ public ExcelExportPackage packageExport(Submission submission, List<SubmissionLi
}
}
});
return new ExcelExportPackage(submission, "Excel", row);
return row;
}

private List<String> getFieldValues(Submission submission, String predicate) {
List<String> fieldValues = new ArrayList<String>();
for (FieldValue fieldValue : submission.getFieldValues()) {
if (matchesPredicate(fieldValue, predicate)) {
fieldValues.add(fieldValue.getValue());
}
}
return fieldValues;
}

private boolean matchesPredicate(FieldValue fieldValue, String predicate) {
String fieldPredicate = fieldValue.getFieldPredicate().getValue();
return fieldPredicate.equals(predicate) || fieldPredicate.startsWith(predicate + ".");
}
Comment on lines +70 to +159

}
2 changes: 2 additions & 0 deletions src/main/java/org/tdl/vireo/model/packager/Packager.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ public interface Packager<EP extends ExportPackage> {

public EP packageExport(Submission submission, List<SubmissionListColumn> columns);

public EP packageExport(Submission submission, List<SubmissionListColumn> columns, String delimiter);

public EP packageExport(Submission submission, Map<String,String> dsDocs);

}
4 changes: 4 additions & 0 deletions src/main/java/org/tdl/vireo/utility/PackagerUtility.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ public ExportPackage packageExport(Packager<?> packager, Submission submission,
return packager.packageExport(submission, columns);
}

public ExportPackage packageExport(Packager<?> packager, Submission submission, List<SubmissionListColumn> columns, String delimiter) {
return packager.packageExport(submission, columns, delimiter);
}

public ExportPackage packageExport(Packager<?> packager, Submission submission, Map<String, String> dsDocs) {
return packager.packageExport(submission, dsDocs);
}
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ app:
# edu.tamu.weaver.auth.service.UserCredentialsService
authority.admins: admin@tdl.org,aggieJack@tamu.edu

# ExcelExport secondary delimiter for keywords within CSV, otherwise multiple keywords appear as separate columns
secondaryDelimiter: '|'

security:
# edu.tamu.weaver.auth.service.CryptoService
Expand Down
73 changes: 73 additions & 0 deletions src/test/java/org/tdl/vireo/model/packager/ExcelPackagerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.tdl.vireo.model.packager;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

import org.junit.jupiter.api.Test;
import org.tdl.vireo.model.FieldPredicate;
import org.tdl.vireo.model.FieldValue;
import org.tdl.vireo.model.Sort;
import org.tdl.vireo.model.Submission;
import org.tdl.vireo.model.SubmissionListColumn;
import org.tdl.vireo.model.export.ExcelExportPackage;
import org.springframework.test.util.ReflectionTestUtils;

public class ExcelPackagerTest {

@SuppressWarnings("unchecked")
@Test
public void testPackageExportUsesRequestedDelimiterForExactPredicateMatches() {
ExcelPackager packager = new ExcelPackager();
Submission submission = new Submission();
SubmissionListColumn column = new SubmissionListColumn("Keywords", Sort.NONE, "dc.subject");

Set<FieldValue> fieldValues = new LinkedHashSet<>();
fieldValues.add(createFieldValue("dc.subject", "alpha"));
fieldValues.add(createFieldValue("dc.subject", "beta"));
fieldValues.add(createFieldValue("dc.title", "ignored"));

ReflectionTestUtils.setField(submission, "fieldValues", fieldValues);

ExcelExportPackage exportPackage = packager.packageExport(submission, Arrays.asList(column), "|");
Map<String, String> row = (Map<String, String>) exportPackage.getPayload();

assertEquals("alpha|beta", row.get("Keywords"), "Repeatable values should be joined once with the requested delimiter.");
}

@SuppressWarnings("unchecked")
@Test
public void testPackageExportMatchesSuffixedPredicates() {
ExcelPackager packager = new ExcelPackager();
Submission submission = new Submission();
SubmissionListColumn column = new SubmissionListColumn("Non-Chairing Committee Members", Sort.NONE, "dc.contributor.committeeMember");

Set<FieldValue> fieldValues = new LinkedHashSet<>();
fieldValues.add(createFieldValue("dc.contributor.committeeMember.0", "Alice Smith"));
fieldValues.add(createFieldValue("dc.contributor.committeeMember.1", "Bob Jones"));

ReflectionTestUtils.setField(submission, "fieldValues", fieldValues);

ExcelExportPackage exportPackage = packager.packageExport(submission, Arrays.asList(column), "|");
Map<String, String> row = (Map<String, String>) exportPackage.getPayload();

assertEquals("Alice Smith|Bob Jones", row.get("Non-Chairing Committee Members"), "Suffixed repeatable predicates should be included in the same exported cell.");
}

private FieldValue createFieldValue(String predicateValue, String value) {
FieldPredicate fieldPredicate = new FieldPredicate();
fieldPredicate.setId((long) predicateValue.hashCode());
fieldPredicate.setValue(predicateValue);

FieldValue fieldValue = new FieldValue();
fieldValue.setId((long) (predicateValue + value).hashCode());
fieldValue.setFieldPredicate(fieldPredicate);
fieldValue.setValue(value);

return fieldValue;
}

}
Loading