/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package edu.harvard.iq.dataverse.mydata; import edu.harvard.iq.dataverse.DvObject; import static edu.harvard.iq.dataverse.DvObject.DATASET_DTYPE_STRING; import static edu.harvard.iq.dataverse.DvObject.DATAVERSE_DTYPE_STRING; import edu.harvard.iq.dataverse.search.IndexServiceBean; import edu.harvard.iq.dataverse.authorization.DataverseRolePermissionHelper; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.search.SearchConstants; import edu.harvard.iq.dataverse.search.SearchFields; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; import javax.json.Json; import javax.json.JsonArrayBuilder; import javax.json.JsonObjectBuilder; import org.apache.commons.lang.StringUtils; import org.primefaces.json.JSONException; import org.primefaces.json.JSONObject; /** * * @author rmp553 */ public class MyDataFilterParams { private static final Logger logger = Logger.getLogger(MyDataFilterParams.class.getCanonicalName()); // ----------------------------------- // Static Reference objects // ----------------------------------- public static final List<String> defaultDvObjectTypes = Arrays.asList(DvObject.DATAVERSE_DTYPE_STRING, DvObject.DATASET_DTYPE_STRING); public static final List<String> allDvObjectTypes = Arrays.asList(DvObject.DATAVERSE_DTYPE_STRING, DvObject.DATASET_DTYPE_STRING, DvObject.DATAFILE_DTYPE_STRING); public static final List<String> defaultPublishedStates = Arrays.asList(IndexServiceBean.getPUBLISHED_STRING(), IndexServiceBean.getUNPUBLISHED_STRING(), IndexServiceBean.getDRAFT_STRING(), IndexServiceBean.getIN_REVIEW_STRING(), IndexServiceBean.getDEACCESSIONED_STRING()); public static final List<String> allPublishedStates = defaultPublishedStates; /*Arrays.asList(IndexServiceBean.getPUBLISHED_STRING(), IndexServiceBean.getUNPUBLISHED_STRING(), IndexServiceBean.getDRAFT_STRING(), IndexServiceBean.getIN_REVIEW_STRING(), IndexServiceBean.getDEACCESSIONED_STRING());*/ public static final HashMap<String, String> sqlToSolrSearchMap ; static { sqlToSolrSearchMap = new HashMap<>(); sqlToSolrSearchMap.put(DvObject.DATAVERSE_DTYPE_STRING, SearchConstants.DATAVERSES); sqlToSolrSearchMap.put(DvObject.DATASET_DTYPE_STRING, SearchConstants.DATASETS); sqlToSolrSearchMap.put(DvObject.DATAFILE_DTYPE_STRING, SearchConstants.FILES); } public static final HashMap<String, String> userInterfaceToSqlSearchMap ; static { userInterfaceToSqlSearchMap = new HashMap<>(); userInterfaceToSqlSearchMap.put(DvObject.DATAVERSE_DTYPE_STRING, SearchConstants.UI_DATAVERSES); userInterfaceToSqlSearchMap.put(DvObject.DATASET_DTYPE_STRING, SearchConstants.UI_DATAVERSES); userInterfaceToSqlSearchMap.put(DvObject.DATAFILE_DTYPE_STRING, SearchConstants.UI_FILES); } // ----------------------------------- // Filter parameters // ----------------------------------- private DataverseRequest dataverseRequest; private AuthenticatedUser authenticatedUser; private String userIdentifier; private List<String> dvObjectTypes; private List<String> publicationStatuses; private List<Long> roleIds; //private ArrayList<DataverseRole> roles; public static final String defaultSearchTerm = "*:*"; private String searchTerm = "*:*"; // ----------------------------------- // Error checking // ----------------------------------- private boolean errorFound = false; private String errorMessage = null; /** * Constructor used to get total counts * * @param authenticatedUser * @param userIdentifier */ public MyDataFilterParams(DataverseRequest dataverseRequest, DataverseRolePermissionHelper roleHelper){ if (dataverseRequest==null){ throw new NullPointerException("MyDataFilterParams constructor: dataverseRequest cannot be null "); } this.dataverseRequest = dataverseRequest; this.setAuthenticatedUserFromDataverseRequest(dataverseRequest); this.userIdentifier = authenticatedUser.getIdentifier(); if (roleHelper==null){ throw new NullPointerException("MyDataFilterParams constructor: roleHelper cannot be null"); } this.dvObjectTypes = MyDataFilterParams.allDvObjectTypes; this.publicationStatuses = MyDataFilterParams.allPublishedStates; this.searchTerm = MyDataFilterParams.defaultSearchTerm; this.roleIds = roleHelper.getRoleIdList(); } /** * @param userIdentifier * @param dvObjectTypes * @param publicationStatuses * @param searchTerm */ public MyDataFilterParams(DataverseRequest dataverseRequest, List<String> dvObjectTypes, List<String> publicationStatuses, List<Long> roleIds, String searchTerm){ if (dataverseRequest==null){ throw new NullPointerException("MyDataFilterParams constructor: dataverseRequest cannot be null "); } this.dataverseRequest = dataverseRequest; this.setAuthenticatedUserFromDataverseRequest(dataverseRequest); this.userIdentifier = authenticatedUser.getIdentifier(); if (dvObjectTypes==null){ throw new NullPointerException("MyDataFilterParams constructor: dvObjectTypes cannot be null"); } this.dvObjectTypes = dvObjectTypes; if (publicationStatuses == null){ this.publicationStatuses = MyDataFilterParams.defaultPublishedStates; }else{ this.publicationStatuses = publicationStatuses; } // Do something here if none chosen! this.roleIds = roleIds; if ((searchTerm == null)||(searchTerm.trim().isEmpty())){ this.searchTerm = MyDataFilterParams.defaultSearchTerm; }else{ this.searchTerm = searchTerm; } this.checkParams(); } private void setAuthenticatedUserFromDataverseRequest(DataverseRequest dvRequest){ if (dvRequest == null){ throw new NullPointerException("MyDataFilterParams getAuthenticatedUserFromDataverseRequest: dvRequest cannot be null"); } this.authenticatedUser = dvRequest.getAuthenticatedUser(); if (this.authenticatedUser == null){ throw new NullPointerException("MyDataFilterParams getAuthenticatedUserFromDataverseRequest: Hold on! dvRequest must be associated with an AuthenticatedUser be null"); } } public List<Long> getRoleIds(){ return this.roleIds; } private void checkParams(){ if ((this.userIdentifier == null)||(this.userIdentifier.isEmpty())){ this.addError("Sorry! No user was found!"); return; } if ((this.roleIds == null)||(this.roleIds.isEmpty())){ this.addError("No results. Please select at least one Role."); return; } if ((this.dvObjectTypes == null)||(this.dvObjectTypes.isEmpty())){ this.addError("No results. Please select one of Dataverses, Datasets, Files."); return; } if ((this.publicationStatuses == null)||(this.publicationStatuses.isEmpty())){ this.addError("No results. Please select one of " + StringUtils.join(MyDataFilterParams.defaultPublishedStates, ", ") + "."); return; } for (String dtype : this.dvObjectTypes){ if (!DvObject.DTYPE_LIST.contains(dtype)){ this.addError("Sorry! The type '" + dtype + "' is not known."); return; } } } public List<String> getDvObjectTypes(){ return this.dvObjectTypes; } public String getUserIdentifier(){ return this.userIdentifier; } public AuthenticatedUser getAuthenticatedUser() { return authenticatedUser; } public String getErrorMessage(){ return this.errorMessage; } public boolean hasError(){ return this.errorFound; } public void addError(String s){ this.errorFound = true; this.errorMessage = s; } // -------------------------------------------- // start: Convenience methods for dvObjectTypes // -------------------------------------------- public boolean areDataversesIncluded(){ if (this.dvObjectTypes.contains(DvObject.DATAVERSE_DTYPE_STRING)){ return true; } return false; } public boolean areDatasetsIncluded(){ if (this.dvObjectTypes.contains(DvObject.DATASET_DTYPE_STRING)){ return true; } return false; } public boolean areFilesIncluded(){ if (this.dvObjectTypes.contains(DvObject.DATAFILE_DTYPE_STRING)){ return true; } return false; } public String getSolrFragmentForDvObjectType(){ if ((this.dvObjectTypes == null)||(this.dvObjectTypes.isEmpty())){ throw new IllegalStateException("Error encountered earlier. Before calling this method, first check 'hasError()'"); } List<String> solrTypes = new ArrayList<>(); for (String dtype : this.dvObjectTypes){ solrTypes.add(MyDataFilterParams.sqlToSolrSearchMap.get(dtype)); } String valStr = StringUtils.join(solrTypes, " OR "); if (this.dvObjectTypes.size() > 1){ valStr = "(" + valStr + ")"; } return SearchFields.TYPE + ":" + valStr;// + ")"; } public String getSolrFragmentForPublicationStatus(){ if ((this.publicationStatuses == null)||(this.publicationStatuses.isEmpty())){ throw new IllegalStateException("Error encountered earlier. Before calling this method, first check 'hasError()'"); } // Add quotes around each publication status // List<String> solrPublicationStatuses = new ArrayList<>(); for (String pubStatus : this.publicationStatuses){ solrPublicationStatuses.add("\"" + pubStatus + "\""); } String valStr = StringUtils.join(solrPublicationStatuses, " OR "); if (this.publicationStatuses.size() > 1){ valStr = "(" + valStr + ")"; } return "(" + SearchFields.PUBLICATION_STATUS + ":" + valStr + ")"; } public String getDvObjectTypesAsJSONString(){ return this.getDvObjectTypesAsJSON().build().toString(); } /** * "publication_statuses" : [ name 1, name 2, etc.] * * @return */ public JsonArrayBuilder getListofSelectedPublicationStatuses(){ JsonArrayBuilder jsonArray = Json.createArrayBuilder(); for (String pubStatus : this.publicationStatuses){ jsonArray.add(pubStatus); } return jsonArray; } public JsonObjectBuilder getDvObjectTypesAsJSON(){ JsonArrayBuilder jsonArray = Json.createArrayBuilder(); jsonArray.add(Json.createObjectBuilder().add("value", DvObject.DATAVERSE_DTYPE_STRING) .add("label", SearchConstants.UI_DATAVERSES) .add("selected", this.areDataversesIncluded())) .add(Json.createObjectBuilder().add("value", DvObject.DATASET_DTYPE_STRING) .add("label", SearchConstants.UI_DATASETS) .add("selected", this.areDatasetsIncluded())) .add(Json.createObjectBuilder().add("value", DvObject.DATAFILE_DTYPE_STRING) .add("label", SearchConstants.UI_FILES) .add("selected", this.areFilesIncluded()) ); JsonObjectBuilder jsonData = Json.createObjectBuilder(); jsonData.add(SearchFields.TYPE, jsonArray); return jsonData; } // -------------------------------------------- // end: Convenience methods for dvObjectTypes // -------------------------------------------- public String getSearchTerm(){ return this.searchTerm; } public static List<String[]> getPublishedStatesForMyDataPage(){ if (defaultPublishedStates==null){ throw new NullPointerException("defaultPublishedStates cannot be null"); } List<String[]> publicationStateInfoList = new ArrayList<String[]>(); String stateNameAsVariable; for (String displayState : defaultPublishedStates){ stateNameAsVariable = displayState.toLowerCase().replace(" ", "_"); String[] singleInfoRow = { displayState, stateNameAsVariable }; publicationStateInfoList.add(singleInfoRow); } return publicationStateInfoList; } public DataverseRequest getDataverseRequest(){ return this.dataverseRequest; } }