ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/experimental/server/XMLReader/XMLPacketParser.java
Revision: 1.1
Committed: Fri Nov 17 11:07:32 2000 UTC (23 years, 5 months ago) by pjm2
Branch: MAIN
Log Message:
Added a new class - XMLPacketParser.java

This new class looks after the SAX parsing methods which are used to
create our XMLPacket contents.

The XMLPacketMaker class has also been altered to make use of the
XMLPacketParser class.  The XMLPacketMaker class now accepts a String
argument in its constructor.  It uses the XMLPacketParser to populate the
XMLPacket, for which the XMLPacketMaker provides an accessor.

File Contents

# User Rev Content
1 pjm2 1.1 import java.io.*;
2     import java.util.ArrayList;
3    
4     import org.xml.sax.*;
5    
6     import javax.xml.parsers.SAXParserFactory;
7     import javax.xml.parsers.ParserConfigurationException;
8     import javax.xml.parsers.SAXParser;
9    
10     // Paul Mutton, pjm2@ukc.ac.uk
11    
12     // XMLPacketParser - Creates an XMLPacket object.
13     public class XMLPacketParser extends HandlerBase {
14    
15     // No-args constructor. Generally not used.
16     public XMLPacketParser () {
17     this.packet = new XMLPacket();
18     }
19    
20     // Constructor for accepting a reference to an XMLPacket
21     public XMLPacketParser (XMLPacket packet) {
22     this.packet = packet;
23     }
24    
25     // Accessor to the XMLPacket.
26     public XMLPacket getXMLPacket() {
27     return packet;
28     }
29    
30     private int indentLevel = 0;
31    
32     // For storing the tag heirarchy.
33     private ArrayList tagList = new ArrayList();
34     private XMLPacket packet;
35    
36     //===========================================================
37     // SAX DocumentHandler methods
38     //===========================================================
39    
40     public void startDocument () throws SAXException {
41     // No purpose currently.
42     }
43    
44     public void endDocument () throws SAXException {
45     // No purpose currently.
46     }
47    
48     // Add each tag's attribute to the XMLPacket.
49     // Note that all attributes within an opening tag are
50     // stored as "someroot.sometag.attributes.attribute_name"
51     // E.g. If <packet> is the root node, then:
52     // <packet machine_name="raptor">
53     // is stored as:
54     // "packet.attributes.machine_name"
55     // within the XMLPacket.
56     public void startElement (String name, AttributeList attrs) throws SAXException {
57     indentLevel++;
58     tagList.add(name);
59     if (attrs != null) {
60     for (int i = 0; i < attrs.getLength (); i++) {
61     packet.addParam(getPath()+".attributes."+attrs.getName(i), attrs.getValue(i));
62     }
63     }
64     }
65    
66     // When an XML element is finished with, we must remove
67     // the tag name from the tagList and decrement the indent
68     // level.
69     public void endElement (String name) throws SAXException {
70     tagList.remove(tagList.size()-1);
71     indentLevel--;
72     }
73    
74     // Any text falling within a pair of terminal tags must
75     // be added to the XMLPacket. Trim leading and trailing
76     // spaces and do not bother to add if there is no data
77     // specified within the tags.
78     public void characters (char[] buf, int offset, int len) throws SAXException {
79     String s = new String(buf, offset, len);
80     if (!s.trim().equals("")) {
81     packet.addParam(getPath(), s);
82     }
83     }
84    
85    
86     //===========================================================
87     // Helpers ...
88     //===========================================================
89    
90    
91     // Return the heirarchical string to be used as a key value
92     // in the XMLPacket.
93     private String getPath () {
94     String path = (String)tagList.get(0);
95     if (tagList.size() > 0) {
96     for (int i = 1 ; i < tagList.size() ; i++) {
97     path = path + "." + (String)tagList.get(i);
98     }
99     }
100     return path;
101     }
102    
103     }