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

IQSS / dataverse / #22985

23 Aug 2024 06:32PM UTC coverage: 20.61% (-0.2%) from 20.791%
#22985

Pull #10781

github

landreev
added an upfront locks check to the /addGlobusFiles api #10623
Pull Request #10781: Improved handling of Globus uploads

4 of 417 new or added lines in 15 files covered. (0.96%)

4194 existing lines in 35 files now uncovered.

17388 of 84365 relevant lines covered (20.61%)

0.21 hits per line

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

51.81
/src/main/java/edu/harvard/iq/dataverse/Dataverse.java
1
package edu.harvard.iq.dataverse;
2

3
import edu.harvard.iq.dataverse.harvest.client.HarvestingClient;
4
import edu.harvard.iq.dataverse.authorization.DataverseRole;
5
import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch;
6
import edu.harvard.iq.dataverse.storageuse.StorageUse;
7
import edu.harvard.iq.dataverse.util.BundleUtil;
8
import edu.harvard.iq.dataverse.util.SystemConfig;
9

10
import java.util.ArrayList;
11
import java.util.HashSet;
12
import java.util.Iterator;
13
import java.util.List;
14
import java.util.Objects;
15
import java.util.Set;
16
import jakarta.persistence.CascadeType;
17
import jakarta.persistence.Column;
18
import jakarta.persistence.Entity;
19
import jakarta.persistence.EnumType;
20
import jakarta.persistence.Enumerated;
21
import jakarta.persistence.FetchType;
22
import jakarta.persistence.Index;
23
import jakarta.persistence.JoinColumn;
24
import jakarta.persistence.JoinTable;
25
import jakarta.persistence.ManyToMany;
26
import jakarta.persistence.ManyToOne;
27
import jakarta.persistence.NamedQueries;
28
import jakarta.persistence.NamedQuery;
29
import jakarta.persistence.OneToMany;
30
import jakarta.persistence.OneToOne;
31
import jakarta.persistence.OrderBy;
32
import jakarta.persistence.Table;
33
import jakarta.validation.constraints.NotNull;
34
import jakarta.validation.constraints.Pattern;
35
import jakarta.validation.constraints.Size;
36

37
import org.hibernate.validator.constraints.NotBlank;
38
import org.hibernate.validator.constraints.NotEmpty;
39

40
/**
41
 *
42
 * @author gdurand
43
 * @author mbarsinai
44
 */
45
@NamedQueries({
46
    @NamedQuery(name = "Dataverse.findIdStale",query = "SELECT d.id FROM Dataverse d WHERE d.indexTime is NULL OR d.indexTime < d.modificationTime"),
47
    @NamedQuery(name = "Dataverse.findIdStalePermission",query = "SELECT d.id FROM Dataverse d WHERE d.permissionIndexTime is NULL OR d.permissionIndexTime < d.permissionModificationTime"),
48
    @NamedQuery(name = "Dataverse.ownedObjectsById", query = "SELECT COUNT(obj) FROM DvObject obj WHERE obj.owner.id=:id"),
49
    @NamedQuery(name = "Dataverse.findAll", query = "SELECT d FROM Dataverse d order by d.name"),
50
    @NamedQuery(name = "Dataverse.findRoot", query = "SELECT d FROM Dataverse d where d.owner.id=null"),
51
    @NamedQuery(name = "Dataverse.findByAlias", query="SELECT dv FROM Dataverse dv WHERE LOWER(dv.alias)=:alias"),
52
    @NamedQuery(name = "Dataverse.findByOwnerId", query="select object(o) from Dataverse as o where o.owner.id =:ownerId order by o.name"),
53
    @NamedQuery(name = "Dataverse.findByCreatorId", query="select object(o) from Dataverse as o where o.creator.id =:creatorId order by o.name"),
54
    @NamedQuery(name = "Dataverse.findByReleaseUserId", query="select object(o) from Dataverse as o where o.releaseUser.id =:releaseUserId order by o.name"),
55
    @NamedQuery(name = "Dataverse.filterByAlias", query="SELECT dv FROM Dataverse dv WHERE LOWER(dv.alias) LIKE :alias order by dv.alias"),
56
    @NamedQuery(name = "Dataverse.filterByAliasNameAffiliation", query="SELECT dv FROM Dataverse dv WHERE (LOWER(dv.alias) LIKE :alias) OR (LOWER(dv.name) LIKE :name) OR (LOWER(dv.affiliation) LIKE :affiliation) order by dv.alias"),
57
    @NamedQuery(name = "Dataverse.filterByName", query="SELECT dv FROM Dataverse dv WHERE LOWER(dv.name) LIKE :name  order by dv.alias")
58
})
59
@Entity
60
@Table(indexes = {@Index(columnList="defaultcontributorrole_id")
61
                , @Index(columnList="defaulttemplate_id")
62
                , @Index(columnList="alias")
63
                , @Index(columnList="affiliation")
64
                , @Index(columnList="dataversetype")
65
                , @Index(columnList="facetroot")
66
                , @Index(columnList="guestbookroot")
67
                , @Index(columnList="metadatablockroot")
68
                , @Index(columnList="templateroot")
69
                , @Index(columnList="permissionroot")
70
                , @Index(columnList="themeroot")})
