/*
* Copyright 2012 The Solmix Project
*
* This 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 software 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 may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.gnu.org/licenses/
* or see the FSF site: http://www.fsf.org.
*/
package org.solmix.commons.collections;
import static org.solmix.commons.util.DataUtils.commaSeparatedStringToList;
import static org.solmix.commons.util.DataUtils.getSubtreePrefixed;
import static org.solmix.commons.util.DataUtils.listToArray;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
/**
* Provides a base datatype decorator that enables additional functionality to be added to a Map via decoration.
* <p>
* Methods are forwarded directly to the decorated map.
* <p>
* This implementation does not perform any special processing with {@link #entrySet()}, {@link #keySet()} or
* {@link #values()}.
* <p>
* It simply returns the Set/Collection from the wrapped map.
*
* @version 110035
* @author solmix.f@gmail.com
* @since 0.0.1
*/
@SuppressWarnings({"rawtypes","unchecked"})
public class DataTypeMap implements Map
{
protected transient Map map;
/**
* Constructor only used in deserialization, do not use otherwise.
*/
public DataTypeMap()
{
this(new HashMap<String,Object>());
}
/**
* Constructor that wraps (not copies).
*
* @param map
*/
public DataTypeMap(Map<?,?> map)
{
if (map == null) {
throw new IllegalArgumentException("Map must not be null");
}
this.map = map;
}
/**
* return String value of the key
*
* @param key
* @return
*/
public String getString(Object key) {
return getString(key, null);
}
/**
* @param key
* @param defaultValue
* @return return key's value if value is null return defaultValue.
*/
public String getString(Object key, String defaultValue) {
Object value = get(key);
if (value == null)
return defaultValue;
else
return value.toString();
}
public DataTypeMap getSubtree(String key) {
return new DataTypeMap(getSubtreePrefixed(key, this));
}
/**
* @param key
* @param defaultValue
* @return return key's value if value is null return defaultValue.
*/
public String[] getStringArray(Object key, String defaultValue[]) {
Object value = get(key);
if (value == null)
return defaultValue;
else
return (String[]) listToArray(getList(key));
}
/**
* @param key
* @param defaultValue
* @return return key's value if value is null return defaultValue.
*/
public String[] getStringArray(String key, String defaultValue[]) {
Object value = get(key);
if (value == null)
return defaultValue;
else
return (String[]) listToArray(getList(key));
}
/**
* Gets the map being decorated.
*
* @return the decorated map
*/
public DataTypeMap getMap(Object key) {
return getMap(key, null);
}
/**
* Gets the map being decorated.
*
* @param key
* @param defaultValue
* @return if value is null return default value.
*/
public DataTypeMap getMap(Object key, Map<?, ?> defaultValue) {
Object value = get(key);
if (value instanceof DataTypeMap)
return (DataTypeMap) value;
if (value instanceof Map<?, ?>)
return new DataTypeMap((Map<?, ?>) value);
if (value == null) {
if (defaultValue != null) {
if (defaultValue instanceof DataTypeMap)
return (DataTypeMap) defaultValue;
else
return new DataTypeMap(defaultValue);
} else {
return null;
}
} else {
return new DataTypeMap((Map<?, ?>) value);
}
}
/**
* @param key
* @return
*/
public List<?> getList(Object key) {
return getList(key, null);
}
/**
* @param key
* @param defaultValue
* @return
*/
public List<?> getList(Object key, List<?> defaultValue) {
Object value = get(key);
if (value == null)
return defaultValue;
if (value instanceof List<?>)
return (List<?>) value;
List<String> result = new ArrayList<String>();
for (StringTokenizer st = new StringTokenizer(value.toString().trim(), " \r\t\n,"); st.hasMoreTokens(); result.add(st.nextToken().toString().trim()))
;
return result;
}
/**
* put comma separated objects into a List
*
* @param key
* @return
*/
public List<?> getCommaSeparatedList(Object key) {
return getCommaSeparatedList(key, null);
}
/**
* put comma separated objects into a List
*
* @param key
* @param defaultValue
* @return
*/
public List<?> getCommaSeparatedList(Object key, List<?> defaultValue) {
Object value = get(key);
if (value == null)
return defaultValue;
if (value instanceof List<?>)
return (List<?>) value;
else
return commaSeparatedStringToList(value.toString().trim());
}
/**
* Provided a flexible way to get boolean value
*
* @param key
* @param defaultValue
* @return
*/
public boolean getBoolean(Object key, boolean defaultValue) {
return getBoolean(key, new Boolean(defaultValue)).booleanValue();
}
/**
* Provided a flexible way to get boolean value
*
* @param key
* @return
*/
public Boolean getBoolean(Object key) {
return getBoolean(key, ((Boolean) (null)));
}
/**
* Provided a flexible way to get boolean value
* <p>
* NOTE:String value "true","yes" return true; "false","no" return false.
*
* @param key
* @param defaultValue
* @return
*/
public Boolean getBoolean(Object key, Boolean defaultValue) {
Object value = get(key);
if (value == null)
return defaultValue;
if (value instanceof Boolean)
return (Boolean) value;
String s = value.toString().toLowerCase().trim();
if (s.equals("true") || s.equals("yes"))
return new Boolean(true);
if (s.equals("false") || s.equals("no"))
return new Boolean(false);
else
return defaultValue;
}
/**
* @param key
* @return
*/
public Byte getByte(Object key) {
return getByte(key, ((Byte) (null)));
}
/**
* @param key
* @param defaultValue
* @return
*/
public byte getByte(Object key, byte defaultValue) {
return getByte(key, new Byte(defaultValue)).byteValue();
}
/**
*
* @param key
* @param defaultValue
* @return
*/
public Byte getByte(Object key, Byte defaultValue) {
Object value = get(key);
if (value == null)
return defaultValue;
if (value instanceof Byte)
return (Byte) value;
else
return new Byte(value.toString().trim());
}
public short getShort(Object key, short defaultValue) {
return getShort(key, new Short(defaultValue)).shortValue();
}
/**
* @param key
* @return
*/
public Short getShort(Object key) {
return getShort(key, ((Short) (null)));
}
/**
* get short type object if the key equal null return defaultValue
*
* @param key
* @param defaultValue
* @return
*/
public Short getShort(Object key, Short defaultValue) {
Object value = get(key);
if (value == null)
return defaultValue;
if (value instanceof Short)
return (Short) value;
else
return new Short(value.toString().trim());
}
/**
* @param key
* @return
*/
public Integer getInt(Object key) {
return getInteger(key, ((Integer) (null)));
}
/**
* @param key
* @return
*/
public Integer getInteger(Object key) {
return getInteger(key, ((Integer) (null)));
}
public int getInt(Object key, int defaultValue) {
return getInteger(key, new Integer(defaultValue)).intValue();
}
public int getInteger(Object key, int defaultValue) {
return getInteger(key, new Integer(defaultValue)).intValue();
}
public Integer getInteger(Object key, Integer defaultValue) {
Object value = get(key);
if (value == null)
return defaultValue;
if (value instanceof Integer)
return (Integer) value;
else
return new Integer(value.toString().trim());
}
/**
* @param key
* @return
*/
public Long getLong(Object key) {
return getLong(key, ((Long) (null)));
}
/**
* @param key
* @param defaultValue
* @return
*/
public long getLong(Object key, long defaultValue) {
return getLong(key, new Long(defaultValue)).longValue();
}
/**
* @param key
* @param defaultValue
* @return
*/
public Long getLong(Object key, Long defaultValue) {
Object value = get(key);
if (value == null)
return defaultValue;
if (value instanceof Long)
return (Long) value;
else
return new Long(value.toString().trim());
}
public Float getFloat(Object key) {
return getFloat(key, ((Float) (null)));
}
public float getFloat(Object key, float defaultValue) {
return getFloat(key, new Float(defaultValue)).floatValue();
}
/**
* @param key
* @param defaultValue
* @return
*/
public Float getFloat(Object key, Float defaultValue) {
Object value = get(key);
if (value == null)
return defaultValue;
if (value instanceof Float)
return (Float) value;
else
return new Float(value.toString().trim());
}
public Double getDouble(Object key) {
return getDouble(key, ((Double) (null)));
}
/**
* @param key
* @param defaultValue
* @return
*/
public double getDouble(Object key, double defaultValue) {
return getDouble(key, new Double(defaultValue)).doubleValue();
}
/**
* @param key
* @param defaultValue
* @return
*/
public Double getDouble(Object key, Double defaultValue) {
Object value = get(key);
if (value == null)
return defaultValue;
if (value instanceof Double)
return (Double) value;
else
return new Double(value.toString().trim());
}
protected Map getMap() {
return map;
}
//-----------------------------------------------------------------------
@Override
public void clear() {
map.clear();
}
@Override
public boolean containsKey(Object key) {
return map.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return map.containsValue(value);
}
@Override
public Set entrySet() {
return map.entrySet();
}
@Override
public Object get(Object key) {
return map.get(key);
}
@Override
public boolean isEmpty() {
return map.isEmpty();
}
@Override
public Set keySet() {
return map.keySet();
}
@Override
public Object put(Object key, Object value) {
return map.put(key, value);
}
@Override
public void putAll(Map mapToCopy) {
map.putAll(mapToCopy);
}
@Override
public Object remove(Object key) {
return map.remove(key);
}
@Override
public int size() {
return map.size();
}
@Override
public Collection values() {
return map.values();
}
@Override
public boolean equals(Object object) {
if (object == this) {
return true;
}
return map.equals(object);
}
@Override
public int hashCode() {
return map.hashCode();
}
@Override
public String toString() {
return map.toString();
}
}