/*
* $Id: UserContactSearch.java,v 1.9.2.1 2007/01/12 19:32:48 idegaweb Exp $ Created on
* Jan 17, 2005
*
* Copyright (C) 2005 Idega Software hf. All Rights Reserved.
*
* This software is the proprietary information of Idega hf. Use is subject to
* license terms.
*/
package com.idega.user.block.search.business;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import com.idega.business.IBOLookup;
import com.idega.business.IBOLookupException;
import com.idega.core.contact.data.Email;
import com.idega.core.contact.data.Phone;
import com.idega.core.location.data.Address;
import com.idega.core.search.business.Search;
import com.idega.core.search.business.SearchPlugin;
import com.idega.core.search.business.SearchQuery;
import com.idega.core.search.data.BasicSearch;
import com.idega.core.search.data.BasicSearchResult;
import com.idega.core.search.data.SimpleSearchQuery;
import com.idega.idegaweb.IWBundle;
import com.idega.idegaweb.IWMainApplication;
import com.idega.presentation.IWContext;
import com.idega.user.data.User;
import com.idega.util.ListUtil;
/**
*
* Last modified: $Date: 2007/01/12 19:32:48 $ by $Author: idegaweb $ This class
* implements the Searchplugin interface and can therefore be used in a Search
* block (com.idega.core.search). <br>
* It searches lots of user related info like name, personalid,email etc. and
* returns contact information for users. <br>
* To use it simply register this class as a iw.searchplugin component in a
* bundle.
*
* @author <a href="mailto:eiki@idega.com">Eirikur S. Hrafnsson </a>
* @version $Revision: 1.9.2.1 $
*/
public class UserContactSearch implements SearchPlugin {
public static final String SEARCH_NAME_LOCALIZABLE_KEY = "user_contact_search.name";
public static final String SEARCH_DESCRIPTION_LOCALIZABLE_KEY = "user_contact_search.description";
public static final String SEARCH_TYPE = "user";
public static final String IW_BUNDLE_IDENTIFIER = "com.idega.user";
protected IWMainApplication iwma;
/**
*
*/
public UserContactSearch() {
super();
}
/*
* (non-Javadoc)
*
* @see com.idega.core.search.business.SearchPlugin#getAdvancedSearchSupportedParameters()
*/
public List getAdvancedSearchSupportedParameters() {
return null;
}
/*
* (non-Javadoc)
*
* @see com.idega.core.search.business.SearchPlugin#getSupportsSimpleSearch()
*/
public boolean getSupportsSimpleSearch() {
return true;
}
/*
* (non-Javadoc)
*
* @see com.idega.core.search.business.SearchPlugin#getSupportsAdvancedSearch()
*/
public boolean getSupportsAdvancedSearch() {
return false;
}
/*
* (non-Javadoc)
*
* @see com.idega.core.search.business.SearchPlugin#initialize(com.idega.idegaweb.IWMainApplication)
*/
public boolean initialize(IWMainApplication iwma) {
this.iwma = iwma;
return true;
}
/*
* (non-Javadoc)
*
* @see com.idega.core.search.business.SearchPlugin#destroy(com.idega.idegaweb.IWMainApplication)
*/
public void destroy(IWMainApplication iwma) {
}
/*
* (non-Javadoc)
*
* @see com.idega.core.search.business.SearchPlugin#createSearch(com.idega.core.search.business.SearchQuery)
*/
public Search createSearch(SearchQuery searchQuery) {
List results = new ArrayList();
List alreadyAddedContacts = new ArrayList();
BasicSearch searcher = new BasicSearch();
searcher.setSearchName(getSearchName());
searcher.setSearchType(SEARCH_TYPE);
searcher.setSearchQuery(searchQuery);
Collection users = getUsers(searchQuery);
if (users != null && !users.isEmpty()) {
Iterator iter = users.iterator();
while (iter.hasNext()) {
User user = (User) iter.next();
if(alreadyAddedContacts.contains(user.getPrimaryKey())){
//don't add twice
continue;
}
else{
alreadyAddedContacts.add(user.getPrimaryKey());
BasicSearchResult result = new BasicSearchResult();
fillSearchResultType(result, user);
fillSearchResultName(result,user);
fillSearchResultURI(result,user);
fillSearchResultAbstract(result,user);
fillSearchResultExtraInformation(result,user);
fillSearchResultAttributesMap(result,user);
results.add(result);
}
}
}
searcher.setSearchResults(results);
return searcher;
}
protected void fillSearchResultURI(BasicSearchResult result, User user) {
Collection emails = user.getEmails();
if (emails != null && !emails.isEmpty()) {
String email = ((Email) emails.iterator().next()).getEmailAddress();
result.setSearchResultURI("mailto:" + email);
}
else {
result.setSearchResultURI("#");
}
}
protected void fillSearchResultExtraInformation(BasicSearchResult result, User user) {
Collection emails = user.getEmails();
if (emails != null && !emails.isEmpty()) {
String email = ((Email) emails.iterator().next()).getEmailAddress();
result.setSearchResultExtraInformation(email);
}
}
protected void fillSearchResultName(BasicSearchResult result, User user) {
StringBuffer name = new StringBuffer();
name.append(user.getName());
result.setSearchResultName(name.toString());
}
protected void fillSearchResultAbstract(BasicSearchResult result, User user) {
boolean someThingAdded = false;
StringBuffer abstractText = new StringBuffer();
Collection phones = user.getPhones();
Collection addresses = user.getAddresses();
if (addresses != null && !addresses.isEmpty()) {
abstractText.append(((Address) addresses.iterator().next()).getStreetAddress());
someThingAdded = true;
}
if (phones != null && !phones.isEmpty()) {
Iterator numbers = phones.iterator();
while (numbers.hasNext()) {
Phone phone = (Phone) numbers.next();
String number = phone.getNumber();
if (number!=null && !"".equals(number) && !"null".equals(number)) {
if (someThingAdded) {
abstractText.append(" - ");
}
abstractText.append(number);
someThingAdded = true;
}
}
}
result.setSearchResultAbstract(abstractText.toString());
}
/**
* @param result
*/
protected void fillSearchResultType(BasicSearchResult result, User user) {
result.setSearchResultType(SEARCH_TYPE);
}
/**
* Extend this method to add extra attributes to the search result. The method does nothing by default
* @param result
* @param user
*/
protected void fillSearchResultAttributesMap(BasicSearchResult result, User user) {}
protected Collection getUsers(SearchQuery searchQuery) {
try {
SearchEngine userSearch = (SearchEngine) IBOLookup.getServiceInstance(this.iwma.getIWApplicationContext(),
SearchEngine.class);
String query = ((SimpleSearchQuery) searchQuery).getSimpleSearchQuery();
if(query!=null){
query = query.replace('*', '%');
return userSearch.getSimpleSearchResults(query);
}
else{
return ListUtil.getEmptyList();
}
}
catch (IBOLookupException e) {
e.printStackTrace();
}
catch (RemoteException e) {
e.printStackTrace();
}
return ListUtil.getEmptyList();
}
/*
* (non-Javadoc)
*
* @see com.idega.core.search.business.SearchPlugin#getSearchName()
*/
public String getSearchName() {
IWBundle bundle = this.iwma.getBundle(IW_BUNDLE_IDENTIFIER);
return bundle.getResourceBundle(IWContext.getInstance()).getLocalizedString(SEARCH_NAME_LOCALIZABLE_KEY,
"Contacts");
}
/*
* (non-Javadoc)
*
* @see com.idega.core.search.business.SearchPlugin#getSearchDescription()
*/
public String getSearchDescription() {
IWBundle bundle = this.iwma.getBundle(IW_BUNDLE_IDENTIFIER);
return bundle.getResourceBundle(IWContext.getInstance()).getLocalizedString(SEARCH_DESCRIPTION_LOCALIZABLE_KEY,
"Searches for user contact information");
}
}