/* * $Id: SearchResults.java,v 1.11.2.1 2007/01/12 19:33:02 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.core.search.presentation; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.idega.core.search.business.Search; import com.idega.core.search.business.SearchPlugin; import com.idega.core.search.business.SearchPluginManager; import com.idega.core.search.business.SearchQuery; import com.idega.core.search.business.SearchResult; import com.idega.core.search.data.AdvancedSearchQuery; import com.idega.core.search.data.SimpleSearchQuery; import com.idega.idegaweb.IWResourceBundle; import com.idega.presentation.Block; import com.idega.presentation.CSSSpacer; import com.idega.presentation.IWContext; import com.idega.presentation.Layer; import com.idega.presentation.PresentationObject; import com.idega.presentation.text.Link; import com.idega.presentation.text.Text; /** * Last modified: $Date: 2007/01/12 19:33:02 $ by $Author: idegaweb $ * * This block can use all SearchPlugin objects registered in bundles and sets up * the search results (simple by default or advanced) <br> * Use setInputParameterName if you want to have different searches on the same * page, remember to set the same parameter for the Searcher block.<br> * The look of the results are set via stylesheet classes defined in * iw_core.css.<br> * Do not change core_iw.css, rather add your own custom stylesheet after the * iw_core.css is added and override the styles. * * @author <a href="mailto:eiki@idega.com">Eirikur S. Hrafnsson </a> * @version $Revision: 1.11.2.1 $ */ public class SearchResults extends Block { public static final String DEFAULT_STYLE_CLASS = "iw_search_results"; public static final String DEFAULT_ROW_EVEN_STYLE_CLASS = "iw_search_results_row_even"; public static final String DEFAULT_ROW_ODD_STYLE_CLASS = "iw_search_results_row_odd"; public static final String DEFAULT_LINK_STYLE_CLASS = "iw_search_result_link"; public static final String DEFAULT_ICON_STYLE_CLASS = "iw_search_result_icon"; public static final String DEFAULT_ABSTRACT_TEXT_STYLE_CLASS = "iw_search_result_abstract"; public static final String DEFAULT_EXTRA_INFO_TEXT_STYLE_CLASS = "iw_search_result_extra_info"; public static final String DEFAULT_EXTRA_ATTRIBUTE_ODD_STYLE_CLASS = "iw_search_result_extra_attribute_odd"; public static final String DEFAULT_EXTRA_ATTRIBUTE_EVEN_STYLE_CLASS = "iw_search_result_extra_attribute_even"; private static final String DEFAULT_SEARCH_NAME_STYLE_CLASS = "iw_search_name"; private String linkStyleClass = DEFAULT_LINK_STYLE_CLASS; private String abstractTextStyleClass = DEFAULT_ABSTRACT_TEXT_STYLE_CLASS; private String extraInformationTextStyleClass = DEFAULT_EXTRA_INFO_TEXT_STYLE_CLASS; private String searchNameStyleClass = DEFAULT_SEARCH_NAME_STYLE_CLASS; private String styleClass = DEFAULT_STYLE_CLASS; private String iconStyleClass = DEFAULT_ICON_STYLE_CLASS; private String rowEvenStyleClass = DEFAULT_ROW_EVEN_STYLE_CLASS; private String rowOddStyleClass = DEFAULT_ROW_ODD_STYLE_CLASS; private String extraAttributeTextOddStyleClass = DEFAULT_EXTRA_ATTRIBUTE_ODD_STYLE_CLASS; private String extraAttributeTextEvenStyleClass = DEFAULT_EXTRA_ATTRIBUTE_EVEN_STYLE_CLASS; private String searchParameterName = Searcher.DEFAULT_SEARCH_PARAMETER_NAME; private String advancedSearchParameterName = Searcher.DEFAULT_ADVANCED_SEARCH_PARAMETER_NAME; // todo create handler private String searchPluginsToUse; public SearchResults() { super(); } /** * @return Returns the searchParameterName. */ public String getSimpleSearchParameterName() { return this.searchParameterName; } /** * @param searchParameterName * The searchParameterName to set. */ public void setSimpleSearchParameterName(String searchParameterName) { this.searchParameterName = searchParameterName; } /** * @return Returns the advancedSearchParameterName. */ public String getAdvancedSearchParameterName() { return this.advancedSearchParameterName; } /** * @param searchParameterName * The advancedSearchParameterName to set. */ public void setAdvancedSearchParameterName(String advancedSearchParameterName) { this.advancedSearchParameterName = advancedSearchParameterName; } /** * @return Returns the rowOddStyleClass. */ public String getRowOddStyleClass() { return this.rowOddStyleClass; } /** * @param rowOddStyleClass * The rowOddStyleClass to set. */ public void setRowOddStyleClass(String buttonStyleClass) { this.rowOddStyleClass = buttonStyleClass; } /** * @return Returns the rowEvenStyleClass. */ public String getRowEvenStyleClass() { return this.rowEvenStyleClass; } /** * @param rowEvenStyleClass * The rowEvenStyleClass to set. */ public void setRowEvenStyleClass(String inputStyleClass) { this.rowEvenStyleClass = inputStyleClass; } /** * @return Returns the styleClass. */ public String getStyleClass() { return this.styleClass; } /** * @param styleClass * The styleClass to set. */ public void setStyleClass(String styleClass) { this.styleClass = styleClass; } /* * (non-Javadoc) * * @see com.idega.presentation.PresentationObject#main(com.idega.presentation.IWContext) */ public void main(IWContext iwc) throws Exception { super.main(iwc); IWResourceBundle iwrb = IWContext.getInstance().getIWMainApplication().getCoreBundle().getResourceBundle(iwc); if (iwc.isParameterSet(getSimpleSearchParameterName()) || iwc.isParameterSet(getAdvancedSearchParameterName())) { CSSSpacer spacer = new CSSSpacer(); Layer container = new Layer(); container.setStyleClass(getStyleClass()); // prototypes Layer evenRowProtoType = new Layer(); evenRowProtoType.setStyleClass(getRowEvenStyleClass()); Layer oddRowProtoType = new Layer(); oddRowProtoType.setStyleClass(getRowOddStyleClass()); Layer iconPrototype = new Layer(); iconPrototype.setStyleClass(getIconStyleClass()); Link linkProtoType = new Link(); linkProtoType.setStyleClass(getLinkStyleClass()); Text abstractTextProtoType = new Text(); abstractTextProtoType.setStyleClass(getAbstractTextStyleClass()); Text extraInfoTextProtoType = new Text(); extraInfoTextProtoType.setStyleClass(getExtraInformationTextStyleClass()); Text extraAttributeOddProtoType = new Text(); extraAttributeOddProtoType.setStyleClass(getExtraAttributeTextOddStyleClass()); Text extraAttributeEvenProtoType = new Text(); extraAttributeEvenProtoType.setStyleClass(getExtraAttributeTextEvenStyleClass()); // //// // If the query is advanced then the query object is created later boolean isAdvancedSearch = false; SearchQuery query; if (iwc.isParameterSet(Searcher.DEFAULT_ADVANCED_SEARCH_PARAMETER_NAME)) { isAdvancedSearch = true; query = new AdvancedSearchQuery(); } else { String queryString = iwc.getParameter(getSimpleSearchParameterName()); Map queryMap = new HashMap(); queryMap.put(getSimpleSearchParameterName(), queryString); query = new SimpleSearchQuery(queryMap); } // / boolean noResult = true; Collection plugins = SearchPluginManager.getInstance().getAllSearchPluginsInitialized( iwc.getIWMainApplication()); if (!plugins.isEmpty()) { Iterator iter = plugins.iterator(); while (iter.hasNext()) { SearchPlugin searchPlugin = (SearchPlugin) iter.next(); // odd or even row Layer rowContainer; // todo get from handler if (getSearchPluginsToUse() != null) { String searchClass = searchPlugin.getClass().getName(); String className = searchClass.substring(searchClass.lastIndexOf('.') + 1); String pluginNamesOrClasses = getSearchPluginsToUse(); if ( (pluginNamesOrClasses.indexOf(className) < 0) && (pluginNamesOrClasses.indexOf(searchClass) < 0) ) { continue; } } // if ((isAdvancedSearch && searchPlugin.getSupportsAdvancedSearch()) || (!isAdvancedSearch && searchPlugin.getSupportsSimpleSearch())) { if (isAdvancedSearch && searchPlugin.getSupportsAdvancedSearch()) { fillAdvancedSearch(iwc, query, searchPlugin); } Search search = searchPlugin.createSearch(query); Collection results = search.getSearchResults(); if (results != null && !results.isEmpty()) { noResult = false; Text searchName = new Text(searchPlugin.getSearchName()); searchName.setStyleClass(getSearchNameStyleClass()); container.add(searchName); int row = 1; Iterator iterator = results.iterator(); while (iterator.hasNext()) { SearchResult result = (SearchResult) iterator.next(); String textOnLink = result.getSearchResultName(); String uri = result.getSearchResultURI(); String abstractText = result.getSearchResultAbstract(); String extraInfo = result.getSearchResultExtraInformation(); Map extraParameters = result.getSearchResultAttributes(); // todo group by type String type = result.getSearchResultType(); if (row % 2 == 0) { rowContainer = (Layer) evenRowProtoType.clone(); } else { rowContainer = (Layer) oddRowProtoType.clone(); } // add an extra optional style with the search // type suffix addSearchResultTypeStyleClass(rowContainer, type); // adding spacer to force the row container // around all floating elements, another one is // added at the end rowContainer.add(spacer.clone()); // add an optional icon, use a background image // in the style Layer icon = (Layer) iconPrototype.clone(); addSearchResultTypeStyleClass(icon, type); rowContainer.add(icon); if (textOnLink != null) { Link link = (Link) linkProtoType.clone(); link.setText(textOnLink); // add an extra optional style with the // search type suffix addSearchResultTypeStyleClass(link, type); if (uri != null) { link.setURL(uri); } rowContainer.add(link); } if (extraInfo != null) { Text extraInfoText = (Text) extraInfoTextProtoType.clone(); extraInfoText.setText(extraInfo); // add an extra optional style with the // search type suffix addSearchResultTypeStyleClass(extraInfoText, type); rowContainer.add(extraInfoText); } if (abstractText != null) { Text abstractT = (Text) abstractTextProtoType.clone(); abstractT.setText(abstractText); // add an extra optional style with the // search type suffix addSearchResultTypeStyleClass(abstractT, type); rowContainer.add(abstractT); } if (extraParameters != null && !extraParameters.isEmpty()) { Iterator keys = extraParameters.keySet().iterator(); int counter = 0; while (keys.hasNext()) { counter++; String key = (String) keys.next(); String value = (String) extraParameters.get(key); Text extraParams; if (counter % 2 == 0) { extraParams = (Text)extraAttributeEvenProtoType.clone(); } else { extraParams = (Text)extraAttributeOddProtoType.clone(); } extraParams.setText(value); addSearchResultTypeAndAttributeKeyStyleClass(extraParams, type, key); rowContainer.add(extraParams); } } // adding spacer to force the row container // around all floating elements rowContainer.add(spacer.clone()); container.add(rowContainer); row++; } } } } } if (noResult) { Text noResults = new Text(iwrb.getLocalizedString("search_results.no_results", "The search found no results matching your query.")); noResults.setStyleClass(getSearchNameStyleClass()); container.add(noResults); } add(container); } } /** * @param iwc * @param query * @param searchPlugin */ protected void fillAdvancedSearch(IWContext iwc, SearchQuery query, SearchPlugin searchPlugin) { String queryString = iwc.getParameter(getSimpleSearchParameterName()); Map queryMap = new HashMap(); queryMap.put(getSimpleSearchParameterName(), queryString); List params = searchPlugin.getAdvancedSearchSupportedParameters(); if (params != null && !params.isEmpty()) { Iterator iterator = params.iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); String value = iwc.getParameter(key); queryMap.put(key, value); } } query.setSearchParameters(queryMap); } /** * Adds an extra optional style with the search type suffix * * @param obj * @param type */ protected void addSearchResultTypeStyleClass(PresentationObject obj, String type) { String style = obj.getStyleClass(); obj.setStyleClass(style + " " + style + "_" + type); } /** * Adds an extra optional style with the search type suffix * * @param obj * @param type */ protected void addSearchResultTypeAndAttributeKeyStyleClass(PresentationObject obj, String type, String attributeKey) { String style = obj.getStyleClass(); StringBuffer newStyle = new StringBuffer(); newStyle.append(style).append(" ").append(style).append("_").append(type).append(" ").append(type).append("_").append(attributeKey); obj.setStyleClass(newStyle.toString()); } /** * @return Returns the linkStyleClass. */ public String getLinkStyleClass() { return this.linkStyleClass; } /** * @param linkStyleClass * The linkStyleClass to set. */ public void setLinkStyleClass(String linkStyleClass) { this.linkStyleClass = linkStyleClass; } /** * @return Returns the abstractTextStyleClass. */ public String getAbstractTextStyleClass() { return this.abstractTextStyleClass; } /** * @param abstractTextStyleClass * The abstractTextStyleClass to set. */ public void setAbstractTextStyleClass(String abstractTextStyleClass) { this.abstractTextStyleClass = abstractTextStyleClass; } /** * @return Returns the extraInformationTextStyleClass. */ public String getExtraInformationTextStyleClass() { return this.extraInformationTextStyleClass; } /** * @param extraInformationTextStyleClass * The extraInformationTextStyleClass to set. */ public void setExtraInformationTextStyleClass(String extraInformationTextStyleClass) { this.extraInformationTextStyleClass = extraInformationTextStyleClass; } /** * @return Returns the searchNameStyleClass. */ public String getSearchNameStyleClass() { return this.searchNameStyleClass; } /** * @param searchNameStyleClass * The searchNameStyleClass to set. */ public void setSearchNameStyleClass(String searchNameStyleClass) { this.searchNameStyleClass = searchNameStyleClass; } /** * @return Returns the iconStyleClass. */ public String getIconStyleClass() { return this.iconStyleClass; } /** * @param iconStyleClass * The iconStyleClass to set. */ public void setIconStyleClass(String iconStyleClass) { this.iconStyleClass = iconStyleClass; } /** * @return Returns the searchPluginsToUse. */ public String getSearchPluginsToUse() { return this.searchPluginsToUse; } /** * @param searchPluginsToUse * The searchPluginsToUse to set. */ public void setSearchPluginsToUse(String searchPluginsToUse) { this.searchPluginsToUse = searchPluginsToUse; } /** * @return Returns the extraAttributeTextEvenStyleClass. */ public String getExtraAttributeTextEvenStyleClass() { return this.extraAttributeTextEvenStyleClass; } /** * @param extraAttributeTextEvenStyleClass * The extraAttributeTextEvenStyleClass to set. */ public void setExtraAttributeTextEvenStyleClass(String extraAttributeEvenStyleClass) { this.extraAttributeTextEvenStyleClass = extraAttributeEvenStyleClass; } /** * @return Returns the extraAttributeTextOddStyleClass. */ public String getExtraAttributeTextOddStyleClass() { return this.extraAttributeTextOddStyleClass; } /** * @param extraAttributeTextOddStyleClass * The extraAttributeTextOddStyleClass to set. */ public void setExtraAttributeTextOddStyleClass(String extraAttributeOddStyleClass) { this.extraAttributeTextOddStyleClass = extraAttributeOddStyleClass; } }