blob: c4cf2800ee8e798782268396c738ce18394beddf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.jsdt.debug.internal.crossfire;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Attributes;
/**
* Class to hold information about an onError event so it can be re-thrown, etc
*
* @since 1.0
*/
public class CFThrowable extends Throwable {
private Map frame = null;
private Map error = null;
private Map objects = null;
/**
* Constructor
* @param json
*/
public CFThrowable(Map json) {
super();
if(json != null) {
frame = (Map) json.get(Attributes.FRAME);
if(frame != null) {
processFrame();
}
else {
Map map = (Map) json.get(Attributes.STACKTRACE);
if(map != null) {
//TODO process any frame infos we get
}
}
error = (Map) json.get(Attributes.ERROR);
}
}
void processFrame() {
if(frame != null) {
objects = new HashMap(frame.size());
Map vals = (Map) frame.remove(Attributes.VALUE);
if(vals != null) {
vals = (Map) vals.remove(Attributes.SCRIPT);
if(vals != null) {
objects.put(Attributes.SCRIPT, new CFObject(Attributes.SCRIPT, (String)vals.get(Attributes.TYPE), (Number)vals.get(Attributes.HANDLE)));
}
}
vals = (Map) frame.remove(Attributes.SCOPE);
if(vals != null) {
objects.put(Attributes.SCOPE, new CFObject(Attributes.SCOPE, (String)vals.get(Attributes.TYPE), (Number)vals.get(Attributes.HANDLE)));
}
vals = (Map) frame.remove(Attributes.CALLING_FRAME);
if(vals != null) {
objects.put(Attributes.CALLING_FRAME, new CFObject(Attributes.CALLING_FRAME, (String)vals.get(Attributes.TYPE), (Number) vals.get(Attributes.HANDLE)));
}
vals = (Map) frame.remove(Attributes.EXECUTION_CONTEXT);
if(vals != null) {
objects.put(Attributes.EXECUTION_CONTEXT, new CFObject(Attributes.EXECUTION_CONTEXT, (String)vals.get(Attributes.TYPE), (Number) vals.get(Attributes.HANDLE)));
}
vals = (Map) frame.remove(Attributes.CALLEE);
if(vals != null) {
objects.put(Attributes.CALLEE, new CFObject(Attributes.CALLEE, (String)vals.get(Attributes.TYPE), (Number) vals.get(Attributes.HANDLE)));
}
vals = (Map) frame.remove(Attributes.THIS_VALUE);
if(vals != null) {
objects.put(Attributes.THIS_VALUE, new CFObject(Attributes.THIS_VALUE, (String)vals.get(Attributes.TYPE), (Number) vals.get(Attributes.HANDLE)));
}
}
}
/**
* Returns if the error was caused by the debugger or not
*
* @return if the debugger caused the error or not
*/
public boolean isDebugger() {
if(frame != null) {
Boolean bool = (Boolean) error.get(Attributes.IS_DEBUGGER);
if(bool != null) {
return bool.booleanValue();
}
}
return false;
}
/**
* Returns if the error is valid wrt the state of the Firebug debugger
*
* @return if the error is valid
*/
public boolean isValid() {
if(frame != null) {
Boolean bool = (Boolean) error.get(Attributes.IS_VALID);
if(bool != null) {
return bool.booleanValue();
}
}
return false;
}
/**
* Returns the line number the error originated from or -1 if it could not be determined
*
* @return the line number of the error or -1.
*/
public int lineNumber() {
if(error != null) {
Number val = (Number) error.get(Attributes.LINE_NUMBER);
if(val == null) {
//try lineNo
val = (Number) error.get(Attributes.LINE_NO);
}
if(val != null) {
return val.intValue();
}
}
return -1;
}
/* (non-Javadoc)
* @see java.lang.Throwable#getLocalizedMessage()
*/
public String getLocalizedMessage() {
return getMessage();
}
/* (non-Javadoc)
* @see java.lang.Throwable#getMessage()
*/
public String getMessage() {
if(error != null) {
String val = (String) error.get(Attributes.MESSAGE);
if(val == null) {
//try errorMessage
val = (String) error.get(Attributes.ERROR_MESSAGE);
}
return val;
}
return null;
}
/**
* Returns the column number the error originated from or -1 if it could not be determined
*
* @return the column number or -1
*/
public int columnNumber() {
if(error != null) {
Number val = (Number) error.get(Attributes.COLUMN_NUMBER);
if(val != null) {
return val.intValue();
}
}
return -1;
}
/**
* Returns the flags from the event or -1 if they could not be determined
*
* @return the flags or -1
*/
public int getFlags() {
if(error != null) {
Number val = (Number) error.get(Attributes.FLAGS);
if(val != null) {
return val.intValue();
}
}
return -1;
}
/**
* Return the category for the error or <code>null</code>
*
* @return the error category or <code>null</code>
*/
public String getCategory() {
if(error != null) {
String val = (String) error.get(Attributes.CATEGORY);
return val;
}
return null;
}
/**
* Returns the name of the script the error occurred in or <code>null</code> if it could not be determined
*
* @return the name of the script or <code>null</code>
*/
public String scriptName() {
if(error != null) {
String val = (String) error.get(Attributes.FILE_NAME);
if(val == null) {
//try the source attribute
val = (String) error.get(Attributes.SOURCE_NAME);
}
return val;
}
return null;
}
/**
* Returns the name of the function the error originated from or <code>null</code> if it could not be determined
*
* @return the name of the function or <code>null</code>
*/
public String functionName() {
if(frame != null) {
String val = (String) frame.get(Attributes.FUNCTION_NAME);
return val;
}
return null;
}
/* (non-Javadoc)
* @see java.lang.Throwable#printStackTrace()
*/
public void printStackTrace() {
if(frame != null) {
return;
}
super.printStackTrace();
}
/* (non-Javadoc)
* @see java.lang.Throwable#printStackTrace(java.io.PrintStream)
*/
public void printStackTrace(PrintStream s) {
if(frame != null) {
return;
}
super.printStackTrace(s);
}
/* (non-Javadoc)
* @see java.lang.Throwable#printStackTrace(java.io.PrintWriter)
*/
public void printStackTrace(PrintWriter s) {
if(frame != null) {
return;
}
super.printStackTrace(s);
}
}