/*
* $Id: SimpleHandler.java,v 1.8 2002/09/16 08:05:03 jkl Exp $
*
* Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
*
* Use is subject to license terms, as defined in
* Anvil Sofware License, Version 1.1. See LICENSE
* file, or http://njet.org/license-1.1.txt
*/
package anvil.core.xml;
import anvil.Location;
import anvil.core.Any;
import anvil.core.AnyTuple;
import anvil.core.Array;
import anvil.core.runtime.AnyFunction;
import anvil.doc.Doc;
import anvil.script.Context;
import anvil.script.Type;
import anvil.script.Scope;
import anvil.script.Function;
import java.net.URL;
import java.io.IOException;
import anvil.parser.DocumentHandler;
import anvil.parser.Tag;
import anvil.parser.Locator;
/**
* class SAXHandler
*
* @author: Jani Lehtim�ki
*/
public class SimpleHandler implements DocumentHandler, Function
{
private Context _context;
private Any _userdata;
private Locator _locator = null;
private Any _setDocumentLocator = null;
private Any _startDocument = null;
private Any _endDocument = null;
private Any _handleCharacters = null;
private Any _handleComment = null;
private Any _handleTag = null;
private Any _handleProcessingInstruction = null;
private Any[] _p5 = new Any[5];
public SimpleHandler(Context context, Any callbacks, Any userdata)
{
_context = context;
_userdata = (userdata != null) ? userdata : Any.NULL;
_startDocument = getFunction(context, callbacks, "startDocument");
_endDocument = getFunction(context, callbacks, "endDocument");
_handleCharacters = getFunction(context, callbacks, "handleCharacters");
_handleComment = getFunction(context, callbacks, "handleComment");
_handleTag = getFunction(context, callbacks, "handleTag");
_handleProcessingInstruction = getFunction(context, callbacks, "handleProcessingInstruction");
_setDocumentLocator = getFunction(context, callbacks, "setDocumentLocator");
}
private Any getFunction(Context context, Any struct, String name)
{
Any value = struct.checkAttribute(context, name);
if (!value.isNull() || !value.isUndefined()) {
return value;
}
return null;
}
public void setDocumentLocator(Locator locator)
{
_locator = locator;
if (_setDocumentLocator != null) {
_setDocumentLocator.execute(_context, new AnyFunction(this), _userdata);
}
}
public void startDocument()
{
if (_startDocument != null) {
_startDocument.execute(_context, _userdata);
}
}
public void endDocument()
{
if (_endDocument != null) {
_endDocument.execute(_context, _userdata);
}
}
public void handleTag(Tag tag)
{
if (_handleTag != null) {
_p5[0] = Any.create(tag.getPrefixedName());
int n = tag.getLength();
Array list = new Array(n);
for(int i=0; i<n; i++) {
String name = tag.getName(i);
String value = tag.getValue(i);
list.append(Any.create(name), Any.create(value));
}
_p5[1] = list;
_p5[2] = tag.hasEndSlash() ? Any.TRUE : Any.FALSE;
_p5[3] = Any.create(tag.toString());
_p5[4] = _userdata;
_handleTag.execute(_context, _p5);
}
}
public void handleCharacters(String cdata)
{
if (_handleCharacters != null) {
_handleCharacters.execute(_context, Any.create(cdata), _userdata);
}
}
public void handleComment(String cdata)
{
if (_handleComment != null) {
_handleComment.execute(_context, Any.create(cdata), _userdata);
}
}
public void handleProcessingInstruction(String data)
{
if (_handleProcessingInstruction != null) {
_handleProcessingInstruction.execute(_context, Any.create(data), _userdata);
}
}
public String getName()
{
return "locator";
}
public String getQualifiedName()
{
return getName();
}
public int getType()
{
return FUNCTION;
}
public Scope getParent()
{
return null;
}
public Doc getDocument()
{
return null;
}
public Any execute(Context context, Any self, Any[] parameters)
{
return execute(context, parameters);
}
public Any execute(Context context, Any[] parameters)
{
Location loc = _locator.getLocation();
URL url = loc.getURL();
Any[] list = new Any[3];
list[0] = Any.create(url != null ? new anvil.core.net.AnyURL(loc.getURL()) : Any.NULL);
list[1] = Any.create(loc.getLine());
list[2] = Any.create(loc.getColumn());
return new AnyTuple(list);
}
public Any execute(Context context, Any self)
{
return execute(context, (Any[]) null);
}
public Any execute(Context context, Any self, Any param1)
{
return execute(context, (Any[]) null);
}
public Any execute(Context context, Any self, Any param1, Any param2)
{
return execute(context, (Any[]) null);
}
public Any execute(Context context, Any self, Any param1, Any param2, Any param3)
{
return execute(context, (Any[]) null);
}
public Any execute(Context context, Any self, Any param1, Any param2, Any param3, Any param4)
{
return execute(context, (Any[]) null);
}
public int getTypeRef(anvil.codec.ConstantPool pool)
{
return 0;
}
}