/*
* $Id: SearchArticleBean.java,v 1.21 2007/09/24 15:03:44 valdas Exp $
*
* Copyright (C) 2004 Idega. All Rights Reserved.
*
* This software is the proprietary information of Idega. Use is subject to
* license terms.
*
*/
package com.idega.block.article.bean;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlOutputLink;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.event.ActionListener;
import org.apache.webdav.lib.search.CompareOperator;
import org.apache.webdav.lib.search.SearchException;
import org.apache.webdav.lib.search.SearchExpression;
import org.apache.webdav.lib.search.SearchRequest;
import org.apache.webdav.lib.search.SearchScope;
import org.apache.xmlbeans.XmlException;
import com.idega.block.article.business.ArticleUtil;
import com.idega.business.IBOLookup;
import com.idega.content.bean.ContentItemBeanComparator;
import com.idega.content.business.ContentSearch;
import com.idega.content.business.categories.CategoryBean;
import com.idega.content.data.ContentCategory;
import com.idega.core.search.business.Search;
import com.idega.core.search.business.SearchResult;
import com.idega.presentation.IWContext;
import com.idega.slide.business.IWSlideSession;
import com.idega.slide.util.IWSlideConstants;
import com.idega.util.IWTimestamp;
import com.idega.webface.WFUtil;
import com.idega.webface.bean.AbstractWFEditableListManagedBean;
import com.idega.webface.bean.WFEditableListCellWrapper;
import com.idega.webface.bean.WFEditableListDataBean;
import com.idega.webface.bean.WFListBean;
/**
* Bean for searching articles.
* <p>
* Last modified: $Date: 2007/09/24 15:03:44 $ by $Author: valdas $
*
* @author Anders Lindman
* @version $Revision: 1.21 $
*/
public class SearchArticleBean extends AbstractWFEditableListManagedBean implements WFListBean, Serializable {
/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 3257288011107481141L;
public final static String ARTICLE_ID = "article_id";
protected String[] localizationKey = new String[] { "Headline", "Author", "Source", "Creation date", "Language",
"Status" };
private ActionListener _articleLinkListener = null;
private String _searchText = null;
private String _searchAuthor = null;
private String _searchCategory = null;
private Date _searchPublishedFrom = null;
private Date _searchPublishedTo = null;
private Map _allCategories = null;
private boolean searching = false;
private boolean showResults = false;
/**
* Default constructor.
*/
public SearchArticleBean() {
// No action...
}
/**
* Constructs a new search article bean with the specified article link
* listener.
*/
public SearchArticleBean(ActionListener l) {
this();
setArticleLinkListener(l);
}
public String getSearchText() {
return this._searchText;
}
public String getSearchAuthor() {
return this._searchAuthor;
}
public String getSearchCategory() {
return this._searchCategory;
}
public Date getSearchPublishedFrom() {
return this._searchPublishedFrom;
}
public Date getSearchPublishedTo() {
return this._searchPublishedTo;
}
public void setSearchText(String s) {
this._searchText = s;
}
public void setSearchAuthor(String s) {
this._searchAuthor = s;
}
public void setSearchCategoryId(String s) {
this._searchCategory = s;
}
public void setSearchPublishedFrom(Date d) {
this._searchPublishedFrom = d;
}
public void setSearchPublishedTo(Date d) {
this._searchPublishedTo = d;
}
public ActionListener getArticleLinkListener() {
return this._articleLinkListener;
}
public void setArticleLinkListener(ActionListener l) {
this._articleLinkListener = l;
}
/**
* Returns all categories available for articles.
*/
public Map getCategories() {
if (this._allCategories == null) {
final CategoryBean catBean = CategoryBean.getInstance();
Collection<ContentCategory> cats = catBean.getCategories();
if (cats != null && !cats.isEmpty()) {
this._allCategories = new LinkedHashMap();
this._allCategories.put("-1", ArticleUtil.getBundle().getLocalizedText("All categories"));
for (ContentCategory cat : cats) {
String category = catBean.getCategoryName(cat.getId());
this._allCategories.put(cat.getId(), category);
}
}
}
if (this._allCategories == null) {
return new LinkedHashMap();
}
return this._allCategories;
}
/**
* Generates a search result from the current bean search values.
*/
public void search() {
this.searching = true;
this.showResults = true;
updateDataModel(new Integer(0), new Integer(0));
this.searching = false;
}
/*
* (non-Javadoc)
*
* @see com.idega.webface.bean.AbstractWFEditableListManagedBean#getData()
*/
public WFEditableListDataBean[] getData() {
List beans = getContentItems();
if (beans != null) {
return (ArticleSearchResultBean[]) beans.toArray(new ArticleSearchResultBean[beans.size()]);
}
return new ArticleSearchResultBean[0];
}
/*
* (non-Javadoc)
*
* @see com.idega.webface.bean.AbstractWFEditableListManagedBean#getNumberOfColumns()
*/
public int getNumberOfColumns() {
return 6;
}
public UIComponent createCellWrapper(String var, int columnIndex) {
// Overridden because of value binding
WFEditableListCellWrapper component = constructWFEditableListCellWrapper(var, columnIndex);
WFUtil.setValueBinding(component, "rendered", var + ".rendered");
return component;
}
/*
* (non-Javadoc)
*
* @see com.idega.webface.bean.AbstractWFEditableListManagedBean#getUIComponent(java.lang.String,
* int)
*/
public UIComponent getUIComponent(String var, int columnIndex) {
HtmlOutputLink namePreviewLink = new HtmlOutputLink();
namePreviewLink.setId("columnIndex" + columnIndex + "_preview");
namePreviewLink.setValueBinding("value", WFUtil.createValueBinding("#{" + var + ".previewIWActionURI}"));
namePreviewLink.setStyleClass("wf_listtext");
HtmlOutputText textOnLink = new HtmlOutputText();
textOnLink.setId("columnIndex" + columnIndex + "_text");
WFUtil.setValueBindingToArray(textOnLink, "value", var + ".values", columnIndex);
namePreviewLink.getChildren().add(textOnLink);
return namePreviewLink;
}
/*
* (non-Javadoc)
*
* @see com.idega.webface.bean.AbstractWFEditableListManagedBean#getHeader(int)
*/
public UIComponent getHeader(int columnIndex) {
return ArticleUtil.getBundle().getLocalizedText(this.localizationKey[columnIndex]);
}
/*
* (non-Javadoc)
*
* @see com.idega.content.bean.ContentListViewerManagedBean#getContentItems()
*/
public List getContentItems() {
if (this.searching) {
try {
List l = listArticles();
ContentItemBeanComparator c = new ContentItemBeanComparator();
c.setReverseOrder(true);
Collections.sort(l, c);
return l;
}
catch (XmlException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
return new ArrayList();
}
public List listArticles() throws XmlException, IOException {
List list = new ArrayList();
IWContext iwc = IWContext.getInstance();
try {
String scope = ArticleUtil.getArticleBaseFolderPath();
IWSlideSession session = (IWSlideSession) IBOLookup.getSessionInstance(iwc, IWSlideSession.class);
if (scope != null) {
if (scope.startsWith(session.getWebdavServerURI())) {
scope = scope.substring(session.getWebdavServerURI().length());
}
if (scope.startsWith("/")) {
scope = scope.substring(1);
}
}
ContentSearch searchBusiness = new ContentSearch(iwc.getIWMainApplication());
Search search = searchBusiness.createSearch(getSearchRequest(scope, iwc.getCurrentLocale()));
Collection results = search.getSearchResults();
if (results != null) {
for (Iterator iter = results.iterator(); iter.hasNext();) {
SearchResult result = (SearchResult) iter.next();
try {
System.out.println("Attempting to load " + result.getSearchResultURI());
ArticleItemBean article = new ArticleSearchResultBean();
article.load(result.getSearchResultURI());
list.add(article);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
catch (SearchException e1) {
e1.printStackTrace();
}
return list;
}
/**
* @param folder
* @param localeString
* @param oldest
* @param categoryList
* @throws SearchException
*/
public SearchRequest getSearchRequest(String scope, Locale locale) throws SearchException {
SearchRequest s = new SearchRequest();
s.addSelection(IWSlideConstants.PROPERTY_CREATION_DATE);
s.addSelection(IWSlideConstants.PROPERTY_CATEGORY);
s.addScope(new SearchScope(scope));
SearchExpression whereExpression = null;
// TODO create search input for language
SearchExpression namePatternExpression = s.compare(CompareOperator.LIKE,
IWSlideConstants.PROPERTY_DISPLAY_NAME, "%.article");
// todo search by the content type
whereExpression = namePatternExpression;
SearchExpression creationDateFromExpression = null;
if (getSearchPublishedFrom() != null) {
Date from = getSearchPublishedFrom();
IWTimestamp stamp = new IWTimestamp(from);
// the date's time is at 24:00 so anything from that day will not be
// found. So be back up a day to 24:00
stamp.addDays(-1);
from = stamp.getDate();
creationDateFromExpression = s.compare(CompareOperator.GTE, IWSlideConstants.PROPERTY_CREATION_DATE, from);
whereExpression = s.and(whereExpression, creationDateFromExpression);
}
SearchExpression creationDateToExpression = null;
if (getSearchPublishedTo() != null) {
creationDateToExpression = s.compare(CompareOperator.LTE, IWSlideConstants.PROPERTY_CREATION_DATE,
getSearchPublishedTo());
whereExpression = s.and(whereExpression, creationDateToExpression);
}
if (!("-1").equals(getSearchCategory())) {
SearchExpression categoryExpression = s.compare(CompareOperator.LIKE, IWSlideConstants.PROPERTY_CATEGORY,
"," + getSearchCategory() + ",");
whereExpression = s.and(whereExpression, categoryExpression);
}
String author = getSearchAuthor();
if (author != null && !"".equals(author)) {
SearchExpression authorExpression = s.compare(CompareOperator.LIKE,
IWSlideConstants.PROPERTY_CREATOR_DISPLAY_NAME, "%" + author + "%");
whereExpression = s.and(whereExpression, authorExpression);
}
SearchExpression containsExpression = null;
if (getSearchText() != null && !"".equals(getSearchText())) {
containsExpression = s.contains(getSearchText());
if (whereExpression != null) {
whereExpression = s.and(whereExpression, containsExpression);
}
else {
whereExpression = containsExpression;
}
}
s.setWhereExpression(whereExpression);
System.out.println("------------------------");
System.out.println(s.asString());
System.out.println("------------------------");
return s;
}
public boolean getShowSearchResults() {
return this.showResults;
}
}