// HandlerBase.java: Simple base class for AElfred processors.
// NO WARRANTY! See README, and copyright below.
// $Id: HandlerBase.java,v 2.2 1998/05/02 17:17:10 david Exp $
// package com.microstar.xml;
import com.microstar.xml.XmlHandler;
import com.microstar.xml.XmlParser;
import com.microstar.xml.XmlException;
import java.io.Reader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.*; // Stack, Vector
/**
* Convenience base class for AElfred handlers.
* <p>This base class implements the XmlHandler interface with
* (mostly empty) default handlers. You are not required to use this,
* but if you need to handle only a few events, you might find
* it convenient to extend this class rather than implementing
* the entire interface. This example overrides only the
* <code>charData</code> method, using the defaults for the others:
* <pre>
* import com.microstar.xml.HandlerBase;
*
* public class MyHandler extends HandlerBase {
* public void charData (char ch[], int start, int length)
* {
* System.out.println("Data: " + new String (ch, start, length));
* }
* }
* </pre>
* <p>This class is optional, but if you use it, you must also
* include the <code>XmlException</code> class.
* <p>Do not extend this if you are using SAX; extend
* <code>org.xml.sax.HandlerBase</code> instead.
* @author Copyright (c) 1998 by Microstar Software Ltd.
* @author written by David Megginson <dmeggins@microstar.com>
* @version 1.1
* @see XmlHandler
* @see XmlException
* @see org.xml.sax.HandlerBase
*/
public class FromXMLHandler implements XmlHandler {
//Stack termListStack = new Stack();
//Stack termStack = new Stack();
//TransferKinInfoVector kinTermVector=null;
public Preferences prefs=null;
boolean attributes=false;
FromXML master = null;
Stack masters = new Stack();
Stack data = new Stack();
//Term rootTerm = null;
public FromXMLHandler(FromXML m) {
super();
master = m;
}
public void pushMaster(FromXML d) {
masters.push(master);
master = d;
}
public FromXML popMaster() {
master = (FromXML) masters.pop();
return master;
}
public void processResult(String tag, Object result) { // dispatch to next element above present master
popMaster().fromXMLProcess(tag,result);
}
public void dispatchTo(FromXML newMaster, String tag, Hashtable attributes) { // dispatch to next element above present master
pushMaster(newMaster);
newMaster.fromXMLStart(this, tag, attributes);
}
public void pushData(Object d) {
data.push(d);
}
public Object popData() {
return data.pop();
}
/**
* Handle the start of the document.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#startDocument
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void startDocument ()
throws java.lang.Exception
{
}
/**
* Handle the end of the document.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#endDocument
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void endDocument () throws java.lang.Exception {
}
/**
* Resolve an external entity.
* <p>The default implementation simply returns the supplied
* system identifier.
* @see com.microstar.xml.XmlHandler#resolveEntity
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public Object resolveEntity (String publicId, String systemId)
throws java.lang.Exception
{
return null;
}
/**
* Handle the start of an external entity.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#startExternalEntity
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void startExternalEntity (String systemId)
throws java.lang.Exception
{
}
/**
* Handle the end of an external entity.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#endExternalEntity
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void endExternalEntity (String systemId)
throws java.lang.Exception
{
}
/**
* Handle a document type declaration.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#doctypeDecl
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void doctypeDecl (String name, String publicId, String systemId)
throws java.lang.Exception
{
}
/**
* Handle an attribute assignment.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#attribute
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
private static String attributeLabel = "attributes";
Vector attributeNames = new Vector(1);
Vector attributeValues = new Vector(1);
Hashtable attributeTable = new Hashtable();
public void attribute (String aname, String value, boolean isSpecified)
throws java.lang.Exception
{
attributeNames.addElement(aname);
attributeValues.addElement(value);
attributeTable.put(aname,value);
attributes = true;
}
//TransferKinInfo currentEntry=null;
String currKey=null;
StringVector sv = null;
boolean inStringVector = false;
/**
* Handle the start of an element.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#startElement
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void startElement (String elname)
throws java.lang.Exception
{
if (contentData != null && !contentData.equals("")) attributeTable.put("strayText",contentData.trim());
contentData = "";
master.fromXMLStart(this,elname,attributeTable);
attributeNames = new Vector(1);
attributeValues = new Vector(1);
attributeTable = new Hashtable();
attributes = false;
}
/**
* Handle the end of an element.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#endElement
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void endElement (String elname)
throws java.lang.Exception
{
contentData = contentData.trim();
master.fromXMLEnd(this,elname,contentData);
contentData = "";
}
String contentData = "";
/**
* Handle character data.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#charData
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void charData (char ch[], int start, int length)
throws java.lang.Exception
{
String tdata = new String(ch,start,length);
contentData += tdata;
}
/**
* Handle ignorable whitespace.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#ignorableWhitespace
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void ignorableWhitespace (char ch[], int start, int length)
throws java.lang.Exception
{
}
/**
* Handle a processing instruction.
* <p>The default implementation does nothing.
* @see com.microstar.xml.XmlHandler#processingInstruction
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void processingInstruction (String target, String data)
throws java.lang.Exception
{
}
/**
* Throw an exception for a fatal error.
* <p>The default implementation throws <code>XmlException</code>.
* @see com.microstar.xml.XmlHandler#error
* @exception com.microstar.xml.XmlException A specific parsing error.
* @exception java.lang.Exception Derived methods may throw exceptions.
*/
public void error (String message, String systemId, int line, int column)
throws XmlException, java.lang.Exception
{
throw new XmlException(message, systemId, line, column);
}
public void getRootTerm() {
//return rootTerm;
}
/**
* Start a parse in application mode.
* <p>Output will go to STDOUT.
* @see #displayText
* @see com.microstar.xml.XmlParser#run
*/
void doParse (XFile xr)
throws java.lang.Exception
{
//String docURL = makeAbsoluteURL(url);
// create the parser
// System.out.println("File: "+xr.aFile.toString());
XmlParser parser = new XmlParser();
parser.setHandler(this);
parser.parse(null, null, xr.diStream);
}
void doParse (String xs)
throws java.lang.Exception
{
//String docURL = makeAbsoluteURL(url);
// create the parser
// System.out.println("File: "+xr.aFile.toString());
InputStream xi=null;
try {
if (xs.indexOf("://") != -1) { // try URL first
xi = new URL(xs).openStream();
} else {
String fsep = System.getProperty("file.separator");
xi = new URL("file://"+System.getProperty("user.dir")+fsep+xs).openStream(); // in directory
}
} catch (Throwable e) {xi = null;}
if (xi == null) try {
xi = getClass().getResourceAsStream(xs); // e.g. get from jar file
} catch (Throwable e) {xi = null;}
if (xi != null) {
InputStreamReader xr = new InputStreamReader(xi);
XmlParser parser = new XmlParser();
parser.setHandler(this);
parser.parse(null, null, xr);
}
}
}