package railo.runtime.exp;
import java.util.ArrayList;
import java.util.List;
import railo.commons.io.res.util.ResourceUtil;
import railo.runtime.PageContext;
import railo.runtime.config.Config;
import railo.runtime.err.ErrorPage;
import railo.runtime.type.Struct;
import railo.runtime.type.util.KeyConstants;
/**
* Exception throwed by CFML Code
*/
public final class CustomTypeException extends PageExceptionImpl {
private static final long serialVersionUID = 949287085391895177L;
private int entryLevel;
/**
* constructor of the Exception
* @param message Exception Message
* @param detail Detailed Exception Message
* @param errorCode Error Code
* @param customType Type of the Exception
* @param entryLevel
*/
public CustomTypeException(String message, String detail, String errorCode, String customType,String extendedinfo) {
this(message, detail, errorCode, customType, extendedinfo, 1);
}
public CustomTypeException(String message, String detail, String errorCode, String customType,String extendedinfo, int entryLevel) {
super(message,"custom_type",customType);
setDetail(detail);
setErrorCode(errorCode);
if(extendedinfo!=null)setExtendedInfo(extendedinfo);
this.entryLevel=entryLevel;
}
@Override
public StackTraceElement[] getStackTrace() {
List<StackTraceElement> list=new ArrayList<StackTraceElement>();
StackTraceElement[] elements = super.getStackTrace();
StackTraceElement element;
String template;
int level=0;
for(int i=0;i<elements.length;i++){
element=elements[i];
template = element.getFileName();
if(level<entryLevel && (element.getLineNumber()<=0 || template==null || ResourceUtil.getExtension(template,"").equals("java"))) continue;
if(++level>=entryLevel) {
list.add(element);
}
}
if(list.size()==0) return elements;
return list.toArray(new StackTraceElement[list.size()]);
}
@Override
public CatchBlock getCatchBlock(Config config) {
CatchBlock cb=super.getCatchBlock(config);
cb.setEL(KeyConstants._code,cb.get(KeyConstants._errorcode,null));
cb.setEL(KeyConstants._type,getCustomTypeAsString());
String ei=getExtendedInfo();
if(ei!=null)cb.setEL(KeyConstants._extended_info,ei);
//cb.setEL("ErrorCode","");
return cb;
}
@Override
public Struct getErrorBlock(PageContext pc, ErrorPage ep) {
Struct eb = super.getErrorBlock(pc, ep);
eb.setEL(KeyConstants._type,getCustomTypeAsString());
return eb;
}
@Override
public boolean typeEqual(String type) {
if(type==null) return true;
type=type.toLowerCase().trim();
if(type.equals("any")) return true;
// Custom Type
if(getTypeAsString().equals("custom_type") || getTypeAsString().equals("customtype")) {
return compareCustomType(type,getCustomTypeAsString().toLowerCase().trim());
}
return super.typeEqual(type);
}
/**
* @param leftType
* @param rightType
* @return is same custom type
*/
private boolean compareCustomType(String leftType, String rightType) {
int left=leftType.length();
int right=rightType.length();
if(left>right) return false;
if(left==right) return leftType.equals(rightType);
for(int i=0;i<left;i++) {
if(leftType.charAt(i)!=rightType.charAt(i)) return false;
}
return rightType.charAt(left)=='.';
}
}