- private class XMLHelper extends XML {
- Vector obStack = new Vector();
- public XMLHelper() { super(BUFFER_SIZE); }
- public void startElement(XML.Element c) throws XML.SchemaException {
- JS o = new JS.Obj();
- o.put("$name", c.localName);
- for(int i=0; i<c.len; i++) o.put(c.keys[i], c.vals[i]);
- o.put("$numchildren", new Integer(0));
- obStack.addElement(o);
- }
- public void endElement(XML.Element c) throws XML.SchemaException {
- if (obStack.size() == 1) return;
- JS me = (JS)obStack.lastElement();
- obStack.setSize(obStack.size() - 1);
- JS parent = (JS)obStack.lastElement();
- int numchildren = ((Integer)parent.get("$numchildren")).intValue();
- parent.put("$numchildren", new Integer(numchildren + 1));
- parent.put(new Integer(numchildren), me);
- }
- public void characters(char[] ch, int start, int length) throws XML.SchemaException {
- String s = new String(ch, start, length);
- JS parent = (JS)obStack.lastElement();
- int numchildren = ((Integer)parent.get("$numchildren")).intValue();
- Object lastChild = parent.get(new Integer(numchildren - 1));
- if (lastChild instanceof String) {
- parent.put(new Integer(numchildren - 1), lastChild + s);
- } else {
- parent.put("$numchildren", new Integer(numchildren + 1));
- parent.put(new Integer(numchildren), s);
- }
- }
- public void whitespace(char[] ch, int start, int length) {}
- public JS doParse() throws JS.Exn {
- try {
- InputStream is = getInputStream();
- BufferedReader r = new BufferedReader(new InputStreamReader(is));
- parse(r);
- } catch (XML.XMLException e) {
- throw new JS.Exn("error parsing XML: " + e.toString());
- } catch (IOException e) {
- if (Log.on) Log.log(this, "IO Exception while reading from file");
- if (Log.on) Log.log(this, e);
- throw new JS.Exn("error reading from Resource");
- }
- return obStack.size() >= 1 ? (JS)obStack.elementAt(0) : null;
- }
+ /** what you get when you reference a subresource */
+ public static class Ref extends Res {
+ Res parent;
+ Object key;
+ public String toString() { return parent.toString() + "/" + key; }
+ Ref(Res parent, Object key) { this.parent = parent; this.key = key; }
+ public String getCacheKey() throws NotCacheableException { return parent.getCacheKey() + "/" + key; }
+ public Res addExtension(String extension) {
+ return ((String)key).endsWith(extension) ? this : new Ref(parent, key + extension); }
+ public InputStream getInputStream(String path) throws IOException { return parent.getInputStream("/" + key + path); }