package com.revolsys.collection.map;
import java.sql.Clob;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import com.revolsys.datatype.DataType;
import com.revolsys.datatype.DataTypes;
import com.revolsys.identifier.Identifier;
import com.revolsys.util.Property;
import com.revolsys.util.Strings;
public interface MapEx extends MapDefault<String, Object> {
static final MapEx EMPTY = new MapEx() {
@Override
public Set<Entry<String, Object>> entrySet() {
final Map<String, Object> emptyMap = Collections.emptyMap();
return emptyMap.entrySet();
}
};
default MapEx add(final String key, final Object value) {
put(key, value);
return this;
}
default Byte getByte(final CharSequence name) {
return getValue(name, DataTypes.BYTE);
}
default byte getByte(final CharSequence name, final byte defaultValue) {
final Byte value = getByte(name);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
default Double getDouble(final CharSequence name) {
return getValue(name, DataTypes.DOUBLE);
}
default double getDouble(final CharSequence name, final double defaultValue) {
final Double value = getDouble(name);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
default <E extends Enum<E>> E getEnum(final Class<E> enumType, final CharSequence fieldName) {
final String value = getString(fieldName);
if (Property.hasValue(value)) {
return Enum.valueOf(enumType, value);
} else {
return null;
}
}
default Float getFloat(final CharSequence name) {
return getValue(name, DataTypes.FLOAT);
}
default float getFloat(final CharSequence name, final float defaultValue) {
final Float value = getFloat(name);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
default Identifier getIdentifier(final CharSequence fieldName) {
final Object value = getValue(fieldName);
return Identifier.newIdentifier(value);
}
default Integer getInteger(final CharSequence name) {
return getValue(name, DataTypes.INT);
}
default int getInteger(final CharSequence name, final int defaultValue) {
final Integer value = getInteger(name);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
default Long getLong(final CharSequence name) {
return getValue(name, DataTypes.LONG);
}
default long getLong(final CharSequence name, final long defaultValue) {
final Long value = getLong(name);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
default Short getShort(final CharSequence name) {
return getValue(name, DataTypes.SHORT);
}
default short getShort(final CharSequence name, final short defaultValue) {
final Short value = getShort(name);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
default String getString(final CharSequence fieldName) {
final Object value = getValue(fieldName);
if (value == null) {
return null;
} else if (value instanceof String) {
return value.toString();
} else if (value instanceof Clob) {
final Clob clob = (Clob)value;
try {
return clob.getSubString(1, (int)clob.length());
} catch (final SQLException e) {
throw new RuntimeException("Unable to read clob", e);
}
} else {
return DataTypes.toString(value);
}
}
default String getString(final CharSequence name, final String defaultValue) {
final String value = getString(name);
if (Property.hasValue(value)) {
return value;
} else {
return defaultValue;
}
}
default String getUpperString(final CharSequence fieldName) {
final String string = getString(fieldName);
return Strings.upperCase(string);
}
/**
* Get the value of the field with the specified name.
*
* @param name The name of the field.
* @return The field value.
*/
@SuppressWarnings("unchecked")
default <T extends Object> T getValue(final CharSequence name) {
return (T)get(name.toString());
}
default <T extends Object> T getValue(final CharSequence name, final DataType dataType) {
final Object value = getValue(name);
return dataType.toObject(value);
}
default <T extends Object> T getValue(final CharSequence name, final DataType dataType,
final T defaultValue) {
final T value = getValue(name, dataType);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
default <T extends Object> T getValue(final CharSequence name, final T defaultValue) {
final T value = getValue(name);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
}