/* 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 * */