comparison src/main/java/edu/harvard/iq/dataverse/Dataverse.java @ 10:a50cf11e5178

Rewrite LGDataverse completely upgrading to dataverse4.0
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 08 Sep 2015 17:00:21 +0200
parents
children
comparison
equal deleted inserted replaced
9:5926d6419569 10:a50cf11e5178
1 package edu.harvard.iq.dataverse;
2
3 import edu.harvard.iq.dataverse.authorization.DataverseRole;
4 import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch;
5 import java.util.ArrayList;
6 import java.util.List;
7 import java.util.Objects;
8 import java.util.Set;
9 import javax.persistence.CascadeType;
10 import javax.persistence.Column;
11 import javax.persistence.Entity;
12 import javax.persistence.EnumType;
13 import javax.persistence.Enumerated;
14 import javax.persistence.FetchType;
15 import javax.persistence.JoinColumn;
16 import javax.persistence.JoinTable;
17 import javax.persistence.ManyToMany;
18 import javax.persistence.ManyToOne;
19 import javax.persistence.NamedQueries;
20 import javax.persistence.NamedQuery;
21 import javax.persistence.OneToMany;
22 import javax.persistence.OneToOne;
23 import javax.persistence.OrderBy;
24 import javax.persistence.Transient;
25 import javax.validation.constraints.NotNull;
26 import javax.validation.constraints.Pattern;
27 import javax.validation.constraints.Size;
28 import org.hibernate.validator.constraints.NotBlank;
29 import org.hibernate.validator.constraints.NotEmpty;
30
31 /**
32 *
33 * @author gdurand
34 * @author mbarsinai
35 */
36 @NamedQueries({
37 @NamedQuery(name = "Dataverse.ownedObjectsById", query = "SELECT COUNT(obj) FROM DvObject obj WHERE obj.owner.id=:id")
38 })
39 @Entity
40 public class Dataverse extends DvObjectContainer {
41
42 public enum DataverseType {
43 RESEARCHERS, RESEARCH_PROJECTS, JOURNALS, ORGANIZATIONS_INSTITUTIONS, TEACHING_COURSES, UNCATEGORIZED
44 };
45
46 private static final long serialVersionUID = 1L;
47
48 @NotBlank(message = "Please enter a name.")
49 @Column( nullable = false )
50 private String name;
51
52 /**
53 * @todo add @Column(nullable = false) for the database to enforce non-null
54 */
55 @NotBlank(message = "Please enter an alias.")
56 @Column(nullable = false, unique=true)
57 @Size(max = 60, message = "Alias must be at most 60 characters.")
58 @Pattern.List({@Pattern(regexp = "[a-zA-Z0-9\\_\\-]*", message = "Found an illegal character(s). Valid characters are a-Z, 0-9, '_', and '-'."),
59 @Pattern(regexp=".*\\D.*", message="Alias should not be a number")})
60 private String alias;
61
62 @Column(name = "description", columnDefinition = "TEXT")
63 private String description;
64
65 @Enumerated(EnumType.STRING)
66 @NotNull(message = "Please select a category for your dataverse.")
67 @Column( nullable = false )
68 private DataverseType dataverseType;
69
70 /**
71 * When {@code true}, users are not granted permissions the got for parent
72 * dataverses.
73 */
74 protected boolean permissionRoot;
75
76
77 public DataverseType getDataverseType() {
78 return dataverseType;
79 }
80
81 public void setDataverseType(DataverseType dataverseType) {
82 this.dataverseType = dataverseType;
83 }
84
85 @Transient
86 private final String uncategorizedString = "Uncategorized";
87
88 /**
89 * @todo Don't hard code these as English.
90 */
91 public String getFriendlyCategoryName(){
92 switch (this.dataverseType) {
93 case RESEARCHERS:
94 return "Researcher";
95 case RESEARCH_PROJECTS:
96 return "Research Project";
97 case JOURNALS:
98 return "Journal";
99 case ORGANIZATIONS_INSTITUTIONS:
100 return "Organization or Institution";
101 case TEACHING_COURSES:
102 return "Teaching Course";
103 case UNCATEGORIZED:
104 return uncategorizedString;
105 default:
106 return "";
107 }
108 }
109
110 public String getIndexableCategoryName() {
111 String friendlyName = getFriendlyCategoryName();
112 if (friendlyName.equals(uncategorizedString)) {
113 return null;
114 } else {
115 return friendlyName;
116 }
117 }
118
119 private String affiliation;
120
121 // Note: We can't have "Remove" here, as there are role assignments that refer
122 // to this role. So, adding it would mean violating a forign key contstraint.
123 @OneToMany(cascade = {CascadeType.MERGE},
124 fetch = FetchType.LAZY,
125 mappedBy = "owner")
126 private Set<DataverseRole> roles;
127
128 @ManyToOne
129 @JoinColumn(nullable = false)
130 private DataverseRole defaultContributorRole;
131
132 public DataverseRole getDefaultContributorRole() {
133 return defaultContributorRole;
134 }
135
136 public void setDefaultContributorRole(DataverseRole defaultContributorRole) {
137 this.defaultContributorRole = defaultContributorRole;
138 }
139
140 private boolean metadataBlockRoot;
141 private boolean facetRoot;
142 private boolean themeRoot;
143 private boolean templateRoot;
144
145
146 @OneToOne(mappedBy = "dataverse",cascade={ CascadeType.REMOVE, CascadeType.MERGE,CascadeType.PERSIST}, orphanRemoval=true)
147 private DataverseTheme dataverseTheme;
148
149 @OneToMany(mappedBy = "dataverse",cascade={ CascadeType.REMOVE, CascadeType.MERGE,CascadeType.PERSIST}, orphanRemoval=true)
150 @OrderBy("displayOrder")
151 @NotEmpty(message="At least one contact is required.")
152 private List<DataverseContact> dataverseContacts = new ArrayList();
153
154 @ManyToMany(cascade = {CascadeType.MERGE})
155 private List<MetadataBlock> metadataBlocks = new ArrayList();
156
157 @OneToMany(mappedBy = "dataverse",cascade={ CascadeType.REMOVE, CascadeType.MERGE,CascadeType.PERSIST}, orphanRemoval=true)
158 @OrderBy("displayOrder")
159 private List<DataverseFacet> dataverseFacets = new ArrayList();
160
161 @ManyToMany
162 @JoinTable(name = "dataversesubjects",
163 joinColumns = @JoinColumn(name = "dataverse_id"),
164 inverseJoinColumns = @JoinColumn(name = "controlledvocabularyvalue_id"))
165 private Set<ControlledVocabularyValue> dataverseSubjects;
166
167 @OneToMany(mappedBy="dataverse", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
168 private List<DataverseFeaturedDataverse> dataverseFeaturedDataverses;
169
170 public List<DataverseFeaturedDataverse> getDataverseFeaturedDataverses() {
171 return dataverseFeaturedDataverses;
172 }
173
174 public void setDataverseFeaturedDataverses(List<DataverseFeaturedDataverse> dataverseFeaturedDataverses) {
175 this.dataverseFeaturedDataverses = dataverseFeaturedDataverses;
176 }
177
178 @OneToMany(mappedBy="featuredDataverse", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
179 private List<DataverseFeaturedDataverse> dataverseFeaturingDataverses;
180
181 public List<DataverseFeaturedDataverse> getDataverseFeaturingDataverses() {
182 return dataverseFeaturingDataverses;
183 }
184
185 public void setDataverseFeaturingDataverses(List<DataverseFeaturedDataverse> dataverseFeaturingDataverses) {
186 this.dataverseFeaturingDataverses = dataverseFeaturingDataverses;
187 }
188
189 @OneToMany(mappedBy="dataverse", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
190 private List<DataverseLinkingDataverse> dataverseLinkingDataverses;
191
192 public List<DataverseLinkingDataverse> getDataverseLinkingDataverses() {
193 return dataverseLinkingDataverses;
194 }
195
196 public void setDataverseLinkingDataverses(List<DataverseLinkingDataverse> dataverseLinkingDataverses) {
197 this.dataverseLinkingDataverses = dataverseLinkingDataverses;
198 }
199
200 @OneToMany(mappedBy="linkingDataverse", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
201 private List<DataverseLinkingDataverse> dataverseLinkedDataverses;
202
203 public List<DataverseLinkingDataverse> getDataverseLinkedDataverses() {
204 return dataverseLinkedDataverses;
205 }
206
207 public void setDataverseLinkedDataverses(List<DataverseLinkingDataverse> dataverseLinkedDataverses) {
208 this.dataverseLinkedDataverses = dataverseLinkedDataverses;
209 }
210
211 @OneToMany(mappedBy="linkingDataverse", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
212 private List<DatasetLinkingDataverse> datasetLinkingDataverses;
213
214 public List<DatasetLinkingDataverse> getDatasetLinkingDataverses() {
215 return datasetLinkingDataverses;
216 }
217
218 public void setDatasetLinkingDataverses(List<DatasetLinkingDataverse> datasetLinkingDataverses) {
219 this.datasetLinkingDataverses = datasetLinkingDataverses;
220 }
221
222 public Set<ControlledVocabularyValue> getDataverseSubjects() {
223 return dataverseSubjects;
224 }
225
226 public void setDataverseSubjects(Set<ControlledVocabularyValue> dataverseSubjects) {
227 this.dataverseSubjects = dataverseSubjects;
228 }
229
230
231 @OneToMany(mappedBy = "dataverse")
232 private List<DataverseFieldTypeInputLevel> dataverseFieldTypeInputLevels = new ArrayList();
233
234 @ManyToOne
235 @JoinColumn(nullable = true)
236 private Template defaultTemplate;
237
238 @OneToMany(mappedBy = "definitionPoint", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
239 private List<SavedSearch> savedSearches;
240
241 public List<SavedSearch> getSavedSearches() {
242 return savedSearches;
243 }
244
245 public void setSavedSearches(List<SavedSearch> savedSearches) {
246 this.savedSearches = savedSearches;
247 }
248
249 @OneToMany(mappedBy="dataverse", cascade = {CascadeType.MERGE, CascadeType.REMOVE})
250 private List<Template> templates;
251
252 @OneToMany(mappedBy="dataverse", cascade = {CascadeType.MERGE, CascadeType.REMOVE})
253 private List<Guestbook> guestbooks;
254
255 public List<Guestbook> getGuestbooks() {
256 return guestbooks;
257 }
258
259 public void setGuestbooks(List<Guestbook> guestbooks) {
260 this.guestbooks = guestbooks;
261 }
262
263 @OneToOne (mappedBy="dataverse", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
264 private HarvestingDataverseConfig harvestingDataverseConfig;
265
266 public HarvestingDataverseConfig getHarvestingDataverseConfig() {
267 return this.harvestingDataverseConfig;
268 }
269
270 public void setHarvestingDataverseConfig(HarvestingDataverseConfig harvestingDataverseConfig) {
271 this.harvestingDataverseConfig = harvestingDataverseConfig;
272 }
273
274 public boolean isHarvested() {
275 return harvestingDataverseConfig != null;
276 }
277
278
279 public List<Guestbook> getParentGuestbooks() {
280 List<Guestbook> retList = new ArrayList();
281 Dataverse testDV = this;
282 while (testDV.getOwner() != null){
283 retList.addAll(testDV.getOwner().getGuestbooks());
284 if(testDV.getOwner().guestbookRoot){
285 break;
286 }
287 testDV = testDV.getOwner();
288 }
289 return retList;
290 }
291
292 public List<Guestbook> getAvailableGuestbooks() {
293 //get all guestbooks
294 List<Guestbook> retList = new ArrayList();
295 Dataverse testDV = this;
296 List<Guestbook> allGbs = new ArrayList();
297 if (!this.guestbookRoot){
298 while (testDV.getOwner() != null){
299
300 allGbs.addAll(testDV.getOwner().getGuestbooks());
301 if (testDV.getOwner().isGuestbookRoot()) {
302 break;
303 }
304 testDV = testDV.getOwner();
305 }
306 }
307
308 allGbs.addAll(this.getGuestbooks());
309 //then only display them if they are enabled
310 for (Guestbook gbt : allGbs) {
311 if (gbt.isEnabled()) {
312 retList.add(gbt);
313 }
314 }
315 return retList;
316
317 }
318
319 private boolean guestbookRoot;
320
321 public boolean isGuestbookRoot() {
322 return guestbookRoot;
323 }
324
325 public void setGuestbookRoot(boolean guestbookRoot) {
326 this.guestbookRoot = guestbookRoot;
327 }
328
329
330 public void setDataverseFieldTypeInputLevels(List<DataverseFieldTypeInputLevel> dataverseFieldTypeInputLevels) {
331 this.dataverseFieldTypeInputLevels = dataverseFieldTypeInputLevels;
332 }
333
334 public List<DataverseFieldTypeInputLevel> getDataverseFieldTypeInputLevels() {
335 return dataverseFieldTypeInputLevels;
336 }
337
338
339 public Template getDefaultTemplate() {
340 return defaultTemplate;
341 }
342
343 public void setDefaultTemplate(Template defaultTemplate) {
344 this.defaultTemplate = defaultTemplate;
345 }
346
347 public List<Template> getTemplates() {
348 return templates;
349 }
350
351 public void setTemplates(List<Template> templates) {
352 this.templates = templates;
353 }
354
355 public List<Template> getParentTemplates() {
356 List<Template> retList = new ArrayList();
357 Dataverse testDV = this;
358 while (testDV.getOwner() != null){
359
360 if (!testDV.getMetadataBlocks().equals(testDV.getOwner().getMetadataBlocks())){
361 break;
362 }
363 retList.addAll(testDV.getOwner().getTemplates());
364
365 if(testDV.getOwner().templateRoot){
366 break;
367 }
368 testDV = testDV.getOwner();
369 }
370 return retList;
371 }
372
373 public boolean isThemeRoot() {
374 return themeRoot;
375 }
376
377 public boolean getThemeRoot() {
378 return themeRoot;
379 }
380
381 public void setThemeRoot(boolean themeRoot) {
382 this.themeRoot = themeRoot;
383 }
384
385 public boolean isTemplateRoot() {
386 return templateRoot;
387 }
388
389 public void setTemplateRoot(boolean templateRoot) {
390 this.templateRoot = templateRoot;
391 }
392
393
394
395
396 public List<MetadataBlock> getMetadataBlocks() {
397 return getMetadataBlocks(false);
398 }
399
400 public List<MetadataBlock> getMetadataBlocks(boolean returnActualDB) {
401 if (returnActualDB || metadataBlockRoot || getOwner() == null) {
402 return metadataBlocks;
403 } else {
404 return getOwner().getMetadataBlocks();
405 }
406 }
407
408 public Long getMetadataRootId(){
409 if(metadataBlockRoot || getOwner() == null){
410 return this.getId();
411 } else {
412 return getOwner().getMetadataRootId();
413 }
414 }
415
416
417 public DataverseTheme getDataverseTheme() {
418 return getDataverseTheme(false);
419 }
420
421 public DataverseTheme getDataverseTheme(boolean returnActualDB) {
422 if (returnActualDB || themeRoot || getOwner() == null) {
423 return dataverseTheme;
424 } else {
425 return getOwner().getDataverseTheme();
426 }
427 }
428
429 public String getGuestbookRootDataverseName() {
430 Dataverse testDV = this;
431 String retName = "Parent";
432 while (testDV.getOwner() != null) {
433 retName = testDV.getOwner().getDisplayName();
434 if (testDV.getOwner().guestbookRoot) {
435 break;
436 }
437 testDV = testDV.getOwner();
438 }
439 return retName;
440 }
441
442 public String getTemplateRootDataverseName() {
443 Dataverse testDV = this;
444 String retName = "Parent";
445 while (testDV.getOwner() != null) {
446 retName = testDV.getOwner().getDisplayName();
447 if (testDV.getOwner().templateRoot) {
448 break;
449 }
450 testDV = testDV.getOwner();
451 }
452 return retName;
453 }
454
455 public String getThemeRootDataverseName() {
456 Dataverse testDV = this;
457 String retName = "Parent";
458 while (testDV.getOwner() != null) {
459 retName = testDV.getOwner().getDisplayName();
460 if (testDV.getOwner().themeRoot) {
461 break;
462 }
463 testDV = testDV.getOwner();
464 }
465 return retName;
466 }
467
468 public String getMetadataRootDataverseName() {
469 Dataverse testDV = this;
470 String retName = "Parent";
471 while (testDV.getOwner() != null) {
472 retName = testDV.getOwner().getDisplayName();
473 if (testDV.getOwner().metadataBlockRoot) {
474 break;
475 }
476 testDV = testDV.getOwner();
477 }
478 return retName;
479 }
480
481 public String getFacetRootDataverseName() {
482 Dataverse testDV = this;
483 String retName = "Parent";
484 while (testDV.getOwner() != null) {
485 retName = testDV.getOwner().getDisplayName();
486 if (testDV.getOwner().facetRoot) {
487 break;
488 }
489 testDV = testDV.getOwner();
490 }
491 return retName;
492 }
493
494 public String getLogoOwnerId() {
495 if (themeRoot || getOwner()==null) {
496 return this.getId().toString();
497 } else {
498 return getOwner().getId().toString();
499 }
500 }
501
502 public void setDataverseTheme(DataverseTheme dataverseTheme) {
503 this.dataverseTheme=dataverseTheme;
504 }
505
506 public void setMetadataBlocks(List<MetadataBlock> metadataBlocks) {
507 this.metadataBlocks = metadataBlocks;
508 }
509
510 public List<DataverseFacet> getDataverseFacets() {
511 return getDataverseFacets(false);
512 }
513
514 public List<DataverseFacet> getDataverseFacets(boolean returnActualDB) {
515 if (returnActualDB || facetRoot || getOwner() == null) {
516 return dataverseFacets;
517 } else {
518 return getOwner().getDataverseFacets();
519 }
520 }
521
522 public Long getFacetRootId(){
523 if(facetRoot || getOwner() == null){
524 return this.getId();
525 } else {
526 return getOwner().getFacetRootId();
527 }
528 }
529
530 public void setDataverseFacets(List<DataverseFacet> dataverseFacets) {
531 this.dataverseFacets = dataverseFacets;
532 }
533
534 public List<DataverseContact> getDataverseContacts() {
535 return dataverseContacts;
536 }
537
538 public String getContactEmails() {
539 return "";
540 }
541
542 public void setDataverseContacts(List<DataverseContact> dataverseContacts) {
543 this.dataverseContacts = dataverseContacts;
544 }
545
546 public void addDataverseContact(int index) {
547 dataverseContacts.add(index, new DataverseContact(this));
548 }
549
550 public void removeDataverseContact(int index) {
551 dataverseContacts.remove(index);
552 }
553
554 public String getName() {
555 return name;
556 }
557
558 public void setName(String name) {
559 this.name = name;
560 }
561
562 public String getAlias() {
563 return alias;
564 }
565
566 public void setAlias(String alias) {
567 this.alias = alias;
568 }
569
570 public String getDescription() {
571 return description;
572 }
573
574 public void setDescription(String description) {
575 this.description = description;
576 }
577
578 public String getAffiliation() {
579 return affiliation;
580 }
581
582 public void setAffiliation(String affiliation) {
583 this.affiliation = affiliation;
584 }
585
586 public boolean isMetadataBlockRoot() {
587 return metadataBlockRoot;
588 }
589
590 public void setMetadataBlockRoot(boolean metadataBlockRoot) {
591 this.metadataBlockRoot = metadataBlockRoot;
592 }
593
594 public boolean isFacetRoot() {
595 return facetRoot;
596 }
597
598 public void setFacetRoot(boolean facetRoot) {
599 this.facetRoot = facetRoot;
600 }
601
602
603 public void addRole(DataverseRole role) {
604 role.setOwner(this);
605 roles.add(role);
606 }
607
608 public Set<DataverseRole> getRoles() {
609 return roles;
610 }
611
612 public List<Dataverse> getOwners() {
613 List owners = new ArrayList();
614 if (getOwner() != null) {
615 owners.addAll(getOwner().getOwners());
616 owners.add(getOwner());
617 }
618 return owners;
619 }
620
621 @Override
622 public boolean equals(Object object) {
623 // TODO: Warning - this method won't work in the case the id fields are not set
624 if (!(object instanceof Dataverse)) {
625 return false;
626 }
627 Dataverse other = (Dataverse) object;
628 return Objects.equals(getId(), other.getId());
629 }
630
631 @Override
632 protected String toStringExtras() {
633 return "name:" + getName();
634 }
635
636 @Override
637 public <T> T accept(Visitor<T> v) {
638 return v.visit(this);
639 }
640
641 /**
642 * @todo implement in https://github.com/IQSS/dataverse/issues/551
643 */
644 public String getDepositTermsOfUse() {
645 return "Dataverse Deposit Terms of Use will be implemented in https://github.com/IQSS/dataverse/issues/551";
646 }
647
648 @Override
649 public String getDisplayName() {
650 return getName() + " Dataverse";
651 }
652
653 @Override
654 public boolean isPermissionRoot() {
655 return permissionRoot;
656 }
657
658 public void setPermissionRoot(boolean permissionRoot) {
659 this.permissionRoot = permissionRoot;
660 }
661
662 }