• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CeON / dataverse / 1370

26 Jun 2024 06:59AM UTC coverage: 25.503% (-0.004%) from 25.507%
1370

push

jenkins

web-flow
Closes #2496: Make the banner link optional (#2503)

17782 of 69725 relevant lines covered (25.5%)

0.26 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

44.62
/dataverse-webapp/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetService.java
1
package edu.harvard.iq.dataverse.dataset;
2

3
import edu.harvard.iq.dataverse.DatasetDao;
4
import edu.harvard.iq.dataverse.DatasetPage;
5
import edu.harvard.iq.dataverse.DataverseRequestServiceBean;
6
import edu.harvard.iq.dataverse.DataverseSession;
7
import edu.harvard.iq.dataverse.EjbDataverseEngine;
8
import edu.harvard.iq.dataverse.PermissionServiceBean;
9
import edu.harvard.iq.dataverse.annotations.PermissionNeeded;
10
import edu.harvard.iq.dataverse.api.AbstractApiBean;
11
import edu.harvard.iq.dataverse.engine.command.exception.NotAuthenticatedException;
12
import edu.harvard.iq.dataverse.engine.command.impl.CreateNewDatasetCommand;
13
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetGuestbookCommand;
14
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetThumbnailCommand;
15
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetVersionCommand;
16
import edu.harvard.iq.dataverse.ingest.IngestServiceBean;
17
import edu.harvard.iq.dataverse.interceptors.LoggedCall;
18
import edu.harvard.iq.dataverse.interceptors.Restricted;
19
import edu.harvard.iq.dataverse.interceptors.SuperuserRequired;
20
import edu.harvard.iq.dataverse.notification.NotificationObjectType;
21
import edu.harvard.iq.dataverse.notification.UserNotificationService;
22
import edu.harvard.iq.dataverse.persistence.datafile.DataFile;
23
import edu.harvard.iq.dataverse.persistence.dataset.Dataset;
24
import edu.harvard.iq.dataverse.persistence.dataset.DatasetLock;
25
import edu.harvard.iq.dataverse.persistence.dataset.Template;
26
import edu.harvard.iq.dataverse.persistence.user.AuthenticatedUser;
27
import edu.harvard.iq.dataverse.persistence.user.NotificationType;
28
import edu.harvard.iq.dataverse.persistence.user.Permission;
29
import edu.harvard.iq.dataverse.provenance.ProvPopupFragmentBean;
30
import edu.harvard.iq.dataverse.search.index.SolrIndexServiceBean;
31
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
32

33
import javax.ejb.Stateless;
34
import javax.ejb.TransactionAttribute;
35
import javax.ejb.TransactionAttributeType;
36
import javax.inject.Inject;
37
import java.io.InputStream;
38
import java.time.Clock;
39
import java.time.Instant;
40
import java.util.Date;
41
import java.util.List;
42
import java.util.logging.Level;
43
import java.util.logging.Logger;
44

