Skip to content
Merged
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 @@ -2,9 +2,11 @@

import edu.harvard.iq.dataverse.util.BundleUtil;
import edu.harvard.iq.dataverse.util.file.CreateDataFileResult;
import org.apache.commons.text.StringEscapeUtils;

import javax.ejb.Stateless;
import javax.inject.Inject;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
Expand All @@ -22,6 +24,14 @@ public class EditDataFilesPageHelper {
@Inject
private SettingsWrapper settingsWrapper;

public String consolidateHtmlErrorMessages(List<String> errorMessages) {
if(errorMessages == null || errorMessages.isEmpty()) {
return null;
}

return String.join("</br>", errorMessages);
}

public String getHtmlErrorMessage(CreateDataFileResult createDataFileResult) {
List<String> errors = createDataFileResult.getErrors();
if(errors == null || errors.isEmpty()) {
Expand All @@ -33,8 +43,8 @@ public String getHtmlErrorMessage(CreateDataFileResult createDataFileResult) {
return null;
}

String typeMessage = Optional.ofNullable(BundleUtil.getStringFromBundle(createDataFileResult.getBundleKey())).orElse("Error processing file");
String errorsMessage = errors.stream().limit(maxErrorsToShow).map(text -> String.format("<li>%s</li>", text)).collect(Collectors.joining());
return String.format("%s:<br /><ul>%s</ul>", typeMessage, errorsMessage);
String typeMessage = Optional.ofNullable(BundleUtil.getStringFromBundle(createDataFileResult.getBundleKey(), Arrays.asList(createDataFileResult.getFilename()))).orElse("Error processing file");
String errorsMessage = errors.stream().limit(maxErrorsToShow).map(text -> String.format("<li>%s</li>", StringEscapeUtils.escapeHtml4(text))).collect(Collectors.joining());
return String.format("%s<br /><ul>%s</ul>", typeMessage, errorsMessage);
}
}
24 changes: 15 additions & 9 deletions src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.EJBException;
Expand Down Expand Up @@ -1491,7 +1492,7 @@ public void handleDropBoxUpload(ActionEvent event) {
//datafiles = ingestService.createDataFiles(workingVersion, dropBoxStream, fileName, "application/octet-stream");
CreateDataFileResult createDataFilesResult = FileUtil.createDataFiles(workingVersion, dropBoxStream, fileName, "application/octet-stream", null, null, systemConfig);
datafiles = createDataFilesResult.getDataFiles();
errorMessage = editDataFilesPageHelper.getHtmlErrorMessage(createDataFilesResult);
Optional.ofNullable(editDataFilesPageHelper.getHtmlErrorMessage(createDataFilesResult)).ifPresent(errorMessage -> errorMessages.add(errorMessage));

} catch (IOException ex) {
this.logger.log(Level.SEVERE, "Error during ingest of DropBox file {0} from link {1}", new Object[]{fileName, fileLink});
Expand Down Expand Up @@ -1745,12 +1746,13 @@ public void uploadFinished() {
uploadedFiles.clear();
uploadInProgress.setValue(false);
}
if(errorMessage != null) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, BundleUtil.getStringFromBundle("dataset.file.uploadFailure"), errorMessage));
PrimeFaces.current().ajax().update(":messagePanel");
}

