/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. licenses this file to You under the Apache License, Version 2.0
* (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.esri.gpt.catalog.search;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.esri.gpt.catalog.search.SearchParameterMap.Value;
import com.esri.gpt.framework.request.QueryCriteria;
import com.esri.gpt.framework.util.Val;
import com.esri.gpt.framework.xml.DomUtil;
import com.esri.gpt.framework.xml.XmlIoUtil;
import de.tudresden.gis.search.ISearchFilterGeooperators;
import de.tudresden.gis.search.SearchFilterGeooperators;
/**
* The class SearchCriteria. Class for composition of search criteria.
*/
@SuppressWarnings("serial")
public class SearchCriteria extends QueryCriteria {
// class variables =============================================================
/** The Constant TAG_FILTER. Used when <b>this</b> is serialized to XML. */
private final static String TAG_FILTER = "filter";
/** The Constant TAG_FILTER_INFO. Used when <b>this</b> is serialized to XML. */
private final static String TAG_FILTER_CLASS = "class";
/** The Constant TAG_FILTER_PARAM. Used when <b>this</b> is serialized to XML. */
private final static String TAG_FILTER_PARAM = "param";
/** The Constant TAG_FILTER_PARAM_NAME. Used when <b>this</b> is serialized to XML. */
private final static String TAG_FILTER_PARAM_NAME = "name";
/** The Constant TAG_FILTER_PARAM_VALUE. Used when <b>this</b> is serialized to XML. */
private final static String TAG_FILTER_PARAM_VALUE = "value";
/** The Constant TAG_FILTER_PARAM_INFO. Used when <b>this</b> is serialized to XML. */
private final static String TAG_FILTER_PARAM_INFO = "info";
/** Filters with attributes in the search criteria */
private final static String TAG_FILTER_ESSENTIAL = "essential";
/** Attribute where the saved search name will be put*/
private final static String ATTRIB_SAVEDSEARCH_NAME = "savedSearchName";
/** Element for saved states **/
private final static String ELEM_SAVEDSTATES = "savedStates";
/**
* Where to save the search criteria to.
*/
public static enum OptionSaveLocation {
/** option to save to desktop. */
saveToDesktop,
/** option to save to online repository. */
saveToOnline
};
/** The class logger *. */
private static Logger LOG =
Logger.getLogger(SearchCriteria.class.getCanonicalName());
/** The saved search name. */
private String savedSearchName;
// instance variables =========================================================
/** The list of all filters. */
private SearchFiltersList miscelleniousFilters;
/** The essential filter objects. */
private SearchFiltersList essentialFilterObjects;
/** Flag indicating whether or not result records should be expanded by default. */
private boolean expandResultContent = false;
/** The search uri filter. */
private ISearchFilterURI searchFilterUri;
/** The page cursor filter. */
private ISearchFilterPagination searchFilterPageCursor;
/** The spatial search filter. */
private ISearchFilterSpatialObj searchFilterSpatial;
/** The search filter themes. */
private ISearchFilterThemes searchFilterThemes;
/** The search filter keyword. */
private ISearchFilterKeyword searchFilterKeyword;
/** The search filter content types. */
private ISearchFilterContentTypes searchFilterContentTypes;
/** The search filter geooperators. */
private ISearchFilterGeooperators searchFilterGeooperators;
/** The search filter temporal. */
private ISearchFilterTemporal searchFilterTemporal;
/** The search filter sort. */
private ISearchFilterSort searchFilterSort;
// constructor =================================================================
/**
* Instantiates a new search criteria.
* If class is extended, be sure to use super
*/
public SearchCriteria() {
super();
}
/**
* Instantiates a new search criteria with values of searchCriteriaDom.
*
* @param searchCriteriaDom the search criteria dom (never null assumed)
*
* @throws SearchException the search exception
*/
public SearchCriteria(Document searchCriteriaDom) throws SearchException {
this.loadSearchCriteria(searchCriteriaDom);
}
/**
* Instantiates a new search criteria with the values of the criteria param.
*
* @param criteria the criteria (assumed never null)
*
* @throws SearchException the search exception
*/
public SearchCriteria(SearchCriteria criteria) throws SearchException {
this.loadSearchCriteria(criteria.toDom());
}
// properties ===================================================================
/**
* Gets the flag indicating whether or not result records should be expanded by default.
* @return true if results records should be expanded
*/
public boolean getExpandResultContent() {
return expandResultContent;
}
/**
* Sets the flag indicating whether or not result records should be expanded by default.
* @param expand true if results records should be expanded
*/
public void setExpandResultContent(boolean expand) {
this.expandResultContent = expand;
}
/**
* Gets the saved search name.
*
* @return the saved search name (never null)
*/
public String getSavedSearchName() {
return Val.chkStr(savedSearchName);
}
/**
* Sets the saved search name.
*
* @param savedSearchName the new saved search name
*/
public void setSavedSearchName(String savedSearchName) {
this.savedSearchName = savedSearchName;
}
/**
* Gets the filters that do not have attributes in the search criteria.
*
* @return the filter object list (never null )
*/
public final SearchFiltersList getMiscelleniousFilters() {
if(this.miscelleniousFilters == null) {
this.miscelleniousFilters = new SearchFiltersList();
}
return this.miscelleniousFilters;
}
/**
* Sets the filter object list.
*
* @param filterObjectList the new filter object list
*/
@SuppressWarnings("unchecked")
public final void setMiscelleniousFilters(SearchFiltersList filterObjectList) {
this.miscelleniousFilters = filterObjectList;
}
/**
* Gets the essential filter objects.
*
* @return the essential filter objects (never null)
*/
private SearchFiltersList getEssentialFilters() {
if(essentialFilterObjects == null){
essentialFilterObjects = new SearchFiltersList();
}
return essentialFilterObjects;
}
/**
* Updates the individual essential filter objects.
*
* @param essentialFilterObjects the new essential filter objects
*/
private void hyrdateEssentialFilters(SearchFiltersList essentialFilterObjects) {
for(ISearchFilter filter: essentialFilterObjects) {
try {
if(filter == null) {
continue;
}
else if(filter instanceof ISearchFilterContentTypes){
this.getSearchFilterContentTypes().setParams(filter.getParams());
} else if(filter instanceof ISearchFilterKeyword){
this.getSearchFilterKeyword().setParams(filter.getParams());
} else if(filter instanceof ISearchFilterPagination){
this.getSearchFilterPageCursor().setParams(filter.getParams());
} else if(filter instanceof ISearchFilterSort){
this.getSearchFilterSort().setParams(filter.getParams());
} else if(filter instanceof ISearchFilterSpatialObj){
this.getSearchFilterSpatial().setParams(filter.getParams());
} else if(filter instanceof ISearchFilterTemporal){
this.getSearchFilterTemporal().setParams(filter.getParams());
} else if(filter instanceof ISearchFilterThemes){
this.getSearchFilterThemes().setParams(filter.getParams());
} else if(filter instanceof ISearchFilterURI){
this.getSearchFilterThemes().setParams(filter.getParams());
}
}catch(Exception e) {
LOG.log(Level.WARNING, "Error while work", e);
}
}
}
/**
* Hydrate miscellenious filters.
*
* @param list the list
*/
@SuppressWarnings("unchecked")
private void hydrateMiscelleniousFilters(List list) {
if(list == null) {
LOG.info("Hydrating Miscellenious Filters got null list");
return;
}
Iterator newListIter = list.iterator();
Iterator curListIter = this.getMiscelleniousFilters().iterator();
boolean newFilAdded = false;
ISearchFilter curFil = null;
ISearchFilter newFil = null;
while(newListIter != null && newListIter.hasNext()) {
Object newObj = newListIter.next();
if(!(newObj instanceof ISearchFilter)) {
continue;
}
newFilAdded = false;
newFil = (ISearchFilter) newObj;
while(curListIter != null && curListIter.hasNext()) {
Object curObj = curListIter.next();
if(!(curObj instanceof ISearchFilter)) {
continue;
}
curFil = (ISearchFilter) curObj;
if(newFil.getClass().isInstance(curObj)) {
try {
curFil.setParams(newFil.getParams());
newFilAdded = true;
} catch (SearchException e) {
LOG.log(Level.WARNING, "Error while loading miscellenious filter", e);
}
}
}
if(newFilAdded == false) {
this.getMiscelleniousFilters().add(newFil);
}
}
}
// filters ====
/**
* Gets the search uri Filter.
*
* @return the search uri filter (never null)
*/
public ISearchFilterURI getSearchFilterUri() {
if(searchFilterUri == null) {
searchFilterUri = new SearchFilterConnection();
}
return searchFilterUri;
}
/**
* Sets the search uri.
*
* @param searchURIFilter the new search uri filter
*/
public void setSearchFilterUri(ISearchFilterURI searchURIFilter) {
this.getEssentialFilters().remove(this.searchFilterUri);
this.searchFilterUri = searchURIFilter;
this.getEssentialFilters().add(this.searchFilterUri);
}
/**
* Gets the page cursor filter.
*
* @return the page cursor filter (possibly null)
*/
public ISearchFilterPagination getSearchFilterPageCursor() {
if(searchFilterPageCursor == null) {
this.setSearchFilterPageCursor(new SearchFilterPagination());
}
return searchFilterPageCursor;
}
/**
* Sets the page cursor filter.
* CAUTION: If using faces context DO NOT SET THIS METHOD.
* @param pageCursorFilter the new page cursor filter
*/
public void setSearchFilterPageCursor(ISearchFilterPagination pageCursorFilter) {
this.getEssentialFilters().remove(this.searchFilterPageCursor);
this.searchFilterPageCursor = pageCursorFilter;
this.getEssentialFilters()
.add(this.searchFilterPageCursor);
}
/**
* Gets the search filter spatial.
*
* @return the search filter spatial (possibly null)
*/
public ISearchFilterSpatialObj getSearchFilterSpatial() {
if(searchFilterSpatial == null) {
this.setSearchFilterSpatial(new SearchFilterSpatial());
}
return searchFilterSpatial;
}
/**
* Sets the search filter spatial.
* CAUTION: If using faces context DO NOT SET THIS METHOD.
* @param searchFilterSpatial the new search filter spatial
*/
public void setSearchFilterSpatial(ISearchFilterSpatialObj searchFilterSpatial) {
this.getEssentialFilters().remove(this.searchFilterSpatial);
this.searchFilterSpatial = searchFilterSpatial;
this.getEssentialFilters().add(this.searchFilterSpatial);
}
/**
* Gets the search filter themes.
*
* @return the search filter themes (never null)
*/
public ISearchFilterThemes getSearchFilterThemes() {
if(this.searchFilterThemes == null) {
this.setSearchFilterThemes(new SearchFilterThemeTypes());
}
return searchFilterThemes;
}
/**
* Sets the search filter themes.
* CAUTION: If using faces context DO NOT SET THIS METHOD.
* @param searchFilterThemes the new search filter themes
*/
public void setSearchFilterThemes(ISearchFilterThemes searchFilterThemes) {
this.getEssentialFilters().remove(this.searchFilterThemes);
this.searchFilterThemes = searchFilterThemes;
this.getEssentialFilters().add(this.searchFilterThemes);
}
/**
* Gets the search filter keyword.
*
* @return the search filter keyword (never null)
*/
public ISearchFilterKeyword getSearchFilterKeyword() {
if(this.searchFilterKeyword == null) {
this.setSearchFilterKeyword(new SearchFilterKeyword());
}
return searchFilterKeyword;
}
/**
* Sets the search filter keyword.
* CAUTION: If using faces context DO NOT SET THIS METHOD.
* @param searchFilterKeyword the new search filter keyword
*/
public void setSearchFilterKeyword(ISearchFilterKeyword searchFilterKeyword) {
this.getEssentialFilters().remove(this.searchFilterKeyword);
this.searchFilterKeyword = searchFilterKeyword;
this.getEssentialFilters().add(this.searchFilterKeyword);
}
/**
* Gets the search filter content types.
*
* @return the search filter content types (never null)
*/
public ISearchFilterContentTypes getSearchFilterContentTypes() {
if(this.searchFilterContentTypes == null){
this.setSearchFilterContentTypes(new SearchFilterContentTypes());
}
return searchFilterContentTypes;
}
/**
* Sets the search filter content types.
* CAUTION: If using faces context DO NOT SET THIS METHOD.
* @param searchFilterContentTypes the new search filter content types
*/
public void setSearchFilterContentTypes(
ISearchFilterContentTypes searchFilterContentTypes) {
this.getEssentialFilters().remove(this.searchFilterContentTypes);
this.searchFilterContentTypes = searchFilterContentTypes;
this.getEssentialFilters().add(this.searchFilterContentTypes);
}
/**
* Gets the search filter geooperators.
*
* @return the search filter content types (never null)
*/
public ISearchFilterGeooperators getSearchFilterGeooperators() {
if (this.searchFilterGeooperators == null) {
this.setSearchFilterGeooperators(new SearchFilterGeooperators());
}
return searchFilterGeooperators;
}
/**
* Sets the search filter geooperators.
* CAUTION: If using faces context DO NOT SET THIS METHOD.
* @param searchFilterContentTypes the new search filter content types
*/
public void setSearchFilterGeooperators(
ISearchFilterGeooperators searchFilterGeooperators) {
this.getEssentialFilters().remove(this.searchFilterGeooperators);
this.searchFilterGeooperators = searchFilterGeooperators;
this.getEssentialFilters().add(this.searchFilterGeooperators);
}
/**
* Gets the search filter sort.
*
* @return the search filter sort (never null)
*/
public ISearchFilterSort getSearchFilterSort() {
if(this.searchFilterSort == null) {
this.setSearchFilterSort(new SearchFilterSort());
}
return searchFilterSort;
}
/**
* Sets the search filter sort.
* CAUTION: If using faces context DO NOT SET THIS METHOD.
* @param searchFilterSort the new search filter sort
*/
public void setSearchFilterSort(ISearchFilterSort searchFilterSort) {
this.getEssentialFilters().remove(this.searchFilterSort);
this.searchFilterSort = searchFilterSort;
this.getEssentialFilters().add(this.searchFilterSort);
}
/**
* Gets the search filter temporal.
*
* @return the search filter temporal (never null)
*/
public ISearchFilterTemporal getSearchFilterTemporal() {
if(this.searchFilterTemporal == null) {
this.setSearchFilterTemporal(new SearchFilterTemporal());
}
return searchFilterTemporal;
}
/**
* Sets the search filter temporal.
* CAUTION: If using faces context DO NOT SET THIS METHOD.
* @param searchFilterTemporal the new search filter temporal
*/
public void setSearchFilterTemporal(ISearchFilterTemporal searchFilterTemporal) {
this.getEssentialFilters().remove(this.searchFilterTemporal);
this.searchFilterTemporal = searchFilterTemporal;
this.getEssentialFilters().add(this.searchFilterTemporal);
}
// methods =====================================================================
/**
* Reset <b>this</b>. Resets all search filters & this.
* to remove search filters w
*
* @see com.esri.gpt.framework.request.QueryCriteria#reset()
*/
public final void resetFilters() {
for(ISearchFilter filter : this.getMiscelleniousFilters()) {
filter.reset();
}
for(ISearchFilter filter : this.getEssentialFilters()) {
filter.reset();
}
}
/**
* Resets all search filters.
*/
@Override
public final void reset() {
resetFilters();
}
/**
* Validate input.
*
* @throws SearchException thrown when validation has errors
*/
public final void validate() throws SearchException {
for(ISearchFilter filter : this.getMiscelleniousFilters() ) {
filter.validate();
}
for(ISearchFilter filter : this.getEssentialFilters() ) {
filter.validate();
}
}
/**
* The DOM representation of Search Criteria.
* <gpt>
* <savedStates>
* <filter class="com.esri.gpt...">
* <param name="" info="" value=""/>
* ...
* ...
* </filter>
* <filter class="">
* ...
* ...
* </filter>
* ...
* ...
* <savedStates>
*
* </gpt>
*
* @return the Dom representing the criteria (possibly null)
*
* @throws SearchException Especially if DOM document could not be initialized
*/
public final Document toDom() throws SearchException {
return toDom(null);
}
/**
* To dom.
*
* @param extraInfo the extra info
* @param dateFormat the date format
*
* @return the document
*
* @throws SearchException the search exception
*/
public final Document toDom(String extraInfo, SimpleDateFormat dateFormat)
throws SearchException {
Document doc = null;
try {
doc = DomUtil.newDocument();
Element eGpt = doc.createElement("gpt");
doc.appendChild(eGpt);
Element eSavedStates = doc.createElement(ELEM_SAVEDSTATES);
if(extraInfo != null) {
eSavedStates.setAttribute("info", extraInfo);
}
eSavedStates.setAttribute(ATTRIB_SAVEDSEARCH_NAME,
this.getSavedSearchName());
eGpt.appendChild(eSavedStates);
List<ISearchFilter> essentialFilters = this.getEssentialFilters();
this.createDomFilters(doc, eSavedStates, true, essentialFilters,
dateFormat);
this.createDomFilters(doc, eSavedStates, false,
this.getMiscelleniousFilters(), dateFormat);
if(LOG.isLoggable(Level.FINER)) {
LOG.finer("SearchCriteria XML Representation\n"
+ XmlIoUtil.domToString(doc));
}
}
catch(Exception e) {
LOG.log(Level.WARNING,
"Could not convert searchCriteria to xml representation",
e);
throw new SearchException(e);
}
return doc;
}
/**
* Creates the dom filters.
*
* @param doc the doc
* @param isEssential the is essential
* @param filters the filters
* @param eSavedStates the e saved states
* @param dateFormat the date format
*/
private void createDomFilters(Document doc, Element eSavedStates,
boolean isEssential, List<ISearchFilter> filters,
SimpleDateFormat dateFormat) {
ISearchFilter filter = null;
Element eFilter = null;
Element params = null;
Iterator<ISearchFilter> iter = filters.iterator();
while(iter!= null && iter.hasNext()) {
filter = iter.next();
SearchParameterMap sMap = null;
if(dateFormat == null || !(filter instanceof ISearchFilterTemporal)) {
sMap = filter.getParams();
} else {
sMap = ((ISearchFilterTemporal)filter).getParams(dateFormat);
}
if(sMap == null ) {
continue;
}
Iterator<Entry<String, Value>> iter2 = sMap
.entrySet().iterator();
eFilter = doc.createElement(TAG_FILTER);
eFilter.setAttribute(TAG_FILTER_CLASS,
filter.getClass().getCanonicalName());
eFilter.setAttribute(TAG_FILTER_ESSENTIAL,
String.valueOf(isEssential));
eSavedStates.appendChild(eFilter);
while(iter2 != null && iter2.hasNext()) {
Entry<String, Value> vals = iter2.next();
params = doc.createElement(TAG_FILTER_PARAM);
params.setAttribute(TAG_FILTER_PARAM_NAME,
vals.getKey());
params.setAttribute(TAG_FILTER_PARAM_VALUE,
vals.getValue().getParamValue());
params.setAttribute(TAG_FILTER_PARAM_INFO,
vals.getValue().getInfo());
eFilter.appendChild(params);
}
}
}
/**
* Transform <b>this</b> criteria to its DOM representation.
*
* @param extraInfo Any extra info to be put included in this DOM (can be null)
*
* @return the document (possibly null)
*
* @throws SearchException Especially if DOM document could not be initialized
*/
public final Document toDom(String extraInfo) throws SearchException {
return toDom(extraInfo, null);
}
/**
* Convinience method to get DOM as a String.
*
* @return the DOM string representation (never null)
*
* @throws SearchException the search exception
*/
public String toDom2() throws SearchException {
Document doc = this.toDom();
String tmp = null;
try {
tmp = XmlIoUtil.domToString(doc);
if(tmp == null || "".equals(tmp.trim())) {
throw new SearchException("Dom conversion did not end up in xml string");
}
} catch (Exception e) {
throw new SearchException("Could not turn criteria to DOM object: "
+ e.getMessage(), e);
}
return tmp;
}
/**
* Gets the mapped filters. This will be used for translating
* SearchCriteria DOMS to a new SearchCriteria
*
* @return the mapped filters <filter.class.canonicalName, filter>
*/
private Map<String, ISearchFilter> getMappedFilters() {
Map<String, ISearchFilter> map = new LinkedHashMap<String, ISearchFilter>();
map.putAll(this.getMappedEssentialFilters());
map.putAll(this.getMappedMiscelleniousFilters());
return map;
}
/**
* Gets the mapped essential filters.
*
* @return the mapped essential filters
*/
private Map<String, ISearchFilter> getMappedEssentialFilters(){
Map<String, ISearchFilter> map = new LinkedHashMap<String, ISearchFilter>();
for(ISearchFilter filter : this.getMiscelleniousFilters()) {
map.put(filter.getClass().getCanonicalName(), filter);
}
return map;
}
/**
* Gets the mapped miscellenious filters.
*
* @return the mapped miscellenious filters
*/
private Map<String, ISearchFilter> getMappedMiscelleniousFilters(){
Map<String, ISearchFilter> map = new LinkedHashMap<String, ISearchFilter>();
for(ISearchFilter filter : this.getMiscelleniousFilters()) {
map.put(filter.getClass().getCanonicalName(), filter);
}
return map;
}
/**
* Gets the new search filters. Should be overridden by customized
* SearchCriteria child. The child should return a set containing all the
* new filters implemented
*
* @return the new search filters (possibly null)
*/
protected Set<ISearchFilter> getNewSearchFilters() {
return null;
}
/**
* Load search criteria.
*
* @param criteriaDom the criteria XML DOM object (Exception on null)
*
* @throws SearchException exception on error
*/
public void loadSearchCriteria(Document criteriaDom) throws SearchException {
this.resetFilters();
LOG.fine("Deserializing criteria");
if(LOG.isLoggable(Level.FINER)) {
try {
LOG.finer("Criteria to deserialize = " +
XmlIoUtil.domToString(criteriaDom));
} catch(Exception e) {}
}
try {
if(criteriaDom == null) {
throw new SearchException(
"Document to load not recieved by search criteria (null recieved)");
}
Map<String, ISearchFilter> miscelleniousFiltersMap = this.getMappedFilters();
SearchFiltersList miscelleniousFilters = new SearchFiltersList();
SearchFiltersList essentialFilters = new SearchFiltersList();
NodeList savedSearch = criteriaDom.getElementsByTagName(ELEM_SAVEDSTATES);
if(savedSearch != null && savedSearch.getLength() > 0) {
NamedNodeMap attribs = savedSearch.item(0).getAttributes();
if(attribs != null) {
Node attribNode = attribs.getNamedItem(
ATTRIB_SAVEDSEARCH_NAME.toString());
if(attribNode != null) {
this.setSavedSearchName(attribNode.getNodeValue());
}
}
}
NodeList filterList = criteriaDom.getElementsByTagName(TAG_FILTER);
for(int i = 0; i < filterList.getLength(); i++) {
Node filterNode = filterList.item(i);
NamedNodeMap attribs = filterNode.getAttributes();
if(attribs == null) {
LOG.warning("While deserializing search criteria, Expected "
+ TAG_FILTER + " attributes but got null");
continue;
}
Node essentialClass = attribs.getNamedItem(TAG_FILTER_ESSENTIAL);
boolean isEssentialFilter = false;
if(essentialClass != null
&& Val.chkBool(essentialClass.getNodeValue(), false)) {
isEssentialFilter = true;
}
Node attribNode = attribs.getNamedItem(TAG_FILTER_CLASS);
if(attribNode == null){
LOG.warning("While deserializing search criteria, Expected "
+ TAG_FILTER_CLASS + " attribute but got null");
continue;
}
String filterClass = attribNode.getNodeValue();
if(filterClass == null || filterClass.equals("")){
LOG.warning("While deserializing search criteria, Expected "
+ TAG_FILTER_CLASS + " value but got got null or empty");
continue;
}
ISearchFilter filter = null;
if(isEssentialFilter) {
Class<?> cls = Class.forName(filterClass);
filter = (ISearchFilter) cls.newInstance();
essentialFilters.add(filter);
} else {
// Attempting to track an object in the miscellenious filters.
// This part shows the importance that no miscellenious should be
// repeated
filter = miscelleniousFiltersMap.get(filterClass);
if(filter == null){
try {
Class<?> cls = Class.forName(filterClass);
filter = (ISearchFilter) cls.newInstance();
} catch(Exception e) {
LOG.log(Level.WARNING,
"While deserializing search criteria, did not find filter "
+ " object with class " + filterClass + " ", e);
continue;
}
}
miscelleniousFilters.add(filter);
}
NodeList params = filterNode.getChildNodes();
SearchParameterMap paramMap = new SearchParameterMap();
for(int j = 0; j < params.getLength(); j++) {
Node elmParam = params.item(j);
if(!elmParam.getNodeName().equals(TAG_FILTER_PARAM)) {
LOG.warning("While deserializing search criteria, Expected "
+ " element "+ TAG_FILTER_PARAM + " but found " +
elmParam.getNodeName());
continue;
}
NamedNodeMap attrParam = elmParam.getAttributes();
Node paramName = attrParam.getNamedItem(TAG_FILTER_PARAM_NAME);
Node paramValue = attrParam.getNamedItem(TAG_FILTER_PARAM_VALUE);
Node paramInfo = attrParam.getNamedItem(TAG_FILTER_PARAM_INFO);
if(paramName != null && paramValue != null
&& paramName.getNodeName() != null
&& !"".equals(paramName.getNodeName())){
if(paramInfo != null) {
paramMap.put(paramName.getNodeValue(),
paramMap.new Value(paramValue.getNodeValue(),
paramInfo.getNodeValue()));
} else {
paramMap.put(paramName.getNodeValue(),
paramMap.new Value(paramValue.getNodeValue()));
}
}
}
filter.setParams(paramMap);
}
this.hyrdateEssentialFilters(essentialFilters);
this.hydrateMiscelleniousFilters(miscelleniousFilters);
//this.setFilterObjects(deSerializedFilters);
} catch(Exception e) {
throw new SearchException("catalog.search.error.noLoadCriteria ", e);
}
}
/**
* Gets the search uri. If no ISearchCriteria object was found in filter
* list then the gpt.xml search url will be used
*
* @return the search uri (never null if configured properly)
*
* @throws SearchException the search exception
*/
public URI getSearchUri() throws SearchException {
ISearchFilterURI searchURI = this.getSearchFilterUri();
if(searchURI == null) {
return SearchConfig.getConfiguredInstance().getSearchUri();
}
try {
URI uri = searchURI.getSearchURI();
return uri;
} catch(Exception e) {
throw new SearchException("Invalid search URI input", e);
}
}
/**
* String representation of object.
*
* @return String representation of object
*/
@Override
public String toString() {
StringBuffer string = new StringBuffer();
string.append("\n { SearchCriteria class ");
for(ISearchFilter filter: this.getEssentialFilters()) {
string.append(filter.toString());
}
for(ISearchFilter filter: this.getMiscelleniousFilters()) {
string.append(filter.toString());
}
string.append("\n}\n");
return string.toString();
}
/**
* Tests equality of object. Relies on the method {@link #toDom()}
*
* @param obj the obj
*
* @return true if equals, otherwise false
*/
@Override
public boolean equals(Object obj) {
if(!(obj instanceof SearchCriteria)) {
return false;
}
SearchCriteria argCriteria = (SearchCriteria) obj;
try {
Map<String, ISearchFilter> map1 = this.getMappedFilters();
Map<String, ISearchFilter> map2 = argCriteria.getMappedFilters();
if(map1.size() != map2.size()) {
return false;
}
for(Map.Entry<String, ISearchFilter> entry: map1.entrySet()) {
ISearchFilter searchFilter1 = entry.getValue();
ISearchFilter searchFilter2 = map2.get(entry.getKey());
if(searchFilter2 == null || !(searchFilter2.equals(searchFilter1))) {
return false;
}
}
return this.getSearchUri().toString()
.equals(argCriteria.getSearchUri().toString());
} catch (SearchException e) {
LOG.log(Level.SEVERE, "Error while performing equals in SearchCriteria" +
"object", e);
}
return false;
}
/**
* Gets the clone.
*
* @return the clone of <code>this</code>
*
* @throws SearchException the search exception
*/
public SearchCriteria getClone() throws SearchException {
SearchCriteria criteria = new SearchCriteria();
criteria.loadSearchCriteria(this.toDom());
return criteria;
}
/**
* Write rest parameters.
*
* @param map parameters map
*/
public void writeRestParameters(Map<String, String> map) {
if(map == null) {
return;
}
this.reset();
Set<String> keys = map.keySet();
Iterator<String> iter = keys.iterator();
String key = null;
String value = null;
SearchParameterMap sParamMap = new SearchParameterMap();
SearchParameterMap.Value sParamValue = null;
while(iter != null && iter.hasNext()) {
key = iter.next();
value = map.get(key);
sParamValue = sParamMap.new Value(value);
sParamMap.put(key, sParamValue);
}
Map<String, ISearchFilter> filterMap = this.getMappedFilters();
keys = filterMap.keySet();
iter = keys.iterator();
ISearchFilter filter = null;
while(iter != null && iter.hasNext()) {
try {
key = iter.next();
filter = filterMap.get(key);
filter.setParams(sParamMap);
} catch (Throwable e) {
LOG.log(Level.WARNING, "Could not set a filter param ", e);
}
}
}
}