/* * RHQ Management Platform * Copyright (C) 2011 Red Hat, Inc. * All rights reserved. * * This program 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 version 2 of the License. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.coregui.client.util; import java.util.Arrays; import java.util.Date; import java.util.HashSet; import java.util.Map; import java.util.Set; import com.smartgwt.client.data.Criteria; /** * A collection of utility methods for working with SmartGWT {@link com.smartgwt.client.data.Criteria}s. * * @author Ian Springer */ public class CriteriaUtility { private CriteriaUtility() { // static utility class only } public static String toString(Criteria criteria) { if (criteria == null) { return "null"; } return "Criteria[" + criteria.getValues() + "]"; } /** * Clone the specified criteria and return the clone. * * @param criteria the criteria to be cloned. * * @return the clone */ public static Criteria clone(Criteria criteria) { if (criteria == null) { return null; } Criteria newCriteria = new Criteria(); addCriteria(criteria, newCriteria); return newCriteria; } /** * Add the source criteria to the destination criteria. * * SmartGWT 2.4's {@link Criteria#addCriteria(com.smartgwt.client.data.Criteria)} for some reason doesn't have else * clauses for the array types, and it doesn't handle Object types properly (seeing odd behavior because of this), * so this method explicitly supports adding array types and Objects. * * @param target the Criteria to be added to * @param source the Criteria to be added from */ public static void addCriteria(Criteria target, Criteria source) { Map sourceValueMap = source.getValues(); Set sourceKeys = sourceValueMap.keySet(); for (Object sourceKey : sourceKeys) { String field = (String) sourceKey; Object value = sourceValueMap.get(field); if (value instanceof Integer) { target.addCriteria(field, (Integer) value); } else if (value instanceof Float) { target.addCriteria(field, (Float) value); } else if (value instanceof String) { target.addCriteria(field, (String) value); } else if (value instanceof Date) { target.addCriteria(field, (Date) value); } else if (value instanceof Boolean) { target.addCriteria(field, (Boolean) value); } else if (value instanceof Integer[]) { target.addCriteria(field, (Integer[]) value); } else if (value instanceof Double[]) { target.addCriteria(field, (Double[]) value); } else if (value instanceof String[]) { target.addCriteria(field, (String[]) value); } else { // This is the magic piece - we need to get attribute as an object and set that value. target.setAttribute(field, source.getAttributeAsObject(field)); } } } public static boolean equals(Criteria criteria1, Criteria criteria2) { if (criteria1 == criteria2) { return true; } if (criteria1 == null || criteria2 == null) { return false; } Set<String> attributes1 = new HashSet<String>(Arrays.asList(criteria1.getAttributes())); Set<String> attributes2 = new HashSet<String>(Arrays.asList(criteria2.getAttributes())); if (!attributes1.equals(attributes2)) { return false; } for (String attribute : attributes1) { String value1 = criteria1.getAttribute(attribute); String value2 = criteria2.getAttribute(attribute); if ((value1 == null && value2 != null) || (value1 != null && !value1.equals(value2))) { return false; } } return true; } }