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

CeON / dataverse / 1371

28 Jun 2024 05:54AM UTC coverage: 25.453% (-0.05%) from 25.503%
1371

push

jenkins

web-flow
Closes #2474: Store the entity id in saml session once user logs in with the identity provider (#2486)

49 of 54 new or added lines in 4 files covered. (90.74%)

860 existing lines in 14 files now uncovered.

17805 of 69953 relevant lines covered (25.45%)

0.25 hits per line

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

9.35
/dataverse-webapp/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.java
1
package edu.harvard.iq.dataverse;
2

3
import edu.harvard.iq.dataverse.actionlogging.ActionLogServiceBean;
4
import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
5
import edu.harvard.iq.dataverse.authorization.groups.GroupServiceBean;
6
import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroupServiceBean;
7
import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean;
8
import edu.harvard.iq.dataverse.bannersandmessages.messages.DataverseTextMessageServiceBean;
9
import edu.harvard.iq.dataverse.citation.CitationFactory;
10
import edu.harvard.iq.dataverse.dataaccess.DataAccess;
11
import edu.harvard.iq.dataverse.datacapturemodule.DataCaptureModuleServiceBean;
12
import edu.harvard.iq.dataverse.datafile.FileDownloadServiceBean;
13
import edu.harvard.iq.dataverse.dataset.DatasetThumbnailService;
14
import edu.harvard.iq.dataverse.dataset.DownloadDatasetLogDao;
15
import edu.harvard.iq.dataverse.dataset.datasetversion.DatasetVersionServiceBean;
16
import edu.harvard.iq.dataverse.dataverse.template.TemplateDao;
17
import edu.harvard.iq.dataverse.engine.DataverseEngine;
18
import edu.harvard.iq.dataverse.engine.command.Command;
19
import edu.harvard.iq.dataverse.engine.command.CommandContext;
20
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
21
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
22
import edu.harvard.iq.dataverse.engine.command.exception.PermissionException;
23
import edu.harvard.iq.dataverse.featured.FeaturedDataverseServiceBean;
24
import edu.harvard.iq.dataverse.globalid.DOIDataCiteServiceBean;
25
import edu.harvard.iq.dataverse.globalid.DOIEZIdServiceBean;
26
import edu.harvard.iq.dataverse.globalid.FakePidProviderServiceBean;
27
import edu.harvard.iq.dataverse.globalid.HandlenetServiceBean;
28
import edu.harvard.iq.dataverse.guestbook.GuestbookResponseServiceBean;
29
import edu.harvard.iq.dataverse.guestbook.GuestbookServiceBean;
30
import edu.harvard.iq.dataverse.ingest.IngestServiceBean;
31
import edu.harvard.iq.dataverse.notification.UserNotificationService;
32
import edu.harvard.iq.dataverse.persistence.ActionLogRecord;
33
import edu.harvard.iq.dataverse.persistence.DvObject;
34
import edu.harvard.iq.dataverse.persistence.user.Permission;
35
import edu.harvard.iq.dataverse.privateurl.PrivateUrlServiceBean;
36
import edu.harvard.iq.dataverse.search.SearchServiceBean;
37
import edu.harvard.iq.dataverse.search.index.IndexBatchServiceBean;
38
import edu.harvard.iq.dataverse.search.index.IndexServiceBean;
39
import edu.harvard.iq.dataverse.search.index.SolrIndexServiceBean;
40
import edu.harvard.iq.dataverse.search.savedsearch.SavedSearchServiceBean;
41
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
42
import edu.harvard.iq.dataverse.util.SystemConfig;
43
import edu.harvard.iq.dataverse.validation.DatasetFieldValidationService;
44
import edu.harvard.iq.dataverse.workflow.WorkflowServiceBean;
45
import edu.harvard.iq.dataverse.workflow.execution.WorkflowExecutionFacade;
46
import org.apache.commons.collections4.CollectionUtils;
47
import org.apache.commons.collections4.SetUtils;
48

