/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2006-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.web.svclayer.outage;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.extremecomponents.table.bean.Column;
import org.extremecomponents.table.core.TableModel;
import org.extremecomponents.util.ExtremeUtils;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
/**
* Filter Predicate implementation which enable date comparison.
*
* Based on example code from: @author Nathan MA
*
* @author <a href="mailto:joed@opennms.org">Johan Edstrom</a>
* @version $Id: $
* @since 1.8.1
*/
public class DateFilterPredicate implements Predicate
{
/** less than or equal. usage: <= 18-12-1997 */
public static final String LESS_THAN_OR_EQUAL = "<=";
/** greater than or equal. usage: >= 18-12-1997 */
public static final String GREATER_THAN_OR_EQUAL = ">=";
/** date between. usage: <> 18-12-1997 19-12-1997 */
public static final String BETWEEN = "<>";
/** date not equal. ussage: != 18-12-2004 */
public static final String NOT_EQUAL = "!=";
/** delimiters */
public static final String DELIM = "\\s";
private static final Logger logger = Logger.getLogger(DateFilterPredicate.class);
private static final String asterisk = "*";
private static final String emptyString = "";
private TableModel model;
/**
* Creates a new DateFilterPredicate object.
*
* @param model table model
*/
public DateFilterPredicate(TableModel model)
{
this.model = model;
}
/**
* {@inheritDoc}
*
* Use the filter parameters to filter out the table.
*/
public boolean evaluate(Object bean)
{
boolean match = false;
try
{
@SuppressWarnings("unchecked")
Iterator<Column> iter = model.getColumnHandler().getColumns().iterator();
while (iter.hasNext())
{
Column column = iter.next();
String alias = column.getAlias();
String filterValue = model.getLimit().getFilterSet()
.getFilterValue(alias);
if (StringUtils.isEmpty(filterValue))
{
continue;
}
String property = column.getProperty();
Object value = PropertyUtils.getProperty(bean, property);
if (value == null)
{
continue;
}
if (column.isDate())
{
Locale locale = model.getLocale();
value = ExtremeUtils.formatDate(column.getParse(),
column.getFormat(), value, locale);
}
else if (column.isCurrency())
{
Locale locale = model.getLocale();
value = ExtremeUtils.formatNumber(column.getFormat(),
value, locale);
}
if (!isSearchMatch(value, filterValue, column.isDate(),
column.getFormat(), model.getLocale()))
{
match = false; // as soon as fail just short circuit
break;
}
match = true;
}
}
catch (Throwable e)
{
logger.error("FilterPredicate.evaluate() had problems", e);
}
return match;
}
private boolean isSearchMatch(Object value, String search, boolean isDate,
String format, Locale locale)
{
String valueStr = value.toString().toLowerCase().trim();
search = search.toLowerCase().trim();
if (search.startsWith(asterisk) &&
valueStr.endsWith(StringUtils.replace(search, asterisk,
emptyString)))
{
return true;
}
else if (search.endsWith(asterisk) &&
valueStr.startsWith(StringUtils.replace(search, asterisk,
emptyString)))
{
return true;
}
else if (isDate)
{
DateFormat dateFormat = new SimpleDateFormat(format, locale);
Date dateToCompare = null;
Date dateToCompare2 = null;
try
{
Date dateValue = dateFormat.parse(value.toString());
String[] result = search.split(DELIM);
String operator = result[0];
if (operator.equals(LESS_THAN_OR_EQUAL))
{
dateToCompare = dateFormat.parse(result[1]);
return dateValue.getTime() <= dateToCompare.getTime();
}
else if (operator.equals(GREATER_THAN_OR_EQUAL))
{
dateToCompare = dateFormat.parse(result[1]);
return dateValue.getTime() >= dateToCompare.getTime();
}
else if (operator.equals(BETWEEN))
{
dateToCompare = dateFormat.parse(result[1]);
dateToCompare2 = dateFormat.parse(result[2]);
return (dateValue.getTime() >= dateToCompare.getTime()) &&
(dateValue.getTime() <= dateToCompare2.getTime());
}
else if (operator.equals(NOT_EQUAL))
{
dateToCompare = dateFormat.parse(result[1]);
return dateValue.getTime() != dateToCompare.getTime();
}
else
{
return StringUtils.contains(valueStr, search);
}
}
catch (Throwable e)
{
logger.error(
"The parse was incorrectly defined for date String [" +
search + "].");
// date comparions failed. Campare it as normal string.
return StringUtils.contains(valueStr, search);
}
}
else if (StringUtils.contains(valueStr, search))
{
return true;
}
return false;
}
}