// refresh the warning message below the upload component, if exists:
if (uploadComponentId != null) {
if(!errorMessages.isEmpty()) {
FacesContext.getCurrentInstance().addMessage(uploadComponentId, new FacesMessage(FacesMessage.SEVERITY_ERROR, BundleUtil.getStringFromBundle("dataset.file.uploadFailure"), editDataFilesPageHelper.consolidateHtmlErrorMessages(errorMessages)));
}

if (uploadWarningMessage != null) {
if (existingFilesWithDupeContent != null || newlyUploadedFilesWithDupeContent != null) {
setWarningMessageForAlreadyExistsPopUp(uploadWarningMessage);
Expand Down Expand Up @@ -1797,7 +1799,7 @@ public void uploadFinished() {
multipleDupesNew = false;
uploadWarningMessage = null;
uploadSuccessMessage = null;
errorMessage = null;
errorMessages = new ArrayList<>();
}

private String warningMessageForFileTypeDifferentPopUp;
Expand Down Expand Up @@ -1948,7 +1950,7 @@ private void handleReplaceFileUpload(String fullStorageLocation,
}

private String uploadWarningMessage = null;
private String errorMessage = null;
private List<String> errorMessages = new ArrayList<>();
private String uploadSuccessMessage = null;
private String uploadComponentId = null;

Expand Down Expand Up @@ -2020,7 +2022,11 @@ public void handleFileUpload(FileUploadEvent event) throws IOException {
// zip file.
CreateDataFileResult createDataFilesResult = FileUtil.createDataFiles(workingVersion, uFile.getInputStream(), uFile.getFileName(), uFile.getContentType(), null, null, systemConfig);
dFileList = createDataFilesResult.getDataFiles();
errorMessage = editDataFilesPageHelper.getHtmlErrorMessage(createDataFilesResult);
String createDataFilesError = editDataFilesPageHelper.getHtmlErrorMessage(createDataFilesResult);
if(createDataFilesError != null) {
errorMessages.add(createDataFilesError);
uploadComponentId = event.getComponent().getClientId();
}

} catch (IOException ioex) {
logger.warning("Failed to process and/or save the file " + uFile.getFileName() + "; " + ioex.getMessage());
Expand Down Expand Up @@ -2127,7 +2133,7 @@ public void handleExternalUpload() {
//datafiles = ingestService.createDataFiles(workingVersion, dropBoxStream, fileName, "application/octet-stream");
CreateDataFileResult createDataFilesResult = FileUtil.createDataFiles(workingVersion, null, fileName, contentType, fullStorageIdentifier, checksumValue, checksumType, systemConfig);
datafiles = createDataFilesResult.getDataFiles();
errorMessage = editDataFilesPageHelper.getHtmlErrorMessage(createDataFilesResult);
Optional.ofNullable(editDataFilesPageHelper.getHtmlErrorMessage(createDataFilesResult)).ifPresent(errorMessage -> errorMessages.add(errorMessage));
} catch (IOException ex) {
logger.log(Level.SEVERE, "Error during ingest of file {0}", new Object[]{fileName});
}
Expand Down
14 changes: 7 additions & 7 deletions src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -876,7 +876,7 @@ public static CreateDataFileResult createDataFiles(DatasetVersion version, Input
}

datafiles.add(datafile);
return CreateDataFileResult.success(finalType, datafiles);
return CreateDataFileResult.success(fileName, finalType, datafiles);
}

// If it's a ZIP file, we are going to unpack it and create multiple
Expand Down Expand Up @@ -1052,7 +1052,7 @@ public static CreateDataFileResult createDataFiles(DatasetVersion version, Input
logger.warning("Could not remove temp file " + tempFile.getFileName().toString());
}
// and return:
return CreateDataFileResult.success(finalType, datafiles);
return CreateDataFileResult.success(fileName, finalType, datafiles);
}

} else if (finalType.equalsIgnoreCase(ShapefileHandler.SHAPEFILE_FILE_TYPE)) {
Expand All @@ -1068,7 +1068,7 @@ public static CreateDataFileResult createDataFiles(DatasetVersion version, Input
boolean didProcessWork = shpIngestHelper.processFile();
if (!(didProcessWork)) {
logger.severe("Processing of zipped shapefile failed.");
return CreateDataFileResult.error(finalType);
return CreateDataFileResult.error(fileName, finalType);
}

try {
Expand Down Expand Up @@ -1129,11 +1129,11 @@ public static CreateDataFileResult createDataFiles(DatasetVersion version, Input
logger.warning("Unable to delete: " + tempFile.toString() + "due to Security Exception: "
+ se.getMessage());
}
return CreateDataFileResult.success(finalType, datafiles);
return CreateDataFileResult.success(fileName, finalType, datafiles);
} else {
logger.severe("No files added from directory of rezipped shapefiles");
}
return CreateDataFileResult.error(finalType);
return CreateDataFileResult.error(fileName, finalType);

} else if (finalType.equalsIgnoreCase(BagItFileHandler.FILE_TYPE)) {
Optional<BagItFileHandler> bagItFileHandler = CDI.current().select(BagItFileHandlerFactory.class).get().getBagItFileHandler();
Expand Down Expand Up @@ -1176,10 +1176,10 @@ public static CreateDataFileResult createDataFiles(DatasetVersion version, Input
}
datafiles.add(datafile);

return CreateDataFileResult.success(finalType, datafiles);
return CreateDataFileResult.success(fileName, finalType, datafiles);
}

return CreateDataFileResult.error(finalType);
return CreateDataFileResult.error(fileName, finalType);
} // end createDataFiles


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@
import java.nio.file.Path;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
*
Expand All @@ -16,7 +19,7 @@ public class BagValidation {
private final Map<Path, FileValidationResult> fileResults;

public BagValidation(Optional<String> errorMessage) {
this.errorMessage = errorMessage;
this.errorMessage = errorMessage == null ? Optional.empty() : errorMessage;
this.fileResults = new LinkedHashMap<>();
}

Expand All @@ -34,6 +37,12 @@ public Map<Path, FileValidationResult> getFileResults() {
return Collections.unmodifiableMap(fileResults);
}

public List<String> getAllErrors() {
Stream<String> mainError = getErrorMessage().stream();
Stream<String> fileErrors = getFileResults().values().stream().filter(result -> result.isError()).map(result -> result.getMessage());
return Stream.concat(mainError, fileErrors).collect(Collectors.toList());
}

public long errors() {
return fileResults.values().stream().filter(result -> result.isError()).count();
}
Expand Down Expand Up @@ -76,8 +85,9 @@ public void setSuccess() {
this.status = Status.SUCCESS;
}

public void setError() {
public void setError(String message) {
this.status = Status.ERROR;
this.message = message;
}

public boolean isPending() {
Expand All @@ -92,10 +102,6 @@ public boolean isError() {
return status.equals(Status.ERROR);
}

public void setMessage(String message) {
this.message = message;
}

public String getMessage() {
return message;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,7 @@ private BagValidation validateChecksums(FileDataProvider fileDataProvider, Manif
FileChecksumValidationJob validationJob = new FileChecksumValidationJob(inputStreamProvider.get(), filePath, fileChecksum, manifestChecksums.getType(), fileValidationResult);
executor.execute(validationJob);
} else {
fileValidationResult.setError();
fileValidationResult.setMessage(getMessage("bagit.validation.file.not.found", filePath, fileDataProvider.getName()));
fileValidationResult.setError(getMessage("bagit.validation.file.not.found", filePath, fileDataProvider.getName()));
}

}
Expand Down Expand Up @@ -148,7 +147,8 @@ ExecutorService getExecutorService() {
return Executors.newFixedThreadPool(validatorJobPoolSize);
}

private String getMessage(String propertyKey, Object... parameters){
// Visible for testing
String getMessage(String propertyKey, Object... parameters){
List<String> parameterList = Arrays.stream(parameters).map(param -> param.toString()).collect(Collectors.toList());
return BundleUtil.getStringFromBundle(propertyKey, parameterList);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,10 @@ public void run() {
if (fileChecksum.equals(calculatedChecksum)) {
result.setSuccess();
} else {
result.setError();
result.setMessage(getMessage("bagit.checksum.validation.error", filePath, bagChecksumType, fileChecksum, calculatedChecksum));
result.setError(getMessage("bagit.checksum.validation.error", filePath, bagChecksumType, fileChecksum, calculatedChecksum));
}
} catch (Exception e) {
result.setError();
result.setMessage(getMessage("bagit.checksum.validation.exception", filePath, bagChecksumType, e.getMessage()));
result.setError(getMessage("bagit.checksum.validation.exception", filePath, bagChecksumType, e.getMessage()));
logger.log(Level.WARNING, String.format("action=validate-checksum result=error filePath=%s type=%s", filePath, bagChecksumType), e);
} finally {
IOUtils.closeQuietly(inputStream);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import java.util.List;
import java.util.Optional;
import java.util.logging.Logger;
import java.util.stream.Collectors;

/**
*
Expand Down Expand Up @@ -58,25 +57,25 @@ public CreateDataFileResult handleBagItPackage(SystemConfig systemConfig, Datase
try {
List<DataFile> packageDataFiles = processBagItPackage(systemConfig, datasetVersion, uploadedFilename, bagItPackageFile);
if(packageDataFiles.isEmpty()) {
return CreateDataFileResult.error(FILE_TYPE, Collections.emptyList());
return CreateDataFileResult.error(uploadedFilename, FILE_TYPE, Collections.emptyList());
}

BagValidation bagValidation = validateBagItPackage(uploadedFilename, packageDataFiles);
if(bagValidation.success()) {
List<DataFile> finalItems = postProcessor.process(packageDataFiles);
logger.info(String.format("action=handleBagItPackage result=success uploadedFilename=%s file=%s", uploadedFilename, bagItPackageFile.getName()));
return CreateDataFileResult.success(FILE_TYPE, finalItems);
return CreateDataFileResult.success(uploadedFilename, FILE_TYPE, finalItems);
}

// BagIt package has errors
// Capture errors and return to caller
List<String> errors = bagValidation.getFileResults().values().stream().filter(result -> result.isError()).map(result -> result.getMessage()).collect(Collectors.toList());
List<String> errors = bagValidation.getAllErrors();
logger.info(String.format("action=handleBagItPackage result=errors uploadedFilename=%s file=%s errors=%s", uploadedFilename, bagItPackageFile.getName(), errors.size()));
return CreateDataFileResult.error(FILE_TYPE, errors);
return CreateDataFileResult.error(uploadedFilename, FILE_TYPE, errors);

} catch (BagItFileHandlerException e) {
logger.severe(String.format("action=handleBagItPackage result=error uploadedFilename=%s file=%s message=%s", uploadedFilename, bagItPackageFile.getName(), e.getMessage()));
return CreateDataFileResult.error(FILE_TYPE, Arrays.asList(e.getMessage()));
return CreateDataFileResult.error(uploadedFilename, FILE_TYPE, Arrays.asList(e.getMessage()));
} finally {
fileUtil.deleteFile(bagItPackageFile.toPath());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,26 +13,32 @@ public class CreateDataFileResult {

private static final String BUNDLE_KEY_PREFIX = "dataset.file.error";

private final String filename;
private final String type;
private final List<DataFile> dataFiles;
private final List<String> errors;

public CreateDataFileResult(String type, List<DataFile> dataFiles, List<String> errors) {
public CreateDataFileResult(String filename, String type, List<DataFile> dataFiles, List<String> errors) {
this.filename = filename;
this.type = type;
this.dataFiles = dataFiles == null ? null : Collections.unmodifiableList(dataFiles);
this.errors = errors == null ? Collections.emptyList() : Collections.unmodifiableList(errors);
}

public static CreateDataFileResult success(String type, List<DataFile> dataFiles) {
return new CreateDataFileResult(type, dataFiles, null);
public static CreateDataFileResult success(String filename, String type, List<DataFile> dataFiles) {
return new CreateDataFileResult(filename, type, dataFiles, null);
}

public static CreateDataFileResult error(String type) {
return new CreateDataFileResult(type, null, Collections.emptyList());
public static CreateDataFileResult error(String filename, String type) {
return new CreateDataFileResult(filename, type, null, Collections.emptyList());
}

public static CreateDataFileResult error(String type, List<String> errors) {
return new CreateDataFileResult(type, null, errors);
public static CreateDataFileResult error(String filename, String type, List<String> errors) {
return new CreateDataFileResult(filename, type, null, errors);
}

public String getFilename() {
return filename;
}

public String getType() {
Expand Down
14 changes: 7 additions & 7 deletions src/main/java/propertyFiles/Bundle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2270,12 +2270,12 @@ bagit.sourceOrganization=Dataverse Installation (<Site Url>)
bagit.sourceOrganizationAddress=<Full address>
bagit.sourceOrganizationEmail=<Email address>

bagit.checksum.validation.error=Invalid checksum. filePath={0} type={1} fileChecksum={2} calculatedChecksum={3}
bagit.checksum.validation.exception=Error while calculating checksum. filePath={0} type={1} error={2}
bagit.validation.bag.file.not.found=Invalid bag file: {0}
bagit.validation.manifest.not.supported=No supported manifest found in: {0} supportedTypes: {1}
bagit.validation.file.not.found=Manifest declared file: {0} not-found in data provider: {1}
bagit.validation.exception=Unable to complete checksums for: {0}
bagit.checksum.validation.error=Invalid checksum for file "{0}". Manifest checksum={2}, calculated checksum={3}, type={1}
bagit.checksum.validation.exception=Error while calculating checksum for file "{0}". Checksum type={1}, error={2}
bagit.validation.bag.file.not.found=Invalid BagIt package: "{0}"
bagit.validation.manifest.not.supported=No supported manifest found in BagIt package. Supported types are: {1}
bagit.validation.file.not.found=The manifest declared a file, "{0}", that is not found in the BagIt package
bagit.validation.exception=Unable to complete checksums for BagIt package

#Permission.java
permission.addDataverseDataverse=Add a dataverse within another dataverse
Expand Down Expand Up @@ -2348,7 +2348,7 @@ dataset.file.uploadWarning=upload warning
dataset.file.uploadWorked=upload worked
dataset.file.upload.popup.explanation.tip=For more information, please refer to the <a href="{0}/{1}/user/dataset-management.html#duplicate-files" title="Duplicate Files - Dataverse User Guide" target="_blank" rel="noopener">Duplicate Files section of the User Guide</a>.

dataset.file.error.application/zipped-bagit=BagIt package detected, but errors found. These are the errors found until processing stopped
dataset.file.error.application/zipped-bagit=BagIt package, "{0}", detected but errors found. These are the errors found until processing stopped:

#HarvestingClientsPage.java
harvest.start.error=Sorry, harvest could not be started for the selected harvesting client configuration (unknown server error).
Expand Down
Loading