*** empty log message ***
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanDebugger.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanDebugger.java
index 373ee08..89cb2e9 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanDebugger.java
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanDebugger.java
@@ -42,7 +42,7 @@
// printer.m_traceTemplates = true;
// trMgr.addTraceListener(printer);
- XalanTraceListener traceListener = new XalanTraceListener(transformerImpl.getXPathContext().getVarStack(), this);
+ XalanTraceListener traceListener = new XalanTraceListener(this);
trMgr.addTraceListener(traceListener);
}
catch (TooManyListenersException e)
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanRootStyleFrame.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanRootStyleFrame.java
index 2d1f9b2..cdfd3c2 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanRootStyleFrame.java
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanRootStyleFrame.java
@@ -10,23 +10,42 @@
*******************************************************************************/
package org.eclipse.wst.xsl.xalan.debugger;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Vector;
-import org.apache.xalan.templates.ElemTemplateElement;
+import org.apache.xalan.templates.ElemVariable;
+import org.apache.xalan.templates.StylesheetRoot;
+import org.apache.xalan.trace.TracerEvent;
import org.apache.xpath.VariableStack;
+import org.eclipse.wst.xsl.debugger.Variable;
public class XalanRootStyleFrame extends XalanStyleFrame
{
- private final List globals;
+ private final List globals = new ArrayList();
- public XalanRootStyleFrame(ElemTemplateElement element, VariableStack varStack, List globals)
+ public XalanRootStyleFrame(TracerEvent event)
{
- super(null, element, varStack);
- this.globals = globals;
+ super(null, event);
+ fillGlobals(event);
}
- public List getGlobals()
+ protected List getGlobals()
{
return globals;
}
+
+ private void fillGlobals(TracerEvent event)
+ {
+ VariableStack vs = event.m_processor.getXPathContext().getVarStack();
+ StylesheetRoot sr = event.m_styleNode.getStylesheetRoot();
+ Vector vars = sr.getVariablesAndParamsComposed();
+ int i = vars.size();
+ while (--i >= 0)
+ {
+ ElemVariable variable = (ElemVariable) vars.elementAt(i);
+ XalanVariable xvar = new XalanVariable(vs,Variable.GLOBAL_SCOPE,i,variable);
+ globals.add(xvar);
+ }
+ }
}
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanStyleFrame.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanStyleFrame.java
index a4655f0..0786c0f 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanStyleFrame.java
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanStyleFrame.java
@@ -11,7 +11,11 @@
package org.eclipse.wst.xsl.xalan.debugger;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Stack;
import org.apache.commons.logging.Log;
@@ -20,6 +24,7 @@
import org.apache.xalan.templates.ElemTemplate;
import org.apache.xalan.templates.ElemTemplateElement;
import org.apache.xalan.templates.ElemVariable;
+import org.apache.xalan.trace.TracerEvent;
import org.apache.xml.utils.QName;
import org.apache.xpath.VariableStack;
import org.apache.xpath.XPath;
@@ -29,32 +34,34 @@
public class XalanStyleFrame extends StyleFrame
{
private static final Log log = LogFactory.getLog(XalanStyleFrame.class);
-
- private final List localVariables = new ArrayList();
- private final ElemTemplateElement element;
- private final VariableStack varStack;
- private final Stack elementStack = new Stack();
+
+ private final Map varNames;
+ private final Stack eventStack = new Stack();
+ final TracerEvent event;
private int currentLine;
- public XalanStyleFrame(StyleFrame parent, ElemTemplateElement element, VariableStack varStack)
+ public XalanStyleFrame(StyleFrame parent, TracerEvent event)
{
super(parent);
- this.element = element;
- this.varStack = varStack;
- pushElement(element);
+ this.event = event;
+ if (parent != null)
+ this.varNames = new HashMap(((XalanStyleFrame)parent).varNames);
+ else
+ this.varNames = new HashMap();
+ pushElement(event);
}
-
+
public String getFilename()
{
- return element.getStylesheet().getSystemId();
+ return event.m_styleNode.getStylesheet().getSystemId();
}
public String getName()
{
- String name = element.getNodeName();
- if (element instanceof ElemTemplate)
+ String name = event.m_styleNode.getNodeName();
+ if (event.m_styleNode instanceof ElemTemplate)
{
- ElemTemplate et = (ElemTemplate) element;
+ ElemTemplate et = (ElemTemplate) event.m_styleNode;
QName q = et.getName();
if (q != null)
{
@@ -66,9 +73,9 @@
name += " match=\"" + xp.getPatternString() + "\"";
}
}
- else if (element instanceof ElemCallTemplate)
+ else if (event.m_styleNode instanceof ElemCallTemplate)
{
- ElemCallTemplate et = (ElemCallTemplate) element;
+ ElemCallTemplate et = (ElemCallTemplate) event.m_styleNode;
QName q = et.getName();
if (q != null)
{
@@ -77,74 +84,90 @@
}
return name;
}
-
+
public List getVariableStack()
{
List vars = new ArrayList();
- fillWithLocals(vars);
- fillWithGlobals(vars);
+ vars.addAll(getLocals());
+ vars.addAll(getGlobals());
return vars;
}
-
+
public Variable getVariable(String scope, int slotNumber)
{
- List vars = new ArrayList();
if (Variable.GLOBAL_SCOPE.equals(scope))
- fillWithGlobals(vars);
+ {
+ List vars = getGlobals();
+ for (Iterator iterator = vars.iterator(); iterator.hasNext();)
+ {
+ Variable var = (Variable) iterator.next();
+ if (var.getSlotNumber() == slotNumber)
+ return var;
+ }
+ }
else if (Variable.LOCAL_SCOPE.equals(scope))
- fillWithLocals(vars);
- return (Variable) vars.get(slotNumber);
+ {
+ List vars = getLocals();
+ for (Iterator iterator = vars.iterator(); iterator.hasNext();)
+ {
+ Variable var = (Variable) iterator.next();
+ if (var.getSlotNumber() == slotNumber)
+ return var;
+ }
+ }
+ return null;
}
- public void addVariable(ElemVariable variable)
- {
- String scope = variable.getIsTopLevel() ? Variable.GLOBAL_SCOPE : Variable.LOCAL_SCOPE;
- Variable xvar = new XalanVariable(varStack, scope, localVariables.size(), variable);
- localVariables.add(xvar);
- }
-
- public Object getTemplate()
- {
- return element.getOwnerXSLTemplate();
- }
-
public int getCurrentLine()
{
return currentLine;
}
-
- public void pushElement(ElemTemplateElement e)
+
+ public void pushElement(TracerEvent e)
{
- currentLine = e.getLineNumber();
- elementStack.push(e);
- log.debug("Pushed element "+e);
+ currentLine = e.m_styleNode.getLineNumber();
+ eventStack.push(e);
+ log.debug("Pushed element " + e);
}
- public ElemTemplateElement popElement()
+ public TracerEvent popElement()
{
- ElemTemplateElement e = (ElemTemplateElement)elementStack.pop();
- log.debug("Popped element "+e);
- currentLine = e.getEndLineNumber();
+ TracerEvent e = (TracerEvent) eventStack.pop();
+ log.debug("Popped element " + e);
+ currentLine = e.m_styleNode.getEndLineNumber();
+
+ ElemTemplateElement element = e.m_styleNode;
+ String name = element.getNodeName();
+ if (name.equals("param") || name.equals("variable"))
+ addVariable((ElemVariable) e.m_styleNode);
+
return e;
}
- public ElemTemplateElement peekElement()
+ public TracerEvent peekElement()
{
- if (elementStack.isEmpty())
+ if (eventStack.isEmpty())
return null;
- return (ElemTemplateElement)elementStack.peek();
- }
-
- private void fillWithLocals(List vars)
- {
- XalanStyleFrame frame = this;
- while ((frame = (XalanStyleFrame) frame.getParent()) != null)
- {
- vars.addAll(frame.localVariables);
- }
+ return (TracerEvent) eventStack.peek();
}
- private void fillWithGlobals(List vars)
+ private void addVariable(ElemVariable variable)
+ {
+ String scope = variable.getIsTopLevel() ? Variable.GLOBAL_SCOPE : Variable.LOCAL_SCOPE;
+ VariableStack vs = event.m_processor.getXPathContext().getVarStack();
+ Variable xvar = new XalanVariable(vs, scope, variable.getIndex(), variable);
+ varNames.put(variable.getName(),xvar);
+ }
+
+ private List getLocals()
+ {
+ List locals = new ArrayList(varNames.values());
+ // sort by slotNumber
+ Collections.sort(locals);
+ return locals;
+ }
+
+ protected List getGlobals()
{
XalanStyleFrame frame = this;
while ((frame = (XalanStyleFrame) frame.getParent()) != null)
@@ -152,22 +175,9 @@
if (frame instanceof XalanRootStyleFrame)
{
XalanRootStyleFrame root = (XalanRootStyleFrame) frame;
- vars.addAll(root.getGlobals());
- break;
+ return root.getGlobals();
}
}
-
- // if (template != null)
- // {
- // Stylesheet sheet = template.getStylesheet();
- // for (int i = 0; i < sheet.getVariableOrParamCount(); i++)
- // {
- // ElemVariable variable = sheet.getVariableOrParam(i);
- // Variable var = new
- // XalanVariable(this,variable.getName().getLocalName(),Variable.GLOBAL_SCOPE,i,variable);
- // vars.add(var);
- // }
- // }
-
+ return null;
}
}
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanTraceListener.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanTraceListener.java
index cb15c9a..4f6c8b0 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanTraceListener.java
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanTraceListener.java
@@ -10,22 +10,19 @@
*******************************************************************************/
package org.eclipse.wst.xsl.xalan.debugger;
-import java.util.ArrayList;
-import java.util.List;
-
import javax.xml.transform.TransformerException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.xalan.templates.Constants;
import org.apache.xalan.templates.ElemTemplateElement;
+import org.apache.xalan.templates.ElemVariable;
import org.apache.xalan.trace.EndSelectionEvent;
import org.apache.xalan.trace.ExtensionEvent;
import org.apache.xalan.trace.GenerateEvent;
import org.apache.xalan.trace.SelectionEvent;
import org.apache.xalan.trace.TraceListenerEx2;
import org.apache.xalan.trace.TracerEvent;
-import org.apache.xpath.VariableStack;
import org.eclipse.wst.xsl.debugger.BreakPoint;
public class XalanTraceListener implements TraceListenerEx2 //TraceListenerEx3
@@ -33,13 +30,11 @@
private static final Log log = LogFactory.getLog(XalanTraceListener.class);
private final XalanDebugger debugger;
- private final VariableStack varStack;
private boolean started;
- public XalanTraceListener(VariableStack varStack, XalanDebugger debugger)
+ public XalanTraceListener(XalanDebugger debugger)
{
this.debugger = debugger;
- this.varStack = varStack;
}
public void trace(TracerEvent ev)
@@ -49,25 +44,22 @@
{// this is the root of the stack
started = true;
debugger.debuggerTransformStarted();
- List globals = new ArrayList();
- // TODO put back in
- // List globals = getGlobals(el.getStylesheetRoot());
- styleFrame = new XalanRootStyleFrame(ev.m_styleNode, varStack, globals);
+ styleFrame = new XalanRootStyleFrame(ev);
debugger.pushStyleFrame(styleFrame);
}
else if (ev.m_styleNode.getOwnerXSLTemplate() == ev.m_styleNode)
{// this is an xsl:template, so add to template stack
- styleFrame = new XalanStyleFrame(debugger.peekStyleFrame(), ev.m_styleNode, varStack);
+ styleFrame = new XalanStyleFrame(debugger.peekStyleFrame(), ev);
debugger.pushStyleFrame(styleFrame);
}
else if (ev.m_styleNode.getXSLToken() != Constants.ELEMNAME_TEXTLITERALRESULT)
{// add to current template element stack
styleFrame = (XalanStyleFrame) debugger.peekStyleFrame();
- styleFrame.pushElement(ev.m_styleNode);
+ styleFrame.pushElement(ev);
}
else
{
- log.error(ev.m_styleNode.getLocalName());
+ log.debug("Skipped push for element "+ev.m_styleNode.getLocalName());
}
check(styleFrame);
}
@@ -75,14 +67,17 @@
public void traceEnd(TracerEvent ev)
{
XalanStyleFrame styleFrame = (XalanStyleFrame) debugger.peekStyleFrame();
- ElemTemplateElement tel = null;
if (ev.m_styleNode.getOwnerXSLTemplate() == ev.m_styleNode)
- {// end of template, so remove from stack
- tel = styleFrame.popElement();
+ {// remove from current template element stack
+ styleFrame.popElement();
}
else if (ev.m_styleNode.getXSLToken() != Constants.ELEMNAME_TEXTLITERALRESULT)
- {// remove from current templates element stack
- tel = styleFrame.popElement();
+ {// remove from current template element stack
+ styleFrame.popElement();
+ }
+ else
+ {
+ log.debug("Skipped pop for element "+ev.m_styleNode.getLocalName());
}
check(styleFrame);
if (ev.m_styleNode.getOwnerXSLTemplate() == ev.m_styleNode)
@@ -91,9 +86,9 @@
}
else
{// because we don't get selectEnd events, we need to do this check
- tel = styleFrame.peekElement();
+ TracerEvent tel = styleFrame.peekElement();
// if the parent is a choose, move on to it
- switch (tel.getXSLToken())
+ switch (tel.m_styleNode.getXSLToken())
{
case Constants.ELEMNAME_CHOOSE:
styleFrame.popElement();
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanVariable.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanVariable.java
index b7891e8..a8ddf23 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanVariable.java
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanVariable.java
@@ -20,17 +20,20 @@
import org.apache.xpath.objects.XObject;
import org.eclipse.wst.xsl.debugger.Variable;
-public class XalanVariable extends Variable
+public class XalanVariable extends Variable implements Comparable
{
private final Log log = LogFactory.getLog(XalanVariable.class);
private final ElemVariable elemVariable;
private final VariableStack varStack;
+ private int stackFrame;
public XalanVariable(VariableStack varStack, String scope, int slotNumber, ElemVariable elemVariable)
{
- super(getName(elemVariable), scope, slotNumber);
+ super(getName(elemVariable), scope, slotNumber+varStack.getStackFrame());
this.elemVariable = elemVariable;
this.varStack = varStack;
+ // get the stack frame at this current point in time
+ this.stackFrame = varStack.getStackFrame();
}
private static String getName(ElemVariable elemVariable)
@@ -51,7 +54,6 @@
public String getValue()
{
- log.debug("Getting value for " + getName() + " in scope " + getScope() + " with index " + getSlotNumber());
String value = "???";
try
{
@@ -61,18 +63,18 @@
int xalanType = xobject.getType();
switch (xalanType)
{
- case XObject.CLASS_BOOLEAN:
- case XObject.CLASS_NUMBER:
- case XObject.CLASS_STRING:
- case XObject.CLASS_UNKNOWN:
- value = xobject.toString();
+ case XObject.CLASS_UNRESOLVEDVARIABLE:
+ value = "";
break;
case XObject.CLASS_NODESET:
value = ((XNodeSet) xobject).xstr().toString();
break;
- case XObject.CLASS_UNRESOLVEDVARIABLE:
+ case XObject.CLASS_BOOLEAN:
+ case XObject.CLASS_NUMBER:
+ case XObject.CLASS_STRING:
+ case XObject.CLASS_UNKNOWN:
default:
- value = "";
+ value = xobject.toString();
break;
}
}
@@ -81,18 +83,27 @@
{
e.printStackTrace();
}
+// value = getScope()+"."+getSlotNumber()+")"+getName();
+ log.debug(getScope()+"."+getSlotNumber()+")"+getName() + "=" + value);
return value;
}
private XObject getXObject() throws TransformerException
{
- XObject xvalue = null;
- int index = elemVariable.getIndex();
- int frame = varStack.getStackFrame();
+ XObject xvalue;
if (elemVariable.getIsTopLevel())
- xvalue = varStack.elementAt(index);
+ xvalue = varStack.elementAt(slotNumber);
else
- xvalue = varStack.getLocalVariable(index, frame);
+ xvalue = varStack.getLocalVariable(elemVariable.getIndex(), stackFrame);
return xvalue;
}
+
+ public int compareTo(Object arg0)
+ {
+ XalanVariable xvar = (XalanVariable)arg0;
+ int comp = xvar.stackFrame - stackFrame;
+ if (comp == 0)
+ comp = slotNumber - xvar.slotNumber;
+ return comp;
+ }
}