package org.openedit.entermedia.search; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.dom4j.Element; import org.openedit.data.lucene.LuceneSearchQuery; import org.openedit.xml.XmlFile; import com.openedit.hittracker.SearchQuery; import com.openedit.users.Group; import com.openedit.users.User; public class SearchFilter { protected boolean fieldCategorySelected; protected boolean fieldIncludeUserFilter; protected User fieldUser; protected XmlFile fieldSavedFilters; // people, animals etc. protected XmlFile fieldSavedCategoryFilters; // User specific. Temporary // hidden ones protected Set fieldExcludeCategories; // Group based was System Wide public SearchFilter() { // TODO Auto-generated constructor stub } public List listFilters() { List filters = new ArrayList(); if (getSavedFilters() != null) { for (Iterator iterator = getSavedFilters().getElements().iterator(); iterator.hasNext();) { Element child = (Element) iterator.next(); filters.add(child.getText()); } } if (getSavedCategoryFilters() != null) { for (Iterator iterator = getSavedCategoryFilters().getElements().iterator(); iterator.hasNext();) { Element child = (Element) iterator.next(); filters.add(child.getText()); } } if (fieldExcludeCategories != null) { for (Iterator iterator = getExcludeCategories().iterator(); iterator.hasNext();) { String id = (String) iterator.next(); filters.add("excluderecords:category:" + id); } } return filters; } public void clearSavedFilters() { if (getSavedFilters() != null) { getSavedFilters().clear(); } } public void clearSavedFilters(String inId) { if (getSavedFilters() != null) { List toremove = new ArrayList(); for (Iterator iter = getSavedFilters().getElements().iterator(); iter.hasNext();) { Element element = (Element) iter.next(); String value = element.attributeValue("id"); if (value != null) { String[] type = value.split(":"); if (type[0].equals(inId)) { toremove.add(element); } } } for (Iterator iter = toremove.iterator(); iter.hasNext();) { Element element = (Element) iter.next(); getSavedFilters().deleteElement(element); } } } /** * People, animals, etc... * * @param field * @param inValues */ public void addSavedExcludeFilter(String field, List inValues) { for (int i = 0; i < inValues.size(); i++) { String value = (String) inValues.get(i); Element child = getSavedFilters().addNewElement(); child.addAttribute("id", field + ":" + value); child.setText("excluderecords:" + field + ":" + value); } } public void addSavedUserFilter(String field, List inValues) { for (int i = 0; i < inValues.size(); i++) { String value = (String) inValues.get(i); Element child = getSavedFilters().addNewElement(); child.addAttribute("id", field + ":" + value); child.setText("userfilter:" + field + ":" + value); } } public void addSavedCategoryFilter(List inValues) { for (int i = 0; i < inValues.size(); i++) { String value = (String) inValues.get(i); Element child = getSavedCategoryFilters().addNewElement(); child.addAttribute("id", "hidecategory:" + value); child.setText("hidecategory:" + value); } } public List listAllFilters() { List filters = listFilters(); if (getUser() != null) { filters.addAll(getUser().listGroupPermissions()); Map allsettings = getUser().listAllProperties(); for (Iterator iterator = allsettings.keySet().iterator(); iterator.hasNext();) { String key = (String) iterator.next(); if (key.startsWith("excluderecords:") || key.startsWith("limitrecords:")) { String value = (String) allsettings.get(key); if (value != null) { filters.add(key + ":" + value); } } } } return filters; } public String toFilter(boolean inUsesSecurity) { SearchQuery andgroup = new LuceneSearchQuery(); // orgroup.setAndTogether(false); List checks = listAllFilters(); for (Iterator iter = checks.iterator(); iter.hasNext();) { String name = (String) iter.next(); if (name.startsWith("excluderecords:")) { // Format is exclude:Field Id:value String[] command = name.split(":"); if (command.length > 2) { andgroup.addNot(command[1], command[2]); } } else if (name.startsWith("limitrecords:")) { // Format is exclude:Field Id:value String[] command = name.split(":"); if (command.length > 2) { andgroup.addMatches(command[1], command[2]); } } if (isIncludeUserFilter() && name.startsWith("userfilter:")) { String[] command = name.split(":"); andgroup.addNot(command[1], command[2]); } } // AND together with these OR ed things SearchQuery orgroup = new LuceneSearchQuery(); orgroup.setAndTogether(false); // Add security filters if (inUsesSecurity) { orgroup.addMatches("viewasset:blank"); if (getUser() != null) { orgroup.addMatches("viewasset:" + getUser().getUserName()); for (Iterator iterator = getUser().getGroups().iterator(); iterator.hasNext();) { Group group = (Group) iterator.next(); orgroup.addMatches("viewasset:" + group.getName()); } } } for (Iterator iter = checks.iterator(); iter.hasNext();) { String name = (String) iter.next(); if (name.startsWith("limittocategory:")) { String catId = name.substring("limittocategory:".length()); orgroup.addMatches("category", catId); } } if (!isCategorySelected()) { for (Iterator iter = checks.iterator(); iter.hasNext();) { String name = (String) iter.next(); if (name.startsWith("hidecategory:")) { String catId = name.substring("hidecategory:".length()); andgroup.addNot("category", catId); } else if (name.startsWith("excludecategory:")) { String catId = name.substring("excludecategory:".length()); andgroup.addNot("category", catId); } } // andgroup.addMatches("category",inSelected.getId(),inSelected. // getName()); // if (includechildren) //We want to include more records unless // { // for (Iterator iter = inSelected.getChildren().iterator(); // iter.hasNext();) // { // Category childCatalog = (Category) iter.next(); // if (filter != null && filter.indexOf(childCatalog.getId()) > -1) // { // continue; //skip this catalog // } // catalogs = catalogs + " OR " + childCatalog.getId(); // } // } // search.addMatches("category", "(" + catalogs + ")", "Category // matches " + catalog.getName() );//+ ") AND " + not; // if( filter != null ) // { // search.addFilter(filter); // } } if (!andgroup.isEmpty() && !orgroup.isEmpty()) { return andgroup.toQuery() + " AND (" + orgroup.toQuery() + ")"; } if (!andgroup.isEmpty()) { return andgroup.toQuery(); } if (!orgroup.isEmpty()) { return "(" + orgroup.toQuery() + ")"; } // if( !group.isEmpty() ) // { // return group.toQuery(); // } // return " NOT catalogs:( " + notfilter.substring(0, notfilter.length() // - // 2) + ")"; return null; } public String getUserFilter(String inKey) { Element e = getSavedFilters().getElementById(inKey); if (e != null) { return e.getText(); } return null; } public boolean hasUserFilter(String inField, String inKey) { String search = inField + ":" + inKey; if (getUserFilter(search) == null) { return false; } return true; } public boolean hasCategoryFilter(String inField, String inKey) { String search = inField + ":" + inKey; if (getUserCategoryFilter(search) == null) { return false; } return true; } public String getUserCategoryFilter(String inKey) { Element e = getSavedCategoryFilters().getElementById(inKey); if (e != null) { return e.getText(); } return null; } public boolean isCategorySelected() { return fieldCategorySelected; } public void setCategorySelected(boolean inCategorySelected) { fieldCategorySelected = inCategorySelected; } public User getUser() { return fieldUser; } public void setUser(User inUser) { fieldUser = inUser; } public XmlFile getSavedFilters() { return fieldSavedFilters; } public void setSavedFilters(XmlFile inSavedFilters) { fieldSavedFilters = inSavedFilters; } public boolean isIncludeUserFilter() { return fieldIncludeUserFilter; } public void setIncludeUserFilter(boolean inIncludeUserFilter) { fieldIncludeUserFilter = inIncludeUserFilter; } public void setSavedCategoryFilters(XmlFile inSettings) { fieldSavedCategoryFilters = inSettings; } public XmlFile getSavedCategoryFilters() { return fieldSavedCategoryFilters; } public void clearCategoryFilters() { if (getSavedCategoryFilters() != null) { getSavedCategoryFilters().clear(); } } public void addCategoryExclude(String inCat) { getExcludeCategories().add(inCat); } public void removeCategoryExclude(String inCat) { if (fieldExcludeCategories != null) { getExcludeCategories().remove(inCat); } } // List xconfs = getPageManager().getChildrenPaths("/" + inCatalogId + // "/categories/"); public Set getExcludeCategories() { if (fieldExcludeCategories == null) { fieldExcludeCategories = new HashSet(); } return fieldExcludeCategories; } public boolean hasExcludedCategory(String inId) { return getExcludeCategories().contains(inId); } }