/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.DatasetVersionServiceBean.RetrieveDatasetVersionResponse; import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.users.GuestUser; import edu.harvard.iq.dataverse.datasetutility.TwoRavensHelper; import edu.harvard.iq.dataverse.datasetutility.WorldMapPermissionHelper; import edu.harvard.iq.dataverse.engine.command.Command; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetCommand; import edu.harvard.iq.dataverse.export.ExportException; import edu.harvard.iq.dataverse.export.ExportService; import edu.harvard.iq.dataverse.export.spi.Exporter; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.JsfHelper; import static edu.harvard.iq.dataverse.util.JsfHelper.JH; import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.logging.Level; import javax.ejb.EJB; import javax.ejb.EJBException; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.faces.view.ViewScoped; import javax.inject.Inject; import javax.inject.Named; import javax.validation.ConstraintViolation; /** * * @author skraffmi * */ @ViewScoped @Named("FilePage") public class FilePage implements java.io.Serializable { private FileMetadata fileMetadata; private Long fileId; private String version; private DataFile file; private GuestbookResponse guestbookResponse; private int selectedTabIndex; private Dataset editDataset; @EJB DataFileServiceBean datafileService; @EJB DatasetVersionServiceBean datasetVersionService; @EJB PermissionServiceBean permissionService; @EJB SettingsServiceBean settingsService; @EJB FileDownloadServiceBean fileDownloadService; @EJB GuestbookResponseServiceBean guestbookResponseService; @EJB AuthenticationServiceBean authService; @EJB SystemConfig systemConfig; @Inject DataverseSession session; @EJB EjbDataverseEngine commandEngine; @Inject DataverseRequestServiceBean dvRequestService; @Inject PermissionsWrapper permissionsWrapper; @Inject FileDownloadHelper fileDownloadHelper; @Inject TwoRavensHelper twoRavensHelper; @Inject WorldMapPermissionHelper worldMapPermissionHelper; public String init() { if ( fileId != null ) { // --------------------------------------- // Set the file and datasetVersion // --------------------------------------- if (fileId != null) { file = datafileService.find(fileId); } else if (fileId == null){ return permissionsWrapper.notFound(); } if (file == null){ return permissionsWrapper.notFound(); } RetrieveDatasetVersionResponse retrieveDatasetVersionResponse; retrieveDatasetVersionResponse = datasetVersionService.selectRequestedVersion(file.getOwner().getVersions(), version); Long getDatasetVersionID = retrieveDatasetVersionResponse.getDatasetVersion().getId(); fileMetadata = datafileService.findFileMetadataByDatasetVersionIdAndDataFileId(getDatasetVersionID, fileId); if (fileMetadata == null){ return permissionsWrapper.notFound(); } // If this DatasetVersion is unpublished and permission is doesn't have permissions: // > Go to the Login page // // Check permisisons Boolean authorized = (fileMetadata.getDatasetVersion().isReleased()) || (!fileMetadata.getDatasetVersion().isReleased() && this.canViewUnpublishedDataset()) || fileMetadata.getDatasetVersion().isDeaccessioned(); if (!authorized ) { return permissionsWrapper.notAuthorized(); } this.guestbookResponse = this.guestbookResponseService.initGuestbookResponseForFragment(fileMetadata, session); } else { return permissionsWrapper.notFound(); } return null; } private boolean canViewUnpublishedDataset() { return permissionsWrapper.canViewUnpublishedDataset( dvRequestService.getDataverseRequest(), fileMetadata.getDatasetVersion().getDataset()); } public FileMetadata getFileMetadata() { return fileMetadata; } public boolean isDownloadPopupRequired() { if(fileMetadata.getId() == null || fileMetadata.getDatasetVersion().getId() == null ){ return false; } return fileDownloadService.isDownloadPopupRequired(fileMetadata.getDatasetVersion()); } public void setFileMetadata(FileMetadata fileMetadata) { this.fileMetadata = fileMetadata; } public DataFile getFile() { return file; } public void setFile(DataFile file) { this.file = file; } public Long getFileId() { return fileId; } public void setFileId(Long fileId) { this.fileId = fileId; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public List< String[]> getExporters(){ List<String[]> retList = new ArrayList(); String myHostURL = systemConfig.getDataverseSiteUrl(); for (String [] provider : ExportService.getInstance().getExportersLabels() ){ String formatName = provider[1]; String formatDisplayName = provider[0]; Exporter exporter = null; try { exporter = ExportService.getInstance().getExporter(formatName); } catch (ExportException ex) { exporter = null; } if (exporter != null && exporter.isAvailableToUsers()) { // Not all metadata exports should be presented to the web users! // Some are only for harvesting clients. String[] temp = new String[2]; temp[0] = formatDisplayName; temp[1] = myHostURL + "/api/datasets/export?exporter=" + formatName + "&persistentId=" + fileMetadata.getDatasetVersion().getDataset().getGlobalId(); retList.add(temp); } } return retList; } public String restrictFile(boolean restricted){ String fileNames = null; editDataset = this.file.getOwner(); for (FileMetadata fmw: editDataset.getEditVersion().getFileMetadatas()){ if (fmw.getDataFile().equals(this.fileMetadata.getDataFile())){ fileNames += fmw.getLabel(); fmw.setRestricted(restricted); } } if (fileNames != null) { String successMessage = JH.localize("file.restricted.success"); successMessage = successMessage.replace("{0}", fileNames); JsfHelper.addFlashMessage(successMessage); } save(); init(); return returnToDraftVersion(); } private List<FileMetadata> filesToBeDeleted = new ArrayList(); public String deleteFile() { String fileNames = this.getFileMetadata().getLabel(); editDataset = this.getFileMetadata().getDataFile().getOwner(); FileMetadata markedForDelete = null; for (FileMetadata fmd : editDataset.getEditVersion().getFileMetadatas() ){ if (fmd.getDataFile().getId().equals(this.getFile().getId())){ markedForDelete = fmd; } } if (markedForDelete.getId() != null) { // the file already exists as part of this dataset // so all we remove is the file from the fileMetadatas (for display) // and let the delete be handled in the command (by adding it to the filesToBeDeleted list editDataset.getEditVersion().getFileMetadatas().remove(markedForDelete); filesToBeDeleted.add(markedForDelete); } else { List<FileMetadata> filesToKeep = new ArrayList(); for (FileMetadata fmo: editDataset.getEditVersion().getFileMetadatas()){ if (!fmo.getDataFile().getId().equals(this.getFile().getId())){ filesToKeep.add(fmo); } } editDataset.getEditVersion().setFileMetadatas(filesToKeep); } if (fileNames != null) { String successMessage = JH.localize("file.deleted.success"); successMessage = successMessage.replace("{0}", fileNames); JsfHelper.addFlashMessage(successMessage); } save(); return returnToDatasetOnly(); } public String save() { // Validate Set<ConstraintViolation> constraintViolations = this.fileMetadata.getDatasetVersion().validate(); if (!constraintViolations.isEmpty()) { //JsfHelper.addFlashMessage(JH.localize("dataset.message.validationError")); JH.addMessage(FacesMessage.SEVERITY_ERROR, JH.localize("dataset.message.validationError")); //FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Validation Error", "See below for details.")); return ""; } Command<Dataset> cmd; try { cmd = new UpdateDatasetCommand(editDataset, dvRequestService.getDataverseRequest(), filesToBeDeleted); 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(" "); } return null; } catch (CommandException ex) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Dataset Save Failed", " - " + ex.toString())); return null; } JsfHelper.addSuccessMessage(JH.localize("dataset.message.filesSuccess")); setVersion("DRAFT"); return ""; } public boolean isThumbnailAvailable(FileMetadata fileMetadata) { // new and optimized logic: // - check download permission here (should be cached - so it's free!) // - only then ask the file service if the thumbnail is available/exists. // the service itself no longer checks download permissions. if (!fileDownloadHelper.canDownloadFile(fileMetadata)) { return false; } return datafileService.isThumbnailAvailable(fileMetadata.getDataFile()); } private String returnToDatasetOnly(){ return "/dataset.xhtml?persistentId=" + editDataset.getGlobalId() + "&version=DRAFT" + "&faces-redirect=true"; } private String returnToDraftVersion(){ return "/file.xhtml?fileId=" + fileId + "&version=DRAFT&faces-redirect=true"; } public FileDownloadServiceBean getFileDownloadService() { return fileDownloadService; } public void setFileDownloadService(FileDownloadServiceBean fileDownloadService) { this.fileDownloadService = fileDownloadService; } public GuestbookResponseServiceBean getGuestbookResponseService() { return guestbookResponseService; } public void setGuestbookResponseService(GuestbookResponseServiceBean guestbookResponseService) { this.guestbookResponseService = guestbookResponseService; } public GuestbookResponse getGuestbookResponse() { return guestbookResponse; } public void setGuestbookResponse(GuestbookResponse guestbookResponse) { this.guestbookResponse = guestbookResponse; } public boolean canUpdateDataset() { return permissionsWrapper.canUpdateDataset(dvRequestService.getDataverseRequest(), this.file.getOwner()); } public int getSelectedTabIndex() { return selectedTabIndex; } public void setSelectedTabIndex(int selectedTabIndex) { this.selectedTabIndex = selectedTabIndex; } }