libreccm-legacy/ccm-docmgr/src/com/arsdigita/cms/docmgr/ui/SearchPane.java

365 lines
15 KiB
Java
Executable File

/*
* Copyright (C) 2001, 2002 Red Hat Inc. All Rights Reserved.
*
* The contents of this file are subject to the CCM Public
* License (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.redhat.com/licenses/ccmpl.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
*/
package com.arsdigita.cms.docmgr.ui;
import com.arsdigita.bebop.*;
import com.arsdigita.bebop.event.*;
import com.arsdigita.bebop.form.*;
import com.arsdigita.bebop.parameters.*;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.ContentSectionCollection;
import com.arsdigita.cms.docmgr.DocMgr;
import com.arsdigita.cms.docmgr.Document;
import com.arsdigita.cms.docmgr.search.LuceneSearcher;
import com.arsdigita.cms.docmgr.search.SearchResults;
import com.arsdigita.cms.docmgr.search.SearchUtils;
import com.arsdigita.cms.docmgr.util.GlobalizationUtil;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.User;
import com.arsdigita.kernel.permissions.PermissionDescriptor;
import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
import com.arsdigita.persistence.DataQuery;
import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.util.StringUtils;
import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.web.Web;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.TooManyListenersException;
/**
* A Search Pane to search documents.
*
* @author Crag Wolfe
*/
class SearchPane extends SimpleContainer implements DMConstants {
private static final org.apache.log4j.Logger s_log
= org.apache.log4j.Logger.getLogger(
SearchPane.class);
public static final String SEARCH_AUTHOR = "searchAuthor";
public static final String SEARCH_TERMS = "searchTerms";
public static final String SEARCH_MIME_TYPE = "searchMimeType";
public static final String CATEGORY_SELECT = "searchCategorySelect";
public static final String WORKSPACE_SELECT = "workspaceSelect";
private final BigDecimalParameter m_categoriesParam = new BigDecimalParameter(CATEGORY_SELECT);
private final BigDecimalParameter m_workspaceParam = new BigDecimalParameter(WORKSPACE_SELECT);
private final TrimmedStringParameter m_termsParam = new TrimmedStringParameter(SEARCH_TERMS);
private final TrimmedStringParameter m_authorParam = new TrimmedStringParameter(SEARCH_AUTHOR);
private final StringParameter m_mimeTypeParam = new StringParameter(SEARCH_MIME_TYPE);
private final DateParameter m_startDateParam = new DateParameter(START_DATE_PARAM_NAME);
private final DateParameter m_endDateParam = new DateParameter(END_DATE_PARAM_NAME);
private ContentSection m_docsContentSection;
private RequestLocal m_coln;
private RequestLocal m_validated;
private BoxPanel m_mainBrowseContainer;
//private TabbedPane m_mainTabPane;
private Table m_searchResultsTable;
private SearchList m_searchList;
private SearchListModelBuilder m_model;
private Label m_noResultsLabel;
private Label m_hasResultsLabel;
private Label m_emptyLabel;
private Submit m_submit;
private ModalContainer m_segmentHeader;
public SearchPane() {
// set component's content section
ContentSectionCollection csl = ContentSection.getAllSections();
csl.addEqualsFilter("label", DocMgr.getConfig().getContentSection());
if (!csl.next()) {
csl.close();
return;
}
m_docsContentSection = csl.getContentSection();
csl.close();
// bebop components
//m_mainTabPane = new SimpleContainer();
m_mainBrowseContainer = new BoxPanel(BoxPanel.HORIZONTAL, true);
//m_mainTabPane.addTab(WS_SEARCH_TITLE,
// m_mainBrowseContainer);
//m_mainTabPane.add(new Label("yo"));
//m_mainBrowseContainer.setClassAttr("sidebarNavPanel");
DocsSearchForm leftSide = new DocsSearchForm(new GridPanel(2));
m_mainBrowseContainer.add(leftSide);
m_mainBrowseContainer.add(new Label("     ", false));
m_model = new SearchListModelBuilder(leftSide);
SegmentedPanel rightSide = new SegmentedPanel();
rightSide.setClassAttr("main");
m_searchList = new SearchList(m_model);
//rightSide.add(m_searchList);
m_segmentHeader = new ModalContainer();
m_hasResultsLabel = new Label("Results");
m_noResultsLabel = new Label("No results matched your search");
m_emptyLabel = new Label("");
m_segmentHeader.add(m_hasResultsLabel);
m_segmentHeader.add(m_noResultsLabel);
m_segmentHeader.add(m_emptyLabel);
m_segmentHeader.setDefaultComponent(m_emptyLabel);
rightSide.addSegment(
// (new Label(new EmptySearchPrintListener(leftSide)),
m_segmentHeader,
m_searchList);
m_mainBrowseContainer.add(rightSide);
//m_searchResultsTable = new Table(new SearchTableModelBuilder(),
// {"searchResults"});
m_coln = new RequestLocal();
m_validated = new RequestLocal();
add(m_mainBrowseContainer);
}
/* Register state parameters */
public void register(Page p) {
super.register(p);
p.addGlobalStateParam(m_categoriesParam);
p.addGlobalStateParam(m_workspaceParam);
p.addGlobalStateParam(m_termsParam);
p.addGlobalStateParam(m_authorParam);
p.addGlobalStateParam(m_mimeTypeParam);
p.addGlobalStateParam(m_endDateParam);
p.addGlobalStateParam(m_startDateParam);
}
private class DocsSearchForm extends Form
implements SearchForm, FormValidationListener,
FormProcessListener, FormInitListener {
public DocsSearchForm(Container panel) {
super("docSearch", panel);
add(new Label("Search text:"));
TextField searchText = new TextField(SEARCH_TERMS);
//searchText.addValidationListener(new NotEmptyValidationListener());
add(searchText);
add(new Label("Author:"));
add(new TextField(SEARCH_AUTHOR));
add(new Label("Document Type:"));
add(new MimeTypesWidget(m_mimeTypeParam));
add(new Label("Modified After: "));
add(new com.arsdigita.bebop.form.Date(m_startDateParam));
add(new Label("Modified Before: "));
add(new com.arsdigita.bebop.form.Date(m_endDateParam));
add(new Label("Category"));
SingleSelect categoriesWidget
= new SingleSelect(m_categoriesParam);
try {
categoriesWidget.addOption(new Option("", ""));
categoriesWidget.addPrintListener(new CategoriesPrintListener(m_docsContentSection));
} catch (TooManyListenersException e) {
UncheckedWrapperException.throwLoggedException(getClass(), "Too many listeners", e);
}
add(categoriesWidget);
//categoriesWidget.setSize(SELECT_HEIGHT);
add(new Label("Workspace"));
SingleSelect workspaceWidget
= new SingleSelect(m_workspaceParam);
try {
workspaceWidget.addPrintListener(new WorkspacesPrintListener());
} catch (TooManyListenersException e) {
UncheckedWrapperException.throwLoggedException(getClass(), "Too many listeners", e);
}
add(workspaceWidget);
m_submit = new Submit("search", "Search");
add(m_submit);
addInitListener(this);
addValidationListener(this);
addProcessListener(this);
}
public void validate(FormSectionEvent e)
throws FormProcessException {
PageState state = e.getPageState();
String terms = (String) state.getValue(m_termsParam);
String author = (String) state.getValue(m_authorParam);
String mimeType = (String) state.getValue(m_mimeTypeParam);
Date endDate = (Date) state.getValue(m_endDateParam);
Date startDate = (Date) state.getValue(m_startDateParam);
BigDecimal workspaceID = (BigDecimal) state.getValue(m_workspaceParam);
BigDecimal categoryID
= (BigDecimal) state.getValue(m_categoriesParam);
if (StringUtils.emptyString(terms) && StringUtils.emptyString(author) && StringUtils.
emptyString(mimeType) && endDate == null && startDate == null && categoryID
== null
&& workspaceID == null) {
m_emptyLabel.setVisible(state, true);
m_validated.set(state, new Boolean(false));
throw new FormProcessException(GlobalizationUtil.globalize(
"ui.unspecified_search_parameters"));
}
m_validated.set(state, new Boolean(true));
}
public void init(FormSectionEvent e) {
m_segmentHeader.setVisibleComponent(e.getPageState(), m_emptyLabel);
}
public void process(FormSectionEvent e) {
PageState state = e.getPageState();
SearchResults results = getSearchHits(state);
if (results != null && results.getTotalSize() > 0) {
m_segmentHeader.setVisibleComponent(state, m_hasResultsLabel);
s_log.debug("results");
} else {
m_segmentHeader.setVisibleComponent(state, m_noResultsLabel);
s_log.debug("no results");
}
}
public SearchResults getSearchHits(PageState state) {
SearchResults coln = (SearchResults) m_coln.get(state);
if (coln == null && m_submit.isSelected(state) && ((Boolean) m_validated.get(state)).
booleanValue()) {
String terms = (String) state.getValue(m_termsParam);
String author = (String) state.getValue(m_authorParam);
String mimeType = (String) state.getValue(m_mimeTypeParam);
Date endDate = (Date) state.getValue(m_endDateParam);
Date startDate = (Date) state.getValue(m_startDateParam);
BigDecimal workspaceID = (BigDecimal) state.getValue(m_workspaceParam);
String[] sections = null;
if (!LuceneSearcher.class.equals(SearchUtils.getSearcher().getClass())) {
sections = (String[]) new String[]{m_docsContentSection.getID().toString()};
}
// don't need this since all types in this section are documents
//String[] types = (String[])state.getValue(m_typesParam);
String[] types = null;
BigDecimal rootCategoryID
= m_docsContentSection.getRootCategory().getID();
ArrayList categoryIDs = new ArrayList();
if (!LuceneSearcher.class.equals(SearchUtils.getSearcher().getClass())) {
BigDecimal categoryID
= (BigDecimal) state.getValue(m_categoriesParam);
if (categoryID != null && !categoryID.equals(rootCategoryID)) {
categoryIDs.add(categoryID.toString());
}
// this would be used instead for multiple select
//String[] cats = (String[])state.getValue(m_categoriesParam);
//
//if (cats != null) {
// for (int i = 0 ; i < cats.length ; i++) {
// BigDecimal curCat = new BigDecimal(cats[i]);
// if(!rootCategoryID.equals(curCat)) {
// categoryIDs.add(curCat.toString());
// }
// }
//}
}
//if (terms != null && !"".equals(terms)) {
// if form has been submitted, m_emptyLabel will not be visible
User user = (User) Kernel.getContext().getParty();
coln = SearchUtils.getAdvancedSearch(terms,
author,
mimeType,
workspaceID,
startDate,
endDate,
types,
sections,
user,
categoryIDs);
//}
m_coln.set(state, coln);
}
return coln;
}
public boolean isVisible(PageState state) {
return true;
}
public long getSearchResultCount(PageState state) {
return m_coln.get(state) == null ? 0
: ((SearchResults) m_coln.get(state)).getTotalSize();
}
}
private class MimeTypesWidget extends SingleSelect {
public MimeTypesWidget(ParameterModel pm) {
super(pm);
addOption(new Option("", ""));
addOption(new Option("excel", "Excel document"));
addOption(new Option("html", "HTML"));
addOption(new Option("acrobat", "PDF"));
addOption(new Option("plain text", "Plain text"));
addOption(new Option("powerpoint", "Powerpoint file"));
addOption(new Option("rich text", "Rich Text Format (rtf)"));
addOption(new Option("word", "Word document"));
}
}
private class WorkspacesPrintListener implements PrintListener {
public WorkspacesPrintListener() {
}
public void prepare(PrintEvent e) {
OptionGroup o = (OptionGroup) e.getTarget();
o.clearOptions();
PageState state = e.getPageState();
User user = Web.getWebContext().getUser();
o.addOption(new Option("", ""));
DataQuery dq = SessionManager.getSession().retrieveQuery(
"com.arsdigita.cms.docmgr.workspacesWithRepositories");
while (dq.next()) {
if (PermissionService.checkPermission(new PermissionDescriptor(
PrivilegeDescriptor.READ,
new OID(Document.BASE_DATA_OBJECT_TYPE,
dq.get("workspaceID")),
user.getOID()))) {
o.addOption(new Option(((BigDecimal) dq.get("workspaceID")).toString(),
(String) dq.get("title")));
}
dq.close();
}
}
}
}