Skip to content
Merged
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
305 changes: 77 additions & 228 deletions src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,6 @@ public enum FileEditMode {
private DatasetVersion clone;
private String dropBoxSelection = "";
private String displayCitation;
private boolean datasetUpdateRequired = false;
private boolean tabularDataTagsUpdated = false;

private String persistentId;
Expand Down Expand Up @@ -1004,10 +1003,6 @@ private void removeDataFileFromList(List<DataFile> dfs, DataFile dfToDelete) {

public String saveWithTermsOfUse() {
logger.fine("saving terms of use, and the dataset version");
//Set update required only if dataset already exists
if (dataset.getId() != null){
datasetUpdateRequired = true;
}
return save();
}

Expand Down Expand Up @@ -1149,239 +1144,102 @@ public String save() {
JsfHelper.addErrorMessage(getBundleString("file.metadataTab.provenance.error"));
Logger.getLogger(EditDatafilesPage.class.getName()).log(Level.SEVERE, null, ex);
}
//Always update the whole dataset if updating prov
//The flow that happens when datasetUpdateRequired is false has problems with doing saving actions after its merge
//This was the simplest way to work around this issue for prov. --MAD 4.8.6.
datasetUpdateRequired = datasetUpdateRequired || provFreeChanges || provJsonChanges;
}

if (workingVersion.getId() == null || datasetUpdateRequired) {
logger.fine("issuing the dataset update command");
// We are creating a new draft version;
// (OR, a full update of the dataset has been explicitly requested,
// because of the nature of the updates the user has made).
// We'll use an Update command for this:

//newDraftVersion = true;

if (datasetUpdateRequired) {
for (int i = 0; i < workingVersion.getFileMetadatas().size(); i++) {
for (FileMetadata fileMetadata : fileMetadatas) {
if (fileMetadata.getDataFile().getStorageIdentifier() != null) {
if (fileMetadata.getDataFile().getStorageIdentifier().equals(workingVersion.getFileMetadatas().get(i).getDataFile().getStorageIdentifier())) {
workingVersion.getFileMetadatas().set(i, fileMetadata);
}
}
}
}


//Moves DataFile updates from popupFragment to page for saving
//This does not seem to collide with the tags updating below
if(systemConfig.isProvCollectionEnabled() && provJsonChanges) {
HashMap<String,ProvPopupFragmentBean.UpdatesEntry> provenanceUpdates = provPopupFragmentBean.getProvenanceUpdates();
for (int i = 0; i < dataset.getFiles().size(); i++) {
for (ProvPopupFragmentBean.UpdatesEntry ue : provenanceUpdates.values()) {
if (ue.dataFile.getStorageIdentifier() != null ) {
if (ue.dataFile.getStorageIdentifier().equals(dataset.getFiles().get(i).getStorageIdentifier())) {
dataset.getFiles().set(i, ue.dataFile);
}
}
logger.fine("issuing the dataset update command");
// We are creating a new draft version or updating an existing draft;
// We'll use an Update command for this:
if (workingVersion.getId() != null) {
for (int i = 0; i < workingVersion.getFileMetadatas().size(); i++) {
for (FileMetadata fileMetadata : fileMetadatas) {
if (fileMetadata.getDataFile().getStorageIdentifier() != null) {
if (fileMetadata.getDataFile().getStorageIdentifier().equals(workingVersion.getFileMetadatas().get(i).getDataFile().getStorageIdentifier())) {
workingVersion.getFileMetadatas().set(i, fileMetadata);
}
}
}

// Tabular data tags are assigned to datafiles, not to
// version-specfic filemetadatas!
// So if tabular tags have been modified, we also need to
// refresh the list of datafiles, as found in dataset.getFiles(),
// similarly to what we've just done, above, for the filemetadatas.
// Otherwise, when we call UpdateDatasetCommand, it's not going
// to update the tags in the database (issue #2798).
// TODO: Is the above still true/is this still necessary?
// (and why?...)

if (tabularDataTagsUpdated) {
for (int i = 0; i < dataset.getFiles().size(); i++) {
for (FileMetadata fileMetadata : fileMetadatas) {
if (fileMetadata.getDataFile().getStorageIdentifier() != null) {
if (fileMetadata.getDataFile().getStorageIdentifier().equals(dataset.getFiles().get(i).getStorageIdentifier())) {
dataset.getFiles().set(i, fileMetadata.getDataFile());
}
}
}
}
// Moves DataFile updates from popupFragment to page for saving
// This does not seem to collide with the tags updating below
if (systemConfig.isProvCollectionEnabled() && provJsonChanges) {
HashMap<String, ProvPopupFragmentBean.UpdatesEntry> provenanceUpdates = provPopupFragmentBean.getProvenanceUpdates();
for (int i = 0; i < dataset.getFiles().size(); i++) {
for (ProvPopupFragmentBean.UpdatesEntry ue : provenanceUpdates.values()) {
if (ue.dataFile.getStorageIdentifier() != null) {
if (ue.dataFile.getStorageIdentifier().equals(dataset.getFiles().get(i).getStorageIdentifier())) {
dataset.getFiles().set(i, ue.dataFile);
}
}
tabularDataTagsUpdated = false;
}
}

Map<Long, String> deleteStorageLocations = null;

if (!filesToBeDeleted.isEmpty()) {
deleteStorageLocations = datafileService.getPhysicalFilesToDelete(filesToBeDeleted);
}

Command<Dataset> cmd;
try {
cmd = new UpdateDatasetVersionCommand(dataset, dvRequestService.getDataverseRequest(), filesToBeDeleted, clone);
((UpdateDatasetVersionCommand) cmd).setValidateLenient(true);
dataset = commandEngine.submit(cmd);

} catch (EJBException ex) {
StringBuilder error = new StringBuilder();
error.append(ex).append(" ");
error.append(ex.getMessage()).append(" ");
Throwable cause = ex;
while (cause.getCause()!= null) {
cause = cause.getCause();
error.append(cause).append(" ");
error.append(cause.getMessage()).append(" ");
}
logger.log(Level.INFO, "Couldn''t save dataset: {0}", error.toString());
populateDatasetUpdateFailureMessage();
return null;
} catch (CommandException ex) {
//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Dataset Save Failed", " - " + ex.toString()));
logger.log(Level.INFO, "Couldn''t save dataset: {0}", ex.getMessage());
populateDatasetUpdateFailureMessage();
return null;
}

// Have we just deleted some draft datafiles (successfully)?
// finalize the physical file deletes:
// (DataFileService will double-check that the datafiles no
// longer exist in the database, before attempting to delete
// the physical files)
if (deleteStorageLocations != null) {
datafileService.finalizeFileDeletes(deleteStorageLocations);
}

datasetUpdateRequired = false;
saveEnabled = false;
} else {
String lockInfoMessage = "saving current edits";
DatasetLock lock = datasetService.addDatasetLock(getDataset().getId(), DatasetLock.Reason.EditInProgress, session.getUser() != null ? ((AuthenticatedUser)session.getUser()).getId() : null, lockInfoMessage);
if (lock != null) {
getDataset().addLock(lock);
} else {
logger.log(Level.WARNING, "Failed to lock the dataset (dataset id={0})", getDataset().getId());
}
try {
// This is an existing Draft version (and nobody has explicitly
// requested that the entire dataset is updated). So we'll try to update
// only the filemetadatas and/or files affected, and not the
// entire version.
Timestamp updateTime = new Timestamp(new Date().getTime());

workingVersion.setLastUpdateTime(updateTime);
dataset.setModificationTime(updateTime);
}

StringBuilder saveError = new StringBuilder();
// Tabular data tags are assigned to datafiles, not to
// version-specfic filemetadatas!
// So if tabular tags have been modified, we also need to
// refresh the list of datafiles, as found in dataset.getFiles(),
// similarly to what we've just done, above, for the filemetadatas.
// Otherwise, when we call UpdateDatasetCommand, it's not going
// to update the tags in the database (issue #2798).
// TODO: Is the above still true/is this still necessary?
// (and why?...)

if (tabularDataTagsUpdated) {
for (int i = 0; i < dataset.getFiles().size(); i++) {
for (FileMetadata fileMetadata : fileMetadatas) {

if (fileMetadata.getDataFile().getCreateDate() == null) {
fileMetadata.getDataFile().setCreateDate(updateTime);
fileMetadata.getDataFile().setCreator((AuthenticatedUser) session.getUser());
}
fileMetadata.getDataFile().setModificationTime(updateTime);
try {
// DataFile savedDatafile = datafileService.save(fileMetadata.getDataFile());
fileMetadata = datafileService.mergeFileMetadata(fileMetadata);
logger.fine("Successfully saved DataFile " + fileMetadata.getLabel() + " in the database.");
} catch (EJBException ex) {
saveError.append(ex).append(" ");
saveError.append(ex.getMessage()).append(" ");
Throwable cause = ex;
while (cause.getCause() != null) {
cause = cause.getCause();
saveError.append(cause).append(" ");
saveError.append(cause.getMessage()).append(" ");
if (fileMetadata.getDataFile().getStorageIdentifier() != null) {
if (fileMetadata.getDataFile().getStorageIdentifier().equals(dataset.getFiles().get(i).getStorageIdentifier())) {
dataset.getFiles().set(i, fileMetadata.getDataFile());
}
}
}
}
tabularDataTagsUpdated = false;
}

// Remove / delete any files that were removed
for (FileMetadata fmd : filesToBeDeleted) {
// check if this file is being used as the default thumbnail
if (fmd.getDataFile().equals(dataset.getThumbnailFile())) {
logger.fine("deleting the dataset thumbnail designation");
dataset.setThumbnailFile(null);
}
Map<Long, String> deleteStorageLocations = null;

if (!fmd.getDataFile().isReleased()) {
// if file is draft (ie. new to this version, delete; otherwise just remove
// filemetadata object)
boolean deleteCommandSuccess = false;
Long dataFileId = fmd.getDataFile().getId();
String deleteStorageLocation = null;

if (dataFileId != null) { // is this check necessary?

deleteStorageLocation = datafileService.getPhysicalFileToDelete(fmd.getDataFile());

try {
commandEngine.submit(new DeleteDataFileCommand(fmd.getDataFile(), dvRequestService.getDataverseRequest()));
dataset.getFiles().remove(fmd.getDataFile());
workingVersion.getFileMetadatas().remove(fmd);
// added this check to handle an issue where you could not delete a file that
// shared a category with a new file
// the relationship does not seem to cascade, yet somehow it was trying to merge
// the filemetadata
// todo: clean this up some when we clean the create / update dataset methods
for (DataFileCategory cat : dataset.getCategories()) {
cat.getFileMetadatas().remove(fmd);
}
deleteCommandSuccess = true;
} catch (CommandException cmde) {
// TODO:
// add diagnostics reporting for individual data files that
// we failed to delete.
logger.warning("Failed to delete DataFile id=" + dataFileId + " from the database; " + cmde.getMessage());
}
if (deleteCommandSuccess) {
if (deleteStorageLocation != null) {
// Finalize the delete of the physical file
// (File service will double-check that the datafile no
// longer exists in the database, before proceeding to
// delete the physical file)
try {
datafileService.finalizeFileDelete(dataFileId, deleteStorageLocation);
} catch (IOException ioex) {
logger.warning("Failed to delete the physical file associated with the deleted datafile id="
+ dataFileId + ", storage location: " + deleteStorageLocation);
}
}
}
}
} else {
datafileService.removeFileMetadata(fmd);
fmd.getDataFile().getFileMetadatas().remove(fmd);
workingVersion.getFileMetadatas().remove(fmd);
}
}
if (!filesToBeDeleted.isEmpty()) {
deleteStorageLocations = datafileService.getPhysicalFilesToDelete(filesToBeDeleted);
}

String saveErrorString = saveError.toString();
if (saveErrorString != null && !saveErrorString.isEmpty()) {
logger.log(Level.INFO, "Couldn''t save dataset: {0}", saveErrorString);
populateDatasetUpdateFailureMessage();
return null;
}
Command<Dataset> cmd;
try {
cmd = new UpdateDatasetVersionCommand(dataset, dvRequestService.getDataverseRequest(), filesToBeDeleted, clone);
((UpdateDatasetVersionCommand) cmd).setValidateLenient(true);
dataset = commandEngine.submit(cmd);

} catch (EJBException ex) {
StringBuilder error = new StringBuilder();
error.append(ex).append(" ");
error.append(ex.getMessage()).append(" ");
Throwable cause = ex;
while (cause.getCause() != null) {
cause = cause.getCause();
error.append(cause).append(" ");
error.append(cause.getMessage()).append(" ");
}
logger.log(Level.INFO, "Couldn''t save dataset: {0}", error.toString());
populateDatasetUpdateFailureMessage();
return null;
} catch (CommandException ex) {
// FacesContext.getCurrentInstance().addMessage(null, new
// FacesMessage(FacesMessage.SEVERITY_ERROR, "Dataset Save Failed", " - " +
// ex.toString()));
logger.log(Level.INFO, "Couldn''t save dataset: {0}", ex.getMessage());
populateDatasetUpdateFailureMessage();
return null;
}

// Refresh the instance of the dataset object:
// (being in the UPLOAD mode more or less guarantees that the
// dataset object already exists in the database, but we'll check
// the id for null, just in case)
if (mode == FileEditMode.UPLOAD) {
if (dataset.getId() != null) {
dataset = datasetService.find(dataset.getId());
}
}
} finally {
datasetService.removeDatasetLocks(dataset, DatasetLock.Reason.EditInProgress);
}
// Have we just deleted some draft datafiles (successfully)?
// finalize the physical file deletes:
// (DataFileService will double-check that the datafiles no
// longer exist in the database, before attempting to delete
// the physical files)
if (deleteStorageLocations != null) {
datafileService.finalizeFileDeletes(deleteStorageLocations);
}

saveEnabled = false;

if (newFiles.size() > 0) {
logger.fine("clearing newfiles list.");
Expand Down Expand Up @@ -1431,11 +1289,6 @@ public String save() {
return returnToFileLandingPage();
}

//if (newDraftVersion) {
// return returnToDraftVersionById();
//}
// indexService.indexDataset(dataset, true);
// indexing is handled by the commands
logger.fine("Redirecting to the dataset page, from the edit/upload page.");
return returnToDraftVersion();
}
Expand Down Expand Up @@ -2502,8 +2355,6 @@ public void saveAsDesignatedThumbnail() {
logger.fine(successMessage);
successMessage = successMessage.replace("{0}", fileMetadataSelectedForThumbnailPopup.getLabel());
JsfHelper.addFlashMessage(successMessage);

datasetUpdateRequired = true;
}

// And reset the selected fileMetadata:
Expand Down Expand Up @@ -2747,8 +2598,6 @@ public void saveFileTagsAndCategories() {
// ignore
}
}

datasetUpdateRequired = true;
}

fileMetadataSelectedForTagsPopup = null;
Expand Down