*** empty log message ***
diff --git a/bundles/org.eclipse.wst.xsl.xalan/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.xsl.xalan/META-INF/MANIFEST.MF
index 0754c03..3e176df 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.xsl.xalan/META-INF/MANIFEST.MF
@@ -6,4 +6,4 @@
Require-Bundle: org.eclipse.wst.xsl.debug
Bundle-ClassPath: xalan2.7.0.jar,
xalan-debugger.jar
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.wst.xsl.xalan/plugin.xml b/bundles/org.eclipse.wst.xsl.xalan/plugin.xml
index 73fe33a..4ed7a8f 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/plugin.xml
+++ b/bundles/org.eclipse.wst.xsl.xalan/plugin.xml
@@ -17,13 +17,21 @@
className="org.eclipse.wst.xsl.xalan.debugger.XalanDebugger"
classpath="xalan-debugger.jar"
id="org.eclipse.wst.xsl.xalan.debugger"
- name="Xalan Debugger"
+ name="Xalan 2.5.1 or greater"
processorTypeId="org.eclipse.wst.xsl.xalan.processorType">
</debugger>
</extension>
<extension
point="org.eclipse.wst.xsl.launching.processor">
<processor
+ classpath="xalan2.5.1.jar"
+ debuggerId="org.eclipse.wst.xsl.xalan.debugger"
+ id="org.eclipse.wst.xsl.launching.xalan.2_5_1"
+ label="Xalan 2.5.1"
+ processorTypeId="org.eclipse.wst.xsl.xalan.processorType"
+ supports="1.0">
+ </processor>
+ <processor
classpath="xalan2.7.0.jar;serializer2.7.0.jar"
id="org.eclipse.wst.xsl.launching.xalan.2_7_0"
label="Xalan 2.7.0"
diff --git a/bundles/org.eclipse.wst.xsl.xalan/source2.5.1.zip b/bundles/org.eclipse.wst.xsl.xalan/source2.5.1.zip
new file mode 100644
index 0000000..d2b15a1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsl.xalan/source2.5.1.zip
Binary files differ
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 7f73cfa..373ee08 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
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.wst.xsl.xalan.debugger;
+import java.util.Map;
import java.util.TooManyListenersException;
import javax.xml.transform.Transformer;
@@ -29,12 +30,18 @@
tfi.setAttribute(TransformerFactoryImpl.FEATURE_OPTIMIZE, Boolean.FALSE);
}
- public void addTransformer(Transformer transformer)
+ public void addTransformer(Transformer transformer, Map locations)
{
TransformerImpl transformerImpl = (TransformerImpl) transformer;
TraceManager trMgr = transformerImpl.getTraceManager();
try
{
+// XalanPrintTraceListener printer = new XalanPrintTraceListener(new PrintWriter(System.err));
+// printer.m_traceElements = true;
+// printer.m_traceSelection = true;
+// printer.m_traceTemplates = true;
+// trMgr.addTraceListener(printer);
+
XalanTraceListener traceListener = new XalanTraceListener(transformerImpl.getXPathContext().getVarStack(), this);
trMgr.addTraceListener(traceListener);
}
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanPrintTraceListener.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanPrintTraceListener.java
new file mode 100644
index 0000000..3d6c07d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanPrintTraceListener.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Doug Satchwell (Chase Technology Ltd) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsl.xalan.debugger;
+
+import java.io.PrintWriter;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xalan.templates.Constants;
+import org.apache.xalan.templates.ElemTemplate;
+import org.apache.xalan.templates.ElemTextLiteral;
+import org.apache.xalan.trace.EndSelectionEvent;
+import org.apache.xalan.trace.PrintTraceListener;
+import org.apache.xalan.trace.SelectionEvent;
+import org.apache.xalan.trace.TracerEvent;
+
+public class XalanPrintTraceListener extends PrintTraceListener
+{
+ private final PrintWriter writer;
+
+ public XalanPrintTraceListener(PrintWriter pw)
+ {
+ super(pw);
+ this.writer = pw;
+ }
+
+ public void _trace(TracerEvent ev)
+ {
+ switch (ev.m_styleNode.getXSLToken())
+ {
+ case Constants.ELEMNAME_TEXTLITERALRESULT:
+ if (m_traceElements)
+ {
+ writer.print(ev.m_styleNode.getSystemId() + " Line #" + ev.m_styleNode.getLineNumber() + ", " + "Column #" + ev.m_styleNode.getColumnNumber() + " -- " + ev.m_styleNode.getNodeName()
+ + ": ");
+
+ ElemTextLiteral etl = (ElemTextLiteral) ev.m_styleNode;
+ String chars = new String(etl.getChars(), 0, etl.getChars().length);
+
+ writer.println(" " + chars.trim());
+ }
+ break;
+ case Constants.ELEMNAME_TEMPLATE:
+ if (m_traceTemplates || m_traceElements)
+ {
+ ElemTemplate et = (ElemTemplate) ev.m_styleNode;
+
+ writer.print(et.getSystemId() + " Line #" + et.getLineNumber() + ", " + "Column #" + et.getColumnNumber() + ": " + et.getNodeName() + " ");
+
+ if (null != et.getMatch())
+ {
+ writer.print("match='" + et.getMatch().getPatternString() + "' ");
+ }
+
+ if (null != et.getName())
+ {
+ writer.print("name='" + et.getName() + "' ");
+ }
+
+ writer.println();
+ }
+ break;
+ default:
+ if (m_traceElements)
+ {
+ writer
+ .println(ev.m_styleNode.getSystemId() + " Line #" + ev.m_styleNode.getLineNumber() + ", " + "Column #" + ev.m_styleNode.getColumnNumber() + ": "
+ + ev.m_styleNode.getNodeName());
+ }
+ }
+ }
+
+ public void selected(SelectionEvent ev) throws TransformerException
+ {
+ writer.print("selected: ");
+ super.selected(ev);
+ }
+
+ public void selectEnd(EndSelectionEvent ev) throws TransformerException
+ {
+ writer.print("selectEnd: ");
+ super.selectEnd(ev);
+ }
+
+ public void trace(TracerEvent ev)
+ {
+ writer.print("trace: ");
+ super.trace(ev);
+ }
+
+ public void traceEnd(TracerEvent ev)
+ {
+ writer.print("traceEnd: ");
+ _trace(ev);
+ }
+}
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 f4af450..2d1f9b2 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
@@ -14,15 +14,14 @@
import org.apache.xalan.templates.ElemTemplateElement;
import org.apache.xpath.VariableStack;
-import org.eclipse.wst.xsl.debugger.StyleFrame;
public class XalanRootStyleFrame extends XalanStyleFrame
{
private final List globals;
- public XalanRootStyleFrame(StyleFrame parent, ElemTemplateElement element, VariableStack varStack, List globals)
+ public XalanRootStyleFrame(ElemTemplateElement element, VariableStack varStack, List globals)
{
- super(parent, element, varStack);
+ super(null, element, varStack);
this.globals = globals;
}
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 47b6a06..a4655f0 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
@@ -12,7 +12,10 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Stack;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.xalan.templates.ElemCallTemplate;
import org.apache.xalan.templates.ElemTemplate;
import org.apache.xalan.templates.ElemTemplateElement;
@@ -25,36 +28,27 @@
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 int currentLine;
public XalanStyleFrame(StyleFrame parent, ElemTemplateElement element, VariableStack varStack)
{
super(parent);
this.element = element;
this.varStack = varStack;
+ pushElement(element);
}
-
-
- public int getColumn()
- {
- return element.getColumnNumber();
- }
-
public String getFilename()
{
- return element.getSystemId();
+ return element.getStylesheet().getSystemId();
}
-
- public int getLine()
- {
- return element.getLineNumber();
- }
-
-
public String getName()
{
String name = element.getNodeName();
@@ -83,7 +77,6 @@
}
return name;
}
-
public List getVariableStack()
{
@@ -92,7 +85,6 @@
fillWithGlobals(vars);
return vars;
}
-
public Variable getVariable(String scope, int slotNumber)
{
@@ -110,7 +102,39 @@
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)
+ {
+ currentLine = e.getLineNumber();
+ elementStack.push(e);
+ log.debug("Pushed element "+e);
+ }
+ public ElemTemplateElement popElement()
+ {
+ ElemTemplateElement e = (ElemTemplateElement)elementStack.pop();
+ log.debug("Popped element "+e);
+ currentLine = e.getEndLineNumber();
+ return e;
+ }
+
+ public ElemTemplateElement peekElement()
+ {
+ if (elementStack.isEmpty())
+ return null;
+ return (ElemTemplateElement)elementStack.peek();
+ }
+
private void fillWithLocals(List vars)
{
XalanStyleFrame frame = this;
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 492b959..cb15c9a 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
@@ -11,9 +11,7 @@
package org.eclipse.wst.xsl.xalan.debugger;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
-import java.util.Vector;
import javax.xml.transform.TransformerException;
@@ -21,133 +19,112 @@
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.templates.StylesheetRoot;
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;
-import org.eclipse.wst.xsl.debugger.StyleFrame;
-import org.eclipse.wst.xsl.debugger.Variable;
-public class XalanTraceListener implements TraceListenerEx2
+public class XalanTraceListener implements TraceListenerEx2 //TraceListenerEx3
{
private static final Log log = LogFactory.getLog(XalanTraceListener.class);
private final XalanDebugger debugger;
private final VariableStack varStack;
private boolean started;
-
- public XalanTraceListener(VariableStack stack, XalanDebugger debugger)
+
+ public XalanTraceListener(VariableStack varStack, XalanDebugger debugger)
{
this.debugger = debugger;
- varStack = stack;
- }
-
- public void generated(GenerateEvent ev)
- {
- // TODO here we could build up the output tree into a string, and return to the UI if requested?
- }
-
- // These events are thrown when hitting xsl:when or xsl:if
- public void selected(SelectionEvent ev) throws TransformerException
- {
- }
-
- public void selectEnd(EndSelectionEvent ev) throws TransformerException
- {
+ this.varStack = varStack;
}
public void trace(TracerEvent ev)
{
- // log.debug("trace: "+ev);
- // There is one XalanTraceListener for each stylesheet in the pipeline.
- // So if this is the first trace event, we clear down the debugger's
- // state from the previous transformation.
+ XalanStyleFrame styleFrame = null;
if (!started)
- {
+ {// 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);
+ debugger.pushStyleFrame(styleFrame);
}
- StyleFrame styleFrame = pushStyleFrame(ev);
- if (styleFrame == null)
- return;
- debugger.checkStopped();
- BreakPoint breakpoint = new BreakPoint(styleFrame.getFilename(), styleFrame.getLine());
- debugger.checkSuspended(styleFrame, breakpoint);
+ 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);
+ 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);
+ }
+ else
+ {
+ log.error(ev.m_styleNode.getLocalName());
+ }
+ check(styleFrame);
}
public void traceEnd(TracerEvent ev)
{
- // log.debug("traceEnd: "+ev);
- XalanStyleFrame styleFrame = popStyleFrame(ev);
- debugger.checkStopped();
- BreakPoint breakpoint = new BreakPoint(styleFrame.getFilename(), styleFrame.getEndLine());
- debugger.checkSuspended(styleFrame, breakpoint);
- // consistency check
- log.debug(styleFrame.getFilename() + " " + styleFrame.getName() + " " + styleFrame.getLine() + " " + styleFrame.getEndLine());
- }
-
- private XalanStyleFrame pushStyleFrame(TracerEvent ev)
- {
- StyleFrame parent = debugger.peekStyleFrame();
- XalanStyleFrame styleFrame;
- if (parent == null)
- {
- List globals = getGlobals(ev.m_styleNode.getStylesheetRoot());
- styleFrame = new XalanRootStyleFrame(parent, ev.m_styleNode, varStack, globals);
+ 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();
+ }
+ else if (ev.m_styleNode.getXSLToken() != Constants.ELEMNAME_TEXTLITERALRESULT)
+ {// remove from current templates element stack
+ tel = styleFrame.popElement();
+ }
+ check(styleFrame);
+ if (ev.m_styleNode.getOwnerXSLTemplate() == ev.m_styleNode)
+ {// end of template, so remove from stack
+ debugger.popStyleFrame();
}
else
- styleFrame = new XalanStyleFrame(parent, ev.m_styleNode, varStack);
- debugger.pushStyleFrame(styleFrame);
- return styleFrame;
- }
-
- private List getGlobals(StylesheetRoot root)
- {
- List vars = new ArrayList();
- Vector composedVars = root.getVariablesAndParamsComposed();
- int i = 0;
- for (Iterator iter = composedVars.iterator(); iter.hasNext();)
- {
- ElemVariable variable = (ElemVariable) iter.next();
- int token = variable.getXSLToken();
- if ((token == Constants.ELEMNAME_PARAMVARIABLE || token == Constants.ELEMNAME_VARIABLE) && variable.getIsTopLevel())
+ {// because we don't get selectEnd events, we need to do this check
+ tel = styleFrame.peekElement();
+ // if the parent is a choose, move on to it
+ switch (tel.getXSLToken())
{
- vars.add(new XalanVariable(varStack, Variable.GLOBAL_SCOPE, i, variable));
- ++i;
+ case Constants.ELEMNAME_CHOOSE:
+ styleFrame.popElement();
+ check(styleFrame);
}
}
- return vars;
}
-
- private XalanStyleFrame popStyleFrame(TracerEvent ev)
+
+ private void check(XalanStyleFrame styleFrame)
{
- ElemTemplateElement element = ev.m_styleNode;
- String filename = element.getSystemId();
- int line = element.getLineNumber();
-
- // why the while loop? Because Xalan doesn't report xsl:when or xsl:if
- // as TracerEvents
- // ...so it is a workaround to make sure we get to the right frame
- XalanStyleFrame styleFrame;
- while ((styleFrame = (XalanStyleFrame) debugger.popStyleFrame()) != null)
+ debugger.checkStopped();
+ if (styleFrame!=null)
{
- if (styleFrame.getFilename().equals(filename) && styleFrame.getLine() == line)
- {
- String name = element.getNodeName();
- if (name.equals("param") || name.equals("variable"))
- {
- XalanStyleFrame parent = (XalanStyleFrame) styleFrame.getParent();
- parent.addVariable((ElemVariable) element);
- }
- styleFrame.setEndLine(line);
- return styleFrame;
- }
+ BreakPoint breakpoint = new BreakPoint(styleFrame.getFilename(), styleFrame.getCurrentLine());
+ debugger.checkSuspended(styleFrame, breakpoint);
}
- return null;
}
+
+ public void selected(SelectionEvent ev) throws TransformerException
+ {}
+
+ public void selectEnd(EndSelectionEvent ev) throws TransformerException
+ {}
+
+ public void generated(GenerateEvent ev)
+ {}
+
+ public void extension(ExtensionEvent ee)
+ {}
+
+ public void extensionEnd(ExtensionEvent ee)
+ {}
+
}
diff --git a/bundles/org.eclipse.wst.xsl.xalan/xalan2.5.1.jar b/bundles/org.eclipse.wst.xsl.xalan/xalan2.5.1.jar
new file mode 100644
index 0000000..44d4d09
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsl.xalan/xalan2.5.1.jar
Binary files differ