Last active
October 29, 2018 02:22
-
-
Save ayaysir/3ec240bd04ac08f3e63a3430ec458266 to your computer and use it in GitHub Desktop.
JspMvcHelper.java for Spring MVC
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.lang.reflect.Array; | |
import java.lang.reflect.Field; | |
import java.lang.reflect.ParameterizedType; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.List; | |
import java.util.Map; | |
import java.util.Set; | |
import org.springframework.ui.Model; | |
import org.springframework.web.servlet.ModelAndView; | |
public class JspMvcHelper { | |
private String outputString; | |
public JspMvcHelper(ModelAndView mav){ | |
outputString = help(mav.getModel(), false, false); | |
} | |
public JspMvcHelper(ModelAndView mav, boolean isThisForJSConsole){ | |
outputString = help(mav.getModel(), isThisForJSConsole, false); | |
} | |
public JspMvcHelper(ModelAndView mav, boolean isThisForJSConsole, boolean isWholeStringWrap) | |
{ | |
outputString = help(mav.getModel(), isThisForJSConsole, isWholeStringWrap); | |
} | |
public JspMvcHelper(Model m){ | |
outputString = help(m.asMap(), false, false); | |
} | |
public JspMvcHelper(Model m, boolean isThisForJSConsole){ | |
outputString = help(m.asMap(), isThisForJSConsole, false); | |
} | |
public JspMvcHelper(Model m, boolean isThisForJSConsole, boolean isWholeStringWrap) | |
{ | |
outputString = help(m. asMap(), isThisForJSConsole, isWholeStringWrap); | |
} | |
public String help(Map<String, ?> mm, boolean isThisForJSConsole, boolean isWholeStringWrap) | |
{ | |
// ModelMap mm = mav.getModelMap(); | |
StringBuilder sb = new StringBuilder(); | |
sb.append("********** 변수 목록 **********" + "\n"); | |
sb.append(mm.keySet() + "\n\n"); | |
sb.append("********** 변수 상세 ********** \n《[타입] 변수명 → 값(toString)》" + "\n\n"); | |
for(String key : mm.keySet()){ | |
Class<? extends Object> c = mm.get(key).getClass(); | |
sb.append("[" + c.getName() + "] " + key + " → " + mm.get(key) + "\n"); | |
} | |
sb.append("\n"); | |
sb.append("********** 타입 상세 **********" + "\n"); | |
for(String key: mm.keySet()){ | |
Class<? extends Object> c = mm.get(key).getClass(); | |
List<Field> fs = recursiveGetField(c); | |
sb.append("[" + c.getName() + "] " + key + "\n"); | |
try{ | |
String superName = c.getSuperclass().getSimpleName(); | |
if(c.getPackage().getName().equals("java.lang")){ | |
sb.append("\n"); | |
continue; | |
} else if (superName.equals("AbstractList") || superName.equals("List")){ | |
sb.append(" - "); | |
List<?> tempList = (List<?>) mm.get(key); | |
sb.append(tempList + "\n\n"); | |
continue; | |
} else if (superName.equals("AbstractMap") || superName.equals("Map")){ | |
Map<?, ?> tempMap = (Map<?, ?>) mm.get(key); | |
for(Object oKey : tempMap.keySet()){ | |
sb.append( " - " + oKey + "=" + tempMap.get(oKey) + "\n"); | |
} | |
sb.append("\n"); | |
continue; | |
} else if (superName.equals("AbstractSet") || superName.equals("Set")){ | |
sb.append(" - "); | |
Set<?> tempList = (Set<?>) mm.get(key); | |
sb.append(tempList + "\n\n"); | |
continue; | |
} | |
} catch (Exception e){ | |
System.err.println(c.getName() + ": "+ e); | |
if (c.isArray()){ | |
sb.append(" - "); | |
if (c.isPrimitive()) { | |
int length = Array.getLength(mm.get(key)); | |
Object[] tempArr = new Object[length]; | |
for (int i = 0; i < length; i++) { | |
tempArr[i] = Array.get(mm.get(key), i); | |
} | |
sb.append(Arrays.toString(tempArr) + "\n"); | |
} | |
else { | |
Object[] tempArr = (Object[]) mm.get(key); | |
sb.append(Arrays.toString(tempArr) + "\n"); | |
} | |
sb.append("\n"); | |
continue; | |
} | |
} | |
for(Field f : fs){ | |
sb.append(" - " + f.getType().getSimpleName() + " " + f.getName() + "\n"); | |
} | |
sb.append("\n"); | |
} | |
sb.append("********** 제너릭 타입 상세(β) **********" + "\n"); | |
for(String key: mm.keySet()){ | |
Class<? extends Object> c = mm.get(key).getClass(); | |
// List<Field> fs = recursiveGetField(c); | |
try{ | |
String superName = c.getSuperclass().getSimpleName(); | |
if (superName.equals("AbstractList") || superName.equals("List")){ | |
List<?> tempList = (List<?>) mm.get(key); | |
if(tempList != null){ | |
Class<? extends Object> innerClass = tempList.get(0).getClass(); | |
List<Field> innerFs = recursiveGetField(innerClass); | |
sb.append(key + ": [" + innerClass.getName() + "] " + "\n"); | |
if(!innerClass.getPackage().getName().equals("java.lang")){ | |
for(Field f : innerFs){ | |
sb.append(" - " + f.getType().getSimpleName() + " " + f.getName() + "\n"); | |
} | |
} | |
} | |
sb.append("\n"); | |
continue; | |
} else if (superName.equals("AbstractMap") || superName.equals("Map")){ | |
Map<?, ?> tempMap = (Map<?, ?>) mm.get(key); | |
Object firstKey = tempMap.keySet().iterator().next(); | |
Object firstValue = tempMap.get(firstKey); | |
if( firstKey != null && firstValue != null){ | |
Class<? extends Object> innerKeyClass = firstKey.getClass(); | |
Class<? extends Object> innerValueClass = firstValue.getClass(); | |
List<Field> innerKeyFs = recursiveGetField(innerKeyClass); | |
List<Field> innerValueFs = recursiveGetField(innerValueClass); | |
sb.append(key + ":\n"); | |
sb.append(" key: [" + innerKeyClass.getName() + "] " + "\n"); | |
if(!innerKeyClass.getPackage().getName().equals("java.lang")){ | |
for(Field f : innerKeyFs){ | |
sb.append(" - " + f.getType().getSimpleName() + " " + f.getName() + "\n"); | |
} | |
} | |
sb.append(" value: [" + innerValueClass.getName() + "] " + "\n"); | |
if(!innerValueClass.getPackage().getName().equals("java.lang")){ | |
for(Field f : innerValueFs){ | |
sb.append(" - " + f.getType().getSimpleName() + " " + f.getName() + "\n"); | |
} | |
} | |
} | |
sb.append("\n"); | |
continue; | |
} else if (superName.equals("AbstractSet") || superName.equals("Set")){ | |
Set<?> tempSet = (Set<?>) mm.get(key); | |
Object first = tempSet.iterator().next(); | |
if( first != null){ | |
Class<? extends Object> innerClass = first.getClass(); | |
List<Field> innerFs = recursiveGetField(innerClass); | |
sb.append(key + ": [" + innerClass.getName() + "] " + "\n"); | |
if(!innerClass.getPackage().getName().equals("java.lang")){ | |
for(Field f : innerFs){ | |
sb.append(" - " + f.getType().getSimpleName() + " " + f.getName() + "\n"); | |
} | |
} | |
} | |
sb.append("\n"); | |
continue; | |
} | |
} catch (Exception e){ | |
System.err.println(c.getName() + ": "+ e); | |
if (c.isArray()){ | |
sb.append(" - "); | |
if (c.isPrimitive()) { | |
int length = Array.getLength(mm.get(key)); | |
Object[] tempArr = new Object[length]; | |
for (int i = 0; i < length; i++) { | |
tempArr[i] = Array.get(mm.get(key), i); | |
} | |
sb.append(Arrays.toString(tempArr) + "\n"); | |
} | |
else { | |
Object[] tempArr = (Object[]) mm.get(key); | |
sb.append(Arrays.toString(tempArr) + "\n"); | |
} | |
sb.append("\n"); | |
continue; | |
} | |
} | |
} | |
if(isThisForJSConsole) { | |
if(isWholeStringWrap){ | |
return "\"" + sb.toString().replace("\n", "\\n\" + \n\"") + "\""; | |
} else { | |
return sb.toString().replace("\n", "\\n\" + \n\""); | |
} | |
} else { | |
return sb.toString(); | |
} | |
} | |
public List<Field> recursiveGetField(Class<?> c){ | |
List<Field> a = new ArrayList<>(); | |
Field[] fs = c.getDeclaredFields(); | |
a.addAll(Arrays.asList(fs)); | |
Class<? extends Object> superClass = c.getSuperclass(); | |
if(superClass != null){ | |
a.addAll( recursiveGetField(superClass) ); | |
} | |
return a; | |
} | |
@Override | |
public String toString() { | |
return outputString; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment