Language/JAVA

[JAVA] ObjectUtil

yjkim_97 2021. 12. 19. 19:25

[2021.12.15]

이 포스트는 아래의 글에서 파생되었다. Object를 Map으로 변환하여, 특정 경로와 특정 값이 존재하는지 판단하는 유틸리티이다.

2021.12.19 - [IT story/Spring] - [Spring] RestTemplate - Java에서 HTTP 통신

 

[Spring] RestTemplate - Java에서 HTTP 통신

[2021.12.15] 데이터베이스에 저장된 데이터를 기반으로 자동으로 http 통신을하는 기능을 구현하였다. 아직 프로젝트 기획 전이라서 해당 기능에 대항 정확한 서비스가 명시되지 않았지만 기본 플

yjkim97.tistory.com

 


 

Exception은 실제 구현할 때는 커스텀한 exception으로 내렸다.

 

ObjectUtil.java

/**
 * 
 * @author yjkim
 *
 */
@Slf4j
public class ObjectUtil 
{
	private static final String PATTERN_LIST_INDEX = "\\[[0-9]+\\]";
	private static final String SPLIT_CHAR_KEY = "\\.";

	private static Object findMapValueByKey(Map object, String key)
	{
		if(ObjectUtils.isEmpty(object))
		{
			throw new Exception("The target Map object is empty.");
		}
		if(StringUtils.isEmpty(key))
		{
			throw new Exception("The Key is empty.");
		}
		
		Object value = null;
		
		Set<String> keySet = object.keySet();
		if(keySet.contains(key))
		{
			value = object.get(key);
			if(value instanceof Map)
			{
				value = (Map<String,Object>) value;
			}
			else if(value instanceof String)
			{
				value = String.valueOf(value);
			}
			else if(value instanceof Integer)
			{
				value = (Integer) value;
			}
			else if(value instanceof Boolean)
			{
				value = (Boolean) value;
			}
			else if(value instanceof List)
			{
				value = (List) value;
			}
		}
		else
		{
			throw new Exception("Not found the " + key);
		}
			
		return value;
	}
	
	private static Object findListValueByIndex(List list, Integer index)
	{
		if(ObjectUtils.isEmpty(list))
		{
			throw new Exception("The find target list is empty.");
		}
		
		if(ObjectUtils.isEmpty(index))
		{
			throw new Exception("The index is empty.");
		}
		
		if(list.size() <= index)
		{
			throw new Exception("index more then list size.");
		}
		return list.get(index);
	}
	
	/**
	 * object에서 path의 값을 구한다.
	 * path가 존재하지 않는다면 {@link SurfinnRuntimeException} throw한다.
	 * ex) path : key1.key2[0].key3
	 * 
	 * @param obj
	 * @param path
	 * @return
	 */
	public static Object getValueByPath(Object obj, String path)
	{
		System.out.println("찾을것!!! " + path + " => " + obj);

		Object value =  obj;
		
		List<String> paths = Arrays.asList(path.split(SPLIT_CHAR_KEY));
    	Pattern pattern = Pattern.compile(PATTERN_LIST_INDEX);
    	
    	for(String p : paths)
    	{
    		Matcher matcher = pattern.matcher(p); 
    		if(matcher.find())
    		{
    			String mapKey = p.substring(0,matcher.start());
    			if(StringUtils.isNotBlank(mapKey))
    			{
    				if(value instanceof Map)
    				{
    					value = ObjectUtil.findMapValueByKey((Map) value,mapKey);
    				}
    				else
    				{
    					throw new Exception("The target object is not Map.");
    				}
    			}
    			
    			matcher.reset();
    			while(matcher.find())
    			{
    				String group = matcher.group();
    				int idx = Integer.parseInt(group.substring(1, group.length() - 1));
    				if(obj instanceof List)
    				{
    					value = ObjectUtil.findListValueByIndex((List) value, idx);
    				}
    				else
    				{
    					throw new Exception("The target object is not List.");
    				}
    			}
    		}
    		else 
    		{
    			if(value instanceof Map)
    			{
    				value = ObjectUtil.findMapValueByKey((Map) value,p);
    			}
    			else
    			{
    				throw new Exception("The target object is not Map.");
    			}
    		}
    		System.out.println(p + " => " + value);
    	}
    	
    	System.out.println("결과 => " +value);
    	return value;
	}
	
	/**
	 * object에 path가 존재하는지 확인한다.
	 * true : 존재, false : 존재하지 않음
	 * 
	 * {@link ObjectUtil#getValueByPath(Object, String)}에서
	 * {@link SurfinnRuntimeException}이 throw되면 존재하지 않은 것.
	 * 
	 * @param obj
	 * @param path
	 * @return
	 */
	public static boolean existPath(Object obj, String path)
	{
		if(ObjectUtils.isEmpty(obj) || ObjectUtils.isEmpty(path))
		{
			return false;
		}
		
		try 
		{
			ObjectUtil.getValueByPath(obj, path);
			return true;
		}
		catch(Exception e)
		{
			return false;
		}
	}
	
}