package org.objectstyle.wolips.ruleeditor.model; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.math.NumberUtils; /** * @author <a href="mailto:hprange@moleque.com.br">Henrique Prange</a> */ class LhsValue implements Value { protected static final String NULL_VALUE_CLASS = "com.webobjects.foundation.NSKeyValueCoding$Null"; protected static final String CLASS_PROPERTY = "class"; protected static final String VALUE_PROPERTY = "value"; private static Object initializeComposedValue(final Map<String, ?> map) { if (map == null) { throw new IllegalArgumentException("The left hand side value is a composed value and cannot be null (probably you have a left hand side with value = null)"); } String classProperty = (String) map.get(CLASS_PROPERTY); if (NULL_VALUE_CLASS.equals(classProperty)) { return null; } if (!Number.class.getName().equals(classProperty)) { throw new IllegalArgumentException("The class property " + classProperty + " is invalid or unsupported for a composed value (probably you have a left hand side with value = { class = \"" + classProperty + "\"; ... }"); } Object mappedValue = map.get(VALUE_PROPERTY); if (mappedValue == null) { throw new IllegalArgumentException("The value property cannot be null for a composed value"); } return Integer.valueOf(mappedValue.toString()); } private static Object initializeStringValue(final String value) { if (value == null) { throw new IllegalArgumentException("The left hand side value cannot be null"); } if (NumberUtils.isNumber(value)) { return Integer.valueOf(value); } return value; } final Object value; protected LhsValue(final Map<String, ?> valueMap) { this.value = initializeComposedValue(valueMap); } protected LhsValue(final Object value) { if (value instanceof String) { this.value = initializeStringValue((String) value); } else { this.value = initializeComposedValue((Map) value); } } protected LhsValue(final String value) { this.value = initializeStringValue(value); } public String getValue() { if (value == null) { return "null"; } return value.toString(); } public Object toMap() { if (value == null) { Map<String, String> nullMap = new HashMap<String, String>(); nullMap.put(CLASS_PROPERTY, NULL_VALUE_CLASS); return nullMap; } if (value instanceof Number) { Map<String, String> numberMap = new HashMap<String, String>(); numberMap.put(CLASS_PROPERTY, Number.class.getName()); numberMap.put(VALUE_PROPERTY, value.toString()); return numberMap; } return value; } @Override public String toString() { if (value == null) { return "null"; } if (value instanceof Number) { return value.toString(); } return "'" + value + "'"; } }