diff servlet/src/digilib/io/XMLListLoader.java @ 1:0ff3ede32060

Initial revision
author robcast
date Thu, 17 Jan 2002 15:25:46 +0100
parents
children 2ea78a56ecf8 9cedd170b581
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servlet/src/digilib/io/XMLListLoader.java	Thu Jan 17 15:25:46 2002 +0100
@@ -0,0 +1,141 @@
+/* XMLListLoader -- Load an XML list into a Hashtable
+
+  Digital Image Library servlet components
+
+  Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de)
+
+  This program is free software; you can redistribute  it and/or modify it
+  under  the terms of  the GNU General  Public License as published by the
+  Free Software Foundation;  either version 2 of the  License, or (at your
+  option) any later version.
+   
+  Please read license.txt for the full details. A copy of the GPL
+  may be found at http://www.gnu.org/copyleft/lgpl.html
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*/
+
+package digilib.io;
+
+// JAXP packages
+import javax.xml.parsers.*;
+import org.xml.sax.*;
+import org.xml.sax.helpers.*;
+
+import java.util.*;
+import java.io.*;
+
+public class XMLListLoader {
+
+    private String listTag = "list";
+    private String entryTag = "entry";
+    private String keyAtt = "key";
+    private String valueAtt = "value";
+
+    public XMLListLoader() {
+    }
+
+    public XMLListLoader(String list_tag, String entry_tag, String key_att, String value_att) {
+      //System.out.println("xmlListLoader("+list_tag+","+entry_tag+","+key_att+","+value_att+")");
+      listTag = list_tag;
+      entryTag = entry_tag;
+      keyAtt = key_att;
+      valueAtt = value_att;
+    }
+
+    /**
+     *  inner class XMLListParser to be called by the parser
+     */
+    private class XMLListParser extends DefaultHandler {
+
+      private Hashtable listData;
+      private Stack nameSpace;
+
+      public Hashtable getData() {
+        return listData;
+      }
+
+      // Parser calls this once at the beginning of a document
+      public void startDocument() throws SAXException {
+          listData = new Hashtable();
+          nameSpace = new Stack();
+      }
+
+      // Parser calls this for each element in a document
+      public void startElement(String namespaceURI, String localName,
+                               String qName, Attributes atts)
+  	throws SAXException
+      {
+        //System.out.println("<"+qName);
+        // open a new namespace
+        nameSpace.push(qName);
+
+        // ist it an entry tag?
+        if (qName.equals(entryTag)) {
+          // is it inside a list tag?
+          if ((listTag.length() > 0)&&(nameSpace.search(listTag) < 0)) {
+            System.out.println("BOO: Entry "+entryTag+" not inside list "+listTag);
+            throw new SAXParseException("Entry "+entryTag+" not inside list "+listTag, null);
+          }
+          // get the attributes
+          String key = atts.getValue(keyAtt);
+          String val = atts.getValue(valueAtt);
+          if ((key == null)||(val == null)) {
+            System.out.println("BOO: Entry "+entryTag+" does not have Attributes "+keyAtt+", "+valueAtt);
+            throw new SAXParseException("Entry "+entryTag+" does not have Attributes "+keyAtt+", "+valueAtt, null);
+          }
+          // add the values
+          //System.out.println("DATA: "+key+" = "+val);
+          listData.put(key, val);
+        }
+    }
+
+    public void endElement(String namespaceURI, String localName,
+                             String qName)
+	throws SAXException
+    {
+      // exit the namespace
+      nameSpace.pop();
+    }
+
+    }
+
+
+    /**
+     *  load and parse a file (as URL)
+     *    returns Hashtable with list data
+     */
+    public Hashtable loadURL(String path) throws SAXException, IOException {
+        //System.out.println("loadurl ("+path+")");
+        // Create a JAXP SAXParserFactory and configure it
+        SAXParserFactory spf = SAXParserFactory.newInstance();
+        //spf.setNamespaceAware(true);
+
+        XMLReader xmlReader = null;
+        try {
+          // Create a JAXP SAXParser
+          SAXParser saxParser = spf.newSAXParser();
+
+          // Get the encapsulated SAX XMLReader
+          xmlReader = saxParser.getXMLReader();
+        }
+        catch (ParserConfigurationException e) {
+          throw new SAXException(e);
+        }
+
+        // create a list parser (keeps the data!)
+        XMLListParser listParser = new XMLListParser();
+
+        // Set the ContentHandler of the XMLReader
+        xmlReader.setContentHandler(listParser);
+
+        // Tell the XMLReader to parse the XML document
+        xmlReader.parse(path);
+
+        return listParser.getData();
+    }
+
+}