diff options
Diffstat (limited to 'org/madore/damlengine/TodoItem.java')
-rw-r--r-- | org/madore/damlengine/TodoItem.java | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/org/madore/damlengine/TodoItem.java b/org/madore/damlengine/TodoItem.java index e058ae2..941460e 100644 --- a/org/madore/damlengine/TodoItem.java +++ b/org/madore/damlengine/TodoItem.java @@ -1,13 +1,30 @@ package org.madore.damlengine; +import java.lang.reflect.Method; +import java.lang.reflect.InvocationTargetException; import java.util.Map; +import java.util.HashMap; import org.w3c.dom.Node; public class TodoItem { - protected Node node; - protected Map<String,Object> context; - protected Map<String,Object> options; + protected static Map<String,Method> damlHandlers; + protected static Method defaultHandler; + + { + Class[] handlerArgTypes = new Class[]{ TodoItem.class }; + damlHandlers = new HashMap<String,Method>(); + try { + defaultHandler = DefaultHandler.class.getMethod("handle", handlerArgTypes); + } catch (NoSuchMethodException e) { + // FIXME: this isn't good... + throw new Error("this is impossible"); + } + } + + Node node; + Map<String,Object> context; + Map<String,Object> options; public TodoItem(Node node, Map<String,Object> context, Map<String,Object> options) { this.node = node; @@ -15,4 +32,23 @@ public class TodoItem { this.options = options; } + public void dispatch() { + Method handler; + if ( node.getNamespaceURI().equals(DamlEngine.DAML_NS) ) { + handler = damlHandlers.get(node.getLocalName()); + if ( handler == null ) + handler = defaultHandler; + } else + handler = defaultHandler; + try { + handler.invoke(null, new Object[]{this}); + } catch (IllegalAccessException e) { + // FIXME: this isn't good... + throw new Error("this is impossible"); + } catch (InvocationTargetException e) { + // FIXME: this isn't good... + throw new Error("this is impossible"); + } + } + } |