summaryrefslogtreecommitdiff
path: root/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueUnarchiver.java
diff options
context:
space:
mode:
Diffstat (limited to 'projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueUnarchiver.java')
-rw-r--r--projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueUnarchiver.java165
1 files changed, 165 insertions, 0 deletions
diff --git a/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueUnarchiver.java b/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueUnarchiver.java
new file mode 100644
index 0000000..caed8a4
--- /dev/null
+++ b/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOKeyValueUnarchiver.java
@@ -0,0 +1,165 @@
+/*
+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 java.lang.reflect.Method;
+
+import net.wotonomy.foundation.NSDictionary;
+import net.wotonomy.foundation.NSKeyValueCoding;
+
+/** Creates objects from dictionaries that were created with
+ * EOKeyValueArchiver.
+* @author michael@mpowers.net
+* @author $Author: cgruber $
+* @version $Revision: 894 $
+*/
+public class EOKeyValueUnarchiver {
+
+ NSDictionary dict;
+ Object _delegate;
+ protected static final Class[] METHOD_ARGS = new Class[]{ EOKeyValueUnarchiver.class };
+
+ public EOKeyValueUnarchiver(NSDictionary archive) {
+ super();
+ dict = archive;
+ }
+
+ public void awakeObjects() {
+ }
+
+ public boolean decodeBoolForKey(String key) {
+ Object x = dict.objectForKey(key);
+ if (x == null)
+ return false;
+ return (x.equals("true") || x.equals("YES") || x.equals("Y"));
+ }
+
+ public int decodeIntForKey(String key) {
+ Object x = dict.objectForKey(key);
+ if (x == null)
+ return 0;
+ if (x instanceof Number)
+ return ((Number)x).intValue();
+ try {
+ int i = Integer.parseInt(x.toString());
+ return i;
+ } catch (NumberFormatException ex) {
+ return 0;
+ }
+ }
+
+ public Object decodeObjectForKey(String key) {
+ Object x = dict.objectForKey(key);
+ if (x == null)
+ return null;
+ if (x instanceof NSDictionary) {
+ NSDictionary d = (NSDictionary)x;
+ if (d.objectForKey("class") != null) {
+ String cname = d.objectForKey("class").toString();
+ Class _class = null;
+ if (cname.equals("NSNumber")) {
+ if (d.objectForKey("value") != null)
+ return new Long(d.objectForKey("value").toString());
+ } else if (cname.equals("NSDecimalNumber")) {
+ if (d.objectForKey("value") != null)
+ return new java.math.BigDecimal(d.objectForKey("value").toString());
+ } else if (cname.equals("NSString")) {
+ if (d.objectForKey("value") != null)
+ return d.objectForKey("value").toString();
+ } else if (cname.equals("EONull")) {
+ return NSKeyValueCoding.NullValue;
+ } else if (cname.equals("EOFetchSpecification")) {
+ _class = EOFetchSpecification.class;
+ } else if (cname.equals("EOKeyValueQualifier")) {
+ _class = EOKeyValueQualifier.class;
+ } else if (cname.equals("EONotQualifier")) {
+ _class = EONotQualifier.class;
+ } else if (cname.equals("EOAndQualifier")) {
+ _class = EOAndQualifier.class;
+ } else if (cname.equals("EOOrQualifier")) {
+ _class = EOOrQualifier.class;
+ } else if (cname.equals("EOSortOrdering")) {
+ _class = EOSortOrdering.class;
+ } else if (cname.indexOf(".") < 0) { //Load a class without package
+ try {
+ _class = Class.forName("net.wotonomy.control." + cname);
+ } catch (ClassNotFoundException ex) {
+ }
+ //search for the class in access
+ if (_class == null) {
+ try {
+ _class = Class.forName("net.wotonomy.access." + cname);
+ } catch (ClassNotFoundException ex) {
+ }
+ }
+ } else {
+ try {
+ _class = Class.forName(cname);
+ } catch (ClassNotFoundException ex) {
+ }
+ }
+ if (_class == null)
+ return x;
+ try {
+ Method met = _class.getMethod("decodeWithKeyValueUnarchiver", METHOD_ARGS);
+ return met.invoke(null, new Object[]{ new EOKeyValueUnarchiver(d) });
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return x;
+ }
+ }
+ }
+ return x;
+ }
+
+ public Object decodeObjectReferenceForKey(String key) {
+ return null;
+ }
+
+ public void ensureObjectAwake(Object obj) {
+ }
+
+ public void finishInitializationOfObjects() {
+ }
+
+ public Object parent() {
+ return null;
+ }
+
+ public void setDelegate(Object del) {
+ _delegate = del;
+ }
+ public Object delegate() {
+ return _delegate;
+ }
+
+}
+/*
+ * $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.2 2003/08/11 18:17:41 chochos
+ * decoding of objects now works properly
+ *
+ */ \ No newline at end of file