package railo.commons.lang; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Iterator; import railo.runtime.exp.NativeException; import railo.runtime.exp.PageException; import railo.runtime.exp.PageExceptionImpl; import railo.runtime.type.Collection; import railo.runtime.type.util.CollectionUtil; import railo.runtime.type.util.KeyConstants; import railo.runtime.type.util.ListUtil; public final class ExceptionUtil { public static String getStacktrace(Throwable t, boolean addMessage) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); t.printStackTrace(pw); pw.close(); String st = sw.toString(); String msg=t.getMessage(); if(addMessage && !StringUtil.isEmpty(msg) && !st.startsWith(msg.trim())) st=msg+"\n"+st; return st; } public static String getMessage(Throwable t) { String msg=t.getMessage(); if(StringUtil.isEmpty(msg,true)) msg=t.getClass().getName(); StringBuilder sb=new StringBuilder(msg); if(t instanceof PageException){ PageException pe=(PageException)t; String detail = pe.getDetail(); if(!StringUtil.isEmpty(detail,true)) { sb.append('\n'); sb.append(detail); } } return sb.toString(); } public static PageException addHint(PageExceptionImpl pe,String hint) { pe.setAdditional(KeyConstants._Hint, hint); return pe; } /** * creates a message for key not found with soundex check for similar key * @param keys * @param keyLabel * @return */ public static String similarKeyMessage(Collection.Key[] _keys,String keySearched, String keyLabel, String keyLabels, boolean listAll) { Arrays.sort(_keys); String list=ListUtil.arrayToList(_keys, ","); String keySearchedSoundex=StringUtil.soundex(keySearched); for(int i=0;i<_keys.length;i++){ if(StringUtil.soundex(_keys[i].getString()).equals(keySearchedSoundex)) return "The "+keyLabel+" ["+keySearched+"] does not exist, but there is a similar "+keyLabel+" with name ["+_keys[i].getString()+"] available"+(listAll?". Here is a complete list of all available "+keyLabels+": ["+list+"].":"."); } return "The "+keyLabel+" ["+keySearched+"] does not exist"+(listAll?", only the following "+keyLabels+" are available: ["+list+"].":"."); } public static String similarKeyMessage(Collection coll,String keySearched, String keyLabel, String keyLabels, boolean listAll) { return similarKeyMessage(CollectionUtil.keys(coll), keySearched, keyLabel, keyLabels,listAll); } public static IOException toIOException(Throwable t) { if(t instanceof IOException) return (IOException) t; if(t instanceof InvocationTargetException) return toIOException(((InvocationTargetException) t).getCause()); if(t instanceof NativeException) return toIOException(((NativeException)t).getCause()); IOException ioe = new IOException(t.getClass().getName()+":"+t.getMessage()); ioe.setStackTrace(t.getStackTrace()); return ioe; } public static String createSoundexDetail(String name, Iterator<String> it, String keyName) { StringBuilder sb=new StringBuilder(); String k ,sname=StringUtil.soundex(name); while(it.hasNext()){ k = it.next(); if(StringUtil.soundex(k).equals(sname)) return "did you mean ["+k+"]"; if(sb.length()!=0)sb.append(','); sb.append(k); } return "available "+keyName+" are ["+sb+"]"; } }