45
@Stateless
46
public class DatasetService {
47

48
    private static final Logger logger = Logger.getLogger(DatasetPage.class.getCanonicalName());
1✔
49
    private static final String DATASET_LOCKED_FOR_UPDATE_MESSAGE = "Update embargo date failed. Dataset is locked. ";
50
    private static final String DATASET_IN_WRONG_STATE_MESSAGE = "Setting embargo date failed. Dataset is in a non-editable state.";
51

52
    private EjbDataverseEngine commandEngine;
53
    private UserNotificationService userNotificationService;
54
    private DatasetDao datasetDao;
55
    private DataverseSession session;
56
    private DataverseRequestServiceBean dvRequestService;
57
    private IngestServiceBean ingestService;
58
    private SettingsServiceBean settingsService;
59
    private ProvPopupFragmentBean provPopupFragmentBean;
60
    private SolrIndexServiceBean solrIndexService;
61

62

63
    // -------------------- CONSTRUCTORS --------------------
64

65
    @Deprecated
66
    public DatasetService() {
×
67
    }
×
68

69
    @Inject
70
    public DatasetService(EjbDataverseEngine commandEngine, UserNotificationService userNotificationService,
71
                          DatasetDao datasetDao, DataverseSession session, DataverseRequestServiceBean dvRequestService,
72
                          IngestServiceBean ingestService, SettingsServiceBean settingsService,
73
                          ProvPopupFragmentBean provPopupFragmentBean, PermissionServiceBean permissionService,
74
                          SolrIndexServiceBean solrIndexService) {
1✔
75
        this.commandEngine = commandEngine;
1✔
76
        this.userNotificationService = userNotificationService;
1✔
77
        this.datasetDao = datasetDao;
1✔
78
        this.session = session;
1✔
79
        this.dvRequestService = dvRequestService;
1✔
80
        this.ingestService = ingestService;
1✔
81
        this.settingsService = settingsService;
1✔
82
        this.provPopupFragmentBean = provPopupFragmentBean;
1✔
83
        this.solrIndexService = solrIndexService;
1✔
84
    }
1✔
85

86

87
    // -------------------- LOGIC --------------------
88

89
    public Dataset createDataset(Dataset dataset, Template usedTemplate) {
90

91
        AuthenticatedUser user = retrieveAuthenticatedUser();
×
92

93
        CreateNewDatasetCommand createCommand = new CreateNewDatasetCommand(dataset, dvRequestService.getDataverseRequest(), false, usedTemplate);
×
94
        dataset = commandEngine.submit(createCommand);
×
95

96

97
        userNotificationService.sendNotificationWithEmail(user, dataset.getCreateDate(), NotificationType.CREATEDS,
×
98
                                                          dataset.getLatestVersion().getId(), NotificationObjectType.DATASET_VERSION);
×
99

100
        return dataset;
×
101
    }
102

103
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
104
    public AddFilesResult addFilesToDataset(long datasetId, List<DataFile> newFiles) {
105

106
        Dataset dataset = datasetDao.find(datasetId);
×
107
        AuthenticatedUser user = retrieveAuthenticatedUser();
×
108

109
        if (settingsService.isTrueForKey(SettingsServiceBean.Key.ProvCollectionEnabled)) {
×
110
            provPopupFragmentBean.saveStageProvFreeformToLatestVersion();
×
111
        }
112

113
        List<DataFile> savedFiles = ingestService.saveAndAddFilesToDataset(dataset.getEditVersion(), newFiles);
×
114

115
        int notSavedFilesCount = newFiles.size() - savedFiles.size();
×
116

117
        if (savedFiles.size() == 0) {
×
118
            return new AddFilesResult(dataset, notSavedFilesCount, false);
×
119
        }
120

121
        dataset = commandEngine.submit(new UpdateDatasetVersionCommand(dataset, dvRequestService.getDataverseRequest()));
×
122

123

124
        // Call Ingest Service one more time, to
125
        // queue the data ingest jobs for asynchronous execution:
126
        ingestService.startIngestJobsForDataset(dataset, user);
×
127

128
        //After dataset saved, then persist prov json data
129
        boolean hasProvenanceErrors = false;
×
130

131
        if (settingsService.isTrueForKey(SettingsServiceBean.Key.ProvCollectionEnabled)) {
×
132
            try {
133
                provPopupFragmentBean.saveStagedProvJson(false, dataset.getLatestVersion().getFileMetadatas());
×
134
            } catch (AbstractApiBean.WrappedResponse ex) {
×
135
                logger.log(Level.SEVERE, null, ex);
×
136
                hasProvenanceErrors = true;
×
137
            }
×
138
        }
139

140
        return new AddFilesResult(dataset, notSavedFilesCount, hasProvenanceErrors);
×
141
    }
142

143
    /**
144
     * Replaces thumbnail (default if none is set) with the one provided.
145
     *
146
     * @param datasetForNewThumbnail dataset that will have new thumbnail
147
     * @param thumbnailFile          thumbnail that will be set for dataset
148
     */
149
    public DatasetThumbnail changeDatasetThumbnail(Dataset datasetForNewThumbnail, DataFile thumbnailFile) {
150
        return commandEngine.submit(new UpdateDatasetThumbnailCommand(dvRequestService.getDataverseRequest(),
1✔
151
                                                                      datasetForNewThumbnail,
152
                                                                      UpdateDatasetThumbnailCommand.UserIntent.setDatasetFileAsThumbnail,
153
                                                                      thumbnailFile.getId(),
1✔
154
                                                                      null));
155

156
    }
157

158
    /**
159
     * Replaces thumbnail (default if none is set) with the one provided.
160
     *
161
     * @param datasetForNewThumbnail dataset that will have new thumbnail
162
     * @param fileStream             thumbnail that will be set for dataset
163
     */
164
    public DatasetThumbnail changeDatasetThumbnail(Dataset datasetForNewThumbnail, InputStream fileStream) {
165
        return commandEngine.submit(new UpdateDatasetThumbnailCommand(dvRequestService.getDataverseRequest(),
1✔
166
                                                                      datasetForNewThumbnail,
167
                                                                      UpdateDatasetThumbnailCommand.UserIntent.setNonDatasetFileAsThumbnail,
168
                                                                      null,
169
                                                                      fileStream));
170

171
    }
172

173
    public DatasetThumbnail removeDatasetThumbnail(Dataset datasetWithThumbnail) {
174
        return commandEngine.submit(new UpdateDatasetThumbnailCommand(dvRequestService.getDataverseRequest(),
1✔
175
                                                                      datasetWithThumbnail,
176
                                                                      UpdateDatasetThumbnailCommand.UserIntent.removeThumbnail,
177
                                                                      null,
178
                                                                      null));
179

180
    }
181

182
    public Dataset updateDatasetGuestbook(Dataset editedDataset) {
183
        return commandEngine.submit(new UpdateDatasetGuestbookCommand(dvRequestService.getDataverseRequest(), editedDataset));
×
184
    }
185

186
    @LoggedCall
187
    @Restricted(@PermissionNeeded(needs = {Permission.EditDataset}))
188
    public Dataset setDatasetEmbargoDate(@PermissionNeeded Dataset dataset, Date embargoDate) throws IllegalStateException {
189
        if(dataset.hasEverBeenPublished() && !session.getUser().isSuperuser()) {
1✔
190
            throw new IllegalStateException(getDatasetInWrongStateMessage());
1✔
191
        }
192
        return updateDatasetEmbargoDate(dataset, embargoDate);
1✔
193
    }
194

195
    @LoggedCall
196
    @Restricted(@PermissionNeeded(needs = {Permission.EditDataset}))
197
    public Dataset liftDatasetEmbargoDate(@PermissionNeeded Dataset dataset) {
198
        return updateDatasetEmbargoDate(dataset, null);
×
199
    }
200

201
    String getDatasetLockedMessage(Dataset dataset) {
202
        return DATASET_LOCKED_FOR_UPDATE_MESSAGE + dataset.getLocks().toString();
1✔
203
    }
204

205
    String getDatasetInWrongStateMessage() {
206
        return DATASET_IN_WRONG_STATE_MESSAGE;
1✔
207
    }
208

209
    @SuperuserRequired
210
    public void updateAllLastChangeForExporterTime() {
211
        datasetDao.updateAllLastChangeForExporterTime();
×
212
    }
×
213

214
    @SuperuserRequired
215
    public void updateLastChangeForExporterTime(Dataset dataset) {
216
        dataset.setLastChangeForExporterTime(new Date());
×
217
        datasetDao.merge(dataset);
×
218
    }
×
219

220
    // -------------------- PRIVATE --------------------
221

222
    private AuthenticatedUser retrieveAuthenticatedUser() {
223
        if (!session.getUser().isAuthenticated()) {
×
224
            throw new NotAuthenticatedException();
×
225
        }
226
        return (AuthenticatedUser) session.getUser();
×
227
    }
228

229
    private Dataset updateDatasetEmbargoDate(Dataset dataset, Date embargoDate) throws IllegalStateException {
230
        if(dataset.isLocked() && dataset.getLocks().stream().anyMatch(l -> l.getReason() != DatasetLock.Reason.InReview)) {
1✔
231
            logger.log(Level.WARNING, "Dataset is locked. Cannot perform update embargo date");
1✔
232
            throw new IllegalStateException(getDatasetLockedMessage(dataset));
1✔
233
        }
234

235
        dataset.setEmbargoDate(embargoDate);
1✔
236
        dataset.setLastChangeForExporterTime(Date.from(Instant.now(Clock.systemDefaultZone())));
1✔
237
        dataset = datasetDao.mergeAndFlush(dataset);
1✔
238

239
        solrIndexService.indexPermissionsForDatasetWithDataFiles(dataset);
1✔
240

241
        return dataset;
1✔
242
    }
243

244
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc