- public String getCacheKey() throws NotCacheableException { throw notCacheable; } // not cacheable
- public String toString() { return "builtin:"; }
- public InputStream getInputStream(String path) throws IOException {
- if (!path.equals("")) throw new IOException("the builtin resource has no subresources");
- return Platform.getBuiltinInputStream();
- }
- }
-
- /** what you get when you reference a subresource */
- public static class Ref extends Stream {
- Stream parent;
- Object key;
- public String toString() { return parent.toString() + "/" + key; }
- Ref(Stream parent, Object key) { this.parent = parent; this.key = key; }
- public String getCacheKey() throws NotCacheableException { return parent.getCacheKey() + "/" + key; }
- public Stream 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); }
- }
-
- /** provides redirection of a specified key */
- public static class Graft extends Stream {
- Stream graftee;
- Object replaced_key, replaced_val;
- Graft(Stream graftee, Object key, Object val) { this.graftee = graftee; this.replaced_key = key; this.replaced_val = val; }
- public boolean equals(Object o) { return this == o || graftee.equals(o); }
- public int hashCode() { return graftee.hashCode(); }
- public InputStream getInputStream(String s) throws IOException { return graftee.getInputStream(s); }
- public Object get(Object key) throws JSExn { return replaced_key.equals(key) ? replaced_val : graftee.get(key); }
- public Object callMethod(Object name, Object a, Object b, Object c, Object[] rest, int nargs) throws JSExn {
- if (replaced_key.equals(name)) {
- if (replaced_val instanceof JS) return ((JS)replaced_val).call(a, b, c, rest, nargs);
- else throw new JSExn("attempted to call non-function (class="+replaced_val.getClass()+")");
- } else {
- return graftee.callMethod(name, a, b, c, rest, nargs);
- }
- }
- public Number coerceToNumber() { return graftee.coerceToNumber(); }
- public String coerceToString() { return graftee.coerceToString(); }
- public boolean coerceToBoolean() { return graftee.coerceToBoolean(); }
- public String typeName() { return graftee.typeName(); }