Index: impl/src/test/org/sakaiproject/evaluation/test/mocks/MockEvalExternalLogic.java =================================================================== --- impl/src/test/org/sakaiproject/evaluation/test/mocks/MockEvalExternalLogic.java (revision 69168) +++ impl/src/test/org/sakaiproject/evaluation/test/mocks/MockEvalExternalLogic.java (revision 69217) @@ -577,4 +577,17 @@ return true; } +@SuppressWarnings("unchecked") +public List searchForEvalGroupIds(String searchString, String order, int startResult, int maxResults) { + // TODO Auto-generated method stub + List sitesIds = (List) EvalTestDataLoad.EMPTY_LIST; + if (EvalTestDataLoad.SITE1_TITLE.contains(searchString)){ + sitesIds.add(EvalTestDataLoad.SITE1_REF); + } + if (EvalTestDataLoad.SITE2_TITLE.contains(searchString)){ + sitesIds.add(EvalTestDataLoad.SITE2_REF); + } + return sitesIds; } + +} Index: impl/src/test/org/sakaiproject/evaluation/logic/EvalEvaluationServiceImplTest.java =================================================================== --- impl/src/test/org/sakaiproject/evaluation/logic/EvalEvaluationServiceImplTest.java (revision 69168) +++ impl/src/test/org/sakaiproject/evaluation/logic/EvalEvaluationServiceImplTest.java (revision 69217) @@ -1425,5 +1425,16 @@ List list05 = this.evaluationService.getEvaluations(searchString, order, 4, 25); assertEquals(6, list05.size()); } + + public void testGetEvaluationsForEvalGroups(){ + //first get the eval group Ids + String searchString = "Site1"; + String order = "title"; + int MAX_SEARCH = 1; + List sitesIds = externalLogic.searchForEvalGroupIds(searchString, "", 0, MAX_SEARCH); + assertEquals(1, sitesIds.size()); + List evaluations = evaluationService.getEvaluationsForEvalGroups(sitesIds.toArray(new String[sitesIds.size()]), 0, 0); + assertEquals(6, evaluations.size()); + } } Index: impl/src/java/org/sakaiproject/evaluation/logic/EvalCommonLogicImpl.java =================================================================== --- impl/src/java/org/sakaiproject/evaluation/logic/EvalCommonLogicImpl.java (revision 69168) +++ impl/src/java/org/sakaiproject/evaluation/logic/EvalCommonLogicImpl.java (revision 69217) @@ -42,6 +42,8 @@ import org.sakaiproject.evaluation.providers.EvalGroupsProvider; import org.sakaiproject.evaluation.utils.ArrayUtils; import org.sakaiproject.evaluation.utils.EvalUtils; +import org.sakaiproject.site.api.Site; +import org.sakaiproject.site.api.SiteService.SortType; /** * This is the implementation for the base service @@ -744,4 +746,9 @@ return md5; } + + public List searchForEvalGroupIds(String searchString, String order, int startResult, int maxResults) { + return externalLogic.searchForEvalGroupIds(searchString, order, startResult, maxResults); + } + } Index: impl/src/java/org/sakaiproject/evaluation/logic/EvalEvaluationServiceImpl.java =================================================================== --- impl/src/java/org/sakaiproject/evaluation/logic/EvalEvaluationServiceImpl.java (revision 69168) +++ impl/src/java/org/sakaiproject/evaluation/logic/EvalEvaluationServiceImpl.java (revision 69217) @@ -15,6 +15,7 @@ package org.sakaiproject.evaluation.logic; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; @@ -40,6 +41,9 @@ import org.sakaiproject.genericdao.api.search.Order; import org.sakaiproject.genericdao.api.search.Restriction; import org.sakaiproject.genericdao.api.search.Search; +import org.sakaiproject.site.api.Site; +import org.sakaiproject.site.api.SiteService; +import org.sakaiproject.site.api.SiteService.SortType; /** @@ -78,7 +82,12 @@ this.settings = settings; } + private SiteService siteService; + public void setSiteService(SiteService siteService) { + this.siteService = siteService; + } + /* (non-Javadoc) * @see org.sakaiproject.evaluation.logic.EvalEvaluationService#getEvaluationById(java.lang.Long) */ @@ -1113,4 +1122,12 @@ return template; } + public List getEvaluationsForEvalGroups(String[] evalGroupIds, int startResult, int maxResults){ + if( evalGroupIds.length > 0){ + return dao.getEvaluationsForOwnerAndGroups("", evalGroupIds, null, startResult, maxResults, Boolean.TRUE); + }else{ + return new ArrayList(); + } + } + } Index: impl/src/java/org/sakaiproject/evaluation/logic/externals/EvalExternalLogicImpl.java =================================================================== --- impl/src/java/org/sakaiproject/evaluation/logic/externals/EvalExternalLogicImpl.java (revision 69168) +++ impl/src/java/org/sakaiproject/evaluation/logic/externals/EvalExternalLogicImpl.java (revision 69217) @@ -53,6 +53,9 @@ import org.sakaiproject.entity.api.Reference; import org.sakaiproject.entitybroker.EntityBroker; import org.sakaiproject.entitybroker.EntityReference; +import org.sakaiproject.entitybroker.entityprovider.search.Order; +import org.sakaiproject.entitybroker.entityprovider.search.Restriction; +import org.sakaiproject.entitybroker.entityprovider.search.Search; import org.sakaiproject.evaluation.constant.EvalConstants; import org.sakaiproject.evaluation.logic.entity.AssignGroupEntityProvider; import org.sakaiproject.evaluation.logic.entity.ConfigEntityProvider; @@ -75,6 +78,7 @@ import org.sakaiproject.evaluation.providers.EvalGroupsProvider; import org.sakaiproject.evaluation.utils.ArrayUtils; import org.sakaiproject.exception.IdUnusedException; +import org.sakaiproject.javax.PagingPosition; import org.sakaiproject.site.api.Group; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.api.SiteService; @@ -1095,5 +1099,15 @@ return isEvalGroupPublished; } + public List searchForEvalGroupIds(String searchString, String order, int startResult, int maxResults) { + //for now support sakai sites only TODO:// support hierarchy and adhoc groups. Ordering? + List sakaiSites = new ArrayList(); //keep site ref + List searchResults = siteService.getSites(SiteService.SelectionType.ANY, null, searchString, null, SiteService.SortType.TITLE_ASC, new PagingPosition(1, maxResults)); + for ( Object rawSite : searchResults){ + Site site = (Site) rawSite; + sakaiSites.add(site.getReference()); + } + return sakaiSites; + } } Index: api/src/java/org/sakaiproject/evaluation/logic/EvalEvaluationService.java =================================================================== --- api/src/java/org/sakaiproject/evaluation/logic/EvalEvaluationService.java (revision 69168) +++ api/src/java/org/sakaiproject/evaluation/logic/EvalEvaluationService.java (revision 69217) @@ -14,6 +14,7 @@ package org.sakaiproject.evaluation.logic; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; @@ -619,4 +620,11 @@ public List getEvaluations(String searchString, String order, int startResult, int maxResults); + /** + * Retrieve a list of evaluations with matching eval group Ids. + * @param startResult Results set will start at this minimum count + * @param maxResults Results set will end at this limit count + * @param searchString Text to match. If empty no results are sent back + */ + public List getEvaluationsForEvalGroups(String[] evalGroupIds, int startResult, int maxResults); } Index: api/src/java/org/sakaiproject/evaluation/logic/externals/EvalExternalLogic.java =================================================================== --- api/src/java/org/sakaiproject/evaluation/logic/externals/EvalExternalLogic.java (revision 69168) +++ api/src/java/org/sakaiproject/evaluation/logic/externals/EvalExternalLogic.java (revision 69217) @@ -99,5 +99,4 @@ */ public T getConfigurationSetting(String settingName, T defaultValue); - } Index: api/src/java/org/sakaiproject/evaluation/logic/externals/ExternalEvalGroups.java =================================================================== --- api/src/java/org/sakaiproject/evaluation/logic/externals/ExternalEvalGroups.java (revision 69168) +++ api/src/java/org/sakaiproject/evaluation/logic/externals/ExternalEvalGroups.java (revision 69217) @@ -20,6 +20,9 @@ import org.sakaiproject.evaluation.constant.EvalConstants; import org.sakaiproject.evaluation.logic.EvalCommonLogic; import org.sakaiproject.evaluation.logic.model.EvalGroup; +import org.sakaiproject.evaluation.logic.model.EvalHierarchyNode; +import org.sakaiproject.evaluation.model.EvalAdhocGroup; +import org.sakaiproject.evaluation.model.EvalAssignGroup; /** * This interface provides methods to get EvalGroups (user collections) information @@ -108,4 +111,15 @@ */ public boolean isEvalGroupPublished(String evalGroupId); + /** + * Get a list of evaluation group Ids that contain the search term. + * Currently, this will only search assign groups of type Sakai Site + * + * @param searchString Text to match. If empty no results are sent back + * @param order Field to order the groups + * @param startResult Results set will start at this minimum count + * @param maxResults Results set will end at this limit count + */ + public List searchForEvalGroupIds(String searchString, String order, int startResult, int maxResults); + } Index: api/src/java/org/sakaiproject/evaluation/logic/EvalCommonLogic.java =================================================================== --- api/src/java/org/sakaiproject/evaluation/logic/EvalCommonLogic.java (revision 69168) +++ api/src/java/org/sakaiproject/evaluation/logic/EvalCommonLogic.java (revision 69217) @@ -24,9 +24,11 @@ import org.sakaiproject.evaluation.logic.externals.ExternalSecurity; import org.sakaiproject.evaluation.logic.externals.ExternalTextUtils; import org.sakaiproject.evaluation.logic.externals.ExternalUsers; +import org.sakaiproject.evaluation.logic.model.EvalHierarchyNode; import org.sakaiproject.evaluation.logic.model.EvalUser; import org.sakaiproject.evaluation.model.EvalAdhocGroup; import org.sakaiproject.evaluation.model.EvalAdhocUser; +import org.sakaiproject.evaluation.model.EvalAssignGroup; /** @@ -183,5 +185,23 @@ * @return the list of all adhoc groups that this user owns */ public List getAdhocGroupsForOwner(String userId); + + /** + * Get a list of evaluation groups that contain the search term. + * SUPPORTED: Search assign groups of type Sakai Site + *

+ * NOT YET SUPPORTED: This will search all supported group types by attribute: + *
  • {@link EvalAdhocGroup#getTitle()}
  • + *
  • {@link EvalAssignGroup} searched by corresponding title (eg: sakai site title)
  • + *
  • {@link EvalHierarchyNode#title}
+ * + * @param searchString Text to match. If empty no results are sent back + * @param order Field to order the groups + * @param startResult Results set will start at this minimum count + * @param maxResults Results set will end at this limit count + * + * @return An ordered list of eval group ids + */ + public List searchForEvalGroupIds(String searchString, String order, int startResult, int maxResults); } Index: tool/src/java/org/sakaiproject/evaluation/tool/AdministrateSearchBean.java =================================================================== --- tool/src/java/org/sakaiproject/evaluation/tool/AdministrateSearchBean.java (revision 69168) +++ tool/src/java/org/sakaiproject/evaluation/tool/AdministrateSearchBean.java (revision 69217) @@ -35,4 +35,9 @@ { return "administrateSearchBean.processSearch"; } + + public String processSearchForGroups() + { + return "administrateSearchBean.processSearchForGroups"; + } } Index: tool/src/java/org/sakaiproject/evaluation/tool/producers/AdministrateSearchProducer.java =================================================================== --- tool/src/java/org/sakaiproject/evaluation/tool/producers/AdministrateSearchProducer.java (revision 69168) +++ tool/src/java/org/sakaiproject/evaluation/tool/producers/AdministrateSearchProducer.java (revision 69217) @@ -50,6 +50,7 @@ import uk.org.ponder.rsf.components.UIInternalLink; import uk.org.ponder.rsf.components.UIMessage; import uk.org.ponder.rsf.components.UIOutput; +import uk.org.ponder.rsf.components.UIParameter; import uk.org.ponder.rsf.util.RSFUtil; import uk.org.ponder.rsf.view.ComponentChecker; import uk.org.ponder.rsf.view.ViewComponentProducer; @@ -65,6 +66,7 @@ public class AdministrateSearchProducer implements ViewComponentProducer, ViewParamsReporter { public static int PAGE_SIZE = 20; + public static int MAX_GROUP_SIZE = 200; /** * This is used for navigation within the system. @@ -111,12 +113,14 @@ public void fillComponents(UIContainer tofill, ViewParameters viewparams, ComponentChecker checker) { String searchString = ""; + boolean searchForGroups = false; int page = 0; if(viewparams instanceof AdminSearchViewParameters) { AdminSearchViewParameters asvp = (AdminSearchViewParameters) viewparams; searchString = asvp.searchString; page = asvp.page; + searchForGroups = asvp.searchGroups; } String currentUserId = commonLogic.getCurrentUserId(); @@ -173,12 +177,16 @@ //System Settings UIForm searchForm = UIForm.make(tofill, "search-form"); - UIInput searchInput = UIInput.make(searchForm, "search-input", + UIInput.make(searchForm, "search-input", "#{administrateSearchBean.searchString}", searchString); RSFUtil.addResultingViewBinding(searchForm, "searchString", "#{administrateSearchBean.searchString}"); UICommand.make(searchForm, "search-text", UIMessage.make("administrate.search.submit.title"), "administrateSearchBean.processSearch"); + UICommand.make(searchForm, "search-text-group", + UIMessage.make("administrate.search.submit.title.group"), + "administrateSearchBean.processSearchForGroups"); + RSFUtil.addBasicFormParameter(searchForm, new UIParameter("searchForGroups", "0")); searchForm.parameters.add(new UIELBinding("administrateSearchBean.page", 0)); RSFUtil.addResultingViewBinding(searchForm, "page", "#{administrateSearchBean.page}"); @@ -188,44 +196,63 @@ if(searchString != null && ! searchString.trim().equals("")) { + + int startResult = page * PAGE_SIZE; int maxResults = PAGE_SIZE; String order = "title"; + List evals = new ArrayList(); + int count = 0; - int count = this.evaluationService.countEvaluations(searchString); + if (searchForGroups){ + // do the search for groups and get the results + List assignGroups = commonLogic.searchForEvalGroupIds(searchString, order, startResult, MAX_GROUP_SIZE); + evals = evaluationService.getEvaluationsForEvalGroups(assignGroups.toArray(new String[assignGroups.size()]), 0, 0); //get all evaluations + + if (assignGroups.size() >= MAX_GROUP_SIZE){ + //show 'too many results' messages + UIMessage.make(tofill, "results-max", "administrate.search.results.max", new String[]{String.valueOf(assignGroups.size())}); + } + count = evals.size(); + }else{ + count = evaluationService.countEvaluations(searchString); + } + if(count > 0) { - // do the search and get the results - List evals = this.evaluationService.getEvaluations(searchString, order, startResult, maxResults); + if (!searchForGroups){ + // do the search for evaluation titles and get the results + evals = this.evaluationService.getEvaluations(searchString, order, startResult, maxResults); - int actualStart = startResult + 1; - int actualEnd = startResult + evals.size(); - if(count > PAGE_SIZE) - { - // show count and pager - // show x - y of z message - UIMessage.make(tofill, "pager-count-message", "administrate.search.pager.label", new String[]{ nf.format(actualStart), nf.format(actualEnd), nf.format(count) }); - // show pager - if(page > 0) + int actualStart = startResult + 1; + int actualEnd = startResult + evals.size(); + if(count > PAGE_SIZE) { - // show "previous" pager - UIInternalLink.make(tofill, "previous", new AdminSearchViewParameters(VIEW_ID, searchString, page - 1)); + // show count and pager + // show x - y of z message + UIMessage.make(tofill, "pager-count-message", "administrate.search.pager.label", new String[]{ nf.format(actualStart), nf.format(actualEnd), nf.format(count) }); + // show pager + if(page > 0) + { + // show "previous" pager + UIInternalLink.make(tofill, "previous", new AdminSearchViewParameters(VIEW_ID, searchString, page - 1, searchForGroups)); + } + else + { + // show disabled "previous" pager + UIOutput.make(tofill, "no-previous"); + } + if(count > startResult + maxResults) + { + // show "next" pager + UIInternalLink.make(tofill, "next", new AdminSearchViewParameters(VIEW_ID, searchString, page + 1, searchForGroups)); + } + else + { + //show disabled "next" pager + UIOutput.make(tofill, "no-next"); + } } - else - { - // show disabled "previous" pager - UIOutput.make(tofill, "no-previous"); - } - if(count > startResult + maxResults) - { - // show "next" pager - UIInternalLink.make(tofill, "next", new AdminSearchViewParameters(VIEW_ID, searchString, page + 1)); - } - else - { - //show disabled "next" pager - UIOutput.make(tofill, "no-next"); - } } // show results Index: tool/src/java/org/sakaiproject/evaluation/tool/bundle/messages.properties =================================================================== --- tool/src/java/org/sakaiproject/evaluation/tool/bundle/messages.properties (revision 69168) +++ tool/src/java/org/sakaiproject/evaluation/tool/bundle/messages.properties (revision 69217) @@ -177,7 +177,8 @@ administrate.search.page.title=Administrative Search administrate.search.instruction=Search by evaluation title. Search term should be a substring within the title of the evaluation. Matching is case sensitive. administrate.search.breadcrumb.title=Search -administrate.search.submit.title=Search +administrate.search.submit.title=Search Eval Titles +administrate.search.submit.title.group=Search Group Titles administrate.search.pager.label=Viewing {0}-{1} of total {2} administrate.search.list.title.title=Title administrate.search.list.group.id.title=Group ID @@ -189,6 +190,7 @@ administrate.search.list.preview=preview administrate.search.list.revise=revise administrate.search.list.owner=Owner +administrate.search.results.max=Too many sites were found and results have been limited to {0} sites, you can be a little more specific with your search. # Control Templates Index: tool/src/java/org/sakaiproject/evaluation/tool/viewparams/AdminSearchViewParameters.java =================================================================== --- tool/src/java/org/sakaiproject/evaluation/tool/viewparams/AdminSearchViewParameters.java (revision 69168) +++ tool/src/java/org/sakaiproject/evaluation/tool/viewparams/AdminSearchViewParameters.java (revision 69217) @@ -32,6 +32,7 @@ { public String searchString = ""; public int page = 0; + public boolean searchGroups = false; public AdminSearchViewParameters() { @@ -48,6 +49,16 @@ super(viewId); this.searchString = searchString; this.page = page; + this.searchGroups = false; } + + public AdminSearchViewParameters(String viewId, String searchString, int page, boolean searchGroups) + { + super(viewId); + this.searchString = searchString; + this.page = page; + this.searchGroups = searchGroups; + } + } Index: tool/src/webapp/content/templates/administrate_search.html =================================================================== --- tool/src/webapp/content/templates/administrate_search.html (revision 69168) +++ tool/src/webapp/content/templates/administrate_search.html (revision 69217) @@ -9,10 +9,20 @@ - + + +
@@ -45,13 +55,18 @@
+
Too many results were returned, be a little more specific with your search. +