package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.PrivateUrlUser; import edu.harvard.iq.dataverse.datavariable.VariableServiceBean; 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.CreateDatasetCommand; import edu.harvard.iq.dataverse.engine.command.impl.CreatePrivateUrlCommand; import edu.harvard.iq.dataverse.engine.command.impl.DeaccessionDatasetVersionCommand; import edu.harvard.iq.dataverse.engine.command.impl.DeleteDatasetVersionCommand; import edu.harvard.iq.dataverse.engine.command.impl.DeletePrivateUrlCommand; import edu.harvard.iq.dataverse.engine.command.impl.DestroyDatasetCommand; import edu.harvard.iq.dataverse.engine.command.impl.GetPrivateUrlCommand; import edu.harvard.iq.dataverse.engine.command.impl.LinkDatasetCommand; import edu.harvard.iq.dataverse.engine.command.impl.PublishDatasetCommand; import edu.harvard.iq.dataverse.engine.command.impl.PublishDataverseCommand; 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.ingest.IngestRequest; import edu.harvard.iq.dataverse.ingest.IngestServiceBean; import edu.harvard.iq.dataverse.metadataimport.ForeignMetadataImportServiceBean; import edu.harvard.iq.dataverse.privateurl.PrivateUrl; import edu.harvard.iq.dataverse.privateurl.PrivateUrlServiceBean; import edu.harvard.iq.dataverse.privateurl.PrivateUrlUtil; import edu.harvard.iq.dataverse.search.SearchFilesServiceBean; import edu.harvard.iq.dataverse.search.SortBy; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.FileSortFieldAndOrder; import edu.harvard.iq.dataverse.util.FileUtil; import edu.harvard.iq.dataverse.util.JsfHelper; import static edu.harvard.iq.dataverse.util.JsfHelper.JH; import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Logger; import javax.ejb.EJB; import javax.ejb.EJBException; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; import javax.faces.event.ValueChangeEvent; import javax.faces.view.ViewScoped; import javax.inject.Inject; import javax.inject.Named; import org.primefaces.event.FileUploadEvent; import org.primefaces.model.UploadedFile; import javax.validation.ConstraintViolation; import org.apache.commons.httpclient.HttpClient; import org.primefaces.context.RequestContext; import java.util.Arrays; import java.util.HashSet; import javax.faces.model.SelectItem; import java.util.logging.Level; import edu.harvard.iq.dataverse.datasetutility.TwoRavensHelper; import edu.harvard.iq.dataverse.datasetutility.WorldMapPermissionHelper; import javax.faces.event.AjaxBehaviorEvent; import org.apache.commons.lang.StringEscapeUtils; import org.primefaces.component.tabview.TabView; import org.primefaces.event.TabChangeEvent; /** * * @author gdurand */ @ViewScoped @Named("DatasetPage") public class DatasetPage implements java.io.Serializable { private static final Logger logger = Logger.getLogger(DatasetPage.class.getCanonicalName()); public enum EditMode { CREATE, INFO, FILE, METADATA, LICENSE }; public enum DisplayMode { INIT, SAVE }; @EJB DatasetServiceBean datasetService; @EJB DatasetVersionServiceBean datasetVersionService; @EJB DataFileServiceBean datafileService; @EJB PermissionServiceBean permissionService; @EJB DataverseServiceBean dataverseService; @EJB DatasetFieldServiceBean fieldService; @EJB VariableServiceBean variableService; @EJB IngestServiceBean ingestService; @EJB ForeignMetadataImportServiceBean metadataImportService; @EJB EjbDataverseEngine commandEngine; @Inject DataverseSession session; @EJB UserNotificationServiceBean userNotificationService; @EJB MapLayerMetadataServiceBean mapLayerMetadataService; @EJB BuiltinUserServiceBean builtinUserService; @EJB DataverseFieldTypeInputLevelServiceBean dataverseFieldTypeInputLevelService; @EJB SettingsServiceBean settingsService; @EJB AuthenticationServiceBean authService; @EJB SystemConfig systemConfig; @EJB GuestbookResponseServiceBean guestbookResponseService; @EJB FileDownloadServiceBean fileDownloadService; @EJB DataverseLinkingServiceBean dvLinkingService; @EJB DatasetLinkingServiceBean dsLinkingService; @EJB SearchFilesServiceBean searchFilesService; @EJB DataverseRoleServiceBean dataverseRoleService; @EJB PrivateUrlServiceBean privateUrlService; @Inject DataverseRequestServiceBean dvRequestService; @Inject DatasetVersionUI datasetVersionUI; @Inject PermissionsWrapper permissionsWrapper; @Inject FileDownloadHelper fileDownloadHelper; @Inject TwoRavensHelper twoRavensHelper; @Inject WorldMapPermissionHelper worldMapPermissionHelper; private Dataset dataset = new Dataset(); private EditMode editMode; private Long ownerId; private Long versionId; private int selectedTabIndex; private List<DataFile> newFiles = new ArrayList(); private DatasetVersion workingVersion; private int releaseRadio = 1; private int deaccessionRadio = 0; private int deaccessionReasonRadio = 0; private String datasetNextMajorVersion = "1.0"; private String datasetNextMinorVersion = ""; private String dropBoxSelection = ""; private String deaccessionReasonText = ""; private String displayCitation; private String deaccessionForwardURLFor = ""; private String showVersionList = "false"; private List<Template> dataverseTemplates = new ArrayList(); private Template defaultTemplate; private Template selectedTemplate; private String globalId; private String persistentId; private String version; private String protocol = ""; private String authority = ""; private String separator = ""; private boolean noDVsAtAll = false; private boolean noDVsRemaining = false; private boolean stateChanged = false; private List<Dataverse> dataversesForLinking = new ArrayList(); private Long linkingDataverseId; private List<SelectItem> linkingDVSelectItems; private Dataverse linkingDataverse; // Version tab lists private List<DatasetVersion> versionTabList = new ArrayList(); private List<DatasetVersion> versionTabListForPostLoad = new ArrayList(); // Used to store results of permissions checks private final Map<String, Boolean> datasetPermissionMap = new HashMap<>(); // { Permission human_name : Boolean } private DataFile selectedDownloadFile; private Long maxFileUploadSizeInBytes = null; private String dataverseSiteUrl = ""; private boolean removeUnusedTags; public boolean isRemoveUnusedTags() { return removeUnusedTags; } public void setRemoveUnusedTags(boolean removeUnusedTags) { this.removeUnusedTags = removeUnusedTags; } private List<FileMetadata> fileMetadatas; private String fileSortField; private String fileSortOrder; private LazyFileMetadataDataModel lazyModel; public LazyFileMetadataDataModel getLazyModel() { return lazyModel; } public void setLazyModel(LazyFileMetadataDataModel lazyModel) { this.lazyModel = lazyModel; } private String fileLabelSearchTerm; public String getFileLabelSearchTerm() { return fileLabelSearchTerm; } public void setFileLabelSearchTerm(String fileLabelSearchTerm) { this.fileLabelSearchTerm = fileLabelSearchTerm; } private List<FileMetadata> fileMetadatasSearch; public List<FileMetadata> getFileMetadatasSearch() { return fileMetadatasSearch; } public void setFileMetadatasSearch(List<FileMetadata> fileMetadatasSearch) { this.fileMetadatasSearch = fileMetadatasSearch; } public void updateFileSearch(){ logger.info("updating file search list"); if (readOnly) { this.fileMetadatasSearch = selectFileMetadatasForDisplay(this.fileLabelSearchTerm); } else { this.fileMetadatasSearch = datafileService.findFileMetadataByDatasetVersionIdLabelSearchTerm(workingVersion.getId(), this.fileLabelSearchTerm, "", ""); } } private Long numberOfFilesToShow = new Long(25); public Long getNumberOfFilesToShow() { return numberOfFilesToShow; } public void setNumberOfFilesToShow(Long numberOfFilesToShow) { this.numberOfFilesToShow = numberOfFilesToShow; } public void showAll(){ setNumberOfFilesToShow(new Long(fileMetadatasSearch.size())); } private List<FileMetadata> selectFileMetadatasForDisplay(String searchTerm) { Set<Long> searchResultsIdSet = null; if (searchTerm != null && !searchTerm.equals("")) { List<Integer> searchResultsIdList = datafileService.findFileMetadataIdsByDatasetVersionIdLabelSearchTerm(workingVersion.getId(), searchTerm, "", ""); searchResultsIdSet = new HashSet<>(); for (Integer id : searchResultsIdList) { searchResultsIdSet.add(id.longValue()); } } List<FileMetadata> retList = new ArrayList<>(); for (FileMetadata fileMetadata : workingVersion.getFileMetadatasSorted()) { if (searchResultsIdSet == null || searchResultsIdSet.contains(fileMetadata.getId())) { retList.add(fileMetadata); } } return retList; } /* Save the setting locally so db isn't hit repeatedly This may be "null", signifying unlimited download size */ public Long getMaxFileUploadSizeInBytes(){ return this.maxFileUploadSizeInBytes; } public boolean isUnlimitedUploadFileSize(){ if (this.maxFileUploadSizeInBytes == null){ return true; } return false; } public boolean isMetadataExportEnabled() { return metadataExportEnabled; } public String getDataverseSiteUrl() { return this.dataverseSiteUrl; } public void setDataverseSiteUrl(String dataverseSiteUrl) { this.dataverseSiteUrl = dataverseSiteUrl; } public DataFile getSelectedDownloadFile() { return selectedDownloadFile; } public void setSelectedDownloadFile(DataFile selectedDownloadFile) { this.selectedDownloadFile = selectedDownloadFile; } public List<DataFile> getNewFiles() { return newFiles; } public void setNewFiles(List<DataFile> newFiles) { this.newFiles = newFiles; } public Dataverse getLinkingDataverse() { return linkingDataverse; } public void setLinkingDataverse(Dataverse linkingDataverse) { this.linkingDataverse = linkingDataverse; } public List<SelectItem> getLinkingDVSelectItems() { return linkingDVSelectItems; } public void setLinkingDVSelectItems(List<SelectItem> linkingDVSelectItems) { this.linkingDVSelectItems = linkingDVSelectItems; } public Long getLinkingDataverseId() { return linkingDataverseId; } public void setLinkingDataverseId(Long linkingDataverseId) { this.linkingDataverseId = linkingDataverseId; } public List<Dataverse> getDataversesForLinking() { return dataversesForLinking; } public void setDataversesForLinking(List<Dataverse> dataversesForLinking) { this.dataversesForLinking = dataversesForLinking; } public void updateReleasedVersions(){ setReleasedVersionTabList(resetReleasedVersionTabList()); } public void updateLinkableDataverses() { dataversesForLinking = new ArrayList(); linkingDVSelectItems = new ArrayList(); //Since this is a super user we are getting all dataverses dataversesForLinking = dataverseService.findAll(); if (dataversesForLinking.isEmpty()) { setNoDVsAtAll(true); return; } dataversesForLinking.remove(dataset.getOwner()); Dataverse testDV = dataset.getOwner(); while(testDV.getOwner() != null){ dataversesForLinking.remove(testDV.getOwner()); testDV = testDV.getOwner(); } for (Dataverse removeLinked : dsLinkingService.findLinkingDataverses(dataset.getId())) { dataversesForLinking.remove(removeLinked); } for (Dataverse removeLinked : dvLinkingService.findLinkingDataverses(dataset.getOwner().getId())) { dataversesForLinking.remove(removeLinked); } if (dataversesForLinking.isEmpty()) { setNoDVsRemaining(true); return; } for (Dataverse selectDV : dataversesForLinking) { linkingDVSelectItems.add(new SelectItem(selectDV.getId(), selectDV.getDisplayName())); } if (!dataversesForLinking.isEmpty() && dataversesForLinking.size() == 1 && dataversesForLinking.get(0) != null) { linkingDataverse = dataversesForLinking.get(0); linkingDataverseId = linkingDataverse.getId(); } } public void updateSelectedLinkingDV(ValueChangeEvent event) { linkingDataverseId = (Long) event.getNewValue(); } public boolean isNoDVsAtAll() { return noDVsAtAll; } public void setNoDVsAtAll(boolean noDVsAtAll) { this.noDVsAtAll = noDVsAtAll; } public boolean isNoDVsRemaining() { return noDVsRemaining; } 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 (!this.fileDownloadHelper.canDownloadFile(fileMetadata)) { return false; } return datafileService.isThumbnailAvailable(fileMetadata.getDataFile()); } // Another convenience method - to cache Update Permission on the dataset: public boolean canUpdateDataset() { return permissionsWrapper.canUpdateDataset(dvRequestService.getDataverseRequest(), this.dataset); } public boolean canPublishDataverse() { return permissionsWrapper.canIssuePublishDataverseCommand(dataset.getOwner()); } public boolean canViewUnpublishedDataset() { return permissionsWrapper.canViewUnpublishedDataset( dvRequestService.getDataverseRequest(), dataset); } /* * 4.2.1 optimization. * HOWEVER, this doesn't appear to be saving us anything! * i.e., it's just as cheap to use session.getUser().isAuthenticated() * every time; it doesn't do any new db lookups. */ public boolean isSessionUserAuthenticated() { return session.getUser().isAuthenticated(); } /** * For use in the Dataset page * @return */ public boolean isSuperUser(){ if (!this.isSessionUserAuthenticated()){ return false; } if (this.session.getUser().isSuperuser()){ return true; } return false; } /* TODO/OPTIMIZATION: This is still costing us N SELECT FROM GuestbookResponse queries, where N is the number of files. This could of course be replaced by a query that'll look up all N at once... Not sure if it's worth it; especially now that N will always be 10, for the initial page load. -- L.A. 4.2.1 */ public Long getGuestbookResponseCount(FileMetadata fileMetadata) { return guestbookResponseService.getCountGuestbookResponsesByDataFileId(fileMetadata.getDataFile().getId()); } /** * Check Dataset related permissions * * @param permissionToCheck * @return */ public boolean doesSessionUserHaveDataSetPermission(Permission permissionToCheck){ if (permissionToCheck == null){ return false; } String permName = permissionToCheck.getHumanName(); // Has this check already been done? // if (this.datasetPermissionMap.containsKey(permName)){ // Yes, return previous answer return this.datasetPermissionMap.get(permName); } // Check the permission // boolean hasPermission = this.permissionService.userOn(this.session.getUser(), this.dataset).has(permissionToCheck); // Save the permission this.datasetPermissionMap.put(permName, hasPermission); // return true/false return hasPermission; } public void setNoDVsRemaining(boolean noDVsRemaining) { this.noDVsRemaining = noDVsRemaining; } private final Map<Long, MapLayerMetadata> mapLayerMetadataLookup = new HashMap<>(); private GuestbookResponse guestbookResponse; private Guestbook selectedGuestbook; public GuestbookResponse getGuestbookResponse() { return guestbookResponse; } public void setGuestbookResponse(GuestbookResponse guestbookResponse) { this.guestbookResponse = guestbookResponse; } public Guestbook getSelectedGuestbook() { return selectedGuestbook; } public void setSelectedGuestbook(Guestbook selectedGuestbook) { this.selectedGuestbook = selectedGuestbook; } public void viewSelectedGuestbook(Guestbook selectedGuestbook) { this.selectedGuestbook = selectedGuestbook; } public void reset() { dataset.setGuestbook(null); } public String getGlobalId() { return persistentId; } public String getPersistentId() { return persistentId; } public void setPersistentId(String persistentId) { this.persistentId = persistentId; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public String getShowVersionList() { return showVersionList; } public void setShowVersionList(String showVersionList) { this.showVersionList = showVersionList; } public String getShowOtherText() { return showOtherText; } public void setShowOtherText(String showOtherText) { this.showOtherText = showOtherText; } private String showOtherText = "false"; public String getDeaccessionForwardURLFor() { return deaccessionForwardURLFor; } public void setDeaccessionForwardURLFor(String deaccessionForwardURLFor) { this.deaccessionForwardURLFor = deaccessionForwardURLFor; } private DatasetVersionDifference datasetVersionDifference; public String getDeaccessionReasonText() { return deaccessionReasonText; } public void setDeaccessionReasonText(String deaccessionReasonText) { this.deaccessionReasonText = deaccessionReasonText; } public String getDisplayCitation() { //displayCitation = dataset.getCitation(false, workingVersion); return displayCitation; } public void setDisplayCitation(String displayCitation) { this.displayCitation = displayCitation; } public String getDropBoxSelection() { return dropBoxSelection; } public String getDropBoxKey() { // Site-specific DropBox application registration key is configured // via a JVM option under glassfish. //if (true)return "some-test-key"; // for debugging String configuredDropBoxKey = System.getProperty("dataverse.dropbox.key"); if (configuredDropBoxKey != null) { return configuredDropBoxKey; } return ""; } public void setDropBoxSelection(String dropBoxSelection) { this.dropBoxSelection = dropBoxSelection; } public Dataset getDataset() { return dataset; } public void setDataset(Dataset dataset) { this.dataset = dataset; } public DatasetVersion getWorkingVersion() { return workingVersion; } public EditMode getEditMode() { return editMode; } public void setEditMode(EditMode editMode) { this.editMode = editMode; } public Long getOwnerId() { return ownerId; } public void setOwnerId(Long ownerId) { this.ownerId = ownerId; } public Long getVersionId() { return versionId; } public void setVersionId(Long versionId) { this.versionId = versionId; } public int getSelectedTabIndex() { return selectedTabIndex; } public void setSelectedTabIndex(int selectedTabIndex) { this.selectedTabIndex = selectedTabIndex; } public int getReleaseRadio() { return releaseRadio; } public void setReleaseRadio(int releaseRadio) { this.releaseRadio = releaseRadio; } public String getDatasetNextMajorVersion() { return datasetNextMajorVersion; } public void setDatasetNextMajorVersion(String datasetNextMajorVersion) { this.datasetNextMajorVersion = datasetNextMajorVersion; } public String getDatasetNextMinorVersion() { return datasetNextMinorVersion; } public void setDatasetNextMinorVersion(String datasetNextMinorVersion) { this.datasetNextMinorVersion = datasetNextMinorVersion; } public int getDeaccessionReasonRadio() { return deaccessionReasonRadio; } public void setDeaccessionReasonRadio(int deaccessionReasonRadio) { this.deaccessionReasonRadio = deaccessionReasonRadio; } public int getDeaccessionRadio() { return deaccessionRadio; } public void setDeaccessionRadio(int deaccessionRadio) { this.deaccessionRadio = deaccessionRadio; } public List<Template> getDataverseTemplates() { return dataverseTemplates; } public void setDataverseTemplates(List<Template> dataverseTemplates) { this.dataverseTemplates = dataverseTemplates; } public Template getDefaultTemplate() { return defaultTemplate; } public void setDefaultTemplate(Template defaultTemplate) { this.defaultTemplate = defaultTemplate; } public Template getSelectedTemplate() { return selectedTemplate; } public void setSelectedTemplate(Template selectedTemplate) { this.selectedTemplate = selectedTemplate; } public void updateSelectedTemplate(ValueChangeEvent event) { selectedTemplate = (Template) event.getNewValue(); if (selectedTemplate != null) { //then create new working version from the selected template workingVersion.updateDefaultValuesFromTemplate(selectedTemplate); updateDatasetFieldInputLevels(); } else { workingVersion.initDefaultValues(); updateDatasetFieldInputLevels(); } resetVersionUI(); } /* // Original private void updateDatasetFieldInputLevels() { Long dvIdForInputLevel = ownerId; if (!dataverseService.find(ownerId).isMetadataBlockRoot()) { dvIdForInputLevel = dataverseService.find(ownerId).getMetadataRootId(); } for (DatasetField dsf : workingVersion.getFlatDatasetFields()) { DataverseFieldTypeInputLevel dsfIl = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(dvIdForInputLevel, dsf.getDatasetFieldType().getId()); if (dsfIl != null) { dsf.setInclude(dsfIl.isInclude()); } else { dsf.setInclude(true); } } }*/ /*** * * Note: Updated to retrieve DataverseFieldTypeInputLevel objects in single query * */ private void updateDatasetFieldInputLevels() { Long dvIdForInputLevel = ownerId; // OPTIMIZATION (?): replaced "dataverseService.find(ownerId)" with // simply dataset.getOwner()... saves us a few lookups. // TODO: could there possibly be any reason we want to look this // dataverse up by the id here?? -- L.A. 4.2.1 if (!dataset.getOwner().isMetadataBlockRoot()) { dvIdForInputLevel = dataset.getOwner().getMetadataRootId(); } /* --------------------------------------------------------- Map to hold DatasetFields Format: { DatasetFieldType.id : DatasetField } --------------------------------------------------------- */ // Initialize Map Map<Long, DatasetField> mapDatasetFields = new HashMap<>(); // Populate Map for (DatasetField dsf : workingVersion.getFlatDatasetFields()) { if (dsf.getDatasetFieldType().getId() != null){ mapDatasetFields.put(dsf.getDatasetFieldType().getId(), dsf); } } /* --------------------------------------------------------- Retrieve List of DataverseFieldTypeInputLevel objects Use the DatasetFieldType id's which are the Map's keys --------------------------------------------------------- */ List<Long> idList = new ArrayList<Long>(mapDatasetFields.keySet()); List<DataverseFieldTypeInputLevel> dsFieldTypeInputLevels = dataverseFieldTypeInputLevelService.findByDataverseIdAndDatasetFieldTypeIdList(dvIdForInputLevel, idList); /* --------------------------------------------------------- Iterate through List of DataverseFieldTypeInputLevel objects Call "setInclude" on its related DatasetField object --------------------------------------------------------- */ for (DataverseFieldTypeInputLevel oneDSFieldTypeInputLevel : dsFieldTypeInputLevels){ if (oneDSFieldTypeInputLevel != null) { // Is the DatasetField in the hash? hash format: { DatasetFieldType.id : DatasetField } DatasetField dsf = mapDatasetFields.get(oneDSFieldTypeInputLevel.getDatasetFieldType().getId()); if (dsf != null){ // Yes, call "setInclude" dsf.setInclude(oneDSFieldTypeInputLevel.isInclude()); // remove from hash mapDatasetFields.remove(oneDSFieldTypeInputLevel.getDatasetFieldType().getId()); } } } // end: updateDatasetFieldInputLevels /* --------------------------------------------------------- Iterate through any DatasetField objects remaining in the hash Call "setInclude(true) on each one --------------------------------------------------------- */ for ( DatasetField dsf : mapDatasetFields.values()) { if (dsf != null){ dsf.setInclude(true); } } } public void handleChange() { logger.fine("handle change"); logger.fine("new value " + selectedTemplate.getId()); } public void handleChangeButton() { } public boolean isShapefileType(FileMetadata fm) { if (fm == null) { return false; } if (fm.getDataFile() == null) { return false; } return fm.getDataFile().isShapefileType(); } /* Check if the FileMetadata.dataFile has an associated MapLayerMetadata object The MapLayerMetadata objects have been fetched at page inception by "loadMapLayerMetadataLookup()" */ public boolean hasMapLayerMetadata(FileMetadata fm) { if (fm == null) { return false; } if (fm.getDataFile() == null) { return false; } return doesDataFileHaveMapLayerMetadata(fm.getDataFile()); } /** * Check if a DataFile has an associated MapLayerMetadata object * * The MapLayerMetadata objects have been fetched at page inception by * "loadMapLayerMetadataLookup()" */ private boolean doesDataFileHaveMapLayerMetadata(DataFile df) { if (df == null) { return false; } if (df.getId() == null) { return false; } return this.mapLayerMetadataLookup.containsKey(df.getId()); } /** * Using a DataFile id, retrieve an associated MapLayerMetadata object * * The MapLayerMetadata objects have been fetched at page inception by * "loadMapLayerMetadataLookup()" */ public MapLayerMetadata getMapLayerMetadata(DataFile df) { if (df == null) { return null; } return this.mapLayerMetadataLookup.get(df.getId()); } private void msg(String s){ // System.out.println(s); } /** * For development * * Flag for whether to show sample insert statements for Geoconnect Debug * * Conditions to meet: Person is superuser and GeoconnectDebug active * * @return */ public boolean isGeoconnectDebugAvailable(){ if (!this.isSuperUser()){ return false; } if (settingsService.isTrueForKey(SettingsServiceBean.Key.GeoconnectDebug, false)){ return true; } return false; } /** * Create a hashmap consisting of { DataFile.id : MapLayerMetadata object} * * Very few DataFiles will have associated MapLayerMetadata objects so only * use 1 query to get them */ private void loadMapLayerMetadataLookup() { if (this.dataset == null) { } if (this.dataset.getId() == null) { return; } List<MapLayerMetadata> mapLayerMetadataList = mapLayerMetadataService.getMapLayerMetadataForDataset(this.dataset); if (mapLayerMetadataList == null) { return; } for (MapLayerMetadata layer_metadata : mapLayerMetadataList) { mapLayerMetadataLookup.put(layer_metadata.getDataFile().getId(), layer_metadata); } }// A DataFile may have a related MapLayerMetadata object private List<FileMetadata> displayFileMetadata; public List<FileMetadata> getDisplayFileMetadata() { return displayFileMetadata; } public void setDisplayFileMetadata(List<FileMetadata> displayFileMetadata) { this.displayFileMetadata = displayFileMetadata; } private boolean readOnly = true; private boolean metadataExportEnabled; private String originalSourceUrl = null; public String getOriginalSourceUrl() { return originalSourceUrl; } public void setOriginalSourceUrl(String originalSourceUrl) { this.originalSourceUrl = originalSourceUrl; } public String init() { return init(true); } public String initCitation() { return init(false); } private String init(boolean initFull) { //System.out.println("_YE_OLDE_QUERY_COUNTER_"); // for debug purposes this.maxFileUploadSizeInBytes = systemConfig.getMaxFileUploadSize(); setDataverseSiteUrl(systemConfig.getDataverseSiteUrl()); /** * For now having DDI export enabled is a proxy for having any metadata * export enabled (JSON, Dublin Core, etc.). */ metadataExportEnabled = systemConfig.isDdiExportEnabled(); guestbookResponse = new GuestbookResponse(); String nonNullDefaultIfKeyNotFound = ""; protocol = settingsService.getValueForKey(SettingsServiceBean.Key.Protocol, nonNullDefaultIfKeyNotFound); authority = settingsService.getValueForKey(SettingsServiceBean.Key.Authority, nonNullDefaultIfKeyNotFound); separator = settingsService.getValueForKey(SettingsServiceBean.Key.DoiSeparator, nonNullDefaultIfKeyNotFound); if (dataset.getId() != null || versionId != null || persistentId != null) { // view mode for a dataset DatasetVersionServiceBean.RetrieveDatasetVersionResponse retrieveDatasetVersionResponse = null; // --------------------------------------- // Set the workingVersion and Dataset // --------------------------------------- if (persistentId != null) { logger.fine("initializing DatasetPage with persistent ID " + persistentId); // Set Working Version and Dataset by PersistentID dataset = datasetService.findByGlobalId(persistentId); if (dataset == null) { logger.warning("No such dataset: "+persistentId); return permissionsWrapper.notFound(); } logger.fine("retrived dataset, id="+dataset.getId()); retrieveDatasetVersionResponse = datasetVersionService.selectRequestedVersion(dataset.getVersions(), version); //retrieveDatasetVersionResponse = datasetVersionService.retrieveDatasetVersionByPersistentId(persistentId, version); this.workingVersion = retrieveDatasetVersionResponse.getDatasetVersion(); logger.info("retreived version: id: " + workingVersion.getId() + ", state: " + this.workingVersion.getVersionState()); } else if (dataset.getId() != null) { // Set Working Version and Dataset by Datasaet Id and Version dataset = datasetService.find(dataset.getId()); if (dataset == null) { logger.warning("No such dataset: "+dataset); return permissionsWrapper.notFound(); } //retrieveDatasetVersionResponse = datasetVersionService.retrieveDatasetVersionById(dataset.getId(), version); retrieveDatasetVersionResponse = datasetVersionService.selectRequestedVersion(dataset.getVersions(), version); this.workingVersion = retrieveDatasetVersionResponse.getDatasetVersion(); logger.info("retreived version: id: " + workingVersion.getId() + ", state: " + this.workingVersion.getVersionState()); } else if (versionId != null) { // TODO: 4.2.1 - this method is broken as of now! // Set Working Version and Dataset by DatasaetVersion Id //retrieveDatasetVersionResponse = datasetVersionService.retrieveDatasetVersionByVersionId(versionId); } if (retrieveDatasetVersionResponse == null) { return permissionsWrapper.notFound(); } //this.dataset = this.workingVersion.getDataset(); // end: Set the workingVersion and Dataset // --------------------------------------- // Is the DatasetVersion or Dataset null? // if (workingVersion == null || this.dataset == null) { return permissionsWrapper.notFound(); } // Is the Dataset harvested? if (dataset.isHarvested()) { // if so, we'll simply forward to the remote URL for the original // source of this harvested dataset: String originalSourceURL = dataset.getRemoteArchiveURL(); if (originalSourceURL != null && !originalSourceURL.equals("")) { logger.fine("redirecting to "+originalSourceURL); try { FacesContext.getCurrentInstance().getExternalContext().redirect(originalSourceURL); } catch (IOException ioex) { // must be a bad URL... // we don't need to do anything special here - we'll redirect // to the local 404 page, below. logger.warning("failed to issue a redirect to "+originalSourceURL); } return originalSourceURL; } return permissionsWrapper.notFound(); } // Check permisisons if (!(workingVersion.isReleased() || workingVersion.isDeaccessioned()) && !this.canViewUnpublishedDataset()) { return permissionsWrapper.notAuthorized(); } if (!retrieveDatasetVersionResponse.wasRequestedVersionRetrieved()) { //msg("checkit " + retrieveDatasetVersionResponse.getDifferentVersionMessage()); JsfHelper.addWarningMessage(retrieveDatasetVersionResponse.getDifferentVersionMessage());//JH.localize("dataset.message.metadataSuccess")); } // init the citation displayCitation = dataset.getCitation(true, workingVersion); if (initFull) { // init the list of FileMetadatas if (workingVersion.isDraft() && canUpdateDataset()) { readOnly = false; } else { // an attempt to retreive both the filemetadatas and datafiles early on, so that // we don't have to do so later (possibly, many more times than necessary): datafileService.findFileMetadataOptimizedExperimental(dataset); } fileMetadatasSearch = workingVersion.getFileMetadatasSorted(); ownerId = dataset.getOwner().getId(); datasetNextMajorVersion = this.dataset.getNextMajorVersionString(); datasetNextMinorVersion = this.dataset.getNextMinorVersionString(); datasetVersionUI = datasetVersionUI.initDatasetVersionUI(workingVersion, false); updateDatasetFieldInputLevels(); setExistReleasedVersion(resetExistRealeaseVersion()); //moving setVersionTabList to tab change event //setVersionTabList(resetVersionTabList()); //setReleasedVersionTabList(resetReleasedVersionTabList()); //SEK - lazymodel may be needed for datascroller in future release // lazyModel = new LazyFileMetadataDataModel(workingVersion.getId(), datafileService ); // populate MapLayerMetadata this.loadMapLayerMetadataLookup(); // A DataFile may have a related MapLayerMetadata object this.guestbookResponse = guestbookResponseService.initGuestbookResponseForFragment(dataset, null, session); } } else if (ownerId != null) { // create mode for a new child dataset readOnly = false; editMode = EditMode.CREATE; dataset.setOwner(dataverseService.find(ownerId)); dataset.setProtocol(protocol); dataset.setAuthority(authority); dataset.setDoiSeparator(separator); dataset.setIdentifier(datasetService.generateIdentifierSequence(protocol, authority, separator)); if (dataset.getOwner() == null) { return permissionsWrapper.notFound(); } else if (!permissionService.on(dataset.getOwner()).has(Permission.AddDataset)) { return permissionsWrapper.notAuthorized(); } dataverseTemplates = dataverseService.find(ownerId).getTemplates(); if (!dataverseService.find(ownerId).isTemplateRoot()) { dataverseTemplates.addAll(dataverseService.find(ownerId).getParentTemplates()); } defaultTemplate = dataverseService.find(ownerId).getDefaultTemplate(); if (defaultTemplate != null) { selectedTemplate = defaultTemplate; for (Template testT : dataverseTemplates) { if (defaultTemplate.getId().equals(testT.getId())) { selectedTemplate = testT; } } workingVersion = dataset.getEditVersion(selectedTemplate); updateDatasetFieldInputLevels(); } else { workingVersion = dataset.getCreateVersion(); updateDatasetFieldInputLevels(); } resetVersionUI(); // FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Add New Dataset", " - Enter metadata to create the dataset's citation. You can add more metadata about this dataset after it's created.")); } else { return permissionsWrapper.notFound(); } try { privateUrl = commandEngine.submit(new GetPrivateUrlCommand(dvRequestService.getDataverseRequest(), dataset)); if (privateUrl != null) { JH.addMessage(FacesMessage.SEVERITY_INFO, BundleUtil.getStringFromBundle("dataset.privateurl.infoMessageAuthor", Arrays.asList(getPrivateUrlLink(privateUrl)))); } } catch (CommandException ex) { // No big deal. The user simply doesn't have access to create or delete a Private URL. } if (session.getUser() instanceof PrivateUrlUser) { PrivateUrlUser privateUrlUser = (PrivateUrlUser) session.getUser(); if (dataset != null && dataset.getId().equals(privateUrlUser.getDatasetId())) { JH.addMessage(FacesMessage.SEVERITY_INFO, BundleUtil.getStringFromBundle("dataset.privateurl.infoMessageReviewer")); } } return null; } public boolean isReadOnly() { return readOnly; } private void resetVersionUI() { datasetVersionUI = datasetVersionUI.initDatasetVersionUI(workingVersion, true); if (isSessionUserAuthenticated()) { AuthenticatedUser au = (AuthenticatedUser) session.getUser(); //On create set pre-populated fields for (DatasetField dsf : dataset.getEditVersion().getDatasetFields()) { if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.depositor) && dsf.isEmpty()) { dsf.getDatasetFieldValues().get(0).setValue(au.getLastName() + ", " + au.getFirstName()); } if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.dateOfDeposit) && dsf.isEmpty()) { dsf.getDatasetFieldValues().get(0).setValue(new SimpleDateFormat("yyyy-MM-dd").format(new Timestamp(new Date().getTime()))); } if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.datasetContact) && dsf.isEmpty()) { for (DatasetFieldCompoundValue contactValue : dsf.getDatasetFieldCompoundValues()) { for (DatasetField subField : contactValue.getChildDatasetFields()) { if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.datasetContactName)) { subField.getDatasetFieldValues().get(0).setValue(au.getLastName() + ", " + au.getFirstName()); } if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.datasetContactAffiliation)) { subField.getDatasetFieldValues().get(0).setValue(au.getAffiliation()); } if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.datasetContactEmail)) { subField.getDatasetFieldValues().get(0).setValue(au.getEmail()); } } } } if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.author) && dsf.isEmpty()) { for (DatasetFieldCompoundValue authorValue : dsf.getDatasetFieldCompoundValues()) { for (DatasetField subField : authorValue.getChildDatasetFields()) { if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.authorName)) { subField.getDatasetFieldValues().get(0).setValue(au.getLastName() + ", " + au.getFirstName()); } if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.authorAffiliation)) { subField.getDatasetFieldValues().get(0).setValue(au.getAffiliation()); } } } } } } } private boolean bulkUpdateCheckVersion(){ return workingVersion.isReleased(); } private void refreshSelectedFiles(){ if (readOnly) { dataset = datasetService.find(dataset.getId()); } String termsOfAccess = workingVersion.getTermsOfUseAndAccess().getTermsOfAccess(); boolean requestAccess = workingVersion.getTermsOfUseAndAccess().isFileAccessRequest(); workingVersion = dataset.getEditVersion(); workingVersion.getTermsOfUseAndAccess().setTermsOfAccess(termsOfAccess); workingVersion.getTermsOfUseAndAccess().setFileAccessRequest(requestAccess); List <FileMetadata> newSelectedFiles = new ArrayList(); for (FileMetadata fmd : selectedFiles){ for (FileMetadata fmdn: workingVersion.getFileMetadatas()){ if (fmd.getDataFile().equals(fmdn.getDataFile())){ newSelectedFiles.add(fmdn); } } } selectedFiles.clear(); for (FileMetadata fmdn : newSelectedFiles ){ selectedFiles.add(fmdn); } readOnly = false; } private Integer chunkSize = 25; public Integer getChunkSize() { return chunkSize; } public void setChunkSize(Integer chunkSize) { this.chunkSize = chunkSize; } public void viewAllButtonPress(){ setChunkSize(fileMetadatasSearch.size()); } private int activeTabIndex; public int getActiveTabIndex() { return activeTabIndex; } public void setActiveTabIndex(int activeTabIndex) { this.activeTabIndex = activeTabIndex; } public void tabChanged(TabChangeEvent event) { TabView tv = (TabView) event.getComponent(); this.activeTabIndex = tv.getActiveIndex(); if (this.activeTabIndex == 3) { setVersionTabList(resetVersionTabList()); setReleasedVersionTabList(resetReleasedVersionTabList()); } else { releasedVersionTabList = new ArrayList(); versionTabList = new ArrayList(); if(this.activeTabIndex == 0) { init(); } } } public void edit(EditMode editMode) { this.editMode = editMode; if (this.readOnly) { dataset = datasetService.find(dataset.getId()); } workingVersion = dataset.getEditVersion(); if (editMode == EditMode.INFO) { // ? } else if (editMode == EditMode.FILE) { // JH.addMessage(FacesMessage.SEVERITY_INFO, JH.localize("dataset.message.editFiles")); // FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Upload + Edit Dataset Files", " - You can drag and drop your files from your desktop, directly into the upload widget.")); } else if (editMode.equals(EditMode.METADATA)) { datasetVersionUI = datasetVersionUI.initDatasetVersionUI(workingVersion, true); updateDatasetFieldInputLevels(); JH.addMessage(FacesMessage.SEVERITY_INFO, JH.localize("dataset.message.editMetadata")); //FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Edit Dataset Metadata", " - Add more metadata about your dataset to help others easily find it.")); } else if (editMode.equals(EditMode.LICENSE)){ JH.addMessage(FacesMessage.SEVERITY_INFO, JH.localize("dataset.message.editTerms")); //FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Edit Dataset License and Terms", " - Update your dataset's license and terms of use.")); } this.readOnly = false; } public String releaseDraft() { if (releaseRadio == 1) { return releaseDataset(true); } else { return releaseDataset(false); } } public String releaseMajor() { return releaseDataset(false); } public String sendBackToContributor() { Command<Dataset> cmd; workingVersion = dataset.getEditVersion(); workingVersion.setInReview(false); try { cmd = new UpdateDatasetCommand(dataset, dvRequestService.getDataverseRequest()); ((UpdateDatasetCommand) cmd).setValidateLenient(true); dataset = commandEngine.submit(cmd); } catch (CommandException ex) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Dataset Submission Failed", " - " + ex.toString())); logger.severe(ex.getMessage()); return ""; } List<AuthenticatedUser> authUsers = permissionService.getUsersWithPermissionOn(Permission.PublishDataset, dataset); List<AuthenticatedUser> editUsers = permissionService.getUsersWithPermissionOn(Permission.EditDataset, dataset); for (AuthenticatedUser au : authUsers) { editUsers.remove(au); } for (AuthenticatedUser au : editUsers) { userNotificationService.sendNotification(au, new Timestamp(new Date().getTime()), UserNotification.Type.RETURNEDDS, dataset.getLatestVersion().getId()); } FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DatasetSubmitted", "This dataset has been sent back to the contributor."); FacesContext.getCurrentInstance().addMessage(null, message); return returnToLatestVersion(); } public String submitDataset() { Command<Dataset> cmd; workingVersion = dataset.getEditVersion(); workingVersion.setInReview(true); try { cmd = new UpdateDatasetCommand(dataset, dvRequestService.getDataverseRequest()); ((UpdateDatasetCommand) cmd).setValidateLenient(true); dataset = commandEngine.submit(cmd); } catch (CommandException ex) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Dataset Submission Failed", " - " + ex.toString())); logger.severe(ex.getMessage()); return ""; } List<AuthenticatedUser> authUsers = permissionService.getUsersWithPermissionOn(Permission.PublishDataset, dataset); for (AuthenticatedUser au : authUsers) { userNotificationService.sendNotification(au, new Timestamp(new Date().getTime()), UserNotification.Type.SUBMITTEDDS, dataset.getLatestVersion().getId()); } FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DatasetSubmitted", "Your dataset has been submitted for review."); FacesContext.getCurrentInstance().addMessage(null, message); return returnToLatestVersion(); } public String releaseParentDVAndDataset(){ releaseParentDV(); return releaseDataset(false); } public String releaseDataset() { return releaseDataset(false); } private void releaseParentDV(){ if (session.getUser() instanceof AuthenticatedUser) { PublishDataverseCommand cmd = new PublishDataverseCommand(dvRequestService.getDataverseRequest(), dataset.getOwner()); try { commandEngine.submit(cmd); JsfHelper.addSuccessMessage(JH.localize("dataverse.publish.success")); } catch (Exception ex) { logger.log(Level.SEVERE, "Unexpected Exception calling publish dataverse command", ex); JsfHelper.addErrorMessage(JH.localize("dataverse.publish.failure")); } } else { FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DataverseNotReleased", "Only authenticated users can release a dataverse."); FacesContext.getCurrentInstance().addMessage(null, message); } } public String deaccessionVersions() { Command<DatasetVersion> cmd; try { if (selectedDeaccessionVersions == null) { for (DatasetVersion dv : this.dataset.getVersions()) { if (dv.isReleased()) { DatasetVersion deaccession = datasetVersionService.find(dv.getId()); cmd = new DeaccessionDatasetVersionCommand(dvRequestService.getDataverseRequest(), setDatasetVersionDeaccessionReasonAndURL(deaccession), true); DatasetVersion datasetv = commandEngine.submit(cmd); } } } else { for (DatasetVersion dv : selectedDeaccessionVersions) { DatasetVersion deaccession = datasetVersionService.find(dv.getId()); cmd = new DeaccessionDatasetVersionCommand(dvRequestService.getDataverseRequest(), setDatasetVersionDeaccessionReasonAndURL(deaccession), false); DatasetVersion datasetv = commandEngine.submit(cmd); } } } catch (CommandException ex) { logger.severe(ex.getMessage()); JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataset.message.deaccessionFailure")); } JsfHelper.addSuccessMessage(JH.localize("datasetVersion.message.deaccessionSuccess")); return returnToDatasetOnly(); } private DatasetVersion setDatasetVersionDeaccessionReasonAndURL(DatasetVersion dvIn) { int deaccessionReasonCode = getDeaccessionReasonRadio(); String deacessionReasonDetail = getDeaccessionReasonText() != null ? ( getDeaccessionReasonText()).trim() : ""; switch (deaccessionReasonCode) { case 1: dvIn.setVersionNote("There is identifiable data in one or more files."); break; case 2: dvIn.setVersionNote("The research article has been retracted."); break; case 3: dvIn.setVersionNote("The dataset has been transferred to another repository."); break; case 4: dvIn.setVersionNote("IRB request."); break; case 5: dvIn.setVersionNote("Legal issue or Data Usage Agreement."); break; case 6: dvIn.setVersionNote("Not a valid dataset."); break; case 7: break; } if (!deacessionReasonDetail.isEmpty()){ if (!StringUtil.isEmpty(dvIn.getVersionNote())){ dvIn.setVersionNote(dvIn.getVersionNote() + " " + deacessionReasonDetail); } else { dvIn.setVersionNote(deacessionReasonDetail); } } dvIn.setArchiveNote(getDeaccessionForwardURLFor()); return dvIn; } private String releaseDataset(boolean minor) { Command<Dataset> cmd; //SEK we want to notify concerned users if a DS in review has been published. boolean notifyPublish = workingVersion.isInReview(); if (session.getUser() instanceof AuthenticatedUser) { try { if (editMode == EditMode.CREATE) { cmd = new PublishDatasetCommand(dataset, dvRequestService.getDataverseRequest(), minor); } else { cmd = new PublishDatasetCommand(dataset, dvRequestService.getDataverseRequest(), minor); } dataset = commandEngine.submit(cmd); JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.message.publishSuccess")); if (notifyPublish) { List<AuthenticatedUser> authUsers = permissionService.getUsersWithPermissionOn(Permission.PublishDataset, dataset); List<AuthenticatedUser> editUsers = permissionService.getUsersWithPermissionOn(Permission.EditDataset, dataset); for (AuthenticatedUser au : authUsers) { editUsers.remove(au); } for (AuthenticatedUser au : editUsers) { userNotificationService.sendNotification(au, new Timestamp(new Date().getTime()), UserNotification.Type.PUBLISHEDDS, dataset.getLatestVersion().getId()); } } } catch (CommandException ex) { JsfHelper.addErrorMessage(ex.getLocalizedMessage()); logger.severe(ex.getMessage()); } } else { JsfHelper.addErrorMessage(BundleUtil.getStringFromBundle("dataset.message.only.authenticatedUsers")); } return returnToDatasetOnly(); } public String registerDataset() { Command<Dataset> cmd; try { cmd = new UpdateDatasetCommand(dataset, dvRequestService.getDataverseRequest()); ((UpdateDatasetCommand) cmd).setValidateLenient(true); dataset = commandEngine.submit(cmd); } catch (CommandException ex) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Dataset Registration Failed", " - " + ex.toString())); logger.severe(ex.getMessage()); } FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DatasetRegistered", "Your dataset is now registered."); FacesContext.getCurrentInstance().addMessage(null, message); return returnToDatasetOnly(); } public void refresh(ActionEvent e) { refresh(); } public void refresh() { logger.fine("refreshing"); //dataset = datasetService.find(dataset.getId()); dataset = null; logger.fine("refreshing working version"); DatasetVersionServiceBean.RetrieveDatasetVersionResponse retrieveDatasetVersionResponse = null; if (persistentId != null) { //retrieveDatasetVersionResponse = datasetVersionService.retrieveDatasetVersionByPersistentId(persistentId, version); dataset = datasetService.findByGlobalId(persistentId); retrieveDatasetVersionResponse = datasetVersionService.selectRequestedVersion(dataset.getVersions(), version); } else if (versionId != null) { retrieveDatasetVersionResponse = datasetVersionService.retrieveDatasetVersionByVersionId(versionId); } else if (dataset.getId() != null) { //retrieveDatasetVersionResponse = datasetVersionService.retrieveDatasetVersionById(dataset.getId(), version); dataset = datasetService.find(dataset.getId()); retrieveDatasetVersionResponse = datasetVersionService.selectRequestedVersion(dataset.getVersions(), version); } if (retrieveDatasetVersionResponse == null) { // TODO: // should probably redirect to the 404 page, if we can't find // this version anymore. // -- L.A. 4.2.3 return; } this.workingVersion = retrieveDatasetVersionResponse.getDatasetVersion(); if (this.workingVersion == null) { // TODO: // same as the above return; } if (dataset == null) { // this would be the case if we were retrieving the version by // the versionId, above. this.dataset = this.workingVersion.getDataset(); } if (readOnly) { datafileService.findFileMetadataOptimizedExperimental(dataset); } fileMetadatasSearch = workingVersion.getFileMetadatasSorted(); displayCitation = dataset.getCitation(true, workingVersion); stateChanged = false; } public String deleteDataset() { Command cmd; try { cmd = new DestroyDatasetCommand(dataset, dvRequestService.getDataverseRequest()); commandEngine.submit(cmd); /* - need to figure out what to do Update notification in Delete Dataset Method for (UserNotification und : userNotificationService.findByDvObject(dataset.getId())){ userNotificationService.delete(und); } */ } catch (CommandException ex) { JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataset.message.deleteFailure")); logger.severe(ex.getMessage()); } JsfHelper.addSuccessMessage(JH.localize("dataset.message.deleteSuccess")); return "/dataverse.xhtml?alias=" + dataset.getOwner().getAlias() + "&faces-redirect=true"; } public String editFileMetadata(){ // If there are no files selected, return an empty string - which // means, do nothing, don't redirect anywhere, stay on this page. // The dialogue telling the user to select at least one file will // be shown to them by an onclick javascript method attached to the // filemetadata edit button on the page. // -- L.A. 4.2.1 if (this.selectedFiles == null || this.selectedFiles.size() < 1) { return ""; } return "/editdatafiles.xhtml?selectedFileIds=" + getSelectedFilesIdsString() + "&datasetId=" + dataset.getId() +"&faces-redirect=true"; } public String deleteDatasetVersion() { Command cmd; try { cmd = new DeleteDatasetVersionCommand(dvRequestService.getDataverseRequest(), dataset); commandEngine.submit(cmd); JsfHelper.addSuccessMessage(JH.localize("datasetVersion.message.deleteSuccess")); } catch (CommandException ex) { JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataset.message.deleteFailure")); logger.severe(ex.getMessage()); } return returnToDatasetOnly(); } private List<FileMetadata> selectedFiles = new ArrayList<>(); public List<FileMetadata> getSelectedFiles() { return selectedFiles; } public void setSelectedFiles(List<FileMetadata> selectedFiles) { this.selectedFiles = selectedFiles; } private List<FileMetadata> selectedRestrictedFiles; // = new ArrayList<>(); public List<FileMetadata> getSelectedRestrictedFiles() { return selectedRestrictedFiles; } public void setSelectedRestrictedFiles(List<FileMetadata> selectedRestrictedFiles) { this.selectedRestrictedFiles = selectedRestrictedFiles; } private List<FileMetadata> selectedUnrestrictedFiles; // = new ArrayList<>(); public List<FileMetadata> getSelectedUnrestrictedFiles() { return selectedUnrestrictedFiles; } public void setSelectedUnrestrictedFiles(List<FileMetadata> selectedUnrestrictedFiles) { this.selectedUnrestrictedFiles = selectedUnrestrictedFiles; } private List<FileMetadata> selectedDownloadableFiles; public List<FileMetadata> getSelectedDownloadableFiles() { return selectedDownloadableFiles; } public void setSelectedDownloadableFiles(List<FileMetadata> selectedDownloadableFiles) { this.selectedDownloadableFiles = selectedDownloadableFiles; } private List<FileMetadata> selectedNonDownloadableFiles; public List<FileMetadata> getSelectedNonDownloadableFiles() { return selectedNonDownloadableFiles; } public void setSelectedNonDownloadableFiles(List<FileMetadata> selectedNonDownloadableFiles) { this.selectedNonDownloadableFiles = selectedNonDownloadableFiles; } public void validateFilesForDownload(boolean guestbookRequired){ setSelectedDownloadableFiles(new ArrayList<>()); setSelectedNonDownloadableFiles(new ArrayList<>()); if (this.selectedFiles.isEmpty()) { RequestContext requestContext = RequestContext.getCurrentInstance(); requestContext.execute("PF('selectFilesForDownload').show()"); return; } for (FileMetadata fmd : this.selectedFiles){ if(this.fileDownloadHelper.canDownloadFile(fmd)){ getSelectedDownloadableFiles().add(fmd); } else { getSelectedNonDownloadableFiles().add(fmd); } } if(!getSelectedDownloadableFiles().isEmpty() && getSelectedNonDownloadableFiles().isEmpty()){ if (guestbookRequired){ modifyGuestbookMultipleResponse(); } else{ startMultipleFileDownload(false); } } if(getSelectedDownloadableFiles().isEmpty() && !getSelectedNonDownloadableFiles().isEmpty()){ RequestContext requestContext = RequestContext.getCurrentInstance(); requestContext.execute("PF('downloadInvalid').show()"); return; } if(!getSelectedDownloadableFiles().isEmpty() && !getSelectedNonDownloadableFiles().isEmpty()){ RequestContext requestContext = RequestContext.getCurrentInstance(); requestContext.execute("PF('downloadMixed').show()"); } } private boolean selectAllFiles; public boolean isSelectAllFiles() { return selectAllFiles; } public void setSelectAllFiles(boolean selectAllFiles) { this.selectAllFiles = selectAllFiles; } public void toggleSelectedFiles(){ //method for when user clicks (de-)select all files this.selectedFiles = new ArrayList(); if(this.selectAllFiles){ for (FileMetadata fmd : workingVersion.getFileMetadatas()) { this.selectedFiles.add(fmd); fmd.setSelected(true); } } else { for (FileMetadata fmd : workingVersion.getFileMetadatas()) { fmd.setSelected(false); } } updateFileCounts(); } public void updateSelectedFiles(FileMetadata fmd){ if(fmd.isSelected()){ this.selectedFiles.add(fmd); } else{ this.selectedFiles.remove(fmd); } updateFileCounts(); } // helper Method public String getSelectedFilesIdsString() { String downloadIdString = ""; for (FileMetadata fmd : this.selectedFiles){ if (!StringUtil.isEmpty(downloadIdString)) { downloadIdString += ","; } downloadIdString += fmd.getDataFile().getId(); } return downloadIdString; } // helper Method public String getSelectedDownloadableFilesIdsString() { String downloadIdString = ""; for (FileMetadata fmd : this.selectedDownloadableFiles){ if (!StringUtil.isEmpty(downloadIdString)) { downloadIdString += ","; } downloadIdString += fmd.getDataFile().getId(); } return downloadIdString; } // helper Method public String getSelectedFilesIdsStringForDownload() { String downloadIdString = ""; for (FileMetadata fmd : this.selectedFiles){ if (!StringUtil.isEmpty(downloadIdString)) { downloadIdString += ","; } downloadIdString += fmd.getDataFile().getId(); } return downloadIdString; } public String getDownloadableFilesIdsString() { String downloadIdString = ""; for (FileMetadata fmd : this.selectedDownloadableFiles){ if (!StringUtil.isEmpty(downloadIdString)) { downloadIdString += ","; } downloadIdString += fmd.getDataFile().getId(); } return downloadIdString; } public void updateFileCounts(){ setSelectedUnrestrictedFiles(new ArrayList<FileMetadata>()); setSelectedRestrictedFiles(new ArrayList<FileMetadata>()); setTabularDataSelected(false); for (FileMetadata fmd : this.selectedFiles){ if(fmd.isRestricted()){ getSelectedRestrictedFiles().add(fmd); } else { getSelectedUnrestrictedFiles().add(fmd); } if(fmd.getDataFile().isTabularData()){ setTabularDataSelected(true); } } } private List<String> getSuccessMessageArguments() { List<String> arguments = new ArrayList<>(); arguments.add(StringEscapeUtils.escapeHtml(dataset.getDisplayName())); String linkString = "<a href=\"/dataverse/" + linkingDataverse.getAlias() + "\">" + StringEscapeUtils.escapeHtml(linkingDataverse.getDisplayName()) + "</a>"; arguments.add(linkString); return arguments; } public String saveLinkedDataset() { if (linkingDataverseId == null) { JsfHelper.addFlashMessage("You must select a linking dataverse."); return ""; } linkingDataverse = dataverseService.find(linkingDataverseId); if (readOnly) { // Pass a "real", non-readonly dataset the the LinkDatasetCommand: dataset = datasetService.find(dataset.getId()); } LinkDatasetCommand cmd = new LinkDatasetCommand(dvRequestService.getDataverseRequest(), linkingDataverse, dataset); try { commandEngine.submit(cmd); JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.message.linkSuccess", getSuccessMessageArguments())); } catch (CommandException ex) { String msg = "There was a problem linking this dataset to yours: " + ex; logger.severe(msg); /** * @todo how do we get this message to show up in the GUI? */ FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DatasetNotLinked", msg); FacesContext.getCurrentInstance().addMessage(null, message); } return returnToLatestVersion(); } List<FileMetadata> previouslyRestrictedFiles = null; public boolean isShowAccessPopup() { for (FileMetadata fmd : workingVersion.getFileMetadatas()) { if (fmd.isRestricted()) { if (editMode == EditMode.CREATE) { // if this is a brand new file, it's definitely not // of a previously restricted kind! return true; } if (previouslyRestrictedFiles != null) { // We've already checked whether we are in the CREATE mode, // above; and that means we can safely assume this filemetadata // has an existing db id. So it is safe to use the .contains() // method below: if (!previouslyRestrictedFiles.contains(fmd)) { return true; } } } } return false; } public void setShowAccessPopup(boolean showAccessPopup) {} // dummy set method public String restrictSelectedFiles(boolean restricted){ RequestContext requestContext = RequestContext.getCurrentInstance(); if (selectedFiles.isEmpty()) { if (restricted) { requestContext.execute("PF('selectFilesForRestrict').show()"); } else { requestContext.execute("PF('selectFilesForUnRestrict').show()"); } return ""; } else { boolean validSelection = false; for (FileMetadata fmd : selectedFiles) { if ((fmd.isRestricted() && !restricted) || (!fmd.isRestricted() && restricted)) { validSelection = true; } } if (!validSelection) { if (restricted) { requestContext.execute("PF('selectFilesForRestrict').show()"); } if (!restricted) { requestContext.execute("PF('selectFilesForUnRestrict').show()"); } return ""; } } if (editMode != EditMode.CREATE) { if (bulkUpdateCheckVersion()) { refreshSelectedFiles(); } restrictFiles(restricted); } save(); return returnToDraftVersion(); } public void restrictFiles(boolean restricted) { //if (previouslyRestrictedFiles == null) { // we don't need to buther with this "previously restricted" business // when in Create mode... because all the files are new, so none could // have been restricted previously; // (well, it looks like the code below should never be called in the // CREATE mode in the first place... the edit files fragment uses // its own restrictFiles() method there; also, the fmd.getDataFile().equals(fmw.getDataFile())) // line is not going to work on a new file... so be mindful of all this // when the code between the 2 beans is merged in 4.3. if (editMode != EditMode.CREATE) { previouslyRestrictedFiles = new ArrayList(); for (FileMetadata fmd : workingVersion.getFileMetadatas()) { if (fmd.isRestricted()) { previouslyRestrictedFiles.add(fmd); } } String fileNames = null; for (FileMetadata fmw : workingVersion.getFileMetadatas()) { for (FileMetadata fmd : this.getSelectedFiles()) { if (restricted && !fmw.isRestricted()) { // collect the names of the newly-restrticted files, // to show in the success message: // I don't think this does the right thing: // (adds too many files to the message; good thing this // message isn't used, normally) if (fileNames == null) { fileNames = fmd.getLabel(); } else { fileNames = fileNames.concat(fmd.getLabel()); } } if (fmd.getDataFile().equals(fmw.getDataFile())) { fmw.setRestricted(restricted); if (workingVersion.isDraft() && !fmw.getDataFile().isReleased()) { // We do not really need to check that the working version is // a draft here - it must be a draft, if we've gotten this // far. But just in case. -- L.A. 4.2.1 fmw.getDataFile().setRestricted(restricted); } } } } if (fileNames != null) { String successMessage = JH.localize("file.restricted.success"); logger.fine(successMessage); successMessage = successMessage.replace("{0}", fileNames); JsfHelper.addFlashMessage(successMessage); } } } public int getRestrictedFileCount() { int restrictedFileCount = 0; for (FileMetadata fmd : workingVersion.getFileMetadatas()) { if (fmd.isRestricted()) { restrictedFileCount++; } } return restrictedFileCount; } private List<FileMetadata> filesToBeDeleted = new ArrayList(); public String deleteFilesAndSave(){ if (bulkUpdateCheckVersion()){ refreshSelectedFiles(); } deleteFiles(); return save(); } public void deleteFiles() { String fileNames = null; for (FileMetadata fmd : this.getSelectedFiles()) { // collect the names of the newly-restrticted files, // to show in the success message: if (fileNames == null) { fileNames = fmd.getLabel(); } else { fileNames = fileNames.concat(fmd.getLabel()); } } for (FileMetadata markedForDelete : selectedFiles) { // TODO: // the code below needs to be rewritten: // markedForDelete.getId() == null DOES NOT mean that this file // has just been uploaded! (markedForDelete is a FileMetadata, not // a DataFile!! so this maybe an existing file, but a brand new // DRAFT version and a brand new filemetadata that hasn't been saved // yet) -- L.A. 4.2, Sep. 15 if (markedForDelete.getId() != null) { dataset.getEditVersion().getFileMetadatas().remove(markedForDelete); filesToBeDeleted.add(markedForDelete); } else { // the file was just added during this step, so in addition to // removing it from the fileMetadatas (for display), we also remove it from // the newFiles list and the dataset's files, so it won't get uploaded at all Iterator fmit = dataset.getEditVersion().getFileMetadatas().iterator(); while (fmit.hasNext()) { FileMetadata fmd = (FileMetadata) fmit.next(); if (markedForDelete.getDataFile().getStorageIdentifier().equals(fmd.getDataFile().getStorageIdentifier())) { fmit.remove(); break; } } Iterator<DataFile> dfIt = dataset.getFiles().iterator(); while (dfIt.hasNext()) { DataFile dfn = dfIt.next(); if (markedForDelete.getDataFile().getStorageIdentifier().equals(dfn.getStorageIdentifier())) { // Before we remove the file from the list and forget about // it: // The physical uploaded file is still sitting in the temporary // directory. If it were saved, it would be moved into its // permanent location. But since the user chose not to save it, // we have to delete the temp file too. // // Eventually, we will likely add a dedicated mechanism // for managing temp files, similar to (or part of) the storage // access framework, that would allow us to handle specialized // configurations - highly sensitive/private data, that // has to be kept encrypted even in temp files, and such. // But for now, we just delete the file directly on the // local filesystem: try { Files.delete(Paths.get(FileUtil.getFilesTempDirectory() + "/" + dfn.getStorageIdentifier())); } catch (IOException ioEx) { // safe to ignore - it's just a temp file. logger.warning("Failed to delete temporary file " + FileUtil.getFilesTempDirectory() + "/" + dfn.getStorageIdentifier()); } dfIt.remove(); } } Iterator<DataFile> nfIt = newFiles.iterator(); while (nfIt.hasNext()) { DataFile dfn = nfIt.next(); if (markedForDelete.getDataFile().getStorageIdentifier().equals(dfn.getStorageIdentifier())) { nfIt.remove(); } } } } if (fileNames != null) { String successMessage = JH.localize("file.deleted.success"); logger.fine(successMessage); successMessage = successMessage.replace("{0}", fileNames); JsfHelper.addFlashMessage(successMessage); } /* Do note that if we are deleting any files that have UNFs (i.e., tabular files), we DO NEED TO RECALCULATE the UNF of the version! - but we will do this inside the UpdateDatasetCommand. */ } public String save() { // Validate Set<ConstraintViolation> constraintViolations = workingVersion.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 ""; } // Finally, save the files permanently: ingestService.addFiles(workingVersion, newFiles); // Use the API to save the dataset: Command<Dataset> cmd; try { if (editMode == EditMode.CREATE) { if ( selectedTemplate != null ) { if ( isSessionUserAuthenticated() ) { cmd = new CreateDatasetCommand(dataset, dvRequestService.getDataverseRequest(), false, null, selectedTemplate); } else { JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataset.create.authenticatedUsersOnly")); return null; } } else { cmd = new CreateDatasetCommand(dataset, dvRequestService.getDataverseRequest()); } } else { cmd = new UpdateDatasetCommand(dataset, dvRequestService.getDataverseRequest(), filesToBeDeleted); ((UpdateDatasetCommand) cmd).setValidateLenient(true); } dataset = commandEngine.submit(cmd); if (editMode == EditMode.CREATE) { if (session.getUser() instanceof AuthenticatedUser) { userNotificationService.sendNotification((AuthenticatedUser) session.getUser(), dataset.getCreateDate(), UserNotification.Type.CREATEDS, dataset.getLatestVersion().getId()); } } } 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.FINE, "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.severe(ex.getMessage()); populateDatasetUpdateFailureMessage(); return null; } newFiles.clear(); if (editMode != null){ if(editMode.equals(EditMode.CREATE)){ JsfHelper.addSuccessMessage(JH.localize("dataset.message.createSuccess")); } if(editMode.equals(EditMode.METADATA)){ JsfHelper.addSuccessMessage(JH.localize("dataset.message.metadataSuccess")); } if(editMode.equals(EditMode.LICENSE)){ JsfHelper.addSuccessMessage(JH.localize("dataset.message.termsSuccess")); } if(editMode.equals(EditMode.FILE)){ JsfHelper.addSuccessMessage(JH.localize("dataset.message.filesSuccess")); } } else { JsfHelper.addSuccessMessage(JH.localize("dataset.message.bulkFileUpdateSuccess")); } editMode = null; // Call Ingest Service one more time, to // queue the data ingest jobs for asynchronous execution: ingestService.startIngestJobs(dataset, (AuthenticatedUser) session.getUser()); return returnToDraftVersion(); } private void populateDatasetUpdateFailureMessage(){ // null check would help here. :) -- L.A. if (editMode == null) { JH.addMessage(FacesMessage.SEVERITY_FATAL, "mystery failure"); return; } if (editMode.equals(EditMode.CREATE)) { JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataset.message.createFailure")); } if (editMode.equals(EditMode.METADATA)) { JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataset.message.metadataFailure")); } if (editMode.equals(EditMode.LICENSE)) { JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataset.message.termsFailure")); } if (editMode.equals(EditMode.FILE)) { JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataset.message.filesFailure")); } } private String returnToLatestVersion(){ dataset = datasetService.find(dataset.getId()); workingVersion = dataset.getLatestVersion(); if (workingVersion.isDeaccessioned() && dataset.getReleasedVersion() != null) { workingVersion = dataset.getReleasedVersion(); } setVersionTabList(resetVersionTabList()); setReleasedVersionTabList(resetReleasedVersionTabList()); newFiles.clear(); editMode = null; return "/dataset.xhtml?persistentId=" + dataset.getGlobalId() + "&version="+ workingVersion.getFriendlyVersionNumber() + "&faces-redirect=true"; } private String returnToDatasetOnly(){ dataset = datasetService.find(dataset.getId()); editMode = null; return "/dataset.xhtml?persistentId=" + dataset.getGlobalId() + "&faces-redirect=true"; } private String returnToDraftVersion(){ return "/dataset.xhtml?persistentId=" + dataset.getGlobalId() + "&version=DRAFT" + "&faces-redirect=true"; } public String cancel() { return returnToLatestVersion(); } private HttpClient getClient() { // TODO: // cache the http client? -- L.A. 4.0 alpha return new HttpClient(); } public void refreshLock() { //RequestContext requestContext = RequestContext.getCurrentInstance(); logger.fine("checking lock"); if (isStillLocked()) { logger.fine("(still locked)"); } else { // OK, the dataset is no longer locked. // let's tell the page to refresh: logger.fine("no longer locked!"); stateChanged = true; //requestContext.execute("refreshPage();"); } } /* */ public boolean isLockedInProgress() { if (dataset != null) { logger.fine("checking lock status of dataset " + dataset.getId()); if (dataset.isLocked()) { return true; } } return false; } public boolean isStillLocked() { if (dataset != null && dataset.getId() != null) { logger.fine("checking lock status of dataset " + dataset.getId()); if (datasetService.checkDatasetLock(dataset.getId())) { return true; } } return false; } public boolean isLocked() { if (stateChanged) { return false; } if (dataset != null) { if (dataset.isLocked()) { return true; } } return false; } public void setLocked(boolean locked) { // empty method, so that we can use DatasetPage.locked in a hidden // input on the page. } public boolean isStateChanged() { return stateChanged; } public void setStateChanged(boolean stateChanged) { // empty method, so that we can use DatasetPage.stateChanged in a hidden // input on the page. } public DatasetVersionUI getDatasetVersionUI() { return datasetVersionUI; } public List<DatasetVersion> getVersionTabList() { return versionTabList; } public List<DatasetVersion> getVersionTabListForPostLoad(){ return this.versionTabListForPostLoad; } public void setVersionTabListForPostLoad(List<DatasetVersion> versionTabListForPostLoad) { this.versionTabListForPostLoad = versionTabListForPostLoad; } public Integer getCompareVersionsCount() { Integer retVal = 0; for (DatasetVersion dvTest : dataset.getVersions()) { if (!dvTest.isDeaccessioned()) { retVal++; } } return retVal; } /** * To improve performance, Version Differences * are retrieved/calculated after the page load * * See: dataset-versions.xhtml, remoteCommand 'postLoadVersionTablList' */ public void postLoadSetVersionTabList(){ if (this.getVersionTabList().isEmpty() && workingVersion.isDeaccessioned()){ setVersionTabList(resetVersionTabList()); } this.setVersionTabListForPostLoad(this.getVersionTabList()); //this.versionTabList = this.resetVersionTabList(); } /** * * * @param versionTabList */ public void setVersionTabList(List<DatasetVersion> versionTabList) { this.versionTabList = versionTabList; } private List<DatasetVersion> releasedVersionTabList = new ArrayList(); public List<DatasetVersion> getReleasedVersionTabList() { return releasedVersionTabList; } public void setReleasedVersionTabList(List<DatasetVersion> releasedVersionTabList) { this.releasedVersionTabList = releasedVersionTabList; } private List<DatasetVersion> selectedVersions; public List<DatasetVersion> getSelectedVersions() { return selectedVersions; } public void setSelectedVersions(List<DatasetVersion> selectedVersions) { this.selectedVersions = selectedVersions; } private List<DatasetVersion> selectedDeaccessionVersions; public List<DatasetVersion> getSelectedDeaccessionVersions() { return selectedDeaccessionVersions; } public void setSelectedDeaccessionVersions(List<DatasetVersion> selectedDeaccessionVersions) { this.selectedDeaccessionVersions = selectedDeaccessionVersions; } public DatasetVersionDifference getDatasetVersionDifference() { return datasetVersionDifference; } public void setDatasetVersionDifference(DatasetVersionDifference datasetVersionDifference) { this.datasetVersionDifference = datasetVersionDifference; } public void startMultipleFileDownload (Boolean writeGuestbook){ fileDownloadService.callDownloadServlet(getDownloadableFilesIdsString(), writeGuestbook); } private String downloadType = ""; public String getDownloadType() { return downloadType; } public void setDownloadType(String downloadType) { this.downloadType = downloadType; } public void modifyGuestbookMultipleResponse(){ if (this.selectedFiles.isEmpty()) { RequestContext requestContext = RequestContext.getCurrentInstance(); requestContext.execute("PF('selectFilesForDownload').show()"); return; } this.guestbookResponse = this.guestbookResponseService.modifySelectedFileIds(guestbookResponse, getSelectedDownloadableFilesIdsString()); this.guestbookResponse.setDownloadtype("Download"); this.guestbookResponse.setFileFormat("Download"); RequestContext requestContext = RequestContext.getCurrentInstance(); requestContext.execute("PF('downloadPopup').show();handleResizeDialog('downloadPopup');"); } public void initGuestbookMultipleResponse(String selectedFileIds){ initGuestbookResponse(null, "download", selectedFileIds); } public void initGuestbookResponse(FileMetadata fileMetadata, String downloadFormat, String selectedFileIds) { this.guestbookResponse = guestbookResponseService.initGuestbookResponse(fileMetadata, downloadFormat, selectedFileIds, session); } public void compareVersionDifferences() { RequestContext requestContext = RequestContext.getCurrentInstance(); if (this.selectedVersions.size() != 2) { requestContext.execute("openCompareTwo();"); } else { //order depends on order of selection - needs to be chronological order if (this.selectedVersions.get(0).getId().intValue() > this.selectedVersions.get(1).getId().intValue()) { updateVersionDifferences(this.selectedVersions.get(0), this.selectedVersions.get(1)); } else { updateVersionDifferences(this.selectedVersions.get(1), this.selectedVersions.get(0)); } } } public void updateVersionDifferences(DatasetVersion newVersion, DatasetVersion originalVersion) { if (originalVersion == null) { setDatasetVersionDifference(newVersion.getDefaultVersionDifference()); } else { setDatasetVersionDifference(new DatasetVersionDifference(newVersion, originalVersion)); } } private List<DatasetVersion> resetVersionTabList() { //if (true)return null; List<DatasetVersion> retList = new ArrayList(); if (permissionService.on(dataset).has(Permission.ViewUnpublishedDataset)) { for (DatasetVersion version : dataset.getVersions()) { version.setContributorNames(getContributorsNames(version)); retList.add(version); } } else { for (DatasetVersion version : dataset.getVersions()) { if (version.isReleased() || version.isDeaccessioned()) { version.setContributorNames(getContributorsNames(version)); retList.add(version); } } } return retList; } private String getContributorsNames(DatasetVersion version) { String contNames = ""; for (String id : version.getVersionContributorIdentifiers()) { id = id.startsWith("@") ? id.substring(1) : id; AuthenticatedUser au = authService.getAuthenticatedUser(id); if (au != null) { if (contNames.isEmpty()) { contNames = au.getName(); } else { contNames = contNames + ", " + au.getName(); } } } return contNames; } private boolean existReleasedVersion; public boolean isExistReleasedVersion() { return existReleasedVersion; } public void setExistReleasedVersion(boolean existReleasedVersion) { this.existReleasedVersion = existReleasedVersion; } private boolean resetExistRealeaseVersion(){ for (DatasetVersion version : dataset.getVersions()) { if (version.isReleased() || version.isArchived()) { return true; } } return false; } private List<DatasetVersion> resetReleasedVersionTabList() { List<DatasetVersion> retList = new ArrayList(); for (DatasetVersion version : dataset.getVersions()) { if (version.isReleased() || version.isArchived()) { retList.add(version); } } return retList; } public String getDatasetPublishCustomText(){ String datasetPublishCustomText = settingsService.getValueForKey(SettingsServiceBean.Key.DatasetPublishPopupCustomText); if( datasetPublishCustomText!= null && !datasetPublishCustomText.isEmpty()){ return datasetPublishCustomText; } return ""; } public Boolean isDatasetPublishPopupCustomTextOnAllVersions(){ return settingsService.isTrueForKey(SettingsServiceBean.Key.DatasetPublishPopupCustomTextOnAllVersions, false); } public String getVariableMetadataURL(Long fileid) { String myHostURL = getDataverseSiteUrl(); String metaURL = myHostURL + "/api/meta/datafile/" + fileid; return metaURL; } public String getTabularDataFileURL(Long fileid) { String myHostURL = getDataverseSiteUrl(); String dataURL = myHostURL + "/api/access/datafile/" + fileid; return dataURL; } public String getMetadataAsJsonUrl() { if (dataset != null) { Long datasetId = dataset.getId(); if (datasetId != null) { String myHostURL = getDataverseSiteUrl(); String metadataAsJsonUrl = myHostURL + "/api/datasets/" + datasetId; return metadataAsJsonUrl; } } return null; } public List< String[]> getExporters(){ List<String[]> retList = new ArrayList(); String myHostURL = 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=" + dataset.getGlobalId(); retList.add(temp); } } return retList; } private FileMetadata fileMetadataSelected = null; public void setFileMetadataSelected(FileMetadata fm){ setFileMetadataSelected(fm, null); } public void setFileMetadataSelected(FileMetadata fm, String guestbook) { if (guestbook != null) { if (guestbook.equals("create")) { // /* FIX ME guestbook entry for subsetting */ // guestbookResponseService.createSilentGuestbookEntry(fm, "Subset"); } else { initGuestbookResponse(fm, "Subset", null); } } fileMetadataSelected = fm; logger.fine("set the file for the advanced options popup (" + fileMetadataSelected.getLabel() + ")"); } public FileMetadata getFileMetadataSelected() { if (fileMetadataSelected != null) { logger.fine("returning file metadata for the advanced options popup (" + fileMetadataSelected.getLabel() + ")"); } else { logger.fine("file metadata for the advanced options popup is null."); } return fileMetadataSelected; } public void clearFileMetadataSelected() { fileMetadataSelected = null; } public boolean isDesignatedDatasetThumbnail (FileMetadata fileMetadata) { if (fileMetadata != null) { if (fileMetadata.getDataFile() != null) { if (fileMetadata.getDataFile().getId() != null) { if (fileMetadata.getDataFile().getOwner() != null) { if (fileMetadata.getDataFile().equals(fileMetadata.getDataFile().getOwner().getThumbnailFile())) { return true; } } } } } return false; } /* * Items for the "Designated this image as the Dataset thumbnail: */ private FileMetadata fileMetadataSelectedForThumbnailPopup = null; public void setFileMetadataSelectedForThumbnailPopup(FileMetadata fm){ fileMetadataSelectedForThumbnailPopup = fm; alreadyDesignatedAsDatasetThumbnail = getUseAsDatasetThumbnail(); } public FileMetadata getFileMetadataSelectedForThumbnailPopup() { return fileMetadataSelectedForThumbnailPopup; } public void clearFileMetadataSelectedForThumbnailPopup() { fileMetadataSelectedForThumbnailPopup = null; } private boolean alreadyDesignatedAsDatasetThumbnail = false; public boolean getUseAsDatasetThumbnail() { if (fileMetadataSelectedForThumbnailPopup != null) { if (fileMetadataSelectedForThumbnailPopup.getDataFile() != null) { if (fileMetadataSelectedForThumbnailPopup.getDataFile().getId() != null) { if (fileMetadataSelectedForThumbnailPopup.getDataFile().getOwner() != null) { if (fileMetadataSelectedForThumbnailPopup.getDataFile().equals(fileMetadataSelectedForThumbnailPopup.getDataFile().getOwner().getThumbnailFile())) { return true; } } } } } return false; } public void setUseAsDatasetThumbnail(boolean useAsThumbnail) { if (fileMetadataSelectedForThumbnailPopup != null) { if (fileMetadataSelectedForThumbnailPopup.getDataFile() != null) { if (fileMetadataSelectedForThumbnailPopup.getDataFile().getId() != null) { // ? if (fileMetadataSelectedForThumbnailPopup.getDataFile().getOwner() != null) { if (useAsThumbnail) { fileMetadataSelectedForThumbnailPopup.getDataFile().getOwner().setThumbnailFile(fileMetadataSelectedForThumbnailPopup.getDataFile()); } else if (getUseAsDatasetThumbnail()) { fileMetadataSelectedForThumbnailPopup.getDataFile().getOwner().setThumbnailFile(null); } } } } } } public void saveAsDesignatedThumbnail() { // We don't need to do anything specific to save this setting, because // the setUseAsDatasetThumbnail() method, above, has already updated the // file object appropriately. // However, once the "save" button is pressed, we want to show a success message, if this is // a new image has been designated as such: if (getUseAsDatasetThumbnail() && !alreadyDesignatedAsDatasetThumbnail) { String successMessage = JH.localize("file.assignedDataverseImage.success"); logger.fine(successMessage); successMessage = successMessage.replace("{0}", fileMetadataSelectedForThumbnailPopup.getLabel()); JsfHelper.addFlashMessage(successMessage); } // And reset the selected fileMetadata: fileMetadataSelectedForThumbnailPopup = null; } /* * Items for the "Tags (Categories)" popup. * */ private FileMetadata fileMetadataSelectedForTagsPopup = null; public void setFileMetadataSelectedForTagsPopup(){ } public void setFileMetadataSelectedForTagsPopup(FileMetadata fm){ fileMetadataSelectedForTagsPopup = fm; } public FileMetadata getFileMetadataSelectedForTagsPopup() { return fileMetadataSelectedForTagsPopup; } public void clearFileMetadataSelectedForTagsPopup() { fileMetadataSelectedForTagsPopup = null; } public List <FileMetadata> getListFileMetadataSelectedForTagsPopup(){ List<FileMetadata> retList = new ArrayList(); for (FileMetadata fm : selectedFiles){ retList.add(fm); } return retList; } private List<String> categoriesByName; public void setCategoriesByName(List<String> dummy){ categoriesByName = dummy; } public void refreshTagsPopUp(){ if (bulkUpdateCheckVersion()){ refreshSelectedFiles(); } updateFileCounts(); refreshCategoriesByName(); refreshTabFileTagsByName(); } private List<String> tabFileTagsByName; public List<String> getTabFileTagsByName() { return tabFileTagsByName; } public void setTabFileTagsByName(List<String> tabFileTagsByName) { this.tabFileTagsByName = tabFileTagsByName; } private void refreshCategoriesByName(){ categoriesByName= new ArrayList<>(); for (String category: dataset.getCategoriesByName() ){ categoriesByName.add(category); } refreshSelectedTags(); } public List<String> getCategoriesByName() { return categoriesByName; } /* * 1. Tabular File Tags: */ private List<String> tabFileTags = null; public List<String> getTabFileTags() { if (tabFileTags == null) { tabFileTags = DataFileTag.listTags(); } return tabFileTags; } public void setTabFileTags(List<String> tabFileTags) { this.tabFileTags = tabFileTags; } private String[] selectedTabFileTags = {}; public String[] getSelectedTabFileTags() { return selectedTabFileTags; } public void setSelectedTabFileTags(String[] selectedTabFileTags) { this.selectedTabFileTags = selectedTabFileTags; } private String[] selectedTags = {}; public void handleSelection(final AjaxBehaviorEvent event) { if (selectedTags != null) { selectedTags = selectedTags.clone(); } } private void refreshTabFileTagsByName(){ tabFileTagsByName= new ArrayList<>(); for (FileMetadata fm : selectedFiles) { if (fm.getDataFile().getTags() != null) { for (int i = 0; i < fm.getDataFile().getTags().size(); i++) { if (!tabFileTagsByName.contains(fm.getDataFile().getTags().get(i).getTypeLabel())) { tabFileTagsByName.add(fm.getDataFile().getTags().get(i).getTypeLabel()); } } } } refreshSelectedTabFileTags(); } private void refreshSelectedTabFileTags() { selectedTabFileTags = null; selectedTabFileTags = new String[0]; if (tabFileTagsByName.size() > 0) { selectedTabFileTags = new String[tabFileTagsByName.size()]; for (int i = 0; i < tabFileTagsByName.size(); i++) { selectedTabFileTags[i] = tabFileTagsByName.get(i); } } Arrays.sort(selectedTabFileTags); } private boolean tabularDataSelected = false; public boolean isTabularDataSelected() { return tabularDataSelected; } public void setTabularDataSelected(boolean tabularDataSelected) { this.tabularDataSelected = tabularDataSelected; } public String[] getSelectedTags() { return selectedTags; } public void setSelectedTags(String[] selectedTags) { this.selectedTags = selectedTags; } /* * "File Tags" (aka "File Categories"): */ private String newCategoryName = null; public String getNewCategoryName() { return newCategoryName; } public void setNewCategoryName(String newCategoryName) { this.newCategoryName = newCategoryName; } public String saveNewCategory() { if (newCategoryName != null && !newCategoryName.isEmpty()) { categoriesByName.add(newCategoryName); } //Now increase size of selectedTags and add new category String[] temp = new String[selectedTags.length + 1]; System.arraycopy(selectedTags, 0, temp, 0, selectedTags.length); selectedTags = temp; selectedTags[selectedTags.length - 1] = newCategoryName; //Blank out added category newCategoryName = ""; return ""; } private void refreshSelectedTags() { selectedTags = null; selectedTags = new String[0]; List selectedCategoriesByName= new ArrayList<>(); for (FileMetadata fm : selectedFiles) { if (fm.getCategories() != null) { for (int i = 0; i < fm.getCategories().size(); i++) { if (!selectedCategoriesByName.contains(fm.getCategories().get(i).getName())) { selectedCategoriesByName.add(fm.getCategories().get(i).getName()); } } } } if (selectedCategoriesByName.size() > 0) { selectedTags = new String[selectedCategoriesByName.size()]; for (int i = 0; i < selectedCategoriesByName.size(); i++) { selectedTags[i] = (String) selectedCategoriesByName.get(i); } } Arrays.sort(selectedTags); } /* This method handles saving both "tabular file tags" and * "file categories" (which are also considered "tags" in 4.0) */ public String saveFileTagsAndCategories() { // 1. New Category name: // With we don't need to do anything for the file categories that the user // selected from the pull down list; that was done directly from the // page with the FileMetadata.setCategoriesByName() method. // So here we only need to take care of the new, custom category // name, if entered: if (bulkUpdateCheckVersion()) { refreshSelectedFiles(); } for (FileMetadata fmd : workingVersion.getFileMetadatas()) { if (selectedFiles != null && selectedFiles.size() > 0) { for (FileMetadata fm : selectedFiles) { if (fm.getDataFile().equals(fmd.getDataFile())) { fmd.setCategories(new ArrayList()); if (newCategoryName != null) { fmd.addCategoryByName(newCategoryName); } // 2. Tabular DataFile Tags: if (selectedTags != null) { for (int i = 0; i < selectedTags.length; i++) { fmd.addCategoryByName(selectedTags[i]); } } if (fmd.getDataFile().isTabularData()) { fmd.getDataFile().setTags(null); for (int i = 0; i < selectedTabFileTags.length; i++) { DataFileTag tag = new DataFileTag(); try { tag.setTypeByLabel(selectedTabFileTags[i]); tag.setDataFile(fmd.getDataFile()); fmd.getDataFile().addTag(tag); } catch (IllegalArgumentException iax) { // ignore } } } } } } } // success message: String successMessage = JH.localize("file.assignedTabFileTags.success"); logger.fine(successMessage); successMessage = successMessage.replace("{0}", "Selected Files"); JsfHelper.addFlashMessage(successMessage); selectedTags = null; logger.fine("New category name: " + newCategoryName); newCategoryName = null; if (removeUnusedTags){ removeUnusedFileTagsFromDataset(); } save(); return returnToDraftVersion(); } /* Remove unused file tags When updating datafile tags see if any custom tags are not in use. Remove them */ private void removeUnusedFileTagsFromDataset() { categoriesByName = new ArrayList<>(); for (FileMetadata fm : workingVersion.getFileMetadatas()) { if (fm.getCategories() != null) { for (int i = 0; i < fm.getCategories().size(); i++) { if (!categoriesByName.contains(fm.getCategories().get(i).getName())) { categoriesByName.add(fm.getCategories().get(i).getName()); } } } } List<DataFileCategory> datasetFileCategoriesToRemove = new ArrayList(); for (DataFileCategory test : dataset.getCategories()) { boolean remove = true; for (String catByName : categoriesByName) { if (catByName.equals(test.getName())) { remove = false; break; } } if (remove) { datasetFileCategoriesToRemove.add(test); } } if (!datasetFileCategoriesToRemove.isEmpty()) { for (DataFileCategory remove : datasetFileCategoriesToRemove) { dataset.getCategories().remove(remove); } } } /* * Items for the "Advanced (Ingest) Options" popup. * */ private FileMetadata fileMetadataSelectedForIngestOptionsPopup = null; public void setFileMetadataSelectedForIngestOptionsPopup(FileMetadata fm){ fileMetadataSelectedForIngestOptionsPopup = fm; } public FileMetadata getFileMetadataSelectedForIngestOptionsPopup() { return fileMetadataSelectedForIngestOptionsPopup; } public void clearFileMetadataSelectedForIngestOptionsPopup() { fileMetadataSelectedForIngestOptionsPopup = null; } private String ingestLanguageEncoding = null; public String getIngestLanguageEncoding() { if (ingestLanguageEncoding == null) { return "UTF8 (default)"; } return ingestLanguageEncoding; } public void setIngestLanguageEncoding(String ingestLanguageEncoding) { this.ingestLanguageEncoding = ingestLanguageEncoding; } public void setIngestEncoding(String ingestEncoding) { ingestLanguageEncoding = ingestEncoding; } private String savedLabelsTempFile = null; public void handleLabelsFileUpload(FileUploadEvent event) { logger.fine("entering handleUpload method."); UploadedFile file = event.getFile(); if (file != null) { InputStream uploadStream = null; try { uploadStream = file.getInputstream(); } catch (IOException ioex) { logger.warning("the file " + file.getFileName() + " failed to upload!"); FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, "upload failure", "the file " + file.getFileName() + " failed to upload!"); FacesContext.getCurrentInstance().addMessage(null, message); return; } savedLabelsTempFile = saveTempFile(uploadStream); logger.fine(file.getFileName() + " is successfully uploaded."); FacesMessage message = new FacesMessage("Succesful", file.getFileName() + " is uploaded."); FacesContext.getCurrentInstance().addMessage(null, message); } // process file (i.e., just save it in a temp location; for now): } private String saveTempFile(InputStream input) { if (input == null) { return null; } byte[] buffer = new byte[8192]; int bytesRead = 0; File labelsFile = null; FileOutputStream output = null; try { labelsFile = File.createTempFile("tempIngestLabels.", ".txt"); output = new FileOutputStream(labelsFile); while ((bytesRead = input.read(buffer)) > -1) { output.write(buffer, 0, bytesRead); } } catch (IOException ioex) { if (input != null) { try { input.close(); } catch (IOException e) { } } if (output != null) { try { output.close(); } catch (IOException e) { } } return null; } if (labelsFile != null) { return labelsFile.getAbsolutePath(); } return null; } public void saveAdvancedOptions() { // Language encoding for SPSS SAV (and, possibly, other tabular ingests:) if (ingestLanguageEncoding != null) { if (fileMetadataSelectedForIngestOptionsPopup != null && fileMetadataSelectedForIngestOptionsPopup.getDataFile() != null) { if (fileMetadataSelectedForIngestOptionsPopup.getDataFile().getIngestRequest() == null) { IngestRequest ingestRequest = new IngestRequest(); ingestRequest.setDataFile(fileMetadataSelectedForIngestOptionsPopup.getDataFile()); fileMetadataSelectedForIngestOptionsPopup.getDataFile().setIngestRequest(ingestRequest); } fileMetadataSelectedForIngestOptionsPopup.getDataFile().getIngestRequest().setTextEncoding(ingestLanguageEncoding); } } ingestLanguageEncoding = null; // Extra labels for SPSS POR (and, possibly, other tabular ingests:) // (we are adding this parameter to the IngestRequest now, instead of back // when it was uploaded. This is because we want the user to be able to // hit cancel and bail out, until they actually click 'save' in the // "advanced options" popup) -- L.A. 4.0 beta 11 if (savedLabelsTempFile != null) { if (fileMetadataSelectedForIngestOptionsPopup != null && fileMetadataSelectedForIngestOptionsPopup.getDataFile() != null) { if (fileMetadataSelectedForIngestOptionsPopup.getDataFile().getIngestRequest() == null) { IngestRequest ingestRequest = new IngestRequest(); ingestRequest.setDataFile(fileMetadataSelectedForIngestOptionsPopup.getDataFile()); fileMetadataSelectedForIngestOptionsPopup.getDataFile().setIngestRequest(ingestRequest); } fileMetadataSelectedForIngestOptionsPopup.getDataFile().getIngestRequest().setLabelsFile(savedLabelsTempFile); } } savedLabelsTempFile = null; fileMetadataSelectedForIngestOptionsPopup = null; } public boolean isDownloadButtonAvailable(){ for (FileMetadata fmd : workingVersion.getFileMetadatas()) { if (this.fileDownloadHelper.canDownloadFile(fmd)) { return true; } } return false; } public boolean isFileAccessRequestMultiButtonRequired(){ if (!isSessionUserAuthenticated() || !dataset.isFileAccessRequest()){ return false; } if (workingVersion == null) { return false; } if (!workingVersion.getTermsOfUseAndAccess().isFileAccessRequest()){ // return false; } for (FileMetadata fmd : workingVersion.getFileMetadatas()){ if (!this.fileDownloadHelper.canDownloadFile(fmd)){ return true; } } return false; } public boolean isFileAccessRequestMultiButtonEnabled(){ if (!isSessionUserAuthenticated() || !dataset.isFileAccessRequest()){ return false; } if( this.selectedRestrictedFiles == null || this.selectedRestrictedFiles.isEmpty() ){ return false; } for (FileMetadata fmd : this.selectedRestrictedFiles){ if (!this.fileDownloadHelper.canDownloadFile(fmd)){ return true; } } return false; } private Boolean downloadButtonAllEnabled = null; public boolean isDownloadAllButtonEnabled() { if (downloadButtonAllEnabled == null) { for (FileMetadata fmd : workingVersion.getFileMetadatas()) { if (!this.fileDownloadHelper.canDownloadFile(fmd)) { downloadButtonAllEnabled = false; break; } } downloadButtonAllEnabled = true; } return downloadButtonAllEnabled; } public boolean isDownloadSelectedButtonEnabled(){ if( this.selectedFiles == null || this.selectedFiles.isEmpty() ){ return false; } for (FileMetadata fmd : this.selectedFiles){ if (this.fileDownloadHelper.canDownloadFile(fmd)){ return true; } } return false; } public boolean isFileAccessRequestMultiSignUpButtonRequired(){ if (isSessionUserAuthenticated()){ return false; } // only show button if dataset allows an access request if (!dataset.isFileAccessRequest()){ return false; } for (FileMetadata fmd : workingVersion.getFileMetadatas()){ if (!this.fileDownloadHelper.canDownloadFile(fmd)){ return true; } } return false; } public boolean isFileAccessRequestMultiSignUpButtonEnabled(){ if (isSessionUserAuthenticated()){ return false; } if( this.selectedRestrictedFiles == null || this.selectedRestrictedFiles.isEmpty() ){ return false; } // only show button if dataset allows an access request if (!dataset.isFileAccessRequest()){ return false; } for (FileMetadata fmd : this.selectedRestrictedFiles){ if (!this.fileDownloadHelper.canDownloadFile(fmd)){ return true; } } return false; } public boolean isDownloadPopupRequired() { return fileDownloadService.isDownloadPopupRequired(workingVersion); } public String requestAccessMultipleFiles(String fileIdString) { if (fileIdString.isEmpty()) { RequestContext requestContext = RequestContext.getCurrentInstance(); requestContext.execute("PF('selectFilesForRequestAccess').show()"); return ""; } Long idForNotification = new Long(0); if (fileIdString != null) { String[] ids = fileIdString.split(","); for (String id : ids) { Long test = null; try { test = new Long(id); } catch (NumberFormatException nfe) { // do nothing... test = null; } if (test != null) { idForNotification = test; fileDownloadService.requestAccess(test); } } } if (idForNotification.intValue() > 0) { fileDownloadService.sendRequestFileAccessNotification(dataset,idForNotification); } return returnToDatasetOnly(); } public boolean isSortButtonEnabled() { /** * @todo The "Sort" Button seems to stop responding to mouse clicks * after a while so it can't be shipped in 4.2 and will be deferred, to * be picked up in https://github.com/IQSS/dataverse/issues/2506 */ return false; } public void updateFileListing(String fileSortField, String fileSortOrder) { this.fileSortField = fileSortField; this.fileSortOrder = fileSortOrder; fileMetadatas = populateFileMetadatas(); } private List<FileMetadata> populateFileMetadatas() { if (isSortButtonEnabled()) { List<FileMetadata> fileMetadatasToSet = new ArrayList<>(); Long datasetVersion = workingVersion.getId(); if (datasetVersion != null) { int unlimited = 0; int maxResults = unlimited; List<FileMetadata> dataFilesNew = datafileService.findFileMetadataByDatasetVersionId(datasetVersion, maxResults, fileSortField, fileSortOrder); fileMetadatasToSet.addAll(dataFilesNew); } return fileMetadatasToSet; } else { return new ArrayList<>(); } } public String getFileSortField() { return fileSortField; } public void setFileSortField(String fileSortField) { this.fileSortField = fileSortField; } public String getFileSortOrder() { return fileSortOrder; } public void setFileSortOrder(String fileSortOrder) { this.fileSortOrder = fileSortOrder; } public List<FileMetadata> getFileMetadatas() { if (isSortButtonEnabled()) { return fileMetadatas; } else { return new ArrayList<>(); } } public String getFileSortFieldName() { return FileSortFieldAndOrder.label; } public String getFileSortFieldDate() { return FileSortFieldAndOrder.createDate; } public String getFileSortFieldSize() { return FileSortFieldAndOrder.size; } public String getFileSortFieldType() { return FileSortFieldAndOrder.type; } public String getSortByAscending() { return SortBy.ASCENDING; } public String getSortByDescending() { return SortBy.DESCENDING; } PrivateUrl privateUrl; public PrivateUrl getPrivateUrl() { return privateUrl; } public void setPrivateUrl(PrivateUrl privateUrl) { this.privateUrl = privateUrl; } public void initPrivateUrlPopUp() { if (privateUrl != null) { setPrivateUrlJustCreatedToFalse(); } } boolean privateUrlWasJustCreated; public boolean isPrivateUrlWasJustCreated() { return privateUrlWasJustCreated; } public void setPrivateUrlJustCreatedToFalse() { privateUrlWasJustCreated = false; } public void createPrivateUrl() { try { PrivateUrl createdPrivateUrl = commandEngine.submit(new CreatePrivateUrlCommand(dvRequestService.getDataverseRequest(), dataset)); privateUrl = createdPrivateUrl; JH.addMessage(FacesMessage.SEVERITY_INFO, BundleUtil.getStringFromBundle("dataset.privateurl.infoMessageAuthor", Arrays.asList(getPrivateUrlLink(privateUrl)))); privateUrlWasJustCreated = true; } catch (CommandException ex) { String msg = BundleUtil.getStringFromBundle("dataset.privateurl.noPermToCreate", PrivateUrlUtil.getRequiredPermissions(ex)); logger.info("Unable to create a Private URL for dataset id " + dataset.getId() + ". Message to user: " + msg + " Exception: " + ex); JH.addErrorMessage(msg); } } public void disablePrivateUrl() { try { commandEngine.submit(new DeletePrivateUrlCommand(dvRequestService.getDataverseRequest(), dataset)); privateUrl = null; JH.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.privateurl.disabledSuccess")); } catch (CommandException ex) { logger.info("CommandException caught calling DeletePrivateUrlCommand: " + ex); } } public boolean isUserCanCreatePrivateURL() { return dataset.getLatestVersion().isDraft(); } public String getPrivateUrlLink(PrivateUrl privateUrl) { return privateUrl.getLink(); } public FileDownloadHelper getFileDownloadHelper() { return fileDownloadHelper; } public void setFileDownloadHelper(FileDownloadHelper fileDownloadHelper) { this.fileDownloadHelper = fileDownloadHelper; } 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 WorldMapPermissionHelper getWorldMapPermissionHelper() { return worldMapPermissionHelper; } public void setWorldMapPermissionHelper(WorldMapPermissionHelper worldMapPermissionHelper) { this.worldMapPermissionHelper = worldMapPermissionHelper; } public TwoRavensHelper getTwoRavensHelper() { return twoRavensHelper; } public void setTwoRavensHelper(TwoRavensHelper twoRavensHelper) { this.twoRavensHelper = twoRavensHelper; } }