/* Wotonomy: OpenStep design patterns for pure Java applications. Copyright (C) 2001 Michael Powers This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, see http://www.gnu.org */ package net.wotonomy.control; import net.wotonomy.foundation.NSKeyValueCoding; import net.wotonomy.foundation.NSMutableDictionary; import net.wotonomy.foundation.NSSelector; import net.wotonomy.foundation.internal.WotonomyException; /** * EOKeyValueQualifier performs a property-based comparison against a specified * value. The comparison is specified in the form of a NSSelector. The selector * is expected to take two arguments, the property value on an object and the * comparison value, and return a Boolean indicating whether the object is * qualified. EOQualifier defines selectors that may be used in creating * EOKeyValueQualifiers. * * @author michael@mpowers.net * @author yjcheung@intersectsoft.com * @author $Author: cgruber $ * @version $Revision: 894 $ */ public class EOKeyValueQualifier extends EOQualifier implements EOKeyValueArchiving, EOQualifierEvaluation { private String key; private NSSelector selector; private Object value; /** * Constructor specifying a property key, a selector, and a value for * comparison. The selector may be one of the constant selectors defined on * EOQualifier. */ public EOKeyValueQualifier(String aKey, NSSelector aSelector, Object aValue) { key = aKey; selector = aSelector; value = aValue; } /** * Returns the key for this qualifier. */ public String key() { return key; } /** * Returns the selector for this qualifier. */ public NSSelector selector() { return selector; } /** * Returns the value for this qualifier. */ public Object value() { return value; } /** * Evaluates this qualifier for the specified object, and returns whether the * object is qualified. selector() is invoked on the value for key() on the * specified object, with value() as the parameter. */ public boolean evaluateWithObject(Object anObject) { try { Object value; if (anObject instanceof EOKeyValueCoding) { value = ((EOKeyValueCoding) anObject).valueForKey(key()); } else { value = EOKeyValueCodingSupport.valueForKey(anObject, key()); } return ((Boolean) selector.invoke(value(), value)).booleanValue(); } catch (Exception exc) { throw new WotonomyException(exc); } } /** * Returns a string representation of this qualifier. */ public String toString() { return "( " + key + " " + selector + " " + value + " )"; } public void encodeWithKeyValueArchiver(EOKeyValueArchiver arch) { arch.encodeObject("EOKeyValueQualifier", "class"); arch.encodeObject(key, "key"); NSMutableDictionary d = new NSMutableDictionary(2); if (value instanceof String) d.setObjectForKey("NSString", "class"); else if (value instanceof java.math.BigDecimal) d.setObjectForKey("NSDecimalNumber", "class"); else if (value instanceof Number) d.setObjectForKey("NSNumber", "class"); else if (value instanceof NSKeyValueCoding.Null) d.setObjectForKey("EONull", "class"); if (value != null && !(value instanceof NSKeyValueCoding.Null)) d.setObjectForKey(value.toString(), "value"); arch.encodeObject(d, "value"); String selname = null; if (selector.equals(EOQualifier.QualifierOperatorCaseInsensitiveLike)) selname = "caseInsensitiveLike:"; else if (selector.equals(EOQualifier.QualifierOperatorContains)) selname = "contains:"; else if (selector.equals(EOQualifier.QualifierOperatorEqual)) selname = "isEqualTo:"; else if (selector.equals(EOQualifier.QualifierOperatorGreaterThan)) selname = "greaterThan:"; else if (selector.equals(EOQualifier.QualifierOperatorGreaterThanOrEqualTo)) selname = "greaterThanOrEqualTo:"; else if (selector.equals(EOQualifier.QualifierOperatorLessThan)) selname = "lessThan:"; else if (selector.equals(EOQualifier.QualifierOperatorLessThanOrEqualTo)) selname = "lessThanOrEqualTo:"; else if (selector.equals(EOQualifier.QualifierOperatorLike)) selname = "like:"; else if (selector.equals(EOQualifier.QualifierOperatorNotEqual)) selname = "isNotEqualTo:"; else selname = selector.name() + ":"; arch.encodeObject(selname, "selectorName"); } public static Object decodeWithKeyValueUnarchiver(EOKeyValueUnarchiver arch) { String k = (String) arch.decodeObjectForKey("key"); Object v = arch.decodeObjectForKey("value"); NSSelector sel = null; String sname = (String) arch.decodeObjectForKey("selectorName"); if (sname.equals("isEqualTo:")) sel = EOQualifier.QualifierOperatorEqual; else if (sname.equals("isNotEqualTo:")) sel = EOQualifier.QualifierOperatorNotEqual; else if (sname.equals("caseInsensitiveLike:")) sel = EOQualifier.QualifierOperatorCaseInsensitiveLike; else if (sname.equals("contains:")) sel = EOQualifier.QualifierOperatorContains; else if (sname.equals("greaterThan:")) sel = EOQualifier.QualifierOperatorGreaterThan; else if (sname.equals("greaterThanOrEqualTo:")) sel = EOQualifier.QualifierOperatorGreaterThanOrEqualTo; else if (sname.equals("lessThan:")) sel = EOQualifier.QualifierOperatorLessThan; else if (sname.equals("lessThanOrEqualTo:")) sel = EOQualifier.QualifierOperatorLessThanOrEqualTo; else if (sname.equals("like:")) sel = EOQualifier.QualifierOperatorLike; EOKeyValueQualifier q = new EOKeyValueQualifier(k, sel, v); return q; } } /* * $Log$ Revision 1.2 2006/02/16 16:47:14 cgruber Move some classes in to * "internal" packages and re-work imports, etc. * * Also use UnsupportedOperationExceptions where appropriate, instead of * WotonomyExceptions. * * Revision 1.1 2006/02/16 13:19:57 cgruber Check in all sources in * eclipse-friendly maven-enabled packages. * * Revision 1.10 2003/08/12 01:43:04 chochos formally implement * EOQualifierEvaluation * * Revision 1.9 2003/08/11 19:39:30 chochos special conditions for * NSKeyValueCoding.NullValue -> EONull * * Revision 1.8 2003/08/09 01:22:51 chochos qualifiers implement * EOKeyValueArchiving * * Revision 1.7 2003/08/06 23:07:52 chochos general code cleanup (mostly, * removing unused imports) * * Revision 1.6 2001/10/31 15:26:06 mpowers Fixed typo. * * Revision 1.5 2001/10/31 15:25:14 mpowers Cleanup of qualifiers. * * Revision 1.4 2001/10/30 22:57:28 mpowers EOQualifier framework is now * working. * * Revision 1.3 2001/09/13 15:25:56 mpowers Started implementation of the * EOQualifier framework. * * Revision 1.2 2001/03/29 03:29:49 mpowers Now using KeyValueCoding and Support * instead of Introspector. * * Revision 1.1 2001/02/27 03:33:04 mpowers Initial draft of the key-value * qualifier. * * */