forked from IQSS/dataverse
-
Notifications
You must be signed in to change notification settings - Fork 1
/
FilePage.java
863 lines (695 loc) · 31.9 KB
/
FilePage.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package edu.harvard.iq.dataverse;
import edu.harvard.iq.dataverse.DatasetVersionServiceBean.RetrieveDatasetVersionResponse;
import edu.harvard.iq.dataverse.dataaccess.SwiftAccessIO;
import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
import edu.harvard.iq.dataverse.authorization.Permission;
import edu.harvard.iq.dataverse.dataaccess.StorageIO;
import edu.harvard.iq.dataverse.datasetutility.WorldMapPermissionHelper;
import edu.harvard.iq.dataverse.engine.command.Command;
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
import edu.harvard.iq.dataverse.engine.command.impl.CreateNewDatasetCommand;
import edu.harvard.iq.dataverse.engine.command.impl.PersistProvFreeFormCommand;
import edu.harvard.iq.dataverse.engine.command.impl.RestrictFileCommand;
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetVersionCommand;
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.externaltools.ExternalTool;
import edu.harvard.iq.dataverse.externaltools.ExternalToolServiceBean;
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
import edu.harvard.iq.dataverse.util.BundleUtil;
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.SystemConfig;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.validation.ConstraintViolation;
import org.primefaces.component.tabview.TabView;
import org.primefaces.event.TabChangeEvent;
/**
*
* @author skraffmi
*
*/
@ViewScoped
@Named("FilePage")
public class FilePage implements java.io.Serializable {
private FileMetadata fileMetadata;
private Long fileId;
private String version;
private DataFile file;
private GuestbookResponse guestbookResponse;
private int selectedTabIndex;
private Dataset editDataset;
private Dataset dataset;
private List<DatasetVersion> datasetVersionsForTab;
private List<FileMetadata> fileMetadatasForTab;
private String persistentId;
private List<ExternalTool> configureTools;
private List<ExternalTool> exploreTools;
@EJB
DataFileServiceBean datafileService;
@EJB
DatasetVersionServiceBean datasetVersionService;
@EJB
PermissionServiceBean permissionService;
@EJB
SettingsServiceBean settingsService;
@EJB
FileDownloadServiceBean fileDownloadService;
@EJB
GuestbookResponseServiceBean guestbookResponseService;
@EJB
AuthenticationServiceBean authService;
@EJB
SystemConfig systemConfig;
@Inject
DataverseSession session;
@EJB
EjbDataverseEngine commandEngine;
@EJB
ExternalToolServiceBean externalToolService;
@Inject
DataverseRequestServiceBean dvRequestService;
@Inject
PermissionsWrapper permissionsWrapper;
@Inject
FileDownloadHelper fileDownloadHelper;
@Inject WorldMapPermissionHelper worldMapPermissionHelper;
public WorldMapPermissionHelper getWorldMapPermissionHelper() {
return worldMapPermissionHelper;
}
public void setWorldMapPermissionHelper(WorldMapPermissionHelper worldMapPermissionHelper) {
this.worldMapPermissionHelper = worldMapPermissionHelper;
}
private static final Logger logger = Logger.getLogger(FilePage.class.getCanonicalName());
private boolean fileDeleteInProgress = false;
public String init() {
if ( fileId != null || persistentId != null ) {
// ---------------------------------------
// Set the file and datasetVersion
// ---------------------------------------
if (fileId != null) {
file = datafileService.find(fileId);
} else if (persistentId != null){
file = datafileService.findByGlobalId(persistentId);
if (file != null){
fileId = file.getId();
}
}
if (file == null || fileId == null){
return permissionsWrapper.notFound();
}
// Is the Dataset harvested?
if (file.getOwner().isHarvested()) {
// if so, we'll simply forward to the remote URL for the original
// source of this harvested dataset:
String originalSourceURL = file.getOwner().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 permissionsWrapper.notFound();
}
RetrieveDatasetVersionResponse retrieveDatasetVersionResponse;
retrieveDatasetVersionResponse = datasetVersionService.selectRequestedVersion(file.getOwner().getVersions(), version);
Long getDatasetVersionID = retrieveDatasetVersionResponse.getDatasetVersion().getId();
fileMetadata = datafileService.findFileMetadataByDatasetVersionIdAndDataFileId(getDatasetVersionID, fileId);
if (fileMetadata == null){
logger.fine("fileMetadata is null! Checking finding most recent version file was in.");
fileMetadata = datafileService.findMostRecentVersionFileIsIn(file);
if (fileMetadata == null) {
return permissionsWrapper.notFound();
}
}
// If this DatasetVersion is unpublished and permission is doesn't have permissions:
// > Go to the Login page
//
// Check permisisons
Boolean authorized = (fileMetadata.getDatasetVersion().isReleased()) ||
(!fileMetadata.getDatasetVersion().isReleased() && this.canViewUnpublishedDataset());
if (!authorized ) {
return permissionsWrapper.notAuthorized();
}
this.guestbookResponse = this.guestbookResponseService.initGuestbookResponseForFragment(fileMetadata, session);
// Find external tools based on their type, the file content type, and whether
// ingest has created a derived file for that type
// Currently, tabular data files are the only type of derived file created, so
// isTabularData() works - true for tabular types where a .tab file has been
// created and false for other mimetypes
String contentType = file.getContentType();
//For tabular data, indicate successful ingest by returning a contentType for the derived .tab file
if (file.isTabularData()) {
contentType=DataFileServiceBean.MIME_TYPE_TSV_ALT;
}
configureTools = externalToolService.findByType(ExternalTool.Type.CONFIGURE, contentType);
exploreTools = externalToolService.findByType(ExternalTool.Type.EXPLORE, contentType);
} else {
return permissionsWrapper.notFound();
}
return null;
}
private boolean canViewUnpublishedDataset() {
return permissionsWrapper.canViewUnpublishedDataset( dvRequestService.getDataverseRequest(), fileMetadata.getDatasetVersion().getDataset());
}
public FileMetadata getFileMetadata() {
return fileMetadata;
}
public boolean isDownloadPopupRequired() {
if(fileMetadata.getId() == null || fileMetadata.getDatasetVersion().getId() == null ){
return false;
}
return FileUtil.isDownloadPopupRequired(fileMetadata.getDatasetVersion());
}
public boolean isRequestAccessPopupRequired() {
if(fileMetadata.getId() == null || fileMetadata.getDatasetVersion().getId() == null ){
return false;
}
return FileUtil.isRequestAccessPopupRequired(fileMetadata.getDatasetVersion());
}
public void setFileMetadata(FileMetadata fileMetadata) {
this.fileMetadata = fileMetadata;
}
public DataFile getFile() {
return file;
}
public void setFile(DataFile file) {
this.file = file;
}
public Long getFileId() {
return fileId;
}
public void setFileId(Long fileId) {
this.fileId = fileId;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public List< String[]> getExporters(){
List<String[]> retList = new ArrayList<>();
String myHostURL = systemConfig.getDataverseSiteUrl();
for (String [] provider : ExportService.getInstance(settingsService).getExportersLabels() ){
String formatName = provider[1];
String formatDisplayName = provider[0];
Exporter exporter = null;
try {
exporter = ExportService.getInstance(settingsService).getExporter(formatName);
} catch (ExportException ex) {
exporter = null;
}
if (exporter != null && exporter.isAvailableToUsers()) {
// Not all metadata exports should be presented to the web users!
// Some are only for harvesting clients.
String[] temp = new String[2];
temp[0] = formatDisplayName;
temp[1] = myHostURL + "/api/datasets/export?exporter=" + formatName + "&persistentId=" + fileMetadata.getDatasetVersion().getDataset().getGlobalIdString();
retList.add(temp);
}
}
return retList;
}
public String saveProvFreeform(String freeformTextInput, DataFile dataFileFromPopup) throws CommandException {
editDataset = this.file.getOwner();
file.setProvEntityName(dataFileFromPopup.getProvEntityName()); //passing this value into the file being saved here is pretty hacky.
Command cmd;
for (FileMetadata fmw : editDataset.getEditVersion().getFileMetadatas()) {
if (fmw.getDataFile().equals(this.fileMetadata.getDataFile())) {
cmd = new PersistProvFreeFormCommand(dvRequestService.getDataverseRequest(), file, freeformTextInput);
commandEngine.submit(cmd);
}
}
save();
init();
return returnToDraftVersion();
}
public String restrictFile(boolean restricted) throws CommandException{
String fileNames = null;
String termsOfAccess = this.fileMetadata.getDatasetVersion().getTermsOfUseAndAccess().getTermsOfAccess();
Boolean allowRequest = this.fileMetadata.getDatasetVersion().getTermsOfUseAndAccess().isFileAccessRequest();
editDataset = this.file.getOwner();
Command cmd;
for (FileMetadata fmw : editDataset.getEditVersion().getFileMetadatas()) {
if (fmw.getDataFile().equals(this.fileMetadata.getDataFile())) {
fileNames += fmw.getLabel();
//fmw.setRestricted(restricted);
cmd = new RestrictFileCommand(fmw.getDataFile(), dvRequestService.getDataverseRequest(), restricted);
commandEngine.submit(cmd);
}
}
editDataset.getEditVersion().getTermsOfUseAndAccess().setTermsOfAccess(termsOfAccess);
editDataset.getEditVersion().getTermsOfUseAndAccess().setFileAccessRequest(allowRequest);
if (fileNames != null) {
String successMessage = BundleUtil.getStringFromBundle("file.restricted.success");
successMessage = successMessage.replace("{0}", fileNames);
JsfHelper.addFlashMessage(successMessage);
}
save();
init();
return returnToDraftVersion();
}
private List<FileMetadata> filesToBeDeleted = new ArrayList<>();
public String deleteFile() {
String fileNames = this.getFileMetadata().getLabel();
editDataset = this.getFileMetadata().getDataFile().getOwner();
FileMetadata markedForDelete = null;
for (FileMetadata fmd : editDataset.getEditVersion().getFileMetadatas() ){
if (fmd.getDataFile().getId().equals(this.getFile().getId())){
markedForDelete = fmd;
}
}
if (markedForDelete.getId() != null) {
// the file already exists as part of this dataset
// so all we remove is the file from the fileMetadatas (for display)
// and let the delete be handled in the command (by adding it to the filesToBeDeleted list
editDataset.getEditVersion().getFileMetadatas().remove(markedForDelete);
filesToBeDeleted.add(markedForDelete);
} else {
List<FileMetadata> filesToKeep = new ArrayList<>();
for (FileMetadata fmo: editDataset.getEditVersion().getFileMetadatas()){
if (!fmo.getDataFile().getId().equals(this.getFile().getId())){
filesToKeep.add(fmo);
}
}
editDataset.getEditVersion().setFileMetadatas(filesToKeep);
}
fileDeleteInProgress = true;
save();
return returnToDatasetOnly();
}
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 == 1 || this.activeTabIndex == 2 ) {
setFileMetadatasForTab(loadFileMetadataTabList());
} else {
setFileMetadatasForTab( new ArrayList<>());
}
}
private List<FileMetadata> loadFileMetadataTabList() {
List<DataFile> allfiles = allRelatedFiles();
List<FileMetadata> retList = new ArrayList<>();
for (DatasetVersion versionLoop : fileMetadata.getDatasetVersion().getDataset().getVersions()) {
boolean foundFmd = false;
if (versionLoop.isReleased() || versionLoop.isDeaccessioned() || permissionService.on(fileMetadata.getDatasetVersion().getDataset()).has(Permission.ViewUnpublishedDataset)) {
foundFmd = false;
for (DataFile df : allfiles) {
FileMetadata fmd = datafileService.findFileMetadataByDatasetVersionIdAndDataFileId(versionLoop.getId(), df.getId());
if (fmd != null) {
fmd.setContributorNames(datasetVersionService.getContributorsNames(versionLoop));
FileVersionDifference fvd = new FileVersionDifference(fmd, getPreviousFileMetadata(fmd));
fmd.setFileVersionDifference(fvd);
retList.add(fmd);
foundFmd = true;
break;
}
}
//no File metadata found make dummy one
if (!foundFmd) {
FileMetadata dummy = new FileMetadata();
dummy.setDatasetVersion(versionLoop);
dummy.setDataFile(null);
FileVersionDifference fvd = new FileVersionDifference(dummy, getPreviousFileMetadata(versionLoop));
dummy.setFileVersionDifference(fvd);
retList.add(dummy);
}
}
}
return retList;
}
private FileMetadata getPreviousFileMetadata(DatasetVersion currentversion) {
List<DataFile> allfiles = allRelatedFiles();
boolean foundCurrent = false;
DatasetVersion priorVersion = null;
for (DatasetVersion versionLoop : fileMetadata.getDatasetVersion().getDataset().getVersions()) {
if (foundCurrent) {
priorVersion = versionLoop;
break;
}
if (versionLoop.equals(currentversion)) {
foundCurrent = true;
}
}
if (priorVersion != null && priorVersion.getFileMetadatasSorted() != null) {
for (FileMetadata fmdTest : priorVersion.getFileMetadatasSorted()) {
for (DataFile fileTest : allfiles) {
if (fmdTest.getDataFile().equals(fileTest)) {
return fmdTest;
}
}
}
}
return null;
}
private FileMetadata getPreviousFileMetadata(FileMetadata fmdIn){
DataFile dfPrevious = datafileService.findPreviousFile(fmdIn.getDataFile());
DatasetVersion dvPrevious = null;
boolean gotCurrent = false;
for (DatasetVersion dvloop: fileMetadata.getDatasetVersion().getDataset().getVersions()){
if(gotCurrent){
dvPrevious = dvloop;
break;
}
if(dvloop.equals(fmdIn.getDatasetVersion())){
gotCurrent = true;
}
}
List<DataFile> allfiles = allRelatedFiles();
if (dvPrevious != null && dvPrevious.getFileMetadatasSorted() != null) {
for (FileMetadata fmdTest : dvPrevious.getFileMetadatasSorted()) {
for (DataFile fileTest : allfiles) {
if (fmdTest.getDataFile().equals(fileTest)) {
return fmdTest;
}
}
}
}
Long dfId = fmdIn.getDataFile().getId();
if (dfPrevious != null){
dfId = dfPrevious.getId();
}
Long versionId = null;
if (dvPrevious !=null){
versionId = dvPrevious.getId();
}
FileMetadata fmd = datafileService.findFileMetadataByDatasetVersionIdAndDataFileId(versionId, dfId);
return fmd;
}
public List<FileMetadata> getFileMetadatasForTab() {
return fileMetadatasForTab;
}
public void setFileMetadatasForTab(List<FileMetadata> fileMetadatasForTab) {
this.fileMetadatasForTab = fileMetadatasForTab;
}
public String getPersistentId() {
return persistentId;
}
public void setPersistentId(String persistentId) {
this.persistentId = persistentId;
}
public List<DatasetVersion> getDatasetVersionsForTab() {
return datasetVersionsForTab;
}
public void setDatasetVersionsForTab(List<DatasetVersion> datasetVersionsForTab) {
this.datasetVersionsForTab = datasetVersionsForTab;
}
public String save() {
// Validate
Set<ConstraintViolation> constraintViolations = this.fileMetadata.getDatasetVersion().validate();
if (!constraintViolations.isEmpty()) {
//JsfHelper.addFlashMessage(JH.localize("dataset.message.validationError"));
fileDeleteInProgress = false;
JH.addMessage(FacesMessage.SEVERITY_ERROR, BundleUtil.getStringFromBundle("dataset.message.validationError"));
//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Validation Error", "See below for details."));
return "";
}
Command<Dataset> cmd;
try {
cmd = new UpdateDatasetVersionCommand(editDataset, dvRequestService.getDataverseRequest(), filesToBeDeleted);
commandEngine.submit(cmd);
} catch (EJBException ex) {
StringBuilder error = new StringBuilder();
error.append(ex).append(" ");
error.append(ex.getMessage()).append(" ");
Throwable cause = ex;
while (cause.getCause()!= null) {
cause = cause.getCause();
error.append(cause).append(" ");
error.append(cause.getMessage()).append(" ");
}
return null;
} catch (CommandException ex) {
fileDeleteInProgress = false;
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, BundleUtil.getStringFromBundle("dataset.save.fail"), " - " + ex.toString()));
return null;
}
if (fileDeleteInProgress) {
JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("file.message.deleteSuccess"));
fileDeleteInProgress = false;
} else {
JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("file.message.editSuccess"));
}
setVersion("DRAFT");
return "";
}
private Boolean thumbnailAvailable = null;
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.
// (Also, cache the result the first time the check is performed...
// remember - methods referenced in "rendered=..." attributes are
// called *multiple* times as the page is loading!)
if (thumbnailAvailable != null) {
return thumbnailAvailable;
}
if (!fileDownloadHelper.canDownloadFile(fileMetadata)) {
thumbnailAvailable = false;
} else {
thumbnailAvailable = datafileService.isThumbnailAvailable(fileMetadata.getDataFile());
}
return thumbnailAvailable;
}
private String returnToDatasetOnly(){
return "/dataset.xhtml?persistentId=" + editDataset.getGlobalIdString() + "&version=DRAFT" + "&faces-redirect=true";
}
private String returnToDraftVersion(){
return "/file.xhtml?fileId=" + fileId + "&version=DRAFT&faces-redirect=true";
}
public FileDownloadServiceBean getFileDownloadService() {
return fileDownloadService;
}
public void setFileDownloadService(FileDownloadServiceBean fileDownloadService) {
this.fileDownloadService = fileDownloadService;
}
public GuestbookResponseServiceBean getGuestbookResponseService() {
return guestbookResponseService;
}
public void setGuestbookResponseService(GuestbookResponseServiceBean guestbookResponseService) {
this.guestbookResponseService = guestbookResponseService;
}
public GuestbookResponse getGuestbookResponse() {
return guestbookResponse;
}
public void setGuestbookResponse(GuestbookResponse guestbookResponse) {
this.guestbookResponse = guestbookResponse;
}
public boolean canUpdateDataset() {
return permissionsWrapper.canUpdateDataset(dvRequestService.getDataverseRequest(), this.file.getOwner());
}
public int getSelectedTabIndex() {
return selectedTabIndex;
}
public void setSelectedTabIndex(int selectedTabIndex) {
this.selectedTabIndex = selectedTabIndex;
}
public boolean isSwiftStorage () {
Boolean swiftBool = false;
if (file.getStorageIdentifier().startsWith("swift://")){
swiftBool = true;
}
return swiftBool;
}
public boolean showComputeButton () {
if (isSwiftStorage() && (settingsService.getValueForKey(SettingsServiceBean.Key.ComputeBaseUrl) != null)) {
return true;
}
return false;
}
public SwiftAccessIO getSwiftObject() {
try {
StorageIO<DataFile> storageIO = getFile().getStorageIO();
if (storageIO != null && storageIO instanceof SwiftAccessIO) {
return (SwiftAccessIO)storageIO;
} else {
logger.fine("FilePage: Failed to cast storageIO as SwiftAccessIO");
}
} catch (IOException e) {
logger.fine("FilePage: Failed to get storageIO");
}
return null;
}
public String getSwiftContainerName(){
SwiftAccessIO swiftObject = getSwiftObject();
try {
swiftObject.open();
return swiftObject.getSwiftContainerName();
} catch (IOException e){
logger.info("FilePage: Failed to open swift object");
}
return "";
}
public String getComputeUrl() throws IOException {
SwiftAccessIO swiftObject = getSwiftObject();
if (swiftObject != null) {
swiftObject.open();
//generate a temp url for a file
if (settingsService.isTrueForKey(SettingsServiceBean.Key.PublicInstall, false)) {
return settingsService.getValueForKey(SettingsServiceBean.Key.ComputeBaseUrl) + "?" + this.getFile().getOwner().getGlobalIdString() + "=" + swiftObject.getSwiftFileName();
}
return settingsService.getValueForKey(SettingsServiceBean.Key.ComputeBaseUrl) + "?" + this.getFile().getOwner().getGlobalIdString() + "=" + swiftObject.getSwiftFileName() + "&temp_url_sig=" + swiftObject.getTempUrlSignature() + "&temp_url_expires=" + swiftObject.getTempUrlExpiry();
}
return "";
}
private List<DataFile> allRelatedFiles() {
List<DataFile> dataFiles = new ArrayList<>();
DataFile dataFileToTest = fileMetadata.getDataFile();
Long rootDataFileId = dataFileToTest.getRootDataFileId();
if (rootDataFileId < 0) {
dataFiles.add(dataFileToTest);
} else {
dataFiles.addAll(datafileService.findAllRelatedByRootDatafileId(rootDataFileId));
}
return dataFiles;
}
public boolean isDraftReplacementFile(){
/*
This method tests to see if the file has been replaced in a draft version of the dataset
Since it must must work when you are on prior versions of the dataset
it must accrue all replacement files that may have been created
*/
if(null == dataset) {
dataset = fileMetadata.getDataFile().getOwner();
}
DataFile dataFileToTest = fileMetadata.getDataFile();
DatasetVersion currentVersion = dataset.getLatestVersion();
if (!currentVersion.isDraft()){
return false;
}
if (dataset.getReleasedVersion() == null){
return false;
}
List<DataFile> dataFiles = new ArrayList<>();
dataFiles.add(dataFileToTest);
while (datafileService.findReplacementFile(dataFileToTest.getId()) != null ){
dataFiles.add(datafileService.findReplacementFile(dataFileToTest.getId()));
dataFileToTest = datafileService.findReplacementFile(dataFileToTest.getId());
}
if(dataFiles.size() <2){
return false;
}
int numFiles = dataFiles.size();
DataFile current = dataFiles.get(numFiles - 1 );
DatasetVersion publishedVersion = dataset.getReleasedVersion();
if( datafileService.findFileMetadataByDatasetVersionIdAndDataFileId(publishedVersion.getId(), current.getId()) == null){
return true;
}
return false;
}
/**
* To help with replace development
* @return
*/
public boolean isReplacementFile(){
return this.datafileService.isReplacementFile(this.getFile());
}
public boolean isPubliclyDownloadable() {
return FileUtil.isPubliclyDownloadable(fileMetadata);
}
private Boolean lockedFromEditsVar;
private Boolean lockedFromDownloadVar;
/**
* Authors are not allowed to edit but curators are allowed - when Dataset is inReview
* For all other locks edit should be locked for all editors.
*/
public boolean isLockedFromEdits() {
if(null == dataset) {
dataset = fileMetadata.getDataFile().getOwner();
}
if(null == lockedFromEditsVar) {
try {
permissionService.checkEditDatasetLock(dataset, dvRequestService.getDataverseRequest(), new UpdateDatasetVersionCommand(dataset, dvRequestService.getDataverseRequest()));
lockedFromEditsVar = false;
} catch (IllegalCommandException ex) {
lockedFromEditsVar = true;
}
}
return lockedFromEditsVar;
}
public boolean isLockedFromDownload(){
if(null == dataset) {
dataset = fileMetadata.getDataFile().getOwner();
}
if (null == lockedFromDownloadVar) {
try {
permissionService.checkDownloadFileLock(dataset, dvRequestService.getDataverseRequest(), new CreateNewDatasetCommand(dataset, dvRequestService.getDataverseRequest()));
lockedFromDownloadVar = false;
} catch (IllegalCommandException ex) {
lockedFromDownloadVar = true;
}
}
return lockedFromDownloadVar;
}
public String getPublicDownloadUrl() {
try {
StorageIO<DataFile> storageIO = getFile().getStorageIO();
if (storageIO instanceof SwiftAccessIO) {
String fileDownloadUrl = null;
try {
SwiftAccessIO<DataFile> swiftIO = (SwiftAccessIO<DataFile>) storageIO;
swiftIO.open();
//if its a public install, lets just give users the permanent URL!
if (systemConfig.isPublicInstall()){
fileDownloadUrl = swiftIO.getRemoteUrl();
} else {
//TODO: if a user has access to this file, they should be given the swift url
// perhaps even we could use this as the "private url"
fileDownloadUrl = swiftIO.getTemporarySwiftUrl();
}
logger.info("Swift url: " + fileDownloadUrl);
return fileDownloadUrl;
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e){
e.printStackTrace();
}
return FileUtil.getPublicDownloadUrl(systemConfig.getDataverseSiteUrl(), persistentId, fileId);
}
public List<ExternalTool> getConfigureTools() {
return configureTools;
}
public List<ExternalTool> getExploreTools() {
return exploreTools;
}
//Provenance fragment bean calls this to show error dialogs after popup failure
//This can probably be replaced by calling JsfHelper from the provpopup bean
public void showProvError() {
JH.addMessage(FacesMessage.SEVERITY_ERROR, BundleUtil.getStringFromBundle("file.metadataTab.provenance.error"));
}
}