comparison src/main/java/edu/harvard/iq/dataverse/DataversePage.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.UserNotification.Type;
4 import edu.harvard.iq.dataverse.authorization.Permission;
5 import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
6 import edu.harvard.iq.dataverse.authorization.users.User;
7 import edu.harvard.iq.dataverse.engine.command.Command;
8 import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
9 import edu.harvard.iq.dataverse.engine.command.impl.CreateDataverseCommand;
10 import edu.harvard.iq.dataverse.engine.command.impl.CreateSavedSearchCommand;
11 import edu.harvard.iq.dataverse.engine.command.impl.DeleteDataverseCommand;
12 import edu.harvard.iq.dataverse.engine.command.impl.LinkDataverseCommand;
13 import edu.harvard.iq.dataverse.engine.command.impl.PublishDataverseCommand;
14 import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseCommand;
15 import edu.harvard.iq.dataverse.search.SearchException;
16 import edu.harvard.iq.dataverse.search.SearchFields;
17 import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch;
18 import edu.harvard.iq.dataverse.search.savedsearch.SavedSearchFilterQuery;
19 import edu.harvard.iq.dataverse.search.savedsearch.SavedSearchServiceBean;
20 import edu.harvard.iq.dataverse.util.BundleUtil;
21 import edu.harvard.iq.dataverse.util.JsfHelper;
22 import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
23 import edu.harvard.iq.dataverse.util.SystemConfig;
24 import java.util.List;
25 import javax.ejb.EJB;
26 import javax.faces.application.FacesMessage;
27 import javax.faces.context.FacesContext;
28 import javax.faces.event.ActionEvent;
29 import javax.faces.view.ViewScoped;
30 import javax.inject.Inject;
31 import javax.inject.Named;
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.logging.Level;
35 import java.util.logging.Logger;
36 import javax.faces.component.UIComponent;
37 import javax.faces.component.UIInput;
38 import org.primefaces.model.DualListModel;
39 import javax.ejb.EJBException;
40 import javax.faces.event.ValueChangeEvent;
41 import javax.faces.model.SelectItem;
42 import org.apache.commons.lang.StringUtils;
43 import org.primefaces.event.TransferEvent;
44
45 /**
46 *
47 * @author gdurand
48 */
49 @ViewScoped
50 @Named("DataversePage")
51 public class DataversePage implements java.io.Serializable {
52
53 private static final Logger logger = Logger.getLogger(DataversePage.class.getCanonicalName());
54
55 public enum EditMode {
56
57 CREATE, INFO, FEATURED
58 }
59
60 public enum LinkMode {
61
62 SAVEDSEARCH, LINKDATAVERSE
63 }
64
65 @EJB
66 DataverseServiceBean dataverseService;
67 @EJB
68 DatasetServiceBean datasetService;
69 @Inject
70 DataverseSession session;
71 @EJB
72 EjbDataverseEngine commandEngine;
73 @EJB
74 SearchServiceBean searchService;
75 @EJB
76 DatasetFieldServiceBean datasetFieldService;
77 @EJB
78 DataverseFacetServiceBean dataverseFacetService;
79 @EJB
80 UserNotificationServiceBean userNotificationService;
81 @EJB
82 FeaturedDataverseServiceBean featuredDataverseService;
83 @EJB
84 DataverseFieldTypeInputLevelServiceBean dataverseFieldTypeInputLevelService;
85 @EJB
86 PermissionServiceBean permissionService;
87 @EJB
88 ControlledVocabularyValueServiceBean controlledVocabularyValueServiceBean;
89 @EJB
90 SavedSearchServiceBean savedSearchService;
91 @EJB
92 SystemConfig systemConfig;
93 @Inject
94 SearchIncludeFragment searchIncludeFragment;
95
96 @EJB
97 DataverseLinkingServiceBean linkingService;
98
99 private Dataverse dataverse = new Dataverse();
100 private EditMode editMode;
101 private LinkMode linkMode;
102
103 private Long ownerId;
104 private DualListModel<DatasetFieldType> facets = new DualListModel<>(new ArrayList<DatasetFieldType>(), new ArrayList<DatasetFieldType>());
105 private DualListModel<Dataverse> featuredDataverses = new DualListModel<>(new ArrayList<Dataverse>(), new ArrayList<Dataverse>());
106 private List<Dataverse> dataversesForLinking;
107 private Long linkingDataverseId;
108 private List<SelectItem> linkingDVSelectItems;
109 private Dataverse linkingDataverse;
110 private List<ControlledVocabularyValue> selectedSubjects;
111
112 public List<ControlledVocabularyValue> getSelectedSubjects() {
113 return selectedSubjects;
114 }
115
116 public void setSelectedSubjects(List<ControlledVocabularyValue> selectedSubjects) {
117 this.selectedSubjects = selectedSubjects;
118 }
119
120 public Dataverse getLinkingDataverse() {
121 return linkingDataverse;
122 }
123
124 public void setLinkingDataverse(Dataverse linkingDataverse) {
125 this.linkingDataverse = linkingDataverse;
126 }
127
128 public List<SelectItem> getLinkingDVSelectItems() {
129 return linkingDVSelectItems;
130 }
131
132 public void setLinkingDVSelectItems(List<SelectItem> linkingDVSelectItems) {
133 this.linkingDVSelectItems = linkingDVSelectItems;
134 }
135
136 public Long getLinkingDataverseId() {
137 return linkingDataverseId;
138 }
139
140 public void setLinkingDataverseId(Long linkingDataverseId) {
141 this.linkingDataverseId = linkingDataverseId;
142 }
143
144 public List<Dataverse> getDataversesForLinking() {
145 return dataversesForLinking;
146 }
147
148 public void setDataversesForLinking(List<Dataverse> dataversesForLinking) {
149
150 this.dataversesForLinking = dataversesForLinking;
151 }
152
153 private List<ControlledVocabularyValue> dataverseSubjectControlledVocabularyValues;
154
155 public List<ControlledVocabularyValue> getDataverseSubjectControlledVocabularyValues() {
156 return dataverseSubjectControlledVocabularyValues;
157 }
158
159 public void setDataverseSubjectControlledVocabularyValues(List<ControlledVocabularyValue> dataverseSubjectControlledVocabularyValues) {
160 this.dataverseSubjectControlledVocabularyValues = dataverseSubjectControlledVocabularyValues;
161 }
162
163 private void updateDataverseSubjectSelectItems() {
164 DatasetFieldType subjectDatasetField = datasetFieldService.findByName(DatasetFieldConstant.subject);
165 setDataverseSubjectControlledVocabularyValues(controlledVocabularyValueServiceBean.findByDatasetFieldTypeId(subjectDatasetField.getId()));
166
167 }
168
169
170 public LinkMode getLinkMode() {
171 return linkMode;
172 }
173
174 public void setLinkMode(LinkMode linkMode) {
175 this.linkMode = linkMode;
176 }
177
178
179 public void setupLinkingPopup (String popupSetting){
180 if (popupSetting.equals("link")){
181 setLinkMode(LinkMode.LINKDATAVERSE);
182 } else {
183 setLinkMode(LinkMode.SAVEDSEARCH);
184 }
185 updateLinkableDataverses();
186 }
187
188 public void updateLinkableDataverses() {
189 dataversesForLinking = new ArrayList();
190 linkingDVSelectItems = new ArrayList();
191
192 //Since only a super user function add all dvs
193 dataversesForLinking = dataverseService.findAll();// permissionService.getDataversesUserHasPermissionOn(session.getUser(), Permission.PublishDataverse);
194
195 //for linking - make sure the link hasn't occurred and its not int the tree
196 if (this.linkMode.equals(LinkMode.LINKDATAVERSE)) {
197
198 dataversesForLinking.remove(dataverseService.findRootDataverse());
199 dataversesForLinking.remove(dataverse);
200
201 if (dataverse.getOwner() != null ){
202 Dataverse testDV = dataverse;
203 while(testDV.getOwner() != null){
204 dataversesForLinking.remove(testDV.getOwner());
205 testDV = testDV.getOwner();
206 }
207 }
208
209 for (Dataverse removeLinked : linkingService.findLinkingDataverses(dataverse.getId())) {
210 dataversesForLinking.remove(removeLinked);
211 }
212 } else{
213 //for saved search add all
214
215 }
216
217 for (Dataverse selectDV : dataversesForLinking) {
218 linkingDVSelectItems.add(new SelectItem(selectDV.getId(), selectDV.getDisplayName()));
219 }
220
221 if (!dataversesForLinking.isEmpty() && dataversesForLinking.size() == 1 && dataversesForLinking.get(0) != null) {
222 linkingDataverse = dataversesForLinking.get(0);
223 linkingDataverseId = linkingDataverse.getId();
224 }
225 }
226
227 public void updateSelectedLinkingDV(ValueChangeEvent event) {
228 linkingDataverseId = (Long) event.getNewValue();
229 }
230 // private TreeNode treeWidgetRootNode = new DefaultTreeNode("Root", null);
231
232 public Dataverse getDataverse() {
233 return dataverse;
234 }
235
236 public void setDataverse(Dataverse dataverse) {
237 this.dataverse = dataverse;
238 }
239
240 public EditMode getEditMode() {
241 return editMode;
242 }
243
244 public void setEditMode(EditMode editMode) {
245 this.editMode = editMode;
246 }
247
248 public Long getOwnerId() {
249 return ownerId;
250 }
251
252 public void setOwnerId(Long ownerId) {
253 this.ownerId = ownerId;
254 }
255
256 // public TreeNode getTreeWidgetRootNode() {
257 // return treeWidgetRootNode;
258 // }
259 //
260 // public void setTreeWidgetRootNode(TreeNode treeWidgetRootNode) {
261 // this.treeWidgetRootNode = treeWidgetRootNode;
262 // }
263 public String init() {
264 if (dataverse.getAlias() != null || dataverse.getId() != null || ownerId == null) {// view mode for a dataverse
265 if (dataverse.getAlias() != null) {
266 dataverse = dataverseService.findByAlias(dataverse.getAlias());
267 } else if (dataverse.getId() != null) {
268 dataverse = dataverseService.find(dataverse.getId());
269 } else {
270 try {
271 dataverse = dataverseService.findRootDataverse();
272 } catch (EJBException e) {
273 // @todo handle case with no root dataverse (a fresh installation) with message about using API to create the root
274 dataverse = null;
275 }
276 }
277
278 // check if dv exists and user has permission
279 if (dataverse == null) {
280 return "/404.xhtml";
281 }
282 if (!dataverse.isReleased() && !permissionService.on(dataverse).has(Permission.ViewUnpublishedDataverse)) {
283 return "/loginpage.xhtml" + DataverseHeaderFragment.getRedirectPage();
284 }
285
286 ownerId = dataverse.getOwner() != null ? dataverse.getOwner().getId() : null;
287 } else { // ownerId != null; create mode for a new child dataverse
288 editMode = EditMode.INFO;
289 dataverse.setOwner(dataverseService.find(ownerId));
290 if (dataverse.getOwner() == null) {
291 return "/404.xhtml";
292 } else if (!permissionService.on(dataverse.getOwner()).has(Permission.AddDataverse)) {
293 return "/loginpage.xhtml" + DataverseHeaderFragment.getRedirectPage();
294 }
295
296 // set defaults - contact e-mail and affiliation from user
297 dataverse.getDataverseContacts().add(new DataverseContact(dataverse, session.getUser().getDisplayInfo().getEmailAddress()));
298 dataverse.setAffiliation(session.getUser().getDisplayInfo().getAffiliation());
299 setupForGeneralInfoEdit();
300 // FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Create New Dataverse", " - Create a new dataverse that will be a child dataverse of the parent you clicked from. Asterisks indicate required fields."));
301 }
302
303 return null;
304 }
305
306 public void initFeaturedDataverses() {
307 List<Dataverse> featuredSource = new ArrayList<>();
308 List<Dataverse> featuredTarget = new ArrayList<>();
309 featuredSource.addAll(dataverseService.findAllPublishedByOwnerId(dataverse.getId()));
310 featuredSource.addAll(linkingService.findLinkedDataverses(dataverse.getId()));
311 List<DataverseFeaturedDataverse> featuredList = featuredDataverseService.findByDataverseId(dataverse.getId());
312 for (DataverseFeaturedDataverse dfd : featuredList) {
313 Dataverse fd = dfd.getFeaturedDataverse();
314 featuredTarget.add(fd);
315 featuredSource.remove(fd);
316 }
317 featuredDataverses = new DualListModel<>(featuredSource, featuredTarget);
318
319 }
320
321 public void initFacets() {
322 List<DatasetFieldType> facetsSource = new ArrayList<>();
323 List<DatasetFieldType> facetsTarget = new ArrayList<>();
324 facetsSource.addAll(datasetFieldService.findAllFacetableFieldTypes());
325 List<DataverseFacet> facetsList = dataverseFacetService.findByDataverseId(dataverse.getFacetRootId());
326 for (DataverseFacet dvFacet : facetsList) {
327 DatasetFieldType dsfType = dvFacet.getDatasetFieldType();
328 facetsTarget.add(dsfType);
329 facetsSource.remove(dsfType);
330 }
331 facets = new DualListModel<>(facetsSource, facetsTarget);
332 facetMetadataBlockId = null;
333 }
334
335 private void setupForGeneralInfoEdit() {
336 updateDataverseSubjectSelectItems();
337 initFacets();
338 refreshAllMetadataBlocks();
339 }
340
341 private Long facetMetadataBlockId;
342
343 public Long getFacetMetadataBlockId() {
344 return facetMetadataBlockId;
345 }
346
347 public void setFacetMetadataBlockId(Long facetMetadataBlockId) {
348 this.facetMetadataBlockId = facetMetadataBlockId;
349 }
350
351 public void changeFacetsMetadataBlock() {
352 if (facetMetadataBlockId == null) {
353 facets.setSource(datasetFieldService.findAllFacetableFieldTypes());
354 } else {
355 facets.setSource(datasetFieldService.findFacetableFieldTypesByMetadataBlock(facetMetadataBlockId));
356 }
357
358 facets.getSource().removeAll(facets.getTarget());
359 }
360
361 public void toggleFacetRoot() {
362 if (!dataverse.isFacetRoot()) {
363 initFacets();
364 }
365 }
366
367 public void onFacetTransfer(TransferEvent event) {
368 for (Object item : event.getItems()) {
369 DatasetFieldType facet = (DatasetFieldType) item;
370 if (facetMetadataBlockId != null && !facetMetadataBlockId.equals(facet.getMetadataBlock().getId())) {
371 facets.getSource().remove(facet);
372 }
373 }
374 }
375
376 public List<Dataverse> getCarouselFeaturedDataverses() {
377 List<Dataverse> retList = new ArrayList();
378 List<DataverseFeaturedDataverse> featuredList = featuredDataverseService.findByDataverseId(dataverse.getId());
379 for (DataverseFeaturedDataverse dfd : featuredList) {
380 Dataverse fd = dfd.getFeaturedDataverse();
381 retList.add(fd);
382 }
383 return retList;
384 }
385
386 public List getContents() {
387 List contentsList = dataverseService.findByOwnerId(dataverse.getId());
388 contentsList.addAll(datasetService.findByOwnerId(dataverse.getId()));
389 return contentsList;
390 }
391
392 public void edit(EditMode editMode) {
393 this.editMode = editMode;
394 if (editMode == EditMode.INFO) {
395 setupForGeneralInfoEdit();
396 FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Edit Dataverse", " - Edit your dataverse and click Save. Asterisks indicate required fields."));
397 } else if (editMode == EditMode.FEATURED) {
398 initFeaturedDataverses();
399 }
400
401 }
402
403 public void refresh() {
404
405 }
406
407 private boolean openMetadataBlock;
408
409 public boolean isOpenMetadataBlock() {
410 return openMetadataBlock;
411 }
412
413 public void setOpenMetadataBlock(boolean openMetadataBlock) {
414 this.openMetadataBlock = openMetadataBlock;
415 }
416
417 private boolean editInputLevel;
418
419 public boolean isEditInputLevel() {
420 return editInputLevel;
421 }
422
423 public void setEditInputLevel(boolean editInputLevel) {
424 this.editInputLevel = editInputLevel;
425 }
426
427 public void showDatasetFieldTypes(Long mdbId) {
428 showDatasetFieldTypes(mdbId, true);
429 }
430
431 public void showDatasetFieldTypes(Long mdbId, boolean allowEdit) {
432 for (MetadataBlock mdb : allMetadataBlocks) {
433 if (mdb.getId().equals(mdbId)) {
434 mdb.setShowDatasetFieldTypes(true);
435 openMetadataBlock = true;
436 }
437 }
438 setEditInputLevel(allowEdit);
439 }
440
441 public void hideDatasetFieldTypes(Long mdbId) {
442 for (MetadataBlock mdb : allMetadataBlocks) {
443 if (mdb.getId().equals(mdbId)) {
444 mdb.setShowDatasetFieldTypes(false);
445 openMetadataBlock = false;
446 }
447 }
448 setEditInputLevel(false);
449 }
450
451 public void updateInclude(Long mdbId, long dsftId) {
452 List<DatasetFieldType> childDSFT = new ArrayList();
453
454 for (MetadataBlock mdb : allMetadataBlocks) {
455 if (mdb.getId().equals(mdbId)) {
456 for (DatasetFieldType dsftTest : mdb.getDatasetFieldTypes()) {
457 if (dsftTest.getId().equals(dsftId)) {
458 dsftTest.setOptionSelectItems(resetSelectItems(dsftTest));
459 if ((dsftTest.isHasParent() && !dsftTest.getParentDatasetFieldType().isInclude()) || (!dsftTest.isHasParent() && !dsftTest.isInclude())) {
460 dsftTest.setRequiredDV(false);
461 }
462 if (dsftTest.isHasChildren()) {
463 childDSFT.addAll(dsftTest.getChildDatasetFieldTypes());
464 }
465 }
466 }
467 }
468 }
469 if (!childDSFT.isEmpty()) {
470 for (DatasetFieldType dsftUpdate : childDSFT) {
471 for (MetadataBlock mdb : allMetadataBlocks) {
472 if (mdb.getId().equals(mdbId)) {
473 for (DatasetFieldType dsftTest : mdb.getDatasetFieldTypes()) {
474 if (dsftTest.getId().equals(dsftUpdate.getId())) {
475 dsftTest.setOptionSelectItems(resetSelectItems(dsftTest));
476 }
477 }
478 }
479 }
480 }
481 }
482 }
483
484 public List<SelectItem> resetSelectItems(DatasetFieldType typeIn) {
485 List retList = new ArrayList();
486 if ((typeIn.isHasParent() && typeIn.getParentDatasetFieldType().isInclude()) || (!typeIn.isHasParent() && typeIn.isInclude())) {
487 SelectItem requiredItem = new SelectItem();
488 requiredItem.setLabel("Required");
489 requiredItem.setValue(true);
490 retList.add(requiredItem);
491 SelectItem optional = new SelectItem();
492 optional.setLabel("Optional");
493 optional.setValue(false);
494 retList.add(optional);
495 } else {
496 SelectItem hidden = new SelectItem();
497 hidden.setLabel("Hidden");
498 hidden.setValue(false);
499 hidden.setDisabled(true);
500 retList.add(hidden);
501 }
502 return retList;
503 }
504
505 public void updateRequiredDatasetFieldTypes(Long mdbId, Long dsftId, boolean inVal) {
506 for (MetadataBlock mdb : allMetadataBlocks) {
507 if (mdb.getId().equals(mdbId)) {
508 for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) {
509 if (dsft.getId().equals(dsftId)) {
510 dsft.setRequiredDV(!inVal);
511 }
512 }
513 }
514 }
515 }
516
517 public void updateOptionsRadio(Long mdbId, Long dsftId) {
518
519 for (MetadataBlock mdb : allMetadataBlocks) {
520 if (mdb.getId().equals(mdbId)) {
521 for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) {
522 if (dsft.getId().equals(dsftId)) {
523 dsft.setOptionSelectItems(resetSelectItems(dsft));
524 }
525 }
526 }
527 }
528 }
529
530
531 public String save() {
532 List<DataverseFieldTypeInputLevel> listDFTIL = new ArrayList();
533 if (editMode != null && editMode.equals(EditMode.INFO)) {
534
535 List<MetadataBlock> selectedBlocks = new ArrayList();
536 if (dataverse.isMetadataBlockRoot()) {
537 dataverse.getMetadataBlocks().clear();
538 }
539
540 for (MetadataBlock mdb : this.allMetadataBlocks) {
541 if (dataverse.isMetadataBlockRoot() && (mdb.isSelected() || mdb.isRequired())) {
542 selectedBlocks.add(mdb);
543 for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) {
544 if (dsft.isRequiredDV() && !dsft.isRequired()
545 && ((!dsft.isHasParent() && dsft.isInclude())
546 || (dsft.isHasParent() && dsft.getParentDatasetFieldType().isInclude()))) {
547 DataverseFieldTypeInputLevel dftil = new DataverseFieldTypeInputLevel();
548 dftil.setDatasetFieldType(dsft);
549 dftil.setDataverse(dataverse);
550 dftil.setRequired(true);
551 dftil.setInclude(true);
552 listDFTIL.add(dftil);
553 }
554 if ((!dsft.isHasParent() && !dsft.isInclude())
555 || (dsft.isHasParent() && !dsft.getParentDatasetFieldType().isInclude())) {
556 DataverseFieldTypeInputLevel dftil = new DataverseFieldTypeInputLevel();
557 dftil.setDatasetFieldType(dsft);
558 dftil.setDataverse(dataverse);
559 dftil.setRequired(false);
560 dftil.setInclude(false);
561 listDFTIL.add(dftil);
562 }
563 }
564 }
565 }
566
567 if (!selectedBlocks.isEmpty()) {
568 dataverse.setMetadataBlocks(selectedBlocks);
569 }
570
571 if (!dataverse.isFacetRoot()) {
572 facets.getTarget().clear();
573 }
574
575 }
576
577 Command<Dataverse> cmd = null;
578 //TODO change to Create - for now the page is expecting INFO instead.
579 Boolean create;
580 if (dataverse.getId() == null) {
581 if (session.getUser().isAuthenticated()) {
582 dataverse.setOwner(ownerId != null ? dataverseService.find(ownerId) : null);
583 create = Boolean.TRUE;
584 cmd = new CreateDataverseCommand(dataverse, (AuthenticatedUser) session.getUser(), facets.getTarget(), listDFTIL);
585 } else {
586 JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataverse.create.authenticatedUsersOnly"));
587 return null;
588 }
589 } else {
590 create = Boolean.FALSE;
591 if (editMode != null && editMode.equals(editMode.FEATURED)) {
592 cmd = new UpdateDataverseCommand(dataverse, null, featuredDataverses.getTarget(), session.getUser(), null);
593 } else {
594 cmd = new UpdateDataverseCommand(dataverse, facets.getTarget(), null, session.getUser(), listDFTIL);
595 }
596 }
597
598 try {
599 dataverse = commandEngine.submit(cmd);
600 if (session.getUser() instanceof AuthenticatedUser) {
601 if (create) {
602 userNotificationService.sendNotification((AuthenticatedUser) session.getUser(), dataverse.getCreateDate(), Type.CREATEDV, dataverse.getId());
603 }
604 }
605
606 String message = "";
607 if (editMode != null && editMode.equals(editMode.FEATURED)) {
608 message = "The featured dataverses for this dataverse have been updated.";
609 } else {
610 message = (create) ? BundleUtil.getStringFromBundle("dataverse.create.success", Arrays.asList(systemConfig.getGuidesBaseUrl(), systemConfig.getVersion())) : JH.localize("dataverse.update.success");
611 }
612 JsfHelper.addSuccessMessage(message);
613
614 editMode = null;
615 return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
616
617
618 } catch (CommandException ex) {
619 logger.log(Level.SEVERE, "Unexpected Exception calling dataverse command", ex);
620 String errMsg = create ? JH.localize("dataverse.create.failure") : JH.localize("dataverse.update.failure");
621 JH.addMessage(FacesMessage.SEVERITY_FATAL, errMsg);
622 return null;
623 } catch (Exception e) {
624 logger.log(Level.SEVERE, "Unexpected Exception calling dataverse command", e);
625 String errMsg = create ? JH.localize("dataverse.create.failure") : JH.localize("dataverse.update.failure");
626 JH.addMessage(FacesMessage.SEVERITY_FATAL, errMsg);
627 return null;
628 }
629 }
630
631 public void cancel(ActionEvent e) {
632 // reset values
633 dataverse = dataverseService.find(dataverse.getId());
634 ownerId = dataverse.getOwner() != null ? dataverse.getOwner().getId() : null;
635 editMode = null;
636 }
637
638 public boolean isRootDataverse() {
639 return dataverse.getOwner() == null;
640 }
641
642 public Dataverse getOwner() {
643 return (ownerId != null) ? dataverseService.find(ownerId) : null;
644 }
645
646 // METHODS for Dataverse Setup
647 public boolean isInheritMetadataBlockFromParent() {
648 return !dataverse.isMetadataBlockRoot();
649 }
650
651 public void setInheritMetadataBlockFromParent(boolean inheritMetadataBlockFromParent) {
652 dataverse.setMetadataBlockRoot(!inheritMetadataBlockFromParent);
653 }
654
655 public void editMetadataBlocks() {
656 if (!dataverse.isMetadataBlockRoot()) {
657 refreshAllMetadataBlocks();
658 }
659 }
660
661 public void editMetadataBlocks(boolean checkVal) {
662 setInheritMetadataBlockFromParent(checkVal);
663 if (!dataverse.isMetadataBlockRoot()) {
664 refreshAllMetadataBlocks();
665 }
666 }
667
668 public void cancelMetadataBlocks() {
669 setInheritMetadataBlockFromParent(false);
670 }
671
672 public boolean isInheritFacetFromParent() {
673 return !dataverse.isFacetRoot();
674 }
675
676 public void setInheritFacetFromParent(boolean inheritFacetFromParent) {
677 dataverse.setFacetRoot(!inheritFacetFromParent);
678 }
679
680 public DualListModel<DatasetFieldType> getFacets() {
681 return facets;
682 }
683
684 public void setFacets(DualListModel<DatasetFieldType> facets) {
685 this.facets = facets;
686 }
687
688 public DualListModel<Dataverse> getFeaturedDataverses() {
689 return featuredDataverses;
690 }
691
692 public void setFeaturedDataverses(DualListModel<Dataverse> featuredDataverses) {
693 this.featuredDataverses = featuredDataverses;
694 }
695
696 public String saveLinkedDataverse() {
697
698 if (linkingDataverseId == null) {
699 JsfHelper.addSuccessMessage("You must select a linking dataverse.");
700 return "";
701 }
702
703 AuthenticatedUser savedSearchCreator = getAuthenticatedUser();
704 if (savedSearchCreator == null) {
705 String msg = "Only authenticated users can link a dataverse.";
706 logger.severe(msg);
707 JsfHelper.addErrorMessage(msg);
708 return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
709 }
710
711 linkingDataverse = dataverseService.find(linkingDataverseId);
712
713 LinkDataverseCommand cmd = new LinkDataverseCommand(session.getUser(), linkingDataverse, dataverse);
714 try {
715 DataverseLinkingDataverse linkedDataverse = commandEngine.submit(cmd);
716 } catch (CommandException ex) {
717 String msg = "Unable to link " + dataverse.getDisplayName() + " to " + linkingDataverse.getDisplayName() + ". An internal error occurred.";
718 logger.severe(msg + " " + ex);
719 JsfHelper.addErrorMessage(msg);
720 return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
721 }
722
723 SavedSearch savedSearchOfChildren = createSavedSearchForChildren(savedSearchCreator);
724
725 boolean createLinksAndIndexRightNow = false;
726 if (createLinksAndIndexRightNow) {
727 try {
728 // create links (does indexing) right now (might be expensive)
729 boolean debug = false;
730 savedSearchService.makeLinksForSingleSavedSearch(savedSearchOfChildren, debug);
731 JsfHelper.addSuccessMessage(dataverse.getDisplayName() + " has been successfully linked to " + linkingDataverse.getDisplayName());
732 return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
733 } catch (SearchException | CommandException ex) {
734 // error: solr is down, etc. can't link children right now
735 String msg = dataverse.getDisplayName() + " has been successfully linked to " + linkingDataverse.getDisplayName() + " but contents will not appear until an internal error has been fixed.";
736 logger.severe(msg + " " + ex);
737 JsfHelper.addErrorMessage(msg);
738 return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
739 }
740 } else {
741 // defer: please wait for the next timer/cron job
742 JsfHelper.addSuccessMessage(dataverse.getDisplayName() + " has been successfully linked to " + linkingDataverse.getDisplayName() + ". Please wait for its contents to appear.");
743 return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
744 }
745 }
746
747 @Deprecated
748 private SavedSearch createSavedOfCurrentDataverse(AuthenticatedUser savedSearchCreator) {
749 /**
750 * Please note that we are relying on the fact that the Solr ID of a
751 * dataverse never changes, unlike datasets and files, which will change
752 * from "dataset_10_draft" to "dataset_10" when published, for example.
753 */
754 String queryForCurrentDataverse = SearchFields.ID + ":" + IndexServiceBean.solrDocIdentifierDataverse + dataverse.getId();
755 SavedSearch savedSearchToPersist = new SavedSearch(queryForCurrentDataverse, linkingDataverse, savedSearchCreator);
756 SavedSearch savedSearchCreated = savedSearchService.add(savedSearchToPersist);
757 return savedSearchCreated;
758 }
759
760 private SavedSearch createSavedSearchForChildren(AuthenticatedUser savedSearchCreator) {
761 String wildcardQuery = "*";
762 SavedSearch savedSearchToPersist = new SavedSearch(wildcardQuery, linkingDataverse, savedSearchCreator);
763 String dataversePath = dataverseService.determineDataversePath(dataverse);
764 String filterDownToSubtree = SearchFields.SUBTREE + ":\"" + dataversePath + "\"";
765 SavedSearchFilterQuery filterDownToSubtreeFilterQuery = new SavedSearchFilterQuery(filterDownToSubtree, savedSearchToPersist);
766 savedSearchToPersist.setSavedSearchFilterQueries(Arrays.asList(filterDownToSubtreeFilterQuery));
767 SavedSearch savedSearchCreated = savedSearchService.add(savedSearchToPersist);
768 return savedSearchCreated;
769 }
770
771 public String saveSavedSearch() {
772 if (linkingDataverseId == null) {
773 JsfHelper.addSuccessMessage("You must select a linking dataverse.");
774 return "";
775 }
776 linkingDataverse = dataverseService.find(linkingDataverseId);
777
778 AuthenticatedUser savedSearchCreator = getAuthenticatedUser();
779 if (savedSearchCreator == null) {
780 String msg = "Only authenticated users can save a search.";
781 logger.severe(msg);
782 JsfHelper.addErrorMessage(msg);
783 return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
784 }
785
786 SavedSearch savedSearch = new SavedSearch(searchIncludeFragment.getQuery(), linkingDataverse, savedSearchCreator);
787 savedSearch.setSavedSearchFilterQueries(new ArrayList());
788 for (String filterQuery : searchIncludeFragment.getFilterQueriesDebug()) {
789 /**
790 * @todo Why are there null's here anyway? Turn on debug and figure
791 * this out.
792 */
793 if (filterQuery != null && !filterQuery.isEmpty()) {
794 SavedSearchFilterQuery ssfq = new SavedSearchFilterQuery();
795 ssfq.setSavedSearch(savedSearch);
796 ssfq.setFilterQuery(filterQuery);
797 savedSearch.getSavedSearchFilterQueries().add(ssfq);
798 }
799 }
800 CreateSavedSearchCommand cmd = new CreateSavedSearchCommand(session.getUser(), linkingDataverse, savedSearch);
801 try {
802 commandEngine.submit(cmd);
803 JsfHelper.addSuccessMessage("This search is now linked to " + linkingDataverse.getDisplayName());
804 //return "";
805 return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
806 } catch (CommandException ex) {
807 String msg = "There was a problem linking this search to yours: " + ex;
808 logger.severe(msg);
809 /**
810 * @todo how do we get this message to show up in the GUI?
811 */
812 FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DataverseNotLinked", msg);
813 FacesContext.getCurrentInstance().addMessage(null, message);
814 //return "";
815 return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
816 }
817 }
818
819 private AuthenticatedUser getAuthenticatedUser() {
820 User user = session.getUser();
821 if (user.isAuthenticated()) {
822 return (AuthenticatedUser) user;
823 } else {
824 return null;
825 }
826 }
827
828 public String releaseDataverse() {
829 if (session.getUser() instanceof AuthenticatedUser) {
830 PublishDataverseCommand cmd = new PublishDataverseCommand((AuthenticatedUser) session.getUser(), dataverse);
831 try {
832 commandEngine.submit(cmd);
833 JsfHelper.addSuccessMessage(JH.localize("dataverse.publish.success"));
834
835 } catch (Exception ex) {
836 logger.log(Level.SEVERE, "Unexpected Exception calling publish dataverse command", ex);
837 JsfHelper.addErrorMessage(JH.localize("dataverse.publish.failure"));
838
839 }
840 } else {
841 FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DataverseNotReleased", "Only authenticated users can release a dataverse.");
842 FacesContext.getCurrentInstance().addMessage(null, message);
843 }
844 return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
845
846 }
847
848 public String deleteDataverse() {
849 DeleteDataverseCommand cmd = new DeleteDataverseCommand(session.getUser(), dataverse);
850 try {
851 commandEngine.submit(cmd);
852 JsfHelper.addSuccessMessage(JH.localize("dataverse.delete.success"));
853 } catch (Exception ex) {
854 logger.log(Level.SEVERE, "Unexpected Exception calling delete dataverse command", ex);
855 JsfHelper.addErrorMessage(JH.localize("dataverse.delete.failure"));
856 }
857 return "/dataverse.xhtml?alias=" + dataverse.getOwner().getAlias() + "&faces-redirect=true";
858 }
859
860 public String getMetadataBlockPreview(MetadataBlock mdb, int numberOfItems) {
861 /// for beta, we will just preview the first n fields
862 StringBuilder mdbPreview = new StringBuilder();
863 int count = 0;
864 for (DatasetFieldType dsfType : mdb.getDatasetFieldTypes()) {
865 if (!dsfType.isChild()) {
866 if (count != 0) {
867 mdbPreview.append(", ");
868 if (count == numberOfItems) {
869 mdbPreview.append("etc.");
870 break;
871 }
872 }
873
874 mdbPreview.append(dsfType.getDisplayName());
875 count++;
876 }
877 }
878
879 return mdbPreview.toString();
880 }
881
882 public Boolean isEmptyDataverse() {
883 return !dataverseService.hasData(dataverse);
884 }
885 private List<MetadataBlock> allMetadataBlocks;
886
887 public List<MetadataBlock> getAllMetadataBlocks() {
888 return this.allMetadataBlocks;
889 }
890
891 public void setAllMetadataBlocks(List<MetadataBlock> inBlocks) {
892 this.allMetadataBlocks = inBlocks;
893 }
894
895 private void refreshAllMetadataBlocks() {
896 Long dataverseIdForInputLevel = dataverse.getId();
897 List<MetadataBlock> retList = new ArrayList();
898
899 List<MetadataBlock> availableBlocks = new ArrayList();
900 //Add System level blocks
901 availableBlocks.addAll(dataverseService.findSystemMetadataBlocks());
902
903 Dataverse testDV = dataverse;
904 //Add blocks associated with DV
905 availableBlocks.addAll(dataverseService.findMetadataBlocksByDataverseId(dataverse.getId()));
906
907 //Add blocks associated with dv going up inheritance tree
908 while (testDV.getOwner() != null) {
909 availableBlocks.addAll(dataverseService.findMetadataBlocksByDataverseId(testDV.getOwner().getId()));
910 testDV = testDV.getOwner();
911 }
912
913 for (MetadataBlock mdb : availableBlocks) {
914 mdb.setSelected(false);
915 mdb.setShowDatasetFieldTypes(false);
916 if (!dataverse.isMetadataBlockRoot() && dataverse.getOwner() != null) {
917 dataverseIdForInputLevel = dataverse.getMetadataRootId();
918 for (MetadataBlock mdbTest : dataverse.getOwner().getMetadataBlocks()) {
919 if (mdb.equals(mdbTest)) {
920 mdb.setSelected(true);
921 }
922 }
923 } else {
924 for (MetadataBlock mdbTest : dataverse.getMetadataBlocks(true)) {
925 if (mdb.equals(mdbTest)) {
926 mdb.setSelected(true);
927 }
928 }
929 }
930
931 for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) {
932 if (!dsft.isChild()) {
933 DataverseFieldTypeInputLevel dsfIl = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(dataverseIdForInputLevel, dsft.getId());
934 if (dsfIl != null) {
935 dsft.setRequiredDV(dsfIl.isRequired());
936 dsft.setInclude(dsfIl.isInclude());
937 } else {
938 dsft.setRequiredDV(dsft.isRequired());
939 dsft.setInclude(true);
940 }
941 dsft.setOptionSelectItems(resetSelectItems(dsft));
942 if (dsft.isHasChildren()) {
943 for (DatasetFieldType child : dsft.getChildDatasetFieldTypes()) {
944 DataverseFieldTypeInputLevel dsfIlChild = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(dataverseIdForInputLevel, child.getId());
945 if (dsfIlChild != null) {
946 child.setRequiredDV(dsfIlChild.isRequired());
947 child.setInclude(dsfIlChild.isInclude());
948 } else {
949 child.setRequiredDV(child.isRequired());
950 child.setInclude(true);
951 }
952 child.setOptionSelectItems(resetSelectItems(child));
953 }
954 }
955 }
956 }
957 retList.add(mdb);
958 }
959 setAllMetadataBlocks(retList);
960 }
961
962 public void validateAlias(FacesContext context, UIComponent toValidate, Object value) {
963 if (!StringUtils.isEmpty((String) value)) {
964 String alias = (String) value;
965
966 boolean aliasFound = false;
967 Dataverse dv = dataverseService.findByAlias(alias);
968 if (editMode == DataversePage.EditMode.CREATE) {
969 if (dv != null) {
970 aliasFound = true;
971 }
972 } else {
973 if (dv != null && !dv.getId().equals(dataverse.getId())) {
974 aliasFound = true;
975 }
976 }
977 if (aliasFound) {
978 ((UIInput) toValidate).setValid(false);
979 FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "alias", "This Alias is already taken.");
980 context.addMessage(toValidate.getClientId(context), message);
981 }
982 }
983 }
984
985 }