/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/profile/trunk/profile-app/src/java/org/sakaiproject/tool/profile/SearchTool.java $
* $Id: SearchTool.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.tool.profile;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.faces.event.ValueChangeEvent;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.api.app.profile.Profile;
import org.sakaiproject.api.app.profile.ProfileManager;
import org.sakaiproject.util.ResourceLoader;
/**
* @author rshastri <a href="mailto:rshastri@iupui.edu ">Rashmi Shastri</a>
*/
public class SearchTool
{
private ResourceLoader msgs = new ResourceLoader("org.sakaiproject.tool.profile.bundle.Messages");
private static final Log LOG = LogFactory.getLog(SearchTool.class);
private DecoratedProfile profile;
private String searchKeyword;
private List searchResults;
private List currentSearchResults;
private int noOfRecDisplayedFrom = 0;
private int noOfRecDisplayedTo = 0;
private int numberOfSearchedRecordsDisplayedPerPage = 10;
private String displayNoOfRec = "10";
private boolean showPrevious = false;
private boolean showNext = false;
private boolean showSearchResults = false;
private boolean showNoMatchFound = false;
private boolean redirectToSearchedProfile = false;
protected ProfileManager profileService;
public SearchTool()
{
this.reset(msgs.getString("java.search_keyword"));
}
public String getDisplayPage()
{
LOG.debug("getDisplayPage()");
if (redirectToSearchedProfile)
{
return "displaySearchedProfile";
}
else
{
return "main";
}
}
public void processValueChangeForDisplayNSearchResult(ValueChangeEvent vce)
{
if (LOG.isDebugEnabled()) LOG.debug("processValueChangeForDisplayNSearchResult(ValueChangeEvent " + vce + ")");
setDisplayNoOfRec(((String) vce.getNewValue()));
LOG.debug("Show these many rec :" + (String) vce.getNewValue());
processActionDisplayFirst();
}
public String processActionDisplayFirst()
{
LOG.debug("processActionDisplayFirst()");
try
{
if ((searchResults != null) && (searchResults.size() > 1)
&& (searchResults.size() <= numberOfSearchedRecordsDisplayedPerPage))
{
showPrevious = false;
showNext = false;
showSearchResults = true;
currentSearchResults = searchResults;
noOfRecDisplayedFrom = 1;
noOfRecDisplayedTo = searchResults.size();
return getDisplayPage();
}
else if ((searchResults != null) && (searchResults.size() > numberOfSearchedRecordsDisplayedPerPage))
{
currentSearchResults = searchResults.subList(0, (numberOfSearchedRecordsDisplayedPerPage));
noOfRecDisplayedFrom = 1;
noOfRecDisplayedTo = numberOfSearchedRecordsDisplayedPerPage;
showPrevious = false;
showNext = true;
showSearchResults = true;
return getDisplayPage();
}
else
{
return profile.processActionDisplayProfile();
}
}
catch (Exception e)
{
LOG.error(e.getMessage(), e);
return null;
}
}
public String processActionDisplayNext()
{
LOG.debug("processActionDisplayNext()");
try
{
if ((searchResults != null) && (searchResults.size() > (noOfRecDisplayedTo)))
{
this.showNoMatchFound = false;
this.showSearchResults = true;
this.showPrevious = true;
if (searchResults.size() > (noOfRecDisplayedTo + numberOfSearchedRecordsDisplayedPerPage))
{
currentSearchResults = searchResults.subList((noOfRecDisplayedTo),
(noOfRecDisplayedTo + numberOfSearchedRecordsDisplayedPerPage));
noOfRecDisplayedFrom = noOfRecDisplayedTo + 1;
noOfRecDisplayedTo = noOfRecDisplayedTo + numberOfSearchedRecordsDisplayedPerPage;
showNext = true;
return getDisplayPage();
}
if (searchResults.size() == (noOfRecDisplayedTo + numberOfSearchedRecordsDisplayedPerPage))
{
currentSearchResults = searchResults.subList((noOfRecDisplayedTo),
(noOfRecDisplayedTo + numberOfSearchedRecordsDisplayedPerPage));
noOfRecDisplayedFrom = noOfRecDisplayedTo + 1;
noOfRecDisplayedTo = noOfRecDisplayedTo + numberOfSearchedRecordsDisplayedPerPage;
showNext = false;
return getDisplayPage();
}
if (searchResults.size() < (noOfRecDisplayedTo + numberOfSearchedRecordsDisplayedPerPage))
{
currentSearchResults = searchResults.subList((noOfRecDisplayedTo), (searchResults.size()));
noOfRecDisplayedFrom = noOfRecDisplayedTo + 1;
noOfRecDisplayedTo = searchResults.size();
showNext = false;
return getDisplayPage();
}
}
return getDisplayPage();
}
catch (Exception e)
{
LOG.error(e.getMessage(), e);
return null;
}
}
public String processActionDisplayPrevious()
{
LOG.debug("processActionDisplayPrevious()");
try
{
if ((searchResults != null) && ((noOfRecDisplayedFrom) > 1)
&& (noOfRecDisplayedFrom >= numberOfSearchedRecordsDisplayedPerPage))
{
this.showNext = true;
this.showNoMatchFound = false;
this.showSearchResults = true;
if ((noOfRecDisplayedFrom - numberOfSearchedRecordsDisplayedPerPage) == 1)
{
showPrevious = false;
currentSearchResults = searchResults.subList(0, (numberOfSearchedRecordsDisplayedPerPage));
noOfRecDisplayedFrom = 1;
noOfRecDisplayedTo = numberOfSearchedRecordsDisplayedPerPage;
}
else
{
showPrevious = true;
currentSearchResults = searchResults.subList(
(noOfRecDisplayedFrom - numberOfSearchedRecordsDisplayedPerPage - 1), (noOfRecDisplayedFrom - 1));
noOfRecDisplayedTo = noOfRecDisplayedFrom - 1;
noOfRecDisplayedFrom = noOfRecDisplayedFrom - numberOfSearchedRecordsDisplayedPerPage;
}
}
else
{
showPrevious = false;
}
return getDisplayPage();
}
catch (Exception e)
{
LOG.error(e.getMessage(), e);
return null;
}
}
public String processActionDisplayLast()
{
LOG.debug("processActionDisplayLast()");
try
{
// Single page display
if ((searchResults != null) && (searchResults.size() > 1)
&& (searchResults.size() <= numberOfSearchedRecordsDisplayedPerPage))
{
showPrevious = false;
showNext = false;
currentSearchResults = searchResults;
return this.getDisplayPage();
}
else if ((searchResults != null) && (searchResults.size() > numberOfSearchedRecordsDisplayedPerPage))
{
int displayRecForLastPage = searchResults.size() % numberOfSearchedRecordsDisplayedPerPage;
if (displayRecForLastPage == 0)
{
currentSearchResults = searchResults.subList((searchResults.size() - numberOfSearchedRecordsDisplayedPerPage),
(searchResults.size()));
noOfRecDisplayedFrom = searchResults.size() - numberOfSearchedRecordsDisplayedPerPage + 1;
}
else
{
// there is a remainder
currentSearchResults = searchResults.subList((searchResults.size() - displayRecForLastPage), (searchResults
.size()));
noOfRecDisplayedFrom = searchResults.size() - displayRecForLastPage + 1;
}
noOfRecDisplayedTo = searchResults.size();
showPrevious = true;
showNext = false;
return this.getDisplayPage();
}
else
// search result is exactly 1
{
return profile.processActionDisplayProfile();
}
}
catch (Exception e)
{
LOG.error(e.getMessage(), e);
return null;
}
}
public String processActionSearch()
{
LOG.debug("processActionSearch()");
try
{
this.reset(searchKeyword);
// Find User mutable profiles only
if (searchKeyword == null || searchKeyword.trim().length() < 1)
{
this.showNoMatchFound = true;
return "main";
}
List profiles = profileService.findProfiles(searchKeyword);
searchResults = new ArrayList();
if ((profiles != null) && (profiles.size() > 0))
{
Iterator profileIterator = profiles.iterator();
while (profileIterator.hasNext())
{
profile = new DecoratedProfile((Profile) profileIterator.next());
searchResults.add(profile);
}
return processActionDisplayFirst();
}
else
{
this.showNoMatchFound = true;
return "main";
}
}
catch (Exception e)
{
LOG.error(e.getMessage(), e);
return null;
}
}
public boolean isShowNext()
{
LOG.debug("isShowNext()");
return showNext;
}
public boolean isShowPrevious()
{
LOG.debug("isShowPrevious()");
return showPrevious;
}
public List getCurrentSearchResults()
{
LOG.debug("getCurrentSearchResults()");
return currentSearchResults;
}
public void setCurrentSearchResults(List currentSearchResults)
{
if (LOG.isDebugEnabled()) LOG.debug("setCurrentSearchResults(List" + currentSearchResults + ")");
this.currentSearchResults = currentSearchResults;
}
public boolean isShowNoMatchFound()
{
LOG.debug("isShowNoMatchFound()");
return showNoMatchFound;
}
public boolean isShowSearchResults()
{
LOG.debug("isShowSearchResults()");
return (showSearchResults);
}
public void reset(String searchKeyword)
{
if (LOG.isDebugEnabled()) LOG.debug("reset(String" + searchKeyword + ")");
this.searchKeyword = searchKeyword;
this.profile = null;
this.searchResults = null;
this.currentSearchResults = null;
this.noOfRecDisplayedFrom = 0;
this.noOfRecDisplayedTo = 0;
this.showPrevious = false;
this.showNext = false;
this.showSearchResults = false;
this.showNoMatchFound = false;
this.redirectToSearchedProfile = false;
}
public String processCancel()
{
LOG.debug("processCancel()");
this.reset(msgs.getString("java.search_keyword"));
return "main";
}
public String getDisplayNoOfRec()
{
LOG.debug("getDisplayNoOfRec()");
try
{
if ((this.displayNoOfRec != null) && (Integer.parseInt(displayNoOfRec) != 0))
{
numberOfSearchedRecordsDisplayedPerPage = Integer.parseInt(displayNoOfRec);
}
}
catch (NumberFormatException e)
{
LOG.error(e.getMessage(), e);
}
return displayNoOfRec;
}
public void setDisplayNoOfRec(String no_of_searched_rec_per_page)
{
if (LOG.isDebugEnabled()) LOG.debug("setDisplayNoOfRec(String " + no_of_searched_rec_per_page + ")");
displayNoOfRec = no_of_searched_rec_per_page;
try
{
if ((this.displayNoOfRec != null) && (Integer.parseInt(displayNoOfRec) != 0))
{
numberOfSearchedRecordsDisplayedPerPage = Integer.parseInt(displayNoOfRec);
}
}
catch (NumberFormatException e)
{
LOG.error(e.getMessage(), e);
}
}
public DecoratedProfile getProfile()
{
LOG.debug("getProfile()");
return profile;
}
/**
* @return
*/
public ProfileManager getProfileService()
{
LOG.debug("getProfileService()");
return profileService;
}
/**
* @return
*/
public String getSearchKeyword()
{
LOG.debug("getSearchKeyword()");
return searchKeyword;
}
/**
* @return
*/
public List getSearchResults()
{
LOG.debug("getSearchResults()");
return searchResults;
}
/**
* @param profileService
*/
public void setProfileService(ProfileManager profileService)
{
if (LOG.isDebugEnabled()) LOG.debug("setProfileService(ProfileManager " + profileService + ")");
this.profileService = profileService;
}
/**
* @param profile
*/
public void setProfile(DecoratedProfile profile)
{
if (LOG.isDebugEnabled()) LOG.debug("setProfile(DecoratedProfile " + profile + ")");
this.profile = profile;
}
/**
* @param searchKeyword
*/
public void setSearchKeyword(String searchKeyword)
{
if (LOG.isDebugEnabled()) LOG.debug("setSearchResults(String " + searchKeyword + ")");
this.searchKeyword = searchKeyword;
}
/**
* @param searchResults
*/
public void setSearchResults(List searchResults)
{
if (LOG.isDebugEnabled()) LOG.debug("setSearchResults(List " + searchResults + ")");
this.searchResults = searchResults;
}
public class DecoratedProfile
{
protected Profile inProfile;
/**
* @param newProfile
*/
public DecoratedProfile(Profile newProfile)
{
if (LOG.isDebugEnabled()) LOG.debug("DecoratedProfile(Profile" + newProfile + ")");
inProfile = newProfile;
}
/**
* @return
*/
public Profile getProfile()
{
LOG.debug("getProfile()");
return inProfile;
}
/**
* @return
*/
public String processActionDisplayProfile()
{
LOG.debug("processActionDisplayProfile()");
try
{
profile = this;
redirectToSearchedProfile = true;
return "displaySearchedProfile";
}
catch (Exception e)
{
LOG.error(e.getMessage(), e);
return null;
}
}
public boolean isDisplayCompleteProfile()
{
LOG.debug("isDisplayCompleteProfile()");
return profileService.displayCompleteProfile(inProfile);
}
public boolean isDisplayPictureURL()
{
LOG.debug("isDisplayPictureURL()");
return profileService.isDisplayPictureURL(inProfile);
}
public boolean isDisplayUniversityPhoto()
{
LOG.debug("isDisplayUniversityPhoto()");
return profileService.isDisplayUniversityPhoto(inProfile);
}
public boolean isDisplayUniversityPhotoUnavailable()
{
LOG.debug("isDisplayUniversityPhotoUnavailable()");
return profileService.isDisplayUniversityPhotoUnavailable(inProfile);
}
public boolean isDisplayNoPicture()
{
LOG.debug("isDisplayPhoto()");
return profileService.isDisplayNoPhoto(inProfile);
}
}
}