Mercurial > hg > LGDataverses
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java Tue Sep 08 17:00:21 2015 +0200 @@ -0,0 +1,985 @@ +package edu.harvard.iq.dataverse; + +import edu.harvard.iq.dataverse.UserNotification.Type; +import edu.harvard.iq.dataverse.authorization.Permission; +import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; +import edu.harvard.iq.dataverse.authorization.users.User; +import edu.harvard.iq.dataverse.engine.command.Command; +import edu.harvard.iq.dataverse.engine.command.exception.CommandException; +import edu.harvard.iq.dataverse.engine.command.impl.CreateDataverseCommand; +import edu.harvard.iq.dataverse.engine.command.impl.CreateSavedSearchCommand; +import edu.harvard.iq.dataverse.engine.command.impl.DeleteDataverseCommand; +import edu.harvard.iq.dataverse.engine.command.impl.LinkDataverseCommand; +import edu.harvard.iq.dataverse.engine.command.impl.PublishDataverseCommand; +import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseCommand; +import edu.harvard.iq.dataverse.search.SearchException; +import edu.harvard.iq.dataverse.search.SearchFields; +import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch; +import edu.harvard.iq.dataverse.search.savedsearch.SavedSearchFilterQuery; +import edu.harvard.iq.dataverse.search.savedsearch.SavedSearchServiceBean; +import edu.harvard.iq.dataverse.util.BundleUtil; +import edu.harvard.iq.dataverse.util.JsfHelper; +import static edu.harvard.iq.dataverse.util.JsfHelper.JH; +import edu.harvard.iq.dataverse.util.SystemConfig; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.event.ActionEvent; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.faces.component.UIComponent; +import javax.faces.component.UIInput; +import org.primefaces.model.DualListModel; +import javax.ejb.EJBException; +import javax.faces.event.ValueChangeEvent; +import javax.faces.model.SelectItem; +import org.apache.commons.lang.StringUtils; +import org.primefaces.event.TransferEvent; + +/** + * + * @author gdurand + */ +@ViewScoped +@Named("DataversePage") +public class DataversePage implements java.io.Serializable { + + private static final Logger logger = Logger.getLogger(DataversePage.class.getCanonicalName()); + + public enum EditMode { + + CREATE, INFO, FEATURED + } + + public enum LinkMode { + + SAVEDSEARCH, LINKDATAVERSE + } + + @EJB + DataverseServiceBean dataverseService; + @EJB + DatasetServiceBean datasetService; + @Inject + DataverseSession session; + @EJB + EjbDataverseEngine commandEngine; + @EJB + SearchServiceBean searchService; + @EJB + DatasetFieldServiceBean datasetFieldService; + @EJB + DataverseFacetServiceBean dataverseFacetService; + @EJB + UserNotificationServiceBean userNotificationService; + @EJB + FeaturedDataverseServiceBean featuredDataverseService; + @EJB + DataverseFieldTypeInputLevelServiceBean dataverseFieldTypeInputLevelService; + @EJB + PermissionServiceBean permissionService; + @EJB + ControlledVocabularyValueServiceBean controlledVocabularyValueServiceBean; + @EJB + SavedSearchServiceBean savedSearchService; + @EJB + SystemConfig systemConfig; + @Inject + SearchIncludeFragment searchIncludeFragment; + + @EJB + DataverseLinkingServiceBean linkingService; + + private Dataverse dataverse = new Dataverse(); + private EditMode editMode; + private LinkMode linkMode; + + private Long ownerId; + private DualListModel<DatasetFieldType> facets = new DualListModel<>(new ArrayList<DatasetFieldType>(), new ArrayList<DatasetFieldType>()); + private DualListModel<Dataverse> featuredDataverses = new DualListModel<>(new ArrayList<Dataverse>(), new ArrayList<Dataverse>()); + private List<Dataverse> dataversesForLinking; + private Long linkingDataverseId; + private List<SelectItem> linkingDVSelectItems; + private Dataverse linkingDataverse; + private List<ControlledVocabularyValue> selectedSubjects; + + public List<ControlledVocabularyValue> getSelectedSubjects() { + return selectedSubjects; + } + + public void setSelectedSubjects(List<ControlledVocabularyValue> selectedSubjects) { + this.selectedSubjects = selectedSubjects; + } + + public Dataverse getLinkingDataverse() { + return linkingDataverse; + } + + public void setLinkingDataverse(Dataverse linkingDataverse) { + this.linkingDataverse = linkingDataverse; + } + + public List<SelectItem> getLinkingDVSelectItems() { + return linkingDVSelectItems; + } + + public void setLinkingDVSelectItems(List<SelectItem> linkingDVSelectItems) { + this.linkingDVSelectItems = linkingDVSelectItems; + } + + public Long getLinkingDataverseId() { + return linkingDataverseId; + } + + public void setLinkingDataverseId(Long linkingDataverseId) { + this.linkingDataverseId = linkingDataverseId; + } + + public List<Dataverse> getDataversesForLinking() { + return dataversesForLinking; + } + + public void setDataversesForLinking(List<Dataverse> dataversesForLinking) { + + this.dataversesForLinking = dataversesForLinking; + } + + private List<ControlledVocabularyValue> dataverseSubjectControlledVocabularyValues; + + public List<ControlledVocabularyValue> getDataverseSubjectControlledVocabularyValues() { + return dataverseSubjectControlledVocabularyValues; + } + + public void setDataverseSubjectControlledVocabularyValues(List<ControlledVocabularyValue> dataverseSubjectControlledVocabularyValues) { + this.dataverseSubjectControlledVocabularyValues = dataverseSubjectControlledVocabularyValues; + } + + private void updateDataverseSubjectSelectItems() { + DatasetFieldType subjectDatasetField = datasetFieldService.findByName(DatasetFieldConstant.subject); + setDataverseSubjectControlledVocabularyValues(controlledVocabularyValueServiceBean.findByDatasetFieldTypeId(subjectDatasetField.getId())); + + } + + + public LinkMode getLinkMode() { + return linkMode; + } + + public void setLinkMode(LinkMode linkMode) { + this.linkMode = linkMode; + } + + + public void setupLinkingPopup (String popupSetting){ + if (popupSetting.equals("link")){ + setLinkMode(LinkMode.LINKDATAVERSE); + } else { + setLinkMode(LinkMode.SAVEDSEARCH); + } + updateLinkableDataverses(); + } + + public void updateLinkableDataverses() { + dataversesForLinking = new ArrayList(); + linkingDVSelectItems = new ArrayList(); + + //Since only a super user function add all dvs + dataversesForLinking = dataverseService.findAll();// permissionService.getDataversesUserHasPermissionOn(session.getUser(), Permission.PublishDataverse); + + //for linking - make sure the link hasn't occurred and its not int the tree + if (this.linkMode.equals(LinkMode.LINKDATAVERSE)) { + + dataversesForLinking.remove(dataverseService.findRootDataverse()); + dataversesForLinking.remove(dataverse); + + if (dataverse.getOwner() != null ){ + Dataverse testDV = dataverse; + while(testDV.getOwner() != null){ + dataversesForLinking.remove(testDV.getOwner()); + testDV = testDV.getOwner(); + } + } + + for (Dataverse removeLinked : linkingService.findLinkingDataverses(dataverse.getId())) { + dataversesForLinking.remove(removeLinked); + } + } else{ + //for saved search add all + + } + + for (Dataverse selectDV : dataversesForLinking) { + linkingDVSelectItems.add(new SelectItem(selectDV.getId(), selectDV.getDisplayName())); + } + + if (!dataversesForLinking.isEmpty() && dataversesForLinking.size() == 1 && dataversesForLinking.get(0) != null) { + linkingDataverse = dataversesForLinking.get(0); + linkingDataverseId = linkingDataverse.getId(); + } + } + + public void updateSelectedLinkingDV(ValueChangeEvent event) { + linkingDataverseId = (Long) event.getNewValue(); + } +// private TreeNode treeWidgetRootNode = new DefaultTreeNode("Root", null); + + public Dataverse getDataverse() { + return dataverse; + } + + public void setDataverse(Dataverse dataverse) { + this.dataverse = dataverse; + } + + public EditMode getEditMode() { + return editMode; + } + + public void setEditMode(EditMode editMode) { + this.editMode = editMode; + } + + public Long getOwnerId() { + return ownerId; + } + + public void setOwnerId(Long ownerId) { + this.ownerId = ownerId; + } + +// public TreeNode getTreeWidgetRootNode() { +// return treeWidgetRootNode; +// } +// +// public void setTreeWidgetRootNode(TreeNode treeWidgetRootNode) { +// this.treeWidgetRootNode = treeWidgetRootNode; +// } + public String init() { + if (dataverse.getAlias() != null || dataverse.getId() != null || ownerId == null) {// view mode for a dataverse + if (dataverse.getAlias() != null) { + dataverse = dataverseService.findByAlias(dataverse.getAlias()); + } else if (dataverse.getId() != null) { + dataverse = dataverseService.find(dataverse.getId()); + } else { + try { + dataverse = dataverseService.findRootDataverse(); + } catch (EJBException e) { + // @todo handle case with no root dataverse (a fresh installation) with message about using API to create the root + dataverse = null; + } + } + + // check if dv exists and user has permission + if (dataverse == null) { + return "/404.xhtml"; + } + if (!dataverse.isReleased() && !permissionService.on(dataverse).has(Permission.ViewUnpublishedDataverse)) { + return "/loginpage.xhtml" + DataverseHeaderFragment.getRedirectPage(); + } + + ownerId = dataverse.getOwner() != null ? dataverse.getOwner().getId() : null; + } else { // ownerId != null; create mode for a new child dataverse + editMode = EditMode.INFO; + dataverse.setOwner(dataverseService.find(ownerId)); + if (dataverse.getOwner() == null) { + return "/404.xhtml"; + } else if (!permissionService.on(dataverse.getOwner()).has(Permission.AddDataverse)) { + return "/loginpage.xhtml" + DataverseHeaderFragment.getRedirectPage(); + } + + // set defaults - contact e-mail and affiliation from user + dataverse.getDataverseContacts().add(new DataverseContact(dataverse, session.getUser().getDisplayInfo().getEmailAddress())); + dataverse.setAffiliation(session.getUser().getDisplayInfo().getAffiliation()); + setupForGeneralInfoEdit(); + // 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.")); + } + + return null; + } + + public void initFeaturedDataverses() { + List<Dataverse> featuredSource = new ArrayList<>(); + List<Dataverse> featuredTarget = new ArrayList<>(); + featuredSource.addAll(dataverseService.findAllPublishedByOwnerId(dataverse.getId())); + featuredSource.addAll(linkingService.findLinkedDataverses(dataverse.getId())); + List<DataverseFeaturedDataverse> featuredList = featuredDataverseService.findByDataverseId(dataverse.getId()); + for (DataverseFeaturedDataverse dfd : featuredList) { + Dataverse fd = dfd.getFeaturedDataverse(); + featuredTarget.add(fd); + featuredSource.remove(fd); + } + featuredDataverses = new DualListModel<>(featuredSource, featuredTarget); + + } + + public void initFacets() { + List<DatasetFieldType> facetsSource = new ArrayList<>(); + List<DatasetFieldType> facetsTarget = new ArrayList<>(); + facetsSource.addAll(datasetFieldService.findAllFacetableFieldTypes()); + List<DataverseFacet> facetsList = dataverseFacetService.findByDataverseId(dataverse.getFacetRootId()); + for (DataverseFacet dvFacet : facetsList) { + DatasetFieldType dsfType = dvFacet.getDatasetFieldType(); + facetsTarget.add(dsfType); + facetsSource.remove(dsfType); + } + facets = new DualListModel<>(facetsSource, facetsTarget); + facetMetadataBlockId = null; + } + + private void setupForGeneralInfoEdit() { + updateDataverseSubjectSelectItems(); + initFacets(); + refreshAllMetadataBlocks(); + } + + private Long facetMetadataBlockId; + + public Long getFacetMetadataBlockId() { + return facetMetadataBlockId; + } + + public void setFacetMetadataBlockId(Long facetMetadataBlockId) { + this.facetMetadataBlockId = facetMetadataBlockId; + } + + public void changeFacetsMetadataBlock() { + if (facetMetadataBlockId == null) { + facets.setSource(datasetFieldService.findAllFacetableFieldTypes()); + } else { + facets.setSource(datasetFieldService.findFacetableFieldTypesByMetadataBlock(facetMetadataBlockId)); + } + + facets.getSource().removeAll(facets.getTarget()); + } + + public void toggleFacetRoot() { + if (!dataverse.isFacetRoot()) { + initFacets(); + } + } + + public void onFacetTransfer(TransferEvent event) { + for (Object item : event.getItems()) { + DatasetFieldType facet = (DatasetFieldType) item; + if (facetMetadataBlockId != null && !facetMetadataBlockId.equals(facet.getMetadataBlock().getId())) { + facets.getSource().remove(facet); + } + } + } + + public List<Dataverse> getCarouselFeaturedDataverses() { + List<Dataverse> retList = new ArrayList(); + List<DataverseFeaturedDataverse> featuredList = featuredDataverseService.findByDataverseId(dataverse.getId()); + for (DataverseFeaturedDataverse dfd : featuredList) { + Dataverse fd = dfd.getFeaturedDataverse(); + retList.add(fd); + } + return retList; + } + + public List getContents() { + List contentsList = dataverseService.findByOwnerId(dataverse.getId()); + contentsList.addAll(datasetService.findByOwnerId(dataverse.getId())); + return contentsList; + } + + public void edit(EditMode editMode) { + this.editMode = editMode; + if (editMode == EditMode.INFO) { + setupForGeneralInfoEdit(); + FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Edit Dataverse", " - Edit your dataverse and click Save. Asterisks indicate required fields.")); + } else if (editMode == EditMode.FEATURED) { + initFeaturedDataverses(); + } + + } + + public void refresh() { + + } + + private boolean openMetadataBlock; + + public boolean isOpenMetadataBlock() { + return openMetadataBlock; + } + + public void setOpenMetadataBlock(boolean openMetadataBlock) { + this.openMetadataBlock = openMetadataBlock; + } + + private boolean editInputLevel; + + public boolean isEditInputLevel() { + return editInputLevel; + } + + public void setEditInputLevel(boolean editInputLevel) { + this.editInputLevel = editInputLevel; + } + + public void showDatasetFieldTypes(Long mdbId) { + showDatasetFieldTypes(mdbId, true); + } + + public void showDatasetFieldTypes(Long mdbId, boolean allowEdit) { + for (MetadataBlock mdb : allMetadataBlocks) { + if (mdb.getId().equals(mdbId)) { + mdb.setShowDatasetFieldTypes(true); + openMetadataBlock = true; + } + } + setEditInputLevel(allowEdit); + } + + public void hideDatasetFieldTypes(Long mdbId) { + for (MetadataBlock mdb : allMetadataBlocks) { + if (mdb.getId().equals(mdbId)) { + mdb.setShowDatasetFieldTypes(false); + openMetadataBlock = false; + } + } + setEditInputLevel(false); + } + + public void updateInclude(Long mdbId, long dsftId) { + List<DatasetFieldType> childDSFT = new ArrayList(); + + for (MetadataBlock mdb : allMetadataBlocks) { + if (mdb.getId().equals(mdbId)) { + for (DatasetFieldType dsftTest : mdb.getDatasetFieldTypes()) { + if (dsftTest.getId().equals(dsftId)) { + dsftTest.setOptionSelectItems(resetSelectItems(dsftTest)); + if ((dsftTest.isHasParent() && !dsftTest.getParentDatasetFieldType().isInclude()) || (!dsftTest.isHasParent() && !dsftTest.isInclude())) { + dsftTest.setRequiredDV(false); + } + if (dsftTest.isHasChildren()) { + childDSFT.addAll(dsftTest.getChildDatasetFieldTypes()); + } + } + } + } + } + if (!childDSFT.isEmpty()) { + for (DatasetFieldType dsftUpdate : childDSFT) { + for (MetadataBlock mdb : allMetadataBlocks) { + if (mdb.getId().equals(mdbId)) { + for (DatasetFieldType dsftTest : mdb.getDatasetFieldTypes()) { + if (dsftTest.getId().equals(dsftUpdate.getId())) { + dsftTest.setOptionSelectItems(resetSelectItems(dsftTest)); + } + } + } + } + } + } + } + + public List<SelectItem> resetSelectItems(DatasetFieldType typeIn) { + List retList = new ArrayList(); + if ((typeIn.isHasParent() && typeIn.getParentDatasetFieldType().isInclude()) || (!typeIn.isHasParent() && typeIn.isInclude())) { + SelectItem requiredItem = new SelectItem(); + requiredItem.setLabel("Required"); + requiredItem.setValue(true); + retList.add(requiredItem); + SelectItem optional = new SelectItem(); + optional.setLabel("Optional"); + optional.setValue(false); + retList.add(optional); + } else { + SelectItem hidden = new SelectItem(); + hidden.setLabel("Hidden"); + hidden.setValue(false); + hidden.setDisabled(true); + retList.add(hidden); + } + return retList; + } + + public void updateRequiredDatasetFieldTypes(Long mdbId, Long dsftId, boolean inVal) { + for (MetadataBlock mdb : allMetadataBlocks) { + if (mdb.getId().equals(mdbId)) { + for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) { + if (dsft.getId().equals(dsftId)) { + dsft.setRequiredDV(!inVal); + } + } + } + } + } + + public void updateOptionsRadio(Long mdbId, Long dsftId) { + + for (MetadataBlock mdb : allMetadataBlocks) { + if (mdb.getId().equals(mdbId)) { + for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) { + if (dsft.getId().equals(dsftId)) { + dsft.setOptionSelectItems(resetSelectItems(dsft)); + } + } + } + } + } + + + public String save() { + List<DataverseFieldTypeInputLevel> listDFTIL = new ArrayList(); + if (editMode != null && editMode.equals(EditMode.INFO)) { + + List<MetadataBlock> selectedBlocks = new ArrayList(); + if (dataverse.isMetadataBlockRoot()) { + dataverse.getMetadataBlocks().clear(); + } + + for (MetadataBlock mdb : this.allMetadataBlocks) { + if (dataverse.isMetadataBlockRoot() && (mdb.isSelected() || mdb.isRequired())) { + selectedBlocks.add(mdb); + for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) { + if (dsft.isRequiredDV() && !dsft.isRequired() + && ((!dsft.isHasParent() && dsft.isInclude()) + || (dsft.isHasParent() && dsft.getParentDatasetFieldType().isInclude()))) { + DataverseFieldTypeInputLevel dftil = new DataverseFieldTypeInputLevel(); + dftil.setDatasetFieldType(dsft); + dftil.setDataverse(dataverse); + dftil.setRequired(true); + dftil.setInclude(true); + listDFTIL.add(dftil); + } + if ((!dsft.isHasParent() && !dsft.isInclude()) + || (dsft.isHasParent() && !dsft.getParentDatasetFieldType().isInclude())) { + DataverseFieldTypeInputLevel dftil = new DataverseFieldTypeInputLevel(); + dftil.setDatasetFieldType(dsft); + dftil.setDataverse(dataverse); + dftil.setRequired(false); + dftil.setInclude(false); + listDFTIL.add(dftil); + } + } + } + } + + if (!selectedBlocks.isEmpty()) { + dataverse.setMetadataBlocks(selectedBlocks); + } + + if (!dataverse.isFacetRoot()) { + facets.getTarget().clear(); + } + + } + + Command<Dataverse> cmd = null; + //TODO change to Create - for now the page is expecting INFO instead. + Boolean create; + if (dataverse.getId() == null) { + if (session.getUser().isAuthenticated()) { + dataverse.setOwner(ownerId != null ? dataverseService.find(ownerId) : null); + create = Boolean.TRUE; + cmd = new CreateDataverseCommand(dataverse, (AuthenticatedUser) session.getUser(), facets.getTarget(), listDFTIL); + } else { + JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataverse.create.authenticatedUsersOnly")); + return null; + } + } else { + create = Boolean.FALSE; + if (editMode != null && editMode.equals(editMode.FEATURED)) { + cmd = new UpdateDataverseCommand(dataverse, null, featuredDataverses.getTarget(), session.getUser(), null); + } else { + cmd = new UpdateDataverseCommand(dataverse, facets.getTarget(), null, session.getUser(), listDFTIL); + } + } + + try { + dataverse = commandEngine.submit(cmd); + if (session.getUser() instanceof AuthenticatedUser) { + if (create) { + userNotificationService.sendNotification((AuthenticatedUser) session.getUser(), dataverse.getCreateDate(), Type.CREATEDV, dataverse.getId()); + } + } + + String message = ""; + if (editMode != null && editMode.equals(editMode.FEATURED)) { + message = "The featured dataverses for this dataverse have been updated."; + } else { + message = (create) ? BundleUtil.getStringFromBundle("dataverse.create.success", Arrays.asList(systemConfig.getGuidesBaseUrl(), systemConfig.getVersion())) : JH.localize("dataverse.update.success"); + } + JsfHelper.addSuccessMessage(message); + + editMode = null; + return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true"; + + + } catch (CommandException ex) { + logger.log(Level.SEVERE, "Unexpected Exception calling dataverse command", ex); + String errMsg = create ? JH.localize("dataverse.create.failure") : JH.localize("dataverse.update.failure"); + JH.addMessage(FacesMessage.SEVERITY_FATAL, errMsg); + return null; + } catch (Exception e) { + logger.log(Level.SEVERE, "Unexpected Exception calling dataverse command", e); + String errMsg = create ? JH.localize("dataverse.create.failure") : JH.localize("dataverse.update.failure"); + JH.addMessage(FacesMessage.SEVERITY_FATAL, errMsg); + return null; + } + } + + public void cancel(ActionEvent e) { + // reset values + dataverse = dataverseService.find(dataverse.getId()); + ownerId = dataverse.getOwner() != null ? dataverse.getOwner().getId() : null; + editMode = null; + } + + public boolean isRootDataverse() { + return dataverse.getOwner() == null; + } + + public Dataverse getOwner() { + return (ownerId != null) ? dataverseService.find(ownerId) : null; + } + + // METHODS for Dataverse Setup + public boolean isInheritMetadataBlockFromParent() { + return !dataverse.isMetadataBlockRoot(); + } + + public void setInheritMetadataBlockFromParent(boolean inheritMetadataBlockFromParent) { + dataverse.setMetadataBlockRoot(!inheritMetadataBlockFromParent); + } + + public void editMetadataBlocks() { + if (!dataverse.isMetadataBlockRoot()) { + refreshAllMetadataBlocks(); + } + } + + public void editMetadataBlocks(boolean checkVal) { + setInheritMetadataBlockFromParent(checkVal); + if (!dataverse.isMetadataBlockRoot()) { + refreshAllMetadataBlocks(); + } + } + + public void cancelMetadataBlocks() { + setInheritMetadataBlockFromParent(false); + } + + public boolean isInheritFacetFromParent() { + return !dataverse.isFacetRoot(); + } + + public void setInheritFacetFromParent(boolean inheritFacetFromParent) { + dataverse.setFacetRoot(!inheritFacetFromParent); + } + + public DualListModel<DatasetFieldType> getFacets() { + return facets; + } + + public void setFacets(DualListModel<DatasetFieldType> facets) { + this.facets = facets; + } + + public DualListModel<Dataverse> getFeaturedDataverses() { + return featuredDataverses; + } + + public void setFeaturedDataverses(DualListModel<Dataverse> featuredDataverses) { + this.featuredDataverses = featuredDataverses; + } + + public String saveLinkedDataverse() { + + if (linkingDataverseId == null) { + JsfHelper.addSuccessMessage("You must select a linking dataverse."); + return ""; + } + + AuthenticatedUser savedSearchCreator = getAuthenticatedUser(); + if (savedSearchCreator == null) { + String msg = "Only authenticated users can link a dataverse."; + logger.severe(msg); + JsfHelper.addErrorMessage(msg); + return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true"; + } + + linkingDataverse = dataverseService.find(linkingDataverseId); + + LinkDataverseCommand cmd = new LinkDataverseCommand(session.getUser(), linkingDataverse, dataverse); + try { + DataverseLinkingDataverse linkedDataverse = commandEngine.submit(cmd); + } catch (CommandException ex) { + String msg = "Unable to link " + dataverse.getDisplayName() + " to " + linkingDataverse.getDisplayName() + ". An internal error occurred."; + logger.severe(msg + " " + ex); + JsfHelper.addErrorMessage(msg); + return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true"; + } + + SavedSearch savedSearchOfChildren = createSavedSearchForChildren(savedSearchCreator); + + boolean createLinksAndIndexRightNow = false; + if (createLinksAndIndexRightNow) { + try { + // create links (does indexing) right now (might be expensive) + boolean debug = false; + savedSearchService.makeLinksForSingleSavedSearch(savedSearchOfChildren, debug); + JsfHelper.addSuccessMessage(dataverse.getDisplayName() + " has been successfully linked to " + linkingDataverse.getDisplayName()); + return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true"; + } catch (SearchException | CommandException ex) { + // error: solr is down, etc. can't link children right now + String msg = dataverse.getDisplayName() + " has been successfully linked to " + linkingDataverse.getDisplayName() + " but contents will not appear until an internal error has been fixed."; + logger.severe(msg + " " + ex); + JsfHelper.addErrorMessage(msg); + return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true"; + } + } else { + // defer: please wait for the next timer/cron job + JsfHelper.addSuccessMessage(dataverse.getDisplayName() + " has been successfully linked to " + linkingDataverse.getDisplayName() + ". Please wait for its contents to appear."); + return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true"; + } + } + + @Deprecated + private SavedSearch createSavedOfCurrentDataverse(AuthenticatedUser savedSearchCreator) { + /** + * Please note that we are relying on the fact that the Solr ID of a + * dataverse never changes, unlike datasets and files, which will change + * from "dataset_10_draft" to "dataset_10" when published, for example. + */ + String queryForCurrentDataverse = SearchFields.ID + ":" + IndexServiceBean.solrDocIdentifierDataverse + dataverse.getId(); + SavedSearch savedSearchToPersist = new SavedSearch(queryForCurrentDataverse, linkingDataverse, savedSearchCreator); + SavedSearch savedSearchCreated = savedSearchService.add(savedSearchToPersist); + return savedSearchCreated; + } + + private SavedSearch createSavedSearchForChildren(AuthenticatedUser savedSearchCreator) { + String wildcardQuery = "*"; + SavedSearch savedSearchToPersist = new SavedSearch(wildcardQuery, linkingDataverse, savedSearchCreator); + String dataversePath = dataverseService.determineDataversePath(dataverse); + String filterDownToSubtree = SearchFields.SUBTREE + ":\"" + dataversePath + "\""; + SavedSearchFilterQuery filterDownToSubtreeFilterQuery = new SavedSearchFilterQuery(filterDownToSubtree, savedSearchToPersist); + savedSearchToPersist.setSavedSearchFilterQueries(Arrays.asList(filterDownToSubtreeFilterQuery)); + SavedSearch savedSearchCreated = savedSearchService.add(savedSearchToPersist); + return savedSearchCreated; + } + + public String saveSavedSearch() { + if (linkingDataverseId == null) { + JsfHelper.addSuccessMessage("You must select a linking dataverse."); + return ""; + } + linkingDataverse = dataverseService.find(linkingDataverseId); + + AuthenticatedUser savedSearchCreator = getAuthenticatedUser(); + if (savedSearchCreator == null) { + String msg = "Only authenticated users can save a search."; + logger.severe(msg); + JsfHelper.addErrorMessage(msg); + return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true"; + } + + SavedSearch savedSearch = new SavedSearch(searchIncludeFragment.getQuery(), linkingDataverse, savedSearchCreator); + savedSearch.setSavedSearchFilterQueries(new ArrayList()); + for (String filterQuery : searchIncludeFragment.getFilterQueriesDebug()) { + /** + * @todo Why are there null's here anyway? Turn on debug and figure + * this out. + */ + if (filterQuery != null && !filterQuery.isEmpty()) { + SavedSearchFilterQuery ssfq = new SavedSearchFilterQuery(); + ssfq.setSavedSearch(savedSearch); + ssfq.setFilterQuery(filterQuery); + savedSearch.getSavedSearchFilterQueries().add(ssfq); + } + } + CreateSavedSearchCommand cmd = new CreateSavedSearchCommand(session.getUser(), linkingDataverse, savedSearch); + try { + commandEngine.submit(cmd); + JsfHelper.addSuccessMessage("This search is now linked to " + linkingDataverse.getDisplayName()); + //return ""; + return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true"; + } catch (CommandException ex) { + String msg = "There was a problem linking this search to yours: " + ex; + logger.severe(msg); + /** + * @todo how do we get this message to show up in the GUI? + */ + FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DataverseNotLinked", msg); + FacesContext.getCurrentInstance().addMessage(null, message); + //return ""; + return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true"; + } + } + + private AuthenticatedUser getAuthenticatedUser() { + User user = session.getUser(); + if (user.isAuthenticated()) { + return (AuthenticatedUser) user; + } else { + return null; + } + } + + public String releaseDataverse() { + if (session.getUser() instanceof AuthenticatedUser) { + PublishDataverseCommand cmd = new PublishDataverseCommand((AuthenticatedUser) session.getUser(), dataverse); + try { + commandEngine.submit(cmd); + JsfHelper.addSuccessMessage(JH.localize("dataverse.publish.success")); + + } catch (Exception ex) { + logger.log(Level.SEVERE, "Unexpected Exception calling publish dataverse command", ex); + JsfHelper.addErrorMessage(JH.localize("dataverse.publish.failure")); + + } + } else { + FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DataverseNotReleased", "Only authenticated users can release a dataverse."); + FacesContext.getCurrentInstance().addMessage(null, message); + } + return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true"; + + } + + public String deleteDataverse() { + DeleteDataverseCommand cmd = new DeleteDataverseCommand(session.getUser(), dataverse); + try { + commandEngine.submit(cmd); + JsfHelper.addSuccessMessage(JH.localize("dataverse.delete.success")); + } catch (Exception ex) { + logger.log(Level.SEVERE, "Unexpected Exception calling delete dataverse command", ex); + JsfHelper.addErrorMessage(JH.localize("dataverse.delete.failure")); + } + return "/dataverse.xhtml?alias=" + dataverse.getOwner().getAlias() + "&faces-redirect=true"; + } + + public String getMetadataBlockPreview(MetadataBlock mdb, int numberOfItems) { + /// for beta, we will just preview the first n fields + StringBuilder mdbPreview = new StringBuilder(); + int count = 0; + for (DatasetFieldType dsfType : mdb.getDatasetFieldTypes()) { + if (!dsfType.isChild()) { + if (count != 0) { + mdbPreview.append(", "); + if (count == numberOfItems) { + mdbPreview.append("etc."); + break; + } + } + + mdbPreview.append(dsfType.getDisplayName()); + count++; + } + } + + return mdbPreview.toString(); + } + + public Boolean isEmptyDataverse() { + return !dataverseService.hasData(dataverse); + } + private List<MetadataBlock> allMetadataBlocks; + + public List<MetadataBlock> getAllMetadataBlocks() { + return this.allMetadataBlocks; + } + + public void setAllMetadataBlocks(List<MetadataBlock> inBlocks) { + this.allMetadataBlocks = inBlocks; + } + + private void refreshAllMetadataBlocks() { + Long dataverseIdForInputLevel = dataverse.getId(); + List<MetadataBlock> retList = new ArrayList(); + + List<MetadataBlock> availableBlocks = new ArrayList(); + //Add System level blocks + availableBlocks.addAll(dataverseService.findSystemMetadataBlocks()); + + Dataverse testDV = dataverse; + //Add blocks associated with DV + availableBlocks.addAll(dataverseService.findMetadataBlocksByDataverseId(dataverse.getId())); + + //Add blocks associated with dv going up inheritance tree + while (testDV.getOwner() != null) { + availableBlocks.addAll(dataverseService.findMetadataBlocksByDataverseId(testDV.getOwner().getId())); + testDV = testDV.getOwner(); + } + + for (MetadataBlock mdb : availableBlocks) { + mdb.setSelected(false); + mdb.setShowDatasetFieldTypes(false); + if (!dataverse.isMetadataBlockRoot() && dataverse.getOwner() != null) { + dataverseIdForInputLevel = dataverse.getMetadataRootId(); + for (MetadataBlock mdbTest : dataverse.getOwner().getMetadataBlocks()) { + if (mdb.equals(mdbTest)) { + mdb.setSelected(true); + } + } + } else { + for (MetadataBlock mdbTest : dataverse.getMetadataBlocks(true)) { + if (mdb.equals(mdbTest)) { + mdb.setSelected(true); + } + } + } + + for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) { + if (!dsft.isChild()) { + DataverseFieldTypeInputLevel dsfIl = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(dataverseIdForInputLevel, dsft.getId()); + if (dsfIl != null) { + dsft.setRequiredDV(dsfIl.isRequired()); + dsft.setInclude(dsfIl.isInclude()); + } else { + dsft.setRequiredDV(dsft.isRequired()); + dsft.setInclude(true); + } + dsft.setOptionSelectItems(resetSelectItems(dsft)); + if (dsft.isHasChildren()) { + for (DatasetFieldType child : dsft.getChildDatasetFieldTypes()) { + DataverseFieldTypeInputLevel dsfIlChild = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(dataverseIdForInputLevel, child.getId()); + if (dsfIlChild != null) { + child.setRequiredDV(dsfIlChild.isRequired()); + child.setInclude(dsfIlChild.isInclude()); + } else { + child.setRequiredDV(child.isRequired()); + child.setInclude(true); + } + child.setOptionSelectItems(resetSelectItems(child)); + } + } + } + } + retList.add(mdb); + } + setAllMetadataBlocks(retList); + } + + public void validateAlias(FacesContext context, UIComponent toValidate, Object value) { + if (!StringUtils.isEmpty((String) value)) { + String alias = (String) value; + + boolean aliasFound = false; + Dataverse dv = dataverseService.findByAlias(alias); + if (editMode == DataversePage.EditMode.CREATE) { + if (dv != null) { + aliasFound = true; + } + } else { + if (dv != null && !dv.getId().equals(dataverse.getId())) { + aliasFound = true; + } + } + if (aliasFound) { + ((UIInput) toValidate).setValid(false); + FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "alias", "This Alias is already taken."); + context.addMessage(toValidate.getClientId(context), message); + } + } + } + +}
