package sgc.portal.base.util;

import java.io.Serializable;
import java.util.HashMap;

/**
 * <PRE>
 * 밑줄문자(underscore)로 구분된 키(key) 문자열을 camelCase 문자열로 변환하여 저장하는 HashMap
 * (키를 자동 변환하는 EasygHashMap 보다는 resultMap과 HashMap 사용할 것을 권장함
 * </PRE>
 *
 * @param <K> HashMap의 키 형식 타입. 실 타입은 주로 String 이 사용됨
 * @param <V> HashMap의 값 형식 타입. 실 타입은 주로 Object 이 사용됨
 */
@SuppressWarnings("serial")
public class EasyHashMap<K, V> extends HashMap<K, V> implements Serializable {


	/**
	 * <PRE>
	 * key 에 대하여 Camel Case 변환하여 super.put(ListOrderedMap) 을 호출한다.
	 * </PRE>
	 *
	 * @param key '_' 가 포함된 변수명
	 * @param value  명시된 key 에 대한 값 (변경 없음)
	 * @return V 키와 관련한 기존 값. 없거나 null 인경우 null 반환
	 */
	@SuppressWarnings("unchecked")
	@Override
	public V put(final K key, final V value) {
		return super.put((K)(toCamelCase((String)key)), value);
	}

	private String toCamelCase(final String key) {
		StringBuilder sb = new StringBuilder(32);
		for (String s : key.split("_")) {
			s.replaceAll("\n", "");
			s.replaceAll("\r", "");
			if (s.length() > 0) {
				sb.append(Character.toUpperCase(s.charAt(0)));
			}
			if (s.length() > 1) {
				sb.append(s.substring(1, s.length()).toLowerCase());
			}
		}
		sb.replace(0, 1, Character.valueOf(Character.toLowerCase(sb.charAt(0))).toString() );

		return sb.toString();
	}
}
