org.eclipse.wst.xsl.xalan.debugger.XalanVariable.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.wst.xsl.xalan.debugger.XalanVariable.java

Source

/*******************************************************************************
 * 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
 *     David Carver (STAR) - bug 214235 - Allows nodes to be expanded.
 *******************************************************************************/
package org.eclipse.wst.xsl.xalan.debugger;

import javax.xml.transform.TransformerException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.xalan.templates.ElemVariable;
import org.apache.xpath.VariableStack;
import org.apache.xpath.objects.XNodeSet;
import org.apache.xpath.objects.XObject;
import org.eclipse.wst.xsl.jaxp.debug.debugger.Variable;
import org.w3c.dom.Attr;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.ProcessingInstruction;

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;
    private XObject xobject;

    public XalanVariable(XalanStyleFrame xalanStyleFrame, VariableStack varStack, String scope, int slotNumber,
            ElemVariable elemVariable) {
        super(getName(elemVariable, scope, xalanStyleFrame), scope, slotNumber + varStack.getStackFrame());
        this.elemVariable = elemVariable;
        this.varStack = varStack;
        // get the stack frame at this current point in time
        this.stackFrame = varStack.getStackFrame();
        try {
            xobject = getXObject();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private static String getName(ElemVariable elemVariable, String scope, XalanStyleFrame xalanStyleFrame) {
        String name = elemVariable.getName().getLocalName();
        String systemId = elemVariable.getStylesheet().getSystemId();
        if (GLOBAL_SCOPE.equals(scope) && systemId != null) {
            int index;
            if ((index = systemId.lastIndexOf('/')) > 0)
                name += " (" + systemId.substring(index + 1) + ")";
            else
                name += " (" + systemId + ")";
        }
        // else if (LOCAL_SCOPE.equals(scope))
        // {
        // name += " (" + xalanStyleFrame.getName() + ")";
        // }
        return name;
    }

    public String getType() {
        String value = UNKNOWN;
        // XObject xobject = getXObject();
        if (xobject != null) {
            int xalanType = xobject.getType();
            switch (xalanType) {
            case XObject.CLASS_UNRESOLVEDVARIABLE:
                value = UNRESOLVED;
                break;
            case XObject.CLASS_NODESET:
                value = NODESET;
                break;
            case XObject.CLASS_BOOLEAN:
                value = BOOLEAN;
                break;
            case XObject.CLASS_NUMBER:
                value = NUMBER;
                break;
            case XObject.CLASS_UNKNOWN:
                value = UNKNOWN;
                break;
            case XObject.CLASS_STRING:
            default:
                value = STRING;
                break;
            }
        }
        // catch (TransformerException e)
        // {
        // e.printStackTrace();
        // }
        return value;
    }

    public String getValue() {
        String value = "???";
        try {
            xobject = getXObject();
            if (xobject != null) {
                int xalanType = xobject.getType();
                switch (xalanType) {
                case XObject.CLASS_UNRESOLVEDVARIABLE:
                    value = "";
                    break;
                case XObject.CLASS_NODESET:
                    XNodeSet xns = (XNodeSet) xobject;
                    if (xns.nodelist().getLength() > 0) {
                        value = convertNode(xns);
                    } else
                        value = "<EMPTY NODESET>";
                    break;
                case XObject.CLASS_BOOLEAN:
                case XObject.CLASS_NUMBER:
                case XObject.CLASS_STRING:
                case XObject.CLASS_UNKNOWN:
                default:
                    value = xobject.toString();
                    break;
                }
            }
        } catch (TransformerException e) {
            e.printStackTrace();
        }
        // value = getScope()+"."+getSlotNumber()+")"+getName();
        // log.debug(getScope()+"."+getSlotNumber()+")"+getName() + "=" +
        // value);
        return value;
    }

    private String convertNode(XNodeSet xns) throws TransformerException {
        NodeList nodeList = xns.nodelist();
        String value = processNodeList(nodeList);
        return value;
    }

    private String processNodeList(NodeList nodeList) {
        String value = "";
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            if (node != null) {
                int nodeType = node.getNodeType();
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    value = createElement(value, node);
                }
                if (nodeType == Node.COMMENT_NODE) {
                    value = value + "<!-- " + node.getNodeValue() + " -->";
                }
                if (nodeType == Node.PROCESSING_INSTRUCTION_NODE) {
                    ProcessingInstruction pi = (ProcessingInstruction) node;
                    value = value + "<?" + pi.getData() + " ?>";
                }
            }
        }
        return value;
    }

    private String createElement(String value, Node node) {
        value = value + "<";
        //      if (node.getPrefix() != null && node.getPrefix().length() > 0) {
        //         value = value + node.getPrefix() + ":";
        //      }
        if (node.getNodeName() != null) {
            value = value + node.getNodeName();
            if (node.hasAttributes()) {
                NamedNodeMap attr = node.getAttributes();
                value = value + buildAttributes(attr);
            }
            value = value + ">";
            if (node.getNodeValue() != null) {
                value = value + node.getNodeValue();
            }
        }
        if (node.hasChildNodes()) {
            value = value + processNodeList(node.getChildNodes());
        }
        value = value + "</" + node.getNodeName() + ">";
        return value;
    }

    private String buildAttributes(NamedNodeMap attributes) {
        String value = " ";
        for (int a = 0; a < attributes.getLength(); a++) {
            Attr attribute = (Attr) attributes.item(a);
            //         if (attribute.getPrefix() != null) {
            //            value = value + attribute.getPrefix() + ":";
            //         }
            value = value + attribute.getName() + "=\"" + attribute.getValue() + "\" ";
        }
        value = value + " ";
        return value;
    }

    private XObject getXObject() throws TransformerException {
        XObject xvalue;
        if (elemVariable.getIsTopLevel())
            xvalue = varStack.elementAt(slotNumber);
        else
            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;
    }
}