Mercurial > hg > digilib-old
comparison servlet/src/digilib/io/XMLListLoader.java @ 531:9cedd170b581 digilibPDF
* PDF generation works now even with subdirectories
* genericsification and clean up
| author | robcast |
|---|---|
| date | Fri, 05 Feb 2010 20:58:38 +0100 |
| parents | 0ff3ede32060 |
| children | e758a49258e8 |
comparison
equal
deleted
inserted
replaced
| 530:bd6569a95a3c | 531:9cedd170b581 |
|---|---|
| 19 */ | 19 */ |
| 20 | 20 |
| 21 package digilib.io; | 21 package digilib.io; |
| 22 | 22 |
| 23 // JAXP packages | 23 // JAXP packages |
| 24 import javax.xml.parsers.*; | 24 import java.io.IOException; |
| 25 import org.xml.sax.*; | 25 import java.util.HashMap; |
| 26 import org.xml.sax.helpers.*; | 26 import java.util.LinkedList; |
| 27 import java.util.Map; | |
| 27 | 28 |
| 28 import java.util.*; | 29 import javax.xml.parsers.ParserConfigurationException; |
| 29 import java.io.*; | 30 import javax.xml.parsers.SAXParser; |
| 31 import javax.xml.parsers.SAXParserFactory; | |
| 30 | 32 |
| 33 import org.apache.log4j.Logger; | |
| 34 import org.xml.sax.Attributes; | |
| 35 import org.xml.sax.SAXException; | |
| 36 import org.xml.sax.SAXParseException; | |
| 37 import org.xml.sax.helpers.DefaultHandler; | |
| 38 | |
| 39 /** Loads a simple XML list into a HashMap. | |
| 40 * | |
| 41 * The XML file has an outer <code>list_tag</code>. Every entry is an | |
| 42 * <code>entry_tag</code> with two attributes: the <code>key_att</code> | |
| 43 * key and the <code>value_att</code> value. | |
| 44 * | |
| 45 * The file is read by the <code>loadURL</code> method, that returns a | |
| 46 * HashMap with the key-value pairs. | |
| 47 * | |
| 48 * @author casties | |
| 49 */ | |
| 31 public class XMLListLoader { | 50 public class XMLListLoader { |
| 32 | 51 |
| 33 private String listTag = "list"; | 52 private Logger logger = Logger.getLogger(this.getClass()); |
| 34 private String entryTag = "entry"; | 53 private String listTag = "list"; |
| 35 private String keyAtt = "key"; | 54 private String entryTag = "entry"; |
| 36 private String valueAtt = "value"; | 55 private String keyAtt = "key"; |
| 56 private String valueAtt = "value"; | |
| 37 | 57 |
| 38 public XMLListLoader() { | 58 public XMLListLoader() { |
| 39 } | 59 } |
| 40 | 60 |
| 41 public XMLListLoader(String list_tag, String entry_tag, String key_att, String value_att) { | 61 public XMLListLoader( |
| 42 //System.out.println("xmlListLoader("+list_tag+","+entry_tag+","+key_att+","+value_att+")"); | 62 String list_tag, |
| 43 listTag = list_tag; | 63 String entry_tag, |
| 44 entryTag = entry_tag; | 64 String key_att, |
| 45 keyAtt = key_att; | 65 String value_att) { |
| 46 valueAtt = value_att; | 66 logger.debug("xmlListLoader("+list_tag+","+entry_tag+","+key_att+","+value_att+")"); |
| 47 } | 67 listTag = list_tag; |
| 68 entryTag = entry_tag; | |
| 69 keyAtt = key_att; | |
| 70 valueAtt = value_att; | |
| 71 } | |
| 48 | 72 |
| 49 /** | 73 /** |
| 50 * inner class XMLListParser to be called by the parser | 74 * inner class XMLListParser to be called by the parser |
| 51 */ | 75 */ |
| 52 private class XMLListParser extends DefaultHandler { | 76 private class XMLListParser extends DefaultHandler { |
| 53 | 77 |
| 54 private Hashtable listData; | 78 private Map<String, String> listData; |
| 55 private Stack nameSpace; | 79 private LinkedList<String> tagSpace; |
| 56 | 80 |
| 57 public Hashtable getData() { | 81 public Map<String, String> getData() { |
| 58 return listData; | 82 return listData; |
| 59 } | 83 } |
| 60 | 84 |
| 61 // Parser calls this once at the beginning of a document | 85 // Parser calls this once at the beginning of a document |
| 62 public void startDocument() throws SAXException { | 86 public void startDocument() throws SAXException { |
| 63 listData = new Hashtable(); | 87 listData = new HashMap<String, String>(); |
| 64 nameSpace = new Stack(); | 88 tagSpace = new LinkedList<String>(); |
| 65 } | 89 } |
| 66 | 90 |
| 67 // Parser calls this for each element in a document | 91 // Parser calls this for each element in a document |
| 68 public void startElement(String namespaceURI, String localName, | 92 public void startElement( |
| 69 String qName, Attributes atts) | 93 String namespaceURI, |
| 70 throws SAXException | 94 String localName, |
| 71 { | 95 String qName, |
| 72 //System.out.println("<"+qName); | 96 Attributes atts) |
| 73 // open a new namespace | 97 throws SAXException { |
| 74 nameSpace.push(qName); | 98 //System.out.println("<"+qName); |
| 99 // open a new namespace | |
| 100 tagSpace.addLast(qName); | |
| 75 | 101 |
| 76 // ist it an entry tag? | 102 // ist it an entry tag? |
| 77 if (qName.equals(entryTag)) { | 103 if (qName.equals(entryTag)) { |
| 78 // is it inside a list tag? | 104 // is it inside a list tag? |
| 79 if ((listTag.length() > 0)&&(nameSpace.search(listTag) < 0)) { | 105 if ((listTag.length() > 0) && (!tagSpace.contains(listTag))) { |
| 80 System.out.println("BOO: Entry "+entryTag+" not inside list "+listTag); | 106 logger.error("BOO: Entry " |
| 81 throw new SAXParseException("Entry "+entryTag+" not inside list "+listTag, null); | 107 + entryTag |
| 82 } | 108 + " not inside list " |
| 83 // get the attributes | 109 + listTag); |
| 84 String key = atts.getValue(keyAtt); | 110 throw new SAXParseException( |
| 85 String val = atts.getValue(valueAtt); | 111 "Entry " + entryTag + " not inside list " + listTag, |
| 86 if ((key == null)||(val == null)) { | 112 null); |
| 87 System.out.println("BOO: Entry "+entryTag+" does not have Attributes "+keyAtt+", "+valueAtt); | 113 } |
| 88 throw new SAXParseException("Entry "+entryTag+" does not have Attributes "+keyAtt+", "+valueAtt, null); | 114 // get the attributes |
| 89 } | 115 String key = atts.getValue(keyAtt); |
| 90 // add the values | 116 String val = atts.getValue(valueAtt); |
| 91 //System.out.println("DATA: "+key+" = "+val); | 117 if ((key == null) || (val == null)) { |
| 92 listData.put(key, val); | 118 logger.error("BOO: Entry " |
| 93 } | 119 + entryTag |
| 94 } | 120 + " does not have Attributes " |
| 121 + keyAtt | |
| 122 + ", " | |
| 123 + valueAtt); | |
| 124 throw new SAXParseException( | |
| 125 "Entry " | |
| 126 + entryTag | |
| 127 + " does not have Attributes " | |
| 128 + keyAtt | |
| 129 + ", " | |
| 130 + valueAtt, | |
| 131 null); | |
| 132 } | |
| 133 // add the values | |
| 134 //System.out.println("DATA: "+key+" = "+val); | |
| 135 listData.put(key, val); | |
| 136 } | |
| 137 } | |
| 95 | 138 |
| 96 public void endElement(String namespaceURI, String localName, | 139 public void endElement( |
| 97 String qName) | 140 String namespaceURI, |
| 98 throws SAXException | 141 String localName, |
| 99 { | 142 String qName) |
| 100 // exit the namespace | 143 throws SAXException { |
| 101 nameSpace.pop(); | 144 // exit the namespace |
| 102 } | 145 tagSpace.removeLast(); |
| 146 } | |
| 103 | 147 |
| 104 } | 148 } |
| 105 | 149 |
| 150 /** | |
| 151 * load and parse a file (as URL) | |
| 152 * returns HashMap with list data | |
| 153 */ | |
| 154 public Map<String, String> loadURL(String path) throws SAXException, IOException { | |
| 155 //System.out.println("loadurl ("+path+")"); | |
| 156 // Create a JAXP SAXParserFactory and configure it | |
| 157 SAXParserFactory spf = SAXParserFactory.newInstance(); | |
| 158 spf.setNamespaceAware(true); | |
| 106 | 159 |
| 107 /** | 160 SAXParser parser = null; |
| 108 * load and parse a file (as URL) | 161 try { |
| 109 * returns Hashtable with list data | 162 // Create a JAXP SAXParser |
| 110 */ | 163 parser = spf.newSAXParser(); |
| 111 public Hashtable loadURL(String path) throws SAXException, IOException { | |
| 112 //System.out.println("loadurl ("+path+")"); | |
| 113 // Create a JAXP SAXParserFactory and configure it | |
| 114 SAXParserFactory spf = SAXParserFactory.newInstance(); | |
| 115 //spf.setNamespaceAware(true); | |
| 116 | 164 |
| 117 XMLReader xmlReader = null; | 165 } catch (ParserConfigurationException e) { |
| 118 try { | 166 throw new SAXException(e); |
| 119 // Create a JAXP SAXParser | 167 } |
| 120 SAXParser saxParser = spf.newSAXParser(); | |
| 121 | 168 |
| 122 // Get the encapsulated SAX XMLReader | 169 // create a list parser (keeps the data!) |
| 123 xmlReader = saxParser.getXMLReader(); | 170 XMLListParser listParser = new XMLListParser(); |
| 124 } | |
| 125 catch (ParserConfigurationException e) { | |
| 126 throw new SAXException(e); | |
| 127 } | |
| 128 | 171 |
| 129 // create a list parser (keeps the data!) | 172 // Tell the SAXParser to parse the XML document |
| 130 XMLListParser listParser = new XMLListParser(); | 173 parser.parse(path, listParser); |
| 131 | 174 |
| 132 // Set the ContentHandler of the XMLReader | 175 return listParser.getData(); |
| 133 xmlReader.setContentHandler(listParser); | 176 } |
| 134 | |
| 135 // Tell the XMLReader to parse the XML document | |
| 136 xmlReader.parse(path); | |
| 137 | |
| 138 return listParser.getData(); | |
| 139 } | |
| 140 | 177 |
| 141 } | 178 } |
