package railo.transformer.cfml.tag;
import railo.commons.lang.StringUtil;
import railo.runtime.SourceFile;
import railo.runtime.op.Caster;
import railo.transformer.util.CFMLString;
/**
* Die Klasse TemplateException wird durch den CFMLTransformer geworfen,
* wenn dieser auf einen grammatikalischen Fehler in dem zu verarbeitenden CFML Code stoesst
* oder wenn ein Tag oder eine Funktion von der
* Definition innerhalb der Tag- bzw. der Funktions- Library abweicht.
*/
public final class CFMLTransformerException extends Exception {
private CFMLString cfml;
//private String htmlMessage;
/**
* Konstruktor mit einem CFMLString und einer anderen Exception.
* @param cfml
* @param e
*/
public CFMLTransformerException(CFMLString cfml, Exception e) {
this(
cfml,
StringUtil.isEmpty(e.getMessage())?
(Caster.toClassName(e)):
e.getMessage());
}
/**
* Konstruktor ohne Message, nur mit CFMLString.
* @param cfml
public TemplateException(CFMLString cfml) {
this(cfml,"Error while transforming CFML File");
}*/
/**
* Hauptkonstruktor, mit CFMLString und message.
* @param cfml CFMLString
* @param message Fehlermeldung
*/
public CFMLTransformerException(CFMLString cfml,String message) {
super(message);
this.cfml=cfml;
}
/**
* Gibt eine detaillierte Fehlermeldung zurueck.
* �berschreibt toString Methode von java.lang.Objekt, alias fuer getMessage().
* @return Fehlermeldung als Plain Text Ausgabe
*/
public String toString() {
boolean hasCFML=cfml!=null;
StringBuffer sb=new StringBuffer();
sb.append("Error\n");
sb.append("----------------------------------\n");
if(hasCFML && cfml.getSourceFile()!=null) {
sb.append("File: "+cfml.getSourceFile().getDisplayPath()+"\n");
}
if(hasCFML) {
int line=cfml.getLine();
int counter=0;
sb.append("Line: "+line+"\n");
sb.append("Column: "+cfml.getColumn()+"\n");
sb.append("Type: Syntax\n");
sb.append("Code Outprint: \n");
line=(line-2<1)?1:line-2;
int lineDescLen=(((line+5)+"").length());
for(int i=line;;i++) {
if(i>0) {
String strLine=cfml.getLineAsString(i);
if(strLine==null)break;
String desc=((""+i).length()<lineDescLen)?"0"+i:""+i;
sb.append(desc+": "+strLine+"\n");
counter++;
}
if(counter==5) break;
}
sb.append("\n");
}
sb.append("Message:\n");
sb.append(""+super.getMessage()+"\n");
return sb.toString();
}
/* *
* Gibt eine detaillierte Fehlermeldung als HTML Ausgabe zurueck.
* @return Fehlermeldung als HTML Ausgabe.
* /
public String getMessageAsHTML() {
boolean hasCFML=cfml!=null;
String str=HTMLOutput.getStyle("fnf","#ff4400","#ff954f","#4f1500");
str+=HTMLOutput.getHead("fnf","Railo - ParserException");
if(hasCFML && cfml.getSourceFile()!=null) {
str+=HTMLOutput.getItem("fnf","File",cfml.getSourceFile().getDisplayPath());
}
if(hasCFML) {
int line=cfml.getLine();
str+=HTMLOutput.getItem("fnf","Line", line+"");
str+=HTMLOutput.getItem("fnf","Column", cfml.getColumn()+"");
str+=HTMLOutput.getItem("fnf","Type", "Syntax");
int failureLine=line;
line=(line-2<1)?1:line-2;
int lineDescLen=(((line+5)+"").length());
int counter=0;
StringBuffer sb=new StringBuffer();
for(int i=line;;i++) {
if(i>0) {
String strLine=cfml.getLineAsString(i);
if(strLine==null)break;
String desc=((""+i).length()<lineDescLen)?"0"+i:""+i;
sb.append(desc+": ");
if(i==failureLine)sb.append("<b>");
sb.append((strLine.replaceAll("<","<").replaceAll(">",">")));
if(i==failureLine)sb.append("</b>");
sb.append("\n");
counter++;
}
if(counter==5) break;
}
str+=HTMLOutput.getItem("fnf","Code","<pre>"+sb+"</pre>");
}
str+=HTMLOutput.getItem("fnf","Message",StringUtil.replace(super.getMessage(),"\n","<br>",false));
str+=HTMLOutput.getBottom();
return str;
}*/
/**
* Gibt die Zeilennummer zurueck
* @return Zeilennummer
*/
public int getLine() {
return cfml.getLine();
}
/**
* Gibt die Column der aktuellen Zeile zurueck
* @return Column der Zeile
*/
public int getColumn() {
return cfml.getColumn();
}
/**
* Source Dokument
* @return Source Dokument
*/
public SourceFile getSource() {
return cfml.getSourceFile();
}
/**
* Returns the value of cfml.
* @return value cfml
*/
public CFMLString getCfml() {
return cfml;
}
}