/**
* Copyright 2011 meltmedia
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xchain.examples.tutorial;
import org.xchain.Locatable;
import org.xchain.annotations.Attribute;
import org.xchain.annotations.AttributeType;
import org.xchain.annotations.Element;
import org.xchain.impl.ChainImpl;
import org.xchain.framework.sax.CommandHandler;
import org.xchain.framework.sax.CommandXmlReader;
import org.xchain.namespaces.sax.PipelineCommand;
import org.apache.commons.jxpath.JXPathContext;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
/**
* @author Christian Trimble
*/
public class TraceUtil
{
public static final String XHTML_NAMESPACE_URI = "http://www.w3.org/1999/xhtml";
public static final String DIV_ELEMENT = "div";
public static final String SPAN_ELEMENT = "span";
private static final AttributesImpl EMPTY_ATTRIBUTES = new AttributesImpl();
private static final AttributesImpl EXECUTE_DIV_ATTRIBUTES = new AttributesImpl();
private static final AttributesImpl CHILDREN_DIV_ATTRIBUTES = new AttributesImpl();
private static final AttributesImpl POST_PROCESS_DIV_ATTRIBUTES = new AttributesImpl();
private static final AttributesImpl LABEL_SPAN_ATTRIBUTES = new AttributesImpl();
private static final AttributesImpl VALUE_SPAN_ATTRIBUTES = new AttributesImpl();
static {
// add the attributes to the execute div.
EXECUTE_DIV_ATTRIBUTES.addAttribute("", "class", "class", "CDATA", "trace-execute");
// add the attributes to the post process div.
POST_PROCESS_DIV_ATTRIBUTES.addAttribute("", "class", "class", "CDATA", "trace-post-process");
// add the attributes to the children div.
CHILDREN_DIV_ATTRIBUTES.addAttribute("", "class", "class", "CDATA", "trace-children");
LABEL_SPAN_ATTRIBUTES.addAttribute("", "class", "class", "CDATA", "trace-label");
VALUE_SPAN_ATTRIBUTES.addAttribute("", "class", "class", "CDATA", "trace-value");
}
public static String xhtmlPrefix(JXPathContext context)
throws SAXException
{
String prefix = context.getPrefix(XHTML_NAMESPACE_URI);
if( prefix == null ) {
throw new SAXException("The namespace '"+XHTML_NAMESPACE_URI+"' must be bound to a prefix.");
}
return prefix;
}
public static String createQName(String prefix, String localName)
throws SAXException
{
if( prefix == null || "".equals(prefix) ) {
return localName;
}
return prefix+":"+localName;
}
public static void startDiv(ContentHandler handler, String xhtmlPrefix, Attributes attributes)
throws SAXException
{
handler.startElement(XHTML_NAMESPACE_URI, DIV_ELEMENT, createQName(xhtmlPrefix, DIV_ELEMENT), attributes);
}
public static void endDiv(ContentHandler handler, String xhtmlPrefix)
throws SAXException
{
handler.endElement(XHTML_NAMESPACE_URI, DIV_ELEMENT, createQName(xhtmlPrefix, DIV_ELEMENT));
}
public static void startSpan( ContentHandler handler, String xhtmlPrefix, Attributes attributes)
throws SAXException
{
handler.startElement(XHTML_NAMESPACE_URI, SPAN_ELEMENT, createQName(xhtmlPrefix, SPAN_ELEMENT), attributes);
}
public static void endSpan(ContentHandler handler, String xhtmlPrefix)
throws SAXException
{
handler.endElement(XHTML_NAMESPACE_URI, SPAN_ELEMENT, createQName(xhtmlPrefix, SPAN_ELEMENT));
}
public static void span( ContentHandler handler, String xhtmlPrefix, Attributes attributes, String text )
throws SAXException
{
startSpan(handler, xhtmlPrefix, attributes);
characters(handler, text);
endSpan(handler, xhtmlPrefix);
}
private static void characters( ContentHandler handler, String text )
throws SAXException
{
char[] characters = text.toCharArray();
handler.characters(characters, 0, characters.length);
}
public static void startExecuteBlock( ContentHandler handler, String xhtmlPrefix, String name )
throws SAXException
{
startDiv(handler, xhtmlPrefix, EXECUTE_DIV_ATTRIBUTES);
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "phase:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, "start execute");
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "name:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, name);
startDiv(handler, xhtmlPrefix, CHILDREN_DIV_ATTRIBUTES);
}
public static void endExecuteBlock( ContentHandler handler, String xhtmlPrefix, String name, boolean result )
throws SAXException
{
endDiv(handler, xhtmlPrefix);
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "phase:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, "end execute");
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "name:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, name);
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "result:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, ""+result);
endDiv(handler, xhtmlPrefix);
}
public static void endExecuteBlock( ContentHandler handler, String xhtmlPrefix, String name, Exception exception )
throws SAXException
{
endDiv(handler, xhtmlPrefix);
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "phase:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, "end execute");
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "name:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, name);
if( exception != null ) {
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "exception:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, exception.toString());
}
endDiv(handler, xhtmlPrefix);
}
public static void startPostProcessBlock( ContentHandler handler, String xhtmlPrefix, String name, Exception exception )
throws SAXException
{
startDiv(handler, xhtmlPrefix, POST_PROCESS_DIV_ATTRIBUTES);
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "phase:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, "start post process");
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "name:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, name);
startDiv(handler, xhtmlPrefix, CHILDREN_DIV_ATTRIBUTES);
}
public static void endPostProcessBlock( ContentHandler handler, String xhtmlPrefix, String name, boolean result )
throws SAXException
{
endDiv(handler, xhtmlPrefix);
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "phase:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, "end post process");
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "name:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, name);
span(handler, xhtmlPrefix, LABEL_SPAN_ATTRIBUTES, "handled:");
span(handler, xhtmlPrefix, VALUE_SPAN_ATTRIBUTES, ""+result);
endDiv(handler, xhtmlPrefix);
}
}