Mercurial > hg > digilib-old
comparison servlet/src/digilib/io/XMLMetaLoader.java @ 233:e40d8b2e3978
Servlet version 1.19b1 -- with context metadata
- reads and caches context tags from index meta file
- for use in dlContext-xml.jsp
author | robcast |
---|---|
date | Sat, 17 Jul 2004 19:25:26 +0200 |
parents | f921735dc578 |
children | aaf6eace011d |
comparison
equal
deleted
inserted
replaced
232:69b616b50431 | 233:e40d8b2e3978 |
---|---|
39 private String outerTag = "resource"; | 39 private String outerTag = "resource"; |
40 private String metaTag = "meta"; | 40 private String metaTag = "meta"; |
41 private String fileTag = "file"; | 41 private String fileTag = "file"; |
42 private String fileNameTag = "name"; | 42 private String fileNameTag = "name"; |
43 private String filePathTag = "path"; | 43 private String filePathTag = "path"; |
44 private String infoTag = "img"; | 44 private String imgTag = "img"; |
45 private String collectTag = "context"; | |
45 | 46 |
46 public XMLMetaLoader() { | 47 public XMLMetaLoader() { |
47 } | 48 } |
48 | 49 |
49 /** | 50 /** |
53 | 54 |
54 private LinkedList tags; | 55 private LinkedList tags; |
55 private HashMap files; | 56 private HashMap files; |
56 private HashMap meta; | 57 private HashMap meta; |
57 private StringBuffer content; | 58 private StringBuffer content; |
59 private boolean collecting; | |
60 private StringBuffer collectedContent; | |
58 private String fileName; | 61 private String fileName; |
59 private String filePath; | 62 private String filePath; |
60 | 63 |
61 /** | 64 /** |
62 * extracts the elements name from either localName ln or qName qn. | 65 * extracts the elements name from either localName ln or qName qn. |
73 } | 76 } |
74 // else it's qName (or nothing) | 77 // else it's qName (or nothing) |
75 return qn; | 78 return qn; |
76 } | 79 } |
77 | 80 |
81 /** | |
82 * returns all attributes as a String | |
83 * | |
84 * @param attrs | |
85 * @return | |
86 */ | |
87 private String getAttrString(Attributes attrs) { | |
88 StringBuffer s = new StringBuffer(); | |
89 for (int i = 0; i < attrs.getLength(); i++) { | |
90 String key = getName(attrs.getLocalName(i), attrs.getQName(i)); | |
91 s.append(" "+key+"=\""+attrs.getValue(i)); | |
92 } | |
93 return s.toString(); | |
94 } | |
95 | |
96 | |
78 // Parser calls this once at the beginning of a document | 97 // Parser calls this once at the beginning of a document |
79 public void startDocument() throws SAXException { | 98 public void startDocument() throws SAXException { |
80 tags = new LinkedList(); | 99 tags = new LinkedList(); |
81 files = new HashMap(); | 100 files = new HashMap(); |
101 collecting = false; | |
102 collectedContent = null; | |
82 } | 103 } |
83 | 104 |
84 // Parser calls this for each element in a document | 105 // Parser calls this for each element in a document |
85 public void startElement( | 106 public void startElement( |
86 String namespaceURI, | 107 String namespaceURI, |
96 content = new StringBuffer(); | 117 content = new StringBuffer(); |
97 | 118 |
98 if (name.equals(metaTag)) { | 119 if (name.equals(metaTag)) { |
99 // new meta tag | 120 // new meta tag |
100 meta = new HashMap(); | 121 meta = new HashMap(); |
122 collectedContent = new StringBuffer(); | |
101 } else if (name.equals(fileTag)) { | 123 } else if (name.equals(fileTag)) { |
102 // new file tag | 124 // new file tag |
103 fileName = null; | 125 fileName = null; |
104 filePath = null; | 126 filePath = null; |
105 meta = new HashMap(); | 127 meta = new HashMap(); |
128 collectedContent = new StringBuffer(); | |
129 } else if (name.equals(collectTag)) { | |
130 // start collecting | |
131 collecting = true; | |
132 if (collectedContent == null) { | |
133 collectedContent = new StringBuffer(); | |
134 } | |
135 } | |
136 | |
137 // record mode | |
138 if (collecting) { | |
139 collectedContent.append("<"+name); | |
140 collectedContent.append(getAttrString(atts)); | |
141 collectedContent.append(">"); | |
106 } | 142 } |
107 } | 143 } |
108 | 144 |
109 // parser calls this for all tag content (possibly more than once) | 145 // parser calls this for all tag content (possibly more than once) |
110 public void characters(char[] ch, int start, int length) | 146 public void characters(char[] ch, int start, int length) |
111 throws SAXException { | 147 throws SAXException { |
112 // append data to current string buffer | 148 // append data to current string buffer |
149 if (content == null) { | |
150 content = new StringBuffer(); | |
151 } | |
113 content.append(ch, start, length); | 152 content.append(ch, start, length); |
114 } | 153 } |
115 | 154 |
116 // parser calls this at the end of each element | 155 // parser calls this at the end of each element |
117 public void endElement( | 156 public void endElement( |
121 throws SAXException { | 160 throws SAXException { |
122 | 161 |
123 String name = getName(localName, qName); | 162 String name = getName(localName, qName); |
124 // exit the tag | 163 // exit the tag |
125 tags.removeLast(); | 164 tags.removeLast(); |
165 String lastTag = (tags.isEmpty()) ? "" : (String) tags.getLast(); | |
126 | 166 |
127 // was it a file/name tag? | 167 // was it a file/name tag? |
128 if (name.equals(fileNameTag) && tags.contains(fileTag)) { | 168 if (name.equals(fileNameTag) && lastTag.equals(fileTag)) { |
129 // save name as filename | 169 // save name as filename |
130 if ((content != null) && (content.length() > 0)) { | 170 if ((content != null) && (content.length() > 0)) { |
131 fileName = content.toString().trim(); | 171 fileName = content.toString().trim(); |
132 } | 172 } |
173 content = null; | |
133 return; | 174 return; |
134 } | 175 } |
135 | 176 |
136 // was it a file/path tag? | 177 // was it a file/path tag? |
137 if (name.equals(filePathTag) && tags.contains(fileTag)) { | 178 if (name.equals(filePathTag) && lastTag.equals(fileTag)) { |
138 // save path as filepath | 179 // save path as filepath |
139 if ((content != null) && (content.length() > 0)) { | 180 if ((content != null) && (content.length() > 0)) { |
140 filePath = content.toString().trim(); | 181 filePath = content.toString().trim(); |
141 } | 182 } |
183 content = null; | |
142 return; | 184 return; |
143 } | 185 } |
144 | 186 |
145 // was it a file tag? | 187 // was it a file tag? |
146 if (name.equals(fileTag)) { | 188 if (name.equals(fileTag)) { |
155 } else { | 197 } else { |
156 fn = fileName; | 198 fn = fileName; |
157 } | 199 } |
158 } else { | 200 } else { |
159 // no file name, no file | 201 // no file name, no file |
202 content = null; | |
160 return; | 203 return; |
161 } | 204 } |
162 // save meta in file list | 205 // save meta in file list |
163 files.put(fn, meta); | 206 files.put(fn, meta); |
164 } | 207 } |
208 content = null; | |
165 return; | 209 return; |
166 } | 210 } |
167 | 211 |
168 // was it a meta tag outside a file tag? | 212 // was it a meta tag outside a file tag? |
169 if (name.equals(metaTag) && !tags.contains(fileTag)) { | 213 if (name.equals(metaTag) && !tags.contains(fileTag)) { |
170 // save meta as dir meta | 214 // save meta as dir meta |
171 if ((meta != null) && (meta.size() > 0)) { | 215 if ((meta != null) && (meta.size() > 0)) { |
172 files.put("", meta); | 216 files.put("", meta); |
173 } | 217 } |
174 return; | 218 content = null; |
175 } | 219 return; |
176 | 220 } |
177 // is this inside an info (=img) tag? | 221 |
178 if (tags.contains(infoTag)) { | 222 // is this inside an digilib info (=img) tag? |
223 if (lastTag.equals(imgTag)) { | |
179 // then add whatever this is | 224 // then add whatever this is |
180 if ((content != null) && (content.length() > 0)) { | 225 if ((content != null) && (content.length() > 0)) { |
181 meta.put(name, content.toString().trim()); | 226 meta.put(name, content.toString().trim()); |
182 } | 227 } |
183 } | 228 content = null; |
184 | 229 return; |
230 } | |
231 | |
232 // is this the end of collectTag? | |
233 if (name.equals(collectTag)) { | |
234 collecting = false; | |
235 collectedContent.append("</"+collectTag+">\n"); | |
236 // store collected stuff | |
237 meta.put(collectTag, collectedContent.toString()); | |
238 //logger.debug("collected: '"+collectedContent+"'"); | |
239 content = null; | |
240 return; | |
241 } | |
242 | |
243 // write collected content | |
244 if (collecting) { | |
245 String s = ""; | |
246 if ((content != null) && (content.length() > 0)) { | |
247 s = content.toString().trim(); | |
248 } | |
249 //logger.debug("collect:"+name+" = "+s); | |
250 collectedContent.append(s); | |
251 collectedContent.append("</"+name+">\n"); | |
252 content = null; | |
253 return; | |
254 } | |
185 } | 255 } |
186 | 256 |
187 } | 257 } |
188 | 258 |
189 /** | 259 /** |