summaryrefslogtreecommitdiff
path: root/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueQualifier.java
diff options
context:
space:
mode:
Diffstat (limited to 'projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueQualifier.java')
-rw-r--r--projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueQualifier.java233
1 files changed, 233 insertions, 0 deletions
diff --git a/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueQualifier.java b/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueQualifier.java
new file mode 100644
index 0000000..799955e
--- /dev/null
+++ b/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueQualifier.java
@@ -0,0 +1,233 @@
+/*
+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.
+ *
+ *
+ */
+
+