71
public class Dataverse extends DvObjectContainer {
72

73
    public enum DataverseType {
1✔
74
        RESEARCHERS, RESEARCH_PROJECTS, JOURNALS, ORGANIZATIONS_INSTITUTIONS, TEACHING_COURSES, UNCATEGORIZED, LABORATORY, RESEARCH_GROUP, DEPARTMENT
1✔
75
    };
76
    
77
    private static final long serialVersionUID = 1L;
78

79
    @NotBlank(message = "{dataverse.name}")
80
    @Column( nullable = false )
81
    private String name;
82

83
    /**
84
     * @todo add @Column(nullable = false) for the database to enforce non-null
85
     */
86
    @NotBlank(message = "{dataverse.alias}")
87
    @Column(nullable = false, unique=true)
88
    @Size(max = 60, message = "{dataverse.aliasLength}")
89
    @Pattern.List({@Pattern(regexp = "[a-zA-Z0-9\\_\\-]*", message = "{dataverse.nameIllegalCharacters}"),
90
        @Pattern(regexp=".*\\D.*", message="{dataverse.aliasNotnumber}")})
91
    private String alias;
92

93
    @Column(name = "description", columnDefinition = "TEXT")
94
    private String description;
95

96
    @Enumerated(EnumType.STRING)
97
    @NotNull(message = "{dataverse.category}")
98
    @Column( nullable = false )
99
    private DataverseType dataverseType;
100
       
101
    /**
102
     * When {@code true}, users are not granted permissions the got for parent
103
     * dataverses.
104
     */
105
    protected boolean permissionRoot;
106
    
107
    public Dataverse() {
1✔
108
        StorageUse storageUse = new StorageUse(this); 
1✔
109
        this.setStorageUse(storageUse);
1✔
110
    }
1✔
111
    
112
    public DataverseType getDataverseType() {
113
        return dataverseType;
1✔
114
    }
115

116
    public void setDataverseType(DataverseType dataverseType) {
117
        this.dataverseType = dataverseType;
1✔
118
    }
1✔
119

120
    public String getFriendlyCategoryName(){
UNCOV
121
        String key = getFriendlyCategoryKey();
×
UNCOV
122
        return BundleUtil.getStringFromBundle(key);
×
123
    }
124

125
    public String getFriendlyCategoryKey(){
126
        switch (this.dataverseType) {
1✔
127
            case RESEARCHERS:
UNCOV
128
                return  ("dataverse.type.selectTab.researchers");
×
129
            case RESEARCH_PROJECTS:
UNCOV
130
                return  ("dataverse.type.selectTab.researchProjects" );
×
131
            case JOURNALS:
UNCOV
132
                return  ("dataverse.type.selectTab.journals" );
×
133
            case ORGANIZATIONS_INSTITUTIONS:
UNCOV
134
                return  ("dataverse.type.selectTab.organizationsAndInsitutions" );
×
135
            case TEACHING_COURSES:
UNCOV
136
                return  ("dataverse.type.selectTab.teachingCourses" );
×
137
            case LABORATORY:
UNCOV
138
                return  ("dataverse.type.selectTab.laboratory");
×
139
            case RESEARCH_GROUP:
UNCOV
140
                return  ("dataverse.type.selectTab.researchGroup" );
×
141
            case DEPARTMENT:
UNCOV
142
                return  ("dataverse.type.selectTab.department" );
×
143
            case UNCATEGORIZED:
144
                return ("dataverse.type.selectTab.uncategorized");
1✔
145
            default:
146
                return "";
×
147
        }
148
    }
149

150

151
    public String getIndexableCategoryName() {
152
        String key = getFriendlyCategoryKey();
1✔
153
        if (key.equals("dataverse.type.selectTab.uncategorized")) {
1✔
154
            return null;
1✔
155
        } else {
156
            return BundleUtil.getStringFromDefaultBundle(key);
×
157
        }
158
    }
159

160
    private String affiliation;
161
    
162
    ///private String storageDriver=null;
163

164
        // Note: We can't have "Remove" here, as there are role assignments that refer
165
    //       to this role. So, adding it would mean violating a forign key contstraint.
166
    @OneToMany(cascade = {CascadeType.MERGE},
167
            fetch = FetchType.LAZY,
168
            mappedBy = "owner")
169
    private Set<DataverseRole> roles;
170
    
171
    @ManyToOne
172
    @JoinColumn(nullable = true)
173
    private DataverseRole defaultContributorRole;
174

175
    public DataverseRole getDefaultContributorRole() {
176
        return defaultContributorRole;
1✔
177
    }
178

179
    public void setDefaultContributorRole(DataverseRole defaultContributorRole) {
180
        this.defaultContributorRole = defaultContributorRole;
1✔
181
    }
1✔
182
   
183
    private boolean metadataBlockRoot;
184
    private boolean facetRoot;
185
    // By default, themeRoot should be true, as new dataverses should start with the default theme
186
    private boolean themeRoot = true;
1✔
187
    private boolean templateRoot;    
188

189
    
190
    @OneToOne(mappedBy = "dataverse",cascade={ CascadeType.REMOVE, CascadeType.MERGE,CascadeType.PERSIST}, orphanRemoval=true)
191
      private DataverseTheme dataverseTheme;
192

193
    @OneToMany(mappedBy = "dataverse",cascade={ CascadeType.REMOVE, CascadeType.MERGE,CascadeType.PERSIST}, orphanRemoval=true)
1✔
194
    @OrderBy("displayOrder")
195
    @NotEmpty(message="At least one contact is required.")
196
    private List<DataverseContact> dataverseContacts = new ArrayList<>();
197
    
198
    @ManyToMany(cascade = {CascadeType.MERGE})
1✔
199
    private List<MetadataBlock> metadataBlocks = new ArrayList<>();
200

201
    @OneToMany(mappedBy = "dataverse",cascade={ CascadeType.REMOVE, CascadeType.MERGE,CascadeType.PERSIST}, orphanRemoval=true)
1✔
202
    @OrderBy("displayOrder")
203
    private List<DataverseFacet> dataverseFacets = new ArrayList<>();
204
    
205
    @ManyToMany(cascade = {CascadeType.MERGE})
1✔
206
    @JoinTable(name = "dataverse_citationDatasetFieldTypes",
207
    joinColumns = @JoinColumn(name = "dataverse_id"),
208
    inverseJoinColumns = @JoinColumn(name = "citationdatasetfieldtype_id"))
209
    private List<DatasetFieldType> citationDatasetFieldTypes = new ArrayList<>();
210
    
211
    @ManyToMany
212
    @JoinTable(name = "dataversesubjects",
213
    joinColumns = @JoinColumn(name = "dataverse_id"),
214
    inverseJoinColumns = @JoinColumn(name = "controlledvocabularyvalue_id"))
215
    private Set<ControlledVocabularyValue> dataverseSubjects;
216
    
217
    @OneToMany(mappedBy="dataverse", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
218
    private List<DataverseFeaturedDataverse> dataverseFeaturedDataverses;
219

220
    public List<DataverseFeaturedDataverse> getDataverseFeaturedDataverses() {
221
        return dataverseFeaturedDataverses;
1✔
222
    }
223

224
    public void setDataverseFeaturedDataverses(List<DataverseFeaturedDataverse> dataverseFeaturedDataverses) {
225
        this.dataverseFeaturedDataverses = dataverseFeaturedDataverses;
×
226
    }
×
227
    
228
    @OneToMany(mappedBy="featuredDataverse", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
229
    private List<DataverseFeaturedDataverse> dataverseFeaturingDataverses;
230

231
    public List<DataverseFeaturedDataverse> getDataverseFeaturingDataverses() {
232
        return dataverseFeaturingDataverses;
×
233
    }
234

235
    public void setDataverseFeaturingDataverses(List<DataverseFeaturedDataverse> dataverseFeaturingDataverses) {
236
        this.dataverseFeaturingDataverses = dataverseFeaturingDataverses;
×
237
    }
×
238
    
239
    @OneToMany(mappedBy="dataverse", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
240
    private List<DataverseLinkingDataverse> dataverseLinkingDataverses;
241

242
    public List<DataverseLinkingDataverse> getDataverseLinkingDataverses() {
243
        return dataverseLinkingDataverses;
1✔
244
    }
245

246
    public void setDataverseLinkingDataverses(List<DataverseLinkingDataverse> dataverseLinkingDataverses) {
247
        this.dataverseLinkingDataverses = dataverseLinkingDataverses;
×
248
    }
×
249
       
250
    @OneToMany(mappedBy="linkingDataverse", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
251
    private List<DataverseLinkingDataverse> dataverseLinkedDataverses;
252

253
    public List<DataverseLinkingDataverse> getDataverseLinkedDataverses() {
254
        return dataverseLinkedDataverses;
×
255
    }
256

257
    public void setDataverseLinkedDataverses(List<DataverseLinkingDataverse> dataverseLinkedDataverses) {
258
        this.dataverseLinkedDataverses = dataverseLinkedDataverses;
×
259
    }
×
260
    
261
    @OneToMany(mappedBy="linkingDataverse", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
262
    private List<DatasetLinkingDataverse> datasetLinkingDataverses;
263

264
    public List<DatasetLinkingDataverse> getDatasetLinkingDataverses() {
265
        return datasetLinkingDataverses;
1✔
266
    }
267

268
    public void setDatasetLinkingDataverses(List<DatasetLinkingDataverse> datasetLinkingDataverses) {
269
        this.datasetLinkingDataverses = datasetLinkingDataverses;
×
270
    }
×
271
        
272
    public Set<ControlledVocabularyValue> getDataverseSubjects() {
273
        return dataverseSubjects;
×
274
    }
275

276
    public void setDataverseSubjects(Set<ControlledVocabularyValue> dataverseSubjects) {
277
        this.dataverseSubjects = dataverseSubjects;
×
278
    }
×
279

280
    
281
    @OneToMany(mappedBy = "dataverse")
1✔
282
    private List<DataverseFieldTypeInputLevel> dataverseFieldTypeInputLevels = new ArrayList<>();
283
    
284
    @ManyToOne
285
    @JoinColumn(nullable = true)
286
    private Template defaultTemplate;  
287
    
288
    @OneToMany(mappedBy = "definitionPoint", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
289
    private List<SavedSearch> savedSearches;
290

291
    public List<SavedSearch> getSavedSearches() {
292
        return savedSearches;
×
293
    }
294

295
    public void setSavedSearches(List<SavedSearch> savedSearches) {
296
        this.savedSearches = savedSearches;
×
297
    }
×
298
    
299
    @OneToMany(mappedBy="dataverse", cascade = {CascadeType.MERGE, CascadeType.REMOVE})
300
    private List<Template> templates; 
301
    
302
    @OneToMany(mappedBy="dataverse", cascade = {CascadeType.MERGE, CascadeType.REMOVE})
303
    private List<Guestbook> guestbooks;
304
        
305
    public List<Guestbook> getGuestbooks() {
306
        return guestbooks;
1✔
307
    }
308

309
    public void setGuestbooks(List<Guestbook> guestbooks) {
310
        this.guestbooks = guestbooks;
1✔
311
    } 
1✔
312
    
313
    
314
    @OneToMany (mappedBy="dataverse", cascade={CascadeType.MERGE, CascadeType.REMOVE})
315
    private List<HarvestingClient> harvestingClientConfigs;
316

317
    public List<HarvestingClient> getHarvestingClientConfigs() {
318
        return this.harvestingClientConfigs;
×
319
    }
320

321
    public void setHarvestingClientConfigs(List<HarvestingClient> harvestingClientConfigs) {
322
        this.harvestingClientConfigs = harvestingClientConfigs;
×
323
    }
×
324
    /*
325
    public boolean isHarvested() {
326
        return harvestingClient != null; 
327
    }
328
    */
329
    private boolean metadataBlockFacetRoot;
330

331
    public boolean isMetadataBlockFacetRoot() {
332
        return metadataBlockFacetRoot;
1✔
333
    }
334

335
    public void setMetadataBlockFacetRoot(boolean metadataBlockFacetRoot) {
336
        this.metadataBlockFacetRoot = metadataBlockFacetRoot;
1✔
337
    }
1✔
338

339
    @OneToMany(mappedBy = "dataverse",cascade={ CascadeType.REMOVE, CascadeType.MERGE,CascadeType.PERSIST }, orphanRemoval=true)
1✔
340
    private List<DataverseMetadataBlockFacet> metadataBlockFacets = new ArrayList<>();
341

342
    public List<DataverseMetadataBlockFacet> getMetadataBlockFacets() {
343
        if (isMetadataBlockFacetRoot() || getOwner() == null) {
1✔
344
            return metadataBlockFacets;
1✔
345
        } else {
346
            return getOwner().getMetadataBlockFacets();
1✔
347
        }
348
    }
349

350
    public void setMetadataBlockFacets(List<DataverseMetadataBlockFacet> metadataBlockFacets) {
351
        this.metadataBlockFacets = metadataBlockFacets;
1✔
352
    }
1✔
353

354
    public List<Guestbook> getParentGuestbooks() {
355
        List<Guestbook> retList = new ArrayList<>();
1✔
356
        Dataverse testDV = this;
1✔
357
        while (testDV.getOwner() != null){   
1✔
358
           retList.addAll(testDV.getOwner().getGuestbooks());          
1✔
359
           if(testDV.getOwner().guestbookRoot){               
1✔
360
               break;
×
361
           }           
362
           testDV = testDV.getOwner();
1✔
363
        }
364
            return  retList;
1✔
365
    }
366
    
367
    public List<Guestbook> getAvailableGuestbooks() {
368
        //get all guestbooks
369
        List<Guestbook> retList = new ArrayList<>();
×
370
        Dataverse testDV = this;
×
371
        List<Guestbook> allGbs = new ArrayList<>();
×
372
        if (!this.guestbookRoot){
×
373
                    while (testDV.getOwner() != null){   
×
374
          
375
                allGbs.addAll(testDV.getOwner().getGuestbooks());
×
376
                if (testDV.getOwner().isGuestbookRoot()) {
×
377
                    break;
×
378
                }
379
                testDV = testDV.getOwner();
×
380
            }
381
        }
382

383
        allGbs.addAll(this.getGuestbooks());
×
384
        //then only display them if they are enabled
385
        for (Guestbook gbt : allGbs) {
×
386
            if (gbt.isEnabled()) {
×
387
                retList.add(gbt);
×
388
            }
389
        }
×
390
            return  retList;
×
391
        
392
    }
393
    
394
    private boolean guestbookRoot;
395
    
396
    public boolean isGuestbookRoot() {
397
        return guestbookRoot;
1✔
398
    }
399

400
    public void setGuestbookRoot(boolean guestbookRoot) {
401
        this.guestbookRoot = guestbookRoot;
1✔
402
    } 
1✔
403
    
404
    
405
    public void setDataverseFieldTypeInputLevels(List<DataverseFieldTypeInputLevel> dataverseFieldTypeInputLevels) {
406
        this.dataverseFieldTypeInputLevels = dataverseFieldTypeInputLevels;
×
407
    }
×
408

409
    public List<DataverseFieldTypeInputLevel> getDataverseFieldTypeInputLevels() {
410
        return dataverseFieldTypeInputLevels;
1✔
411
    }
412

413
    public boolean isDatasetFieldTypeRequiredAsInputLevel(Long datasetFieldTypeId) {
414
        return dataverseFieldTypeInputLevels.stream()
×
415
                .anyMatch(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId) && inputLevel.isRequired());
×
416
    }
417

418
    public boolean isDatasetFieldTypeIncludedAsInputLevel(Long datasetFieldTypeId) {
419
        return dataverseFieldTypeInputLevels.stream()
×
420
                .anyMatch(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId) && inputLevel.isInclude());
×
421
    }
422

423
    public boolean isDatasetFieldTypeInInputLevels(Long datasetFieldTypeId) {
424
        return dataverseFieldTypeInputLevels.stream()
×
425
                .anyMatch(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId));
×
426
    }
427

428
    public Template getDefaultTemplate() {
429
        return defaultTemplate;
1✔
430
    }
431

432
    public void setDefaultTemplate(Template defaultTemplate) {
433
        this.defaultTemplate = defaultTemplate;
1✔
434
    }
1✔
435

436
    public List<Template> getTemplates() {
437
        return templates;
1✔
438
    }
439

440
    public void setTemplates(List<Template> templates) {
441
        this.templates = templates;
1✔
442
    }
1✔
443

444
    public List<Template> getParentTemplates() {
445
        List<Template> retList = new ArrayList<>();
1✔
446
        Dataverse testDV = this;
1✔
447
        while (testDV.getOwner() != null){   
1✔
448
            
449
           if (!testDV.getMetadataBlocks().equals(testDV.getOwner().getMetadataBlocks())){
1✔
450
               break;
×
451
           }           
452
           retList.addAll(testDV.getOwner().getTemplates());
1✔
453
           
454
           if(testDV.getOwner().templateRoot){               
1✔
455
               break;
×
456
           }           
457
           testDV = testDV.getOwner();
1✔
458
        }
459
            return  retList;
1✔
460
    }
461
    
462
    public boolean isThemeRoot() {
463
        return themeRoot;
1✔
464
    }
465
    
466
    public boolean getThemeRoot() {
467
        return themeRoot;
×
468
    }
469

470
    public void setThemeRoot(boolean  themeRoot) {
471
        this.themeRoot = themeRoot;
×
472
    }
×
473
    
474
    public boolean isTemplateRoot() {
475
        return templateRoot;
1✔
476
    }
477

478
    public void setTemplateRoot(boolean templateRoot) {
479
        this.templateRoot = templateRoot;
1✔
480
    }
1✔
481

482
    public List<MetadataBlock> getMetadataBlocks() {
483
        return getMetadataBlocks(false);
1✔
484
    }
485

486
    public List<MetadataBlock> getMetadataBlocks(boolean returnActualDB) {
487
        if (returnActualDB || metadataBlockRoot || getOwner() == null) {
1✔
488
            return metadataBlocks;
1✔
489
        } else {
490
            return getOwner().getMetadataBlocks();
1✔
491
        }
492
    }
493
    
494
    public Long getMetadataRootId(){
495
        if(metadataBlockRoot || getOwner() == null){
×
496
            return this.getId();
×
497
        } else { 
498
            return getOwner().getMetadataRootId();
×
499
        }
500
    }
501

502
    
503
    public DataverseTheme getDataverseTheme() {
504
        return getDataverseTheme(false);
1✔
505
    }
506

507
    public DataverseTheme getDataverseTheme(boolean returnActualDB) {
508
        if (returnActualDB || themeRoot || getOwner() == null) {
1✔
509
            return dataverseTheme;
1✔
510
        } else {
511
            return getOwner().getDataverseTheme();
×
512
        }
513
    }
514
    
515
    public String getGuestbookRootDataverseName() {
516
        Dataverse testDV = this;
×
517
        String retName = "Parent";
×
518
        while (testDV.getOwner() != null) {
×
519
            retName = testDV.getOwner().getDisplayName();
×
520
            if (testDV.getOwner().guestbookRoot) {
×
521
                break;
×
522
            }
523
            testDV = testDV.getOwner();
×
524
        }
525
        return retName;
×
526
    }
527

528
    public String getTemplateRootDataverseName() {
529
        Dataverse testDV = this;
×
530
        String retName = "Parent";
×
531
        while (testDV.getOwner() != null) {
×
532
            retName = testDV.getOwner().getDisplayName();
×
533
            if (testDV.getOwner().templateRoot) {
×
534
                break;
×
535
            }
536
            testDV = testDV.getOwner();
×
537
        }
538
        return retName;
×
539
    }
540

541
    public String getThemeRootDataverseName() {
542
        Dataverse testDV = this;
×
543
        String retName = "Parent";
×
544
        while (testDV.getOwner() != null) {
×
545
            retName = testDV.getOwner().getDisplayName();
×
546
            if (testDV.getOwner().themeRoot) {
×
547
                break;
×
548
            }
549
            testDV = testDV.getOwner();
×
550
        }
551
        return retName;
×
552
    }
553

554
    public String getMetadataRootDataverseName() {
555
        Dataverse testDV = this;
×
556
        String retName = "Parent";
×
557
        while (testDV.getOwner() != null) {
×
558
            retName = testDV.getOwner().getDisplayName();
×
559
            if (testDV.getOwner().metadataBlockRoot) {
×
560
                break;
×
561
            }
562
            testDV = testDV.getOwner();
×
563
        }
564
        return retName;
×
565
    }
566
    
567
    public String getFacetRootDataverseName() {
568
        Dataverse testDV = this;
×
569
        String retName = "Parent";
×
570
        while (testDV.getOwner() != null) {
×
571
            retName = testDV.getOwner().getDisplayName();
×
572
            if (testDV.getOwner().facetRoot) {
×
573
                break;
×
574
            }
575
            testDV = testDV.getOwner();
×
576
        }
577
        return retName;
×
578
    }
579
        
580
    
581
    public String getLogoOwnerId() {
582
        
583
        if (themeRoot || getOwner()==null) {
×
584
            return this.getId().toString();
×
585
        } else {
586
            return getOwner().getId().toString();
×
587
        }
588
    } 
589
    
590
    public void setDataverseTheme(DataverseTheme dataverseTheme) {
591
        this.dataverseTheme=dataverseTheme;
1✔
592
    }
1✔
593

594
    public void setMetadataBlocks(List<MetadataBlock> metadataBlocks) {
595
        this.metadataBlocks = new ArrayList<>(metadataBlocks);
1✔
596
    }
1✔
597

598
    public List<DatasetFieldType> getCitationDatasetFieldTypes() {
599
        return citationDatasetFieldTypes;
1✔
600
    }
601

602
    public void setCitationDatasetFieldTypes(List<DatasetFieldType> citationDatasetFieldTypes) {
603
        this.citationDatasetFieldTypes = citationDatasetFieldTypes;
×
604
    }
×
605
    
606
    /**
607
     * @Note: this setting is Nullable, with {@code null} indicating that the 
608
     * desired behavior is not explicitly configured for this specific collection. 
609
     * See the comment below. 
610
     */
611
    @Column(nullable = true)
612
    private Boolean filePIDsEnabled;
613

614
    /**
615
     * Specifies whether the PIDs for Datafiles should be registered when publishing 
616
     * datasets in this Collection, if the behavior is explicitly configured.
617
     * @return {@code Boolean.TRUE} if explicitly enabled, {@code Boolean.FALSE} if explicitly disabled. 
618
     * {@code null} indicates that the behavior is not explicitly defined, in which 
619
     * case the behavior should follow the explicit configuration of the first 
620
     * direct ancestor collection, or the instance-wide configuration, if none 
621
     * present. 
622
     * @Note: If present, this configuration therefore by default applies to all 
623
     * the sub-collections, unless explicitly overwritten there.
624
     * @author landreev
625
     */
626
    public Boolean getFilePIDsEnabled() {
627
        return filePIDsEnabled;
1✔
628
    }
629
    
630
    public void setFilePIDsEnabled(boolean filePIDsEnabled) {
631
        this.filePIDsEnabled = filePIDsEnabled;
×
632
    }
×
633
    
634
    public List<DataverseFacet> getDataverseFacets() {
635
        return getDataverseFacets(false);
×
636
    }
637

638
    public List<DataverseFacet> getDataverseFacets(boolean returnActualDB) {
639
        if (returnActualDB || facetRoot || getOwner() == null) {
×
640
            return dataverseFacets;
×
641
        } else {
642
            return getOwner().getDataverseFacets();
×
643
        }
644
    }
645
     
646
    public Long getFacetRootId(){
647
        if(facetRoot || getOwner() == null){
×
648
            return this.getId();
×
649
        } else { 
650
            return getOwner().getFacetRootId();
×
651
        }        
652
    }
653

654
    public void setDataverseFacets(List<DataverseFacet> dataverseFacets) {
655
        this.dataverseFacets = dataverseFacets;
×
656
    }
×
657
    
658
    public List<DataverseContact> getDataverseContacts() {
659
        return dataverseContacts;
1✔
660
    }
661
    
662
    /**
663
     * Get the email addresses of the dataverse contacts as a comma-separated
664
     * concatenation.
665
     * @return a comma-separated concatenation of email addresses, or the empty
666
     *  string if there are no contacts.
667
     * @author bencomp
668
     */
669
    public String getContactEmails() {
670
        if (dataverseContacts != null && !dataverseContacts.isEmpty()) {
1✔
671
            StringBuilder buf = new StringBuilder();
1✔
672
            Iterator<DataverseContact> it = dataverseContacts.iterator();
1✔
673
            while (it.hasNext()) {
1✔
674
                DataverseContact con = it.next();
1✔
675
                buf.append(con.getContactEmail());
1✔
676
                if (it.hasNext()) {
1✔
677
                    buf.append(",");
1✔
678
                }
679
            }
1✔
680
            return buf.toString();
1✔
681
        } else {
682
            return "";
1✔
683
        }
684
    }
685

686
    public void setDataverseContacts(List<DataverseContact> dataverseContacts) {
687
        this.dataverseContacts = dataverseContacts;
1✔
688
    }
1✔
689
    
690
    public void addDataverseContact(int index) {
691
        dataverseContacts.add(index, new DataverseContact(this));
×
692
    }
×
693

694
    public void removeDataverseContact(int index) {
695
        dataverseContacts.remove(index);
×
696
    }
×
697

698
    public String getName() {
699
        return name;
1✔
700
    }
701

702
    public void setName(String name) {
703
        this.name = name;
1✔
704
    }
1✔
705

706
    public String getAlias() {
707
        return alias;
1✔
708
    }
709

710
    public void setAlias(String alias) {
711
        this.alias = alias;
1✔
712
    }
1✔
713

714
    public String getDescription() {
715
        return description;
1✔
716
    }
717

718
    public void setDescription(String description) {
719
        this.description = description;
1✔
720
    }
1✔
721

722
    public String getAffiliation() {
723
        return affiliation;
1✔
724
    }
725

726
    public void setAffiliation(String affiliation) {
727
        this.affiliation = affiliation;
1✔
728
    }
1✔
729

730
    public boolean isMetadataBlockRoot() {
731
        return metadataBlockRoot;
1✔
732
    }
733

734
    public void setMetadataBlockRoot(boolean metadataBlockRoot) {
735
        this.metadataBlockRoot = metadataBlockRoot;
1✔
736
    }
1✔
737

738
    public boolean isFacetRoot() {
739
        return facetRoot;
1✔
740
    }
741

742
    public void setFacetRoot(boolean facetRoot) {
743
        this.facetRoot = facetRoot;
1✔
744
    }
1✔
745

746

747
    public void addRole(DataverseRole role) {
748
        role.setOwner(this);
1✔
749
        if ( roles == null ) {
1✔
750
            roles = new HashSet<>();
1✔
751
        }
752
        roles.add(role);
1✔
753
    }
1✔
754
    
755
    /**
756
     * Note: to add a role, use {@link #addRole(edu.harvard.iq.dataverse.authorization.DataverseRole)},
757
     * do not call this method and try to add directly to the list. 
758
     * @return the roles defined in this Dataverse.
759
     */
760
    public Set<DataverseRole> getRoles() {
761
        if ( roles == null ) {
×
762
            roles = new HashSet<>();
×
763
        }
764
        return roles;
×
765
    }
766
    
767
    public List<Dataverse> getOwners() {
768
        List<Dataverse> owners = new ArrayList<>();
1✔
769
        if (getOwner() != null) {
1✔
770
            owners.addAll(getOwner().getOwners());
1✔
771
            owners.add(getOwner());
1✔
772
        }
773
        return owners;
1✔
774
    }
775

776
    @Override
777
    public boolean equals(Object object) {
778
        // TODO: Warning - this method won't work in the case the id fields are not set
779
        if (!(object instanceof Dataverse)) {
1✔
780
            return false;
1✔
781
        }
782
        Dataverse other = (Dataverse) object;
1✔
783
        return Objects.equals(getId(), other.getId());
1✔
784
    }
785

786
    @Override
787
    protected String toStringExtras() {
788
        return "name:" + getName();
1✔
789
    }
790

791
    @Override
792
    public <T> T accept(Visitor<T> v) {
793
        return v.visit(this);
×
794
    }
795

796
    /**
797
     * @todo implement in https://github.com/IQSS/dataverse/issues/551
798
     */
799
    public String getDepositTermsOfUse() {
800
        return "Dataverse Deposit Terms of Use will be implemented in https://github.com/IQSS/dataverse/issues/551";
×
801
    }
802
    
803
    @Override
804
    public String getDisplayName() {
805
        return getName();
1✔
806
    }
807
    
808
    @Override
809
    public String getCurrentName() {
810
        return getName();
×
811
    }
812
    
813
    @Override
814
    public boolean isPermissionRoot() {
815
        return permissionRoot;
1✔
816
    }
817

818
    public void setPermissionRoot(boolean permissionRoot) {
819
        this.permissionRoot = permissionRoot;
1✔
820
    }
1✔
821
      
822
    @Override
823
    public boolean isAncestorOf( DvObject other ) {
824
        while ( other != null ) {
1✔
825
            if ( equals(other) ) {
1✔
826
                return true;
1✔
827
            }
828
            other = other.getOwner();
1✔
829
        }
830
        return false;
1✔
831
    }
832
    
833
    public String getLocalURL() {
834
        return  SystemConfig.getDataverseSiteUrlStatic() + "/dataverse/" + this.getAlias();
×
835
    }
836

837
    public void addInputLevelsMetadataBlocksIfNotPresent(List<DataverseFieldTypeInputLevel> inputLevels) {
838
        for (DataverseFieldTypeInputLevel inputLevel : inputLevels) {
1✔
839
            MetadataBlock inputLevelMetadataBlock = inputLevel.getDatasetFieldType().getMetadataBlock();
1✔
840
            if (!hasMetadataBlock(inputLevelMetadataBlock)) {
1✔
841
                metadataBlocks.add(inputLevelMetadataBlock);
1✔
842
            }
843
        }
1✔
844
    }
1✔
845

846
    private boolean hasMetadataBlock(MetadataBlock metadataBlock) {
847
        return metadataBlocks.stream().anyMatch(block -> block.getId().equals(metadataBlock.getId()));
1✔
848
    }
849
}
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

© 2025 Coveralls, Inc