/* * ==================================================================== * * The ObjectStyle Group Software License, Version 1.0 * * Copyright (c) 2006 The ObjectStyle Group and individual authors of the * software. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowlegement: "This product includes software * developed by the ObjectStyle Group (http://objectstyle.org/)." Alternately, * this acknowlegement may appear in the software itself, if and wherever such * third-party acknowlegements normally appear. * * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse or * promote products derived from this software without prior written permission. * For written permission, please contact andrus@objectstyle.org. * * 5. Products derived from this software may not be called "ObjectStyle" nor * may "ObjectStyle" appear in their names without prior written permission of * the ObjectStyle Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * OBJECTSTYLE GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many individuals on * behalf of the ObjectStyle Group. For more information on the ObjectStyle * Group, please see <http://objectstyle.org/>. * */ package org.objectstyle.wolips.eomodeler.core.model; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import org.objectstyle.wolips.eomodeler.core.utils.BooleanUtils; public class EOModelMap implements Map, Cloneable { public static final int YESNO = 1; public static final int YN = 2; public static final int YNOptionalDefaultNo = 3; public static final int YNOptionalDefaultYes = 4; private Map myBackingMap; public EOModelMap() { this(new PropertyListMap()); } public EOModelMap(Map _backingMap) { if (_backingMap == null) { myBackingMap = new PropertyListMap(); } else { myBackingMap = _backingMap; } } @Override public Object clone() throws CloneNotSupportedException { return cloneModelMap(); } public EOModelMap cloneModelMap() { Map sortedMap = new PropertyListMap(); sortedMap.putAll(myBackingMap); return new EOModelMap(sortedMap); } // utility method--there is probably a better place for this public static Object[] asArray(Object o) { if (o instanceof Collection) { Collection c = (Collection) o; if (c.size() > 0) { return c.toArray(); } } return null; } public Map getBackingMap() { return myBackingMap; } public void setBoolean(String _key, Boolean _value, int _booleanStyle) { if (_value == null) { myBackingMap.remove(_key); } else if (_booleanStyle == EOModelMap.YESNO) { myBackingMap.put(_key, _value.booleanValue() ? "YES" : "NO"); } else if (_booleanStyle == EOModelMap.YNOptionalDefaultNo) { if (_value.booleanValue()) { myBackingMap.put(_key, "Y"); } else if (!"N".equals(myBackingMap.get(_key))) { // leave "N" if it's already there myBackingMap.remove(_key); } } else if (_booleanStyle == EOModelMap.YNOptionalDefaultYes) { if (!_value.booleanValue()) { myBackingMap.put(_key, "N"); } else if (!"Y".equals(myBackingMap.get(_key))) { // leave "Y" if it's already there myBackingMap.remove(_key); } } else { myBackingMap.put(_key, _value.booleanValue() ? "Y" : "N"); } } public boolean getBoolean(String _key, boolean defaultValue) { Boolean bool = getBoolean(_key); if (bool == null) { bool = Boolean.valueOf(defaultValue); } return bool.booleanValue(); } public Boolean getBoolean(String _key) { Object value = get(_key); Boolean boolValue; if (value == null) { boolValue = null; } else if (value instanceof Boolean) { boolValue = (Boolean) value; } else if (value instanceof String) { String strValue = getString(_key, true); if (strValue != null) { boolValue = Boolean.valueOf(BooleanUtils.isTrue(strValue)); //$NON-NLS-4$ } else { boolValue = null; } } else { throw new IllegalArgumentException("Unknown boolean value '" + value + "' for '" + _key + "'"); } return boolValue; } public void setMap(String _key, Map _map, boolean _skipIfEmpty) { Map map = _map; if (_skipIfEmpty && map != null && map.isEmpty()) { map = null; } if (map != null) { myBackingMap.put(_key, map); } else { myBackingMap.remove(_key); } } public Map getMap(String _key) { return (Map) myBackingMap.get(_key); } public Map getMap(String _key, boolean _clone) { Map map = (Map) myBackingMap.get(_key); if (_clone && map != null) { Map sortedMap = new PropertyListMap(); sortedMap.putAll(map); map = sortedMap; } return map; } public void setList(String _key, List _list, boolean _skipIfEmpty) { setCollection(_key, _list, _skipIfEmpty); } public void setSet(String _key, Set _list, boolean _skipIfEmpty) { setCollection(_key, _list, _skipIfEmpty); } public void setCollection(String _key, Collection _list, boolean _skipIfEmpty) { Collection list = _list; if (_skipIfEmpty && list != null && list.isEmpty()) { list = null; } if (list == null) { myBackingMap.remove(_key); } else { myBackingMap.put(_key, list); } } public Set getSet(String _key) { return (Set) myBackingMap.get(_key); } public Set getSet(String _key, boolean _clone) { Set set = (Set) myBackingMap.get(_key); if (_clone && set != null) { Set sortedSet = new PropertyListSet(); sortedSet.addAll(set); set = sortedSet; } return set; } public List getList(String _key) { return (List) myBackingMap.get(_key); } public List getList(String _key, boolean _clone) { List list = (List) myBackingMap.get(_key); if (_clone && list != null) { list = new LinkedList(list); } return list; } public void setString(String _key, String _value, boolean _emptyIsNull) { if (_value != null && (!_emptyIsNull || _value.trim().length() > 0)) { myBackingMap.put(_key, _value); } else { myBackingMap.remove(_key); } } public String getString(String _key, boolean _emptyIsNull) { Object objValue = myBackingMap.get(_key); String strValue; if (objValue instanceof String) { strValue = (String) objValue; } else if (objValue instanceof Number) { strValue = objValue.toString(); } else if (objValue instanceof Boolean) { strValue = objValue.toString(); } else { strValue = (String) objValue; // MS: Force a class cast in this // case } if (_emptyIsNull && strValue != null && strValue.trim().length() == 0) { strValue = null; } return strValue; } public void setInteger(String _key, Integer _value) { if (_value == null) { myBackingMap.remove(_key); } else { myBackingMap.put(_key, _value); } } public Integer getInteger(String _key) { Object value = get(_key); Integer integerValue; if (value == null) { integerValue = null; } else if (value instanceof Integer) { integerValue = (Integer) value; } else if (value instanceof String) { String strValue = getString(_key, true); integerValue = Integer.valueOf(strValue); } else { throw new IllegalArgumentException("Unknown integer value '" + value + "' for '" + _key + "'"); } return integerValue; } public void clear() { myBackingMap.clear(); } public boolean containsKey(Object _key) { return myBackingMap.containsKey(_key); } public boolean containsValue(Object _value) { return myBackingMap.containsValue(_value); } public Set entrySet() { return myBackingMap.entrySet(); } public boolean equals(Object _o) { return myBackingMap.equals(_o); } public Object get(Object _key) { return myBackingMap.get(_key); } public int hashCode() { return myBackingMap.hashCode(); } public boolean isEmpty() { return myBackingMap.isEmpty(); } public Set keySet() { return myBackingMap.keySet(); } public Object put(Object arg0, Object arg1) { return myBackingMap.put(arg0, arg1); } public void putAll(Map arg0) { myBackingMap.putAll(arg0); } public Object remove(Object _key) { return myBackingMap.remove(_key); } public int size() { return myBackingMap.size(); } public Collection values() { return myBackingMap.values(); } public String toString() { return "[EOModelMap: backingMap = " + myBackingMap + "]"; } }