package com.aptana.ruby.internal.debug.core.parsing; import java.io.IOException; import java.text.MessageFormat; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import com.aptana.core.util.StringUtil; import com.aptana.ruby.debug.core.RubyDebugCorePlugin; import com.aptana.ruby.internal.debug.core.BreakpointSuspensionPoint; import com.aptana.ruby.internal.debug.core.ExceptionSuspensionPoint; import com.aptana.ruby.internal.debug.core.StepSuspensionPoint; import com.aptana.ruby.internal.debug.core.SuspensionPoint; public class SuspensionReader extends XmlStreamReader { private SuspensionPoint suspensionPoint; public SuspensionReader(XmlPullParser xpp) { super(xpp); } public SuspensionReader(AbstractReadStrategy readStrategy) { super(readStrategy); } public SuspensionPoint readSuspension() throws XmlPullParserException, IOException, XmlStreamReaderException { this.read(); return suspensionPoint; } @SuppressWarnings("nls") protected boolean processStartElement(XmlPullParser xpp) throws XmlStreamReaderException { String name = xpp.getName(); if (name.equals("breakpoint")) { suspensionPoint = new BreakpointSuspensionPoint(); } else if (name.equals("exception")) { ExceptionSuspensionPoint exceptionPoint = new ExceptionSuspensionPoint(); exceptionPoint.setExceptionMessage(xpp.getAttributeValue(StringUtil.EMPTY, "message")); exceptionPoint.setExceptionType(xpp.getAttributeValue(StringUtil.EMPTY, "type")); suspensionPoint = exceptionPoint; } else if (name.equals("suspended")) { StepSuspensionPoint stepPoint = new StepSuspensionPoint(); String frameNoAttribute = xpp.getAttributeValue(StringUtil.EMPTY, "frames"); try { stepPoint.setFramesNumber(Integer.parseInt(frameNoAttribute)); suspensionPoint = stepPoint; } catch (NumberFormatException nfe) { RubyDebugCorePlugin.debug(MessageFormat.format("Could not parse: {0}, {1}", frameNoAttribute, xpp .getText())); return false; } } else { return false; } int line = 0; try { line = Integer.parseInt(xpp.getAttributeValue(StringUtil.EMPTY, "line")); } catch (NumberFormatException e) { RubyDebugCorePlugin.log(e); } suspensionPoint.setLine(line); suspensionPoint.setFile(xpp.getAttributeValue(StringUtil.EMPTY, "file")); suspensionPoint.setThreadId(Integer.parseInt(xpp.getAttributeValue(StringUtil.EMPTY, "threadId"))); return true; } }