49
import javax.annotation.Resource;
50
import javax.ejb.EJB;
51
import javax.ejb.EJBContext;
52
import javax.ejb.EJBException;
53
import javax.ejb.Stateless;
54
import javax.ejb.TransactionAttribute;
55
import javax.inject.Inject;
56
import javax.persistence.EntityManager;
57
import javax.persistence.PersistenceContext;
58
import javax.validation.ConstraintViolation;
59
import javax.validation.ConstraintViolationException;
60
import java.util.EnumSet;
61
import java.util.Map;
62
import java.util.Set;
63
import java.util.logging.Level;
64
import java.util.logging.Logger;
65

66
import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
67

68
/**
69
 * An EJB capable of executing {@link Command}s in a JEE environment.
70
 *
71
 * @author michael
72
 */
73
@Stateless
UNCOV
74
public class EjbDataverseEngine {
×
75

76
    private static final Logger logger = Logger.getLogger(EjbDataverseEngine.class.getCanonicalName());
1✔
77

78
    @EJB
79
    DatasetDao datasetDao;
80

81
    @EJB
82
    DataverseDao dataverseDao;
83

84
    @EJB
85
    DataverseRoleServiceBean rolesService;
86

87
    @EJB
88
    BuiltinUserServiceBean usersService;
89

90
    @EJB
91
    IndexServiceBean indexService;
92

93
    @EJB
94
    IndexBatchServiceBean indexBatchService;
95

96
    @EJB
97
    SolrIndexServiceBean solrIndexService;
98

99
    @EJB
100
    SearchServiceBean searchService;
101

102
    @EJB
103
    IngestServiceBean ingestService;
104

105
    @EJB
106
    PermissionServiceBean permissionService;
107

108
    @EJB
109
    DvObjectServiceBean dvObjectService;
110

111
    @EJB
112
    DataverseFacetServiceBean dataverseFacetService;
113

114
    @EJB
115
    FeaturedDataverseServiceBean featuredDataverseService;
116

117
    @EJB
118
    DataFileServiceBean dataFileService;
119

120
    @EJB
121
    TemplateDao templateDao;
122

123
    @EJB
124
    SavedSearchServiceBean savedSearchService;
125

126
    @EJB
127
    DataverseFieldTypeInputLevelServiceBean fieldTypeInputLevels;
128

129
    @EJB
130
    DOIEZIdServiceBean doiEZId;
131

132
    @EJB
133
    DOIDataCiteServiceBean doiDataCite;
134

135
    @EJB
136
    FakePidProviderServiceBean fakePidProvider;
137

138
    @EJB
139
    HandlenetServiceBean handleNet;
140

141
    @Inject
142
    SettingsServiceBean settings;
143

144
    @EJB
145
    GuestbookServiceBean guestbookService;
146

147
    @EJB
148
    GuestbookResponseServiceBean responses;
149

150
    @EJB
151
    DatasetLinkingServiceBean dsLinking;
152

153
    @EJB
154
    ExplicitGroupServiceBean explicitGroups;
155

156
    @EJB
157
    GroupServiceBean groups;
158

159
    @EJB
160
    RoleAssigneeServiceBean roleAssignees;
161

162
    @EJB
163
    UserNotificationService userNotificationService;
164

165
    @EJB
166
    AuthenticationServiceBean authentication;
167

168
    @EJB
169
    SystemConfig systemConfig;
170

171
    @EJB
172
    PrivateUrlServiceBean privateUrlService;
173

174
    @EJB
175
    DatasetVersionServiceBean datasetVersionService;
176

177
    @EJB
178
    MapLayerMetadataServiceBean mapLayerMetadata;
179

180
    @EJB
181
    DataCaptureModuleServiceBean dataCaptureModule;
182

183
    @PersistenceContext(unitName = "VDCNet-ejbPU")
184
    private EntityManager em;
185

186
    @EJB
187
    ActionLogServiceBean logSvc;
188

189
    @Inject
190
    WorkflowServiceBean workflowService;
191

192
    @Inject
193
    WorkflowExecutionFacade workflowExecutionFacade;
194

195
    @EJB
196
    FileDownloadServiceBean fileDownloadService;
197

198
    @EJB
199
    DataverseTextMessageServiceBean dataverseTextMessageServiceBean;
200

201
    @Inject
202
    DatasetThumbnailService datasetThumbnailService;
203

204
    @Inject
205
    CitationFactory citationFactory;
206

207
    @Inject
208
    DownloadDatasetLogDao downloadDatasetLogDao;
209

210
    @Inject
211
    DatasetFieldValidationService fieldValidationService;
212

213

214
    @Resource
215
    EJBContext ejbCtxt;
216

UNCOV
217
    private DataAccess dataAccess = DataAccess.dataAccess();
×
218

219
    private CommandContext ctxt;
220

221
    @TransactionAttribute(REQUIRES_NEW)
222
    public <R> R submitInNewTransaction(Command<R> aCommand)  {
UNCOV
223
        return submit(aCommand);
×
224
    }
225

226
    public <R> R submit(Command<R> aCommand)  {
227

228
        final ActionLogRecord logRec = new ActionLogRecord(ActionLogRecord.ActionType.Command, aCommand.getClass().getCanonicalName());
1✔
229

230
        try {
UNCOV
231
            logRec.setUserIdentifier(aCommand.getRequest().getUser().getIdentifier());
×
232

233
            // Check permissions - or throw an exception
234
            Map<String, ? extends Set<Permission>> requiredMap = aCommand.getRequiredPermissions();
×
235
            if (requiredMap == null) {
×
UNCOV
236
                throw new RuntimeException("Command " + aCommand + " does not define required permissions.");
×
237
            }
238

UNCOV
239
            DataverseRequest dvReq = aCommand.getRequest();
×
240

241
            Map<String, DvObject> affectedDvObjects = aCommand.getAffectedDvObjects();
×
242
            logRec.setInfo(aCommand.describe());
×
243
            for (Map.Entry<String, ? extends Set<Permission>> pair : requiredMap.entrySet()) {
×
244
                String dvName = pair.getKey();
×
245
                if (!affectedDvObjects.containsKey(dvName)) {
×
UNCOV
246
                    throw new RuntimeException("Command instance " + aCommand + " does not have a DvObject named '" + dvName + "'");
×
247
                }
UNCOV
248
                DvObject dvo = affectedDvObjects.get(dvName);
×
249

250
                Set<Permission> granted = (dvo != null) ? permissionService.permissionsFor(dvReq, dvo)
×
251
                        : EnumSet.allOf(Permission.class);
×
UNCOV
252
                Set<Permission> required = requiredMap.get(dvName);
×
253

254
                if ((!aCommand.isAllPermissionsRequired() && !CollectionUtils.containsAny(granted, required) ||
×
255
                        (aCommand.isAllPermissionsRequired() && !granted.containsAll(required)))) {
×
256
                    Set<Permission> missingPermissions = SetUtils.difference(required, granted);
×
UNCOV
257
                    logRec.setActionResult(ActionLogRecord.Result.PermissionError);
×
258
                    /**
259
                     * @todo Is there any harm in showing the "granted" set
260
                     * since we already show "required"? It would help people
261
                     * reason about the mismatch.
262
                     */
263
                    throw new PermissionException("Can't execute command " + aCommand
×
UNCOV
264
                                                          + ", because request " + aCommand.getRequest()
×
265
                                                          + " is missing permissions " + missingPermissions
UNCOV
266
                                                          + " on Object " + dvo.accept(DvObject.NamePrinter),
×
267
                                                  aCommand,
268
                                                  missingPermissions, dvo);
269
                }
UNCOV
270
            }
×
271
            try {
UNCOV
272
                return aCommand.execute(getContext());
×
273

274
            } catch (EJBException ejbe) {
×
UNCOV
275
                throw new CommandException("Command " + aCommand.toString() + " failed: " + ejbe.getMessage(), ejbe.getCausedByException(), aCommand);
×
276
            }
277
        } catch (CommandException cmdEx) {
×
278
            if (!(cmdEx instanceof PermissionException)) {
×
UNCOV
279
                logRec.setActionResult(ActionLogRecord.Result.InternalError);
×
280
            }
281
            logRec.setInfo(logRec.getInfo() + " (" + cmdEx.getMessage() + ")");
×
UNCOV
282
            throw cmdEx;
×
283
        } catch (RuntimeException re) {
1✔
284
            logRec.setActionResult(ActionLogRecord.Result.InternalError);
1✔
285
            logRec.setInfo(logRec.getInfo() + " (" + re.getMessage() + ")");
1✔
286

287
            Throwable cause = re;
1✔
288
            while (cause != null) {
1✔
289
                if (cause instanceof ConstraintViolationException) {
1✔
290
                    StringBuilder sb = new StringBuilder();
×
291
                    sb.append("Unexpected bean validation constraint exception:");
×
292
                    ConstraintViolationException constraintViolationException = (ConstraintViolationException) cause;
×
293
                    for (ConstraintViolation<?> violation : constraintViolationException.getConstraintViolations()) {
×
294
                        sb.append(" Invalid value: <<<").append(violation.getInvalidValue()).append(">>> for ").append(violation.getPropertyPath()).append(" at ").append(violation.getLeafBean()).append(" - ").append(violation.getMessage());
×
295
                    }
×
UNCOV
296
                    logger.log(Level.SEVERE, sb.toString());
×
297
                    // set this more detailed info in action log
UNCOV
298
                    logRec.setInfo(logRec.getInfo() + " (" + sb.toString() + ")");
×
299
                }
300
                cause = cause.getCause();
1✔
301
            }
302

303
            throw re;
1✔
304

305
        } finally {
306
            if (logRec.getActionResult() == null) {
×
UNCOV
307
                logRec.setActionResult(ActionLogRecord.Result.OK);
×
308
            } else {
UNCOV
309
                ejbCtxt.setRollbackOnly();
×
310
            }
311
            logRec.setEndTime(new java.util.Date());
×
UNCOV
312
            logSvc.log(logRec);
×
313
        }
314

315
    }
316

317
    public CommandContext getContext() {
318
        if (ctxt == null) {
×
UNCOV
319
            ctxt = new CommandContext() {
×
320

321
                @Override
322
                public DatasetDao datasets() {
UNCOV
323
                    return datasetDao;
×
324
                }
325

326
                @Override
327
                public DataverseDao dataverses() {
UNCOV
328
                    return dataverseDao;
×
329
                }
330

331
                @Override
332
                public DataverseRoleServiceBean roles() {
UNCOV
333
                    return rolesService;
×
334
                }
335

336
                @Override
337
                public BuiltinUserServiceBean builtinUsers() {
UNCOV
338
                    return usersService;
×
339
                }
340

341
                @Override
342
                public IndexServiceBean index() {
UNCOV
343
                    return indexService;
×
344
                }
345

346
                @Override
347
                public IndexBatchServiceBean indexBatch() {
UNCOV
348
                    return indexBatchService;
×
349
                }
350

351
                @Override
352
                public SolrIndexServiceBean solrIndex() {
UNCOV
353
                    return solrIndexService;
×
354
                }
355

356
                @Override
357
                public SearchServiceBean search() {
UNCOV
358
                    return searchService;
×
359
                }
360

361
                @Override
362
                public IngestServiceBean ingest() {
UNCOV
363
                    return ingestService;
×
364
                }
365

366
                @Override
367
                public PermissionServiceBean permissions() {
UNCOV
368
                    return permissionService;
×
369
                }
370

371
                @Override
372
                public DvObjectServiceBean dvObjects() {
UNCOV
373
                    return dvObjectService;
×
374
                }
375

376
                @Override
377
                public DataFileServiceBean files() {
UNCOV
378
                    return dataFileService;
×
379
                }
380

381
                @Override
382
                public EntityManager em() {
UNCOV
383
                    return em;
×
384
                }
385

386
                @Override
387
                public DataAccess dataAccess() {
UNCOV
388
                    return dataAccess;
×
389
                }
390

391
                @Override
392
                public DataverseFacetServiceBean facets() {
UNCOV
393
                    return dataverseFacetService;
×
394
                }
395

396
                @Override
397
                public FeaturedDataverseServiceBean featuredDataverses() {
UNCOV
398
                    return featuredDataverseService;
×
399
                }
400

401
                @Override
402
                public TemplateDao templates() {
UNCOV
403
                    return templateDao;
×
404
                }
405

406
                @Override
407
                public SavedSearchServiceBean savedSearches() {
UNCOV
408
                    return savedSearchService;
×
409
                }
410

411
                @Override
412
                public DataverseFieldTypeInputLevelServiceBean fieldTypeInputLevels() {
UNCOV
413
                    return fieldTypeInputLevels;
×
414
                }
415

416
                @Override
417
                public DOIEZIdServiceBean doiEZId() {
UNCOV
418
                    return doiEZId;
×
419
                }
420

421
                @Override
422
                public DOIDataCiteServiceBean doiDataCite() {
UNCOV
423
                    return doiDataCite;
×
424
                }
425

426
                @Override
427
                public FakePidProviderServiceBean fakePidProvider() {
UNCOV
428
                    return fakePidProvider;
×
429
                }
430

431
                @Override
432
                public HandlenetServiceBean handleNet() {
UNCOV
433
                    return handleNet;
×
434
                }
435

436
                @Override
437
                public SettingsServiceBean settings() {
UNCOV
438
                    return settings;
×
439
                }
440

441
                @Override
442
                public GuestbookServiceBean guestbooks() {
UNCOV
443
                    return guestbookService;
×
444
                }
445

446
                @Override
447
                public GuestbookResponseServiceBean responses() {
UNCOV
448
                    return responses;
×
449
                }
450

451
                @Override
452
                public DatasetLinkingServiceBean dsLinking() {
UNCOV
453
                    return dsLinking;
×
454
                }
455

456
                @Override
457
                public DataverseEngine engine() {
UNCOV
458
                    return new DataverseEngine() {
×
459
                        @Override
460
                        public <R> R submit(Command<R> aCommand)  {
UNCOV
461
                            return EjbDataverseEngine.this.submit(aCommand);
×
462
                        }
463
                    };
464
                }
465

466
                @Override
467
                public ExplicitGroupServiceBean explicitGroups() {
UNCOV
468
                    return explicitGroups;
×
469
                }
470

471
                @Override
472
                public GroupServiceBean groups() {
UNCOV
473
                    return groups;
×
474
                }
475

476
                @Override
477
                public RoleAssigneeServiceBean roleAssignees() {
UNCOV
478
                    return roleAssignees;
×
479
                }
480

481
                @Override
482
                public UserNotificationService notifications() {
UNCOV
483
                    return userNotificationService;
×
484
                }
485

486
                @Override
487
                public AuthenticationServiceBean authentication() {
UNCOV
488
                    return authentication;
×
489
                }
490

491
                @Override
492
                public SystemConfig systemConfig() {
UNCOV
493
                    return systemConfig;
×
494
                }
495

496
                @Override
497
                public PrivateUrlServiceBean privateUrl() {
UNCOV
498
                    return privateUrlService;
×
499
                }
500

501
                @Override
502
                public DatasetVersionServiceBean datasetVersion() {
UNCOV
503
                    return datasetVersionService;
×
504
                }
505

506
                @Override
507
                public WorkflowServiceBean workflows() {
UNCOV
508
                    return workflowService;
×
509
                }
510

511
                @Override
512
                public WorkflowExecutionFacade workflowExecutions() {
UNCOV
513
                    return workflowExecutionFacade;
×
514
                }
515

516
                @Override
517
                public MapLayerMetadataServiceBean mapLayerMetadata() {
UNCOV
518
                    return mapLayerMetadata;
×
519
                }
520

521
                @Override
522
                public DataCaptureModuleServiceBean dataCaptureModule() {
UNCOV
523
                    return dataCaptureModule;
×
524
                }
525

526
                @Override
527
                public FileDownloadServiceBean fileDownload() {
UNCOV
528
                    return fileDownloadService;
×
529
                }
530

531
                @Override
532
                public DataverseTextMessageServiceBean dataverseTextMessages() {
UNCOV
533
                    return dataverseTextMessageServiceBean;
×
534
                }
535

536
                @Override
537
                public DatasetThumbnailService datasetThumailService() {
UNCOV
538
                    return datasetThumbnailService;
×
539
                }
540

541
                @Override
542
                public CitationFactory citationFactory() {
UNCOV
543
                    return citationFactory;
×
544
                }
545

546
                @Override
547
                public DownloadDatasetLogDao downloadDatasetDao() {
UNCOV
548
                    return downloadDatasetLogDao;
×
549
                }
550

551
                @Override
552
                public DatasetFieldValidationService fieldValidationService() {
UNCOV
553
                    return fieldValidationService;
×
554
                }
555
            };
556
        }
557

UNCOV
558
        return ctxt;
×
559
    }
560

561
}
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