public boolean __read(final Node n) {
if (!upstreamRead(n)) return false;
if (n.cdata != null) return true;
- final String uri = n.uri;
+ String uri = n.uri;
+ if (uri == null) uri = "http://www.w3.org/1999/xhtml"; // FIXME FIXME FIXME!!!!
final String name = n.name;
if (uri.indexOf(':') == -1)
throw new RuntimeException("uri does not contain a colon: " + uri + " (tag name " + name + ")");
} else if (method.equals("webinf")) {
return graft(newTemplate(servletscope, copyNodeToScope(transform(n, scope), new Scope(servletscope)),
servletscope.getRealPath("/") + "/WEB-INF/" + rest + name), n).upstreamRead(n);
+ } else if (uri.equals("http://xt.ibex.org/form")) {
+ return graft(new InputTag(n.name), n).upstreamRead(n);
} else if (uri.equals("http://xt.ibex.org/")) {
//#switch(name)
+ case "form": return graft(new FormTag(n.attr("class")), n).upstreamRead(n);
+ case "input": return graft(new InputTag(n.attr("field")), n).upstreamRead(n);
case "if":
transform(n, scope);
- return graft((Node.Stream.Functor)("true".equals(n.attr("if")) ? new DropTag() : new DropAll()), n).upstreamRead(n);
+ return graft((Node.Stream.Functor)("true".equals(n.attr("if"))?new DropTag():new DropAll()), n).upstreamRead(n);
case "js": return graft(new JsTag(scope), n).upstreamRead(n);
case "foreach": return graft(new ForEach(n, scope), n).upstreamRead(n);
case "children":
}
}
+ private class InputTag implements Node.Stream.Functor {
+ final String fieldName;
+ public InputTag(String fieldName) { this.fieldName = fieldName; }
+ public Node.Stream wrap(Node.Stream kids) {
+ try {
+ return new Node.Stream.FromXML(new StringReader(servletscope.currentForm.emit(fieldName)));
+ } catch (Exception e) { Log.warn(this, e); return null; }
+ }
+ }
+
+ private class FormTag implements Node.Stream.Functor {
+ final String classname;
+ public FormTag(String classname) { this.classname = classname; }
+ public Node.Stream wrap(final Node.Stream kids) {
+ try {
+ servletscope.currentForm = (Form)Class.forName(classname).newInstance();
+ Log.warn("emit", servletscope.currentForm.emit());
+ return new Node.Stream() {
+ boolean done = false;
+ public boolean _read(Node n) {
+ if (done) return kids._read(n);
+ done = true;
+ n.clear();
+ n.name = "form";
+ n.uri = "http://www.w3.org/1999/xhtml";
+ n.numattrs = 1;
+ n.attrs = new String[] { "action", "/servlet/"+classname };
+ return true;
+ }
+ };
+ } catch (Exception e) {
+ Log.warn(this, e);
+ return null;
+ }
+ } }
+
private class DropTag implements Node.Stream.Functor {
public Node.Stream wrap(Node.Stream kids) {
return kids;