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.DataverseRequest;
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.IndexServiceBean;
import edu.harvard.iq.dataverse.search.SearchException;
import edu.harvard.iq.dataverse.search.SearchFields;
import edu.harvard.iq.dataverse.search.SearchIncludeFragment;
import edu.harvard.iq.dataverse.search.SearchServiceBean;
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.StringEscapeUtils;
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;
@EJB DataverseRoleServiceBean dataverseRoleServiceBean;
@Inject
SearchIncludeFragment searchIncludeFragment;
@Inject
DataverseRequestServiceBean dvRequestService;
@Inject
SettingsWrapper settingsWrapper;
@EJB
DataverseLinkingServiceBean linkingService;
@Inject PermissionsWrapper permissionsWrapper;
private Dataverse dataverse = new Dataverse();
private EditMode editMode;
private LinkMode linkMode;
private Long ownerId;
private DualListModel<DatasetFieldType> facets = new DualListModel<>(new ArrayList<>(), new ArrayList<>());
private DualListModel<Dataverse> featuredDataverses = new DualListModel<>(new ArrayList<>(), new ArrayList<>());
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);
/*
List<DataverseRole> roles = dataverseRoleServiceBean.getDataverseRolesByPermission(Permission.PublishDataverse, dataverse.getId());
List<String> types = new ArrayList();
types.add("Dataverse");
for (Long dvIdAsInt : permissionService.getDvObjectIdsUserHasRoleOn(session.getUser(), roles, types, false)) {
dataversesForLinking.add(dataverseService.find(dvIdAsInt));
}*/
//for linking - make sure the link hasn't occurred and its not int the tree
if (this.linkMode.equals(LinkMode.LINKDATAVERSE)) {
// remove this and it's parent tree
dataversesForLinking.remove(dataverse);
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();
}
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 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 permissionsWrapper.notFound();
}
if (!dataverse.isReleased() && !permissionService.on(dataverse).has(Permission.ViewUnpublishedDataverse)) {
return permissionsWrapper.notAuthorized();
}
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 permissionsWrapper.notFound();
} else if (!permissionService.on(dataverse.getOwner()).has(Permission.AddDataverse)) {
return permissionsWrapper.notAuthorized();
}
// 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.findLinkingDataverses(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);
}
}
}
private List<Dataverse> carouselFeaturedDataverses = null;
public List<Dataverse> getCarouselFeaturedDataverses() {
if (carouselFeaturedDataverses != null) {
return carouselFeaturedDataverses;
}
carouselFeaturedDataverses = featuredDataverseService.findByDataverseIdQuick(dataverse.getId());/*new ArrayList();
List<DataverseFeaturedDataverse> featuredList = featuredDataverseService.findByDataverseId(dataverse.getId());
for (DataverseFeaturedDataverse dfd : featuredList) {
Dataverse fd = dfd.getFeaturedDataverse();
retList.add(fd);
}*/
return carouselFeaturedDataverses;
}
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 toggleInputLevel( Long mdbId, long dsftId){
for (MetadataBlock mdb : allMetadataBlocks) {
if (mdb.getId().equals(mdbId)) {
for (DatasetFieldType dsftTest : mdb.getDatasetFieldTypes()) {
if (dsftTest.getId().equals(dsftId)) {
dsftTest.setRequiredDV(!dsftTest.isRequiredDV());
}
}
}
}
}
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<SelectItem> 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, dvRequestService.getDataverseRequest(), facets.getTarget(), listDFTIL);
} else {
JH.addMessage(FacesMessage.SEVERITY_FATAL, BundleUtil.getStringFromBundle("dataverse.create.authenticatedUsersOnly"));
return null;
}
} else {
create = Boolean.FALSE;
if (editMode != null && editMode.equals(EditMode.FEATURED)) {
cmd = new UpdateDataverseCommand(dataverse, null, featuredDataverses.getTarget(), dvRequestService.getDataverseRequest(), null);
} else {
cmd = new UpdateDataverseCommand(dataverse, facets.getTarget(), null, dvRequestService.getDataverseRequest(), 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(settingsWrapper.getGuidesBaseUrl(), systemConfig.getVersion())) : BundleUtil.getStringFromBundle("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 ? BundleUtil.getStringFromBundle("dataverse.create.failure") : BundleUtil.getStringFromBundle("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 ? BundleUtil.getStringFromBundle("dataverse.create.failure") : BundleUtil.getStringFromBundle("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(dvRequestService.getDataverseRequest(), linkingDataverse, dataverse);
//LinkDvObjectCommand cmd = new LinkDvObjectCommand (session.getUser(), linkingDataverse, dataverse);
try {
commandEngine.submit(cmd);
} catch (CommandException ex) {
String msg = "Unable to link " + dataverse.getDisplayName() + " to " + linkingDataverse.getDisplayName() + ". An internal error occurred.";
logger.log(Level.SEVERE, "{0} {1}", new Object[]{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;
DataverseRequest dataverseRequest = new DataverseRequest(savedSearchCreator, SavedSearchServiceBean.getHttpServletRequest());
savedSearchService.makeLinksForSingleSavedSearch(dataverseRequest, savedSearchOfChildren, debug);
JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataverse.linked.success", getSuccessMessageArguments()));
return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
} catch (SearchException | CommandException ex) {
// error: solr is down, etc. can't link children right now
JsfHelper.addErrorMessage(BundleUtil.getStringFromBundle("dataverse.linked.internalerror", getSuccessMessageArguments()));
String msg = dataverse.getDisplayName() + " has been successfully linked to " + linkingDataverse.getDisplayName() + " but contents will not appear until an internal error has been fixed.";
logger.log(Level.SEVERE, "{0} {1}", new Object[]{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.");
JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataverse.linked.success.wait", getSuccessMessageArguments()));
return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
}
}
private List<String> getSuccessMessageArguments() {
List<String> arguments = new ArrayList<>();
arguments.add(StringEscapeUtils.escapeHtml(dataverse.getDisplayName()));
String linkString = "<a href=\"/dataverse/" + linkingDataverse.getAlias() + "\">" + StringEscapeUtils.escapeHtml(linkingDataverse.getDisplayName()) + "</a>";
arguments.add(linkString);
return arguments;
}
@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.addErrorMessage("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(filterQuery,savedSearch);
savedSearch.getSavedSearchFilterQueries().add(ssfq);
}
}
CreateSavedSearchCommand cmd = new CreateSavedSearchCommand(dvRequestService.getDataverseRequest(), linkingDataverse, savedSearch);
try {
commandEngine.submit(cmd);
List<String> arguments = new ArrayList<>();
String linkString = "<a href=\"/dataverse/" + linkingDataverse.getAlias() + "\">" + StringEscapeUtils.escapeHtml(linkingDataverse.getDisplayName()) + "</a>";
arguments.add(linkString);
String successMessageString = BundleUtil.getStringFromBundle("dataverse.saved.search.success", arguments);
JsfHelper.addSuccessMessage(successMessageString);
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);
JsfHelper.addErrorMessage(BundleUtil.getStringFromBundle("dataverse.saved.search.failure") + " " + ex);
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(dvRequestService.getDataverseRequest(), dataverse);
try {
commandEngine.submit(cmd);
JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataverse.publish.success"));
} catch (Exception ex) {
logger.log(Level.SEVERE, "Unexpected Exception calling publish dataverse command", ex);
JsfHelper.addErrorMessage(BundleUtil.getStringFromBundle("dataverse.publish.failure"));
}
} else {
JsfHelper.addErrorMessage(BundleUtil.getStringFromBundle("dataverse.publish.not.authorized"));
}
return "/dataverse.xhtml?alias=" + dataverse.getAlias() + "&faces-redirect=true";
}
public String deleteDataverse() {
DeleteDataverseCommand cmd = new DeleteDataverseCommand(dvRequestService.getDataverseRequest(), dataverse);
try {
commandEngine.submit(cmd);
JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataverse.delete.success"));
} catch (Exception ex) {
logger.log(Level.SEVERE, "Unexpected Exception calling delete dataverse command", ex);
JsfHelper.addErrorMessage(BundleUtil.getStringFromBundle("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);
}
}
}
}