|
From: <pm_...@us...> - 2011-06-08 08:52:59
|
Revision: 4392
http://mxquery.svn.sourceforge.net/mxquery/?rev=4392&view=rev
Author: pm_fischer
Date: 2011-06-08 08:52:53 +0000 (Wed, 08 Jun 2011)
Log Message:
-----------
add function to remove anonymous event handlers, some fixes
Modified Paths:
--------------
trunk/MXQuery/xqib_src/ch/ethz/mxqjs/client/Environment.java
trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/FGPopulator.java
trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/b/RemoveEventListener.java
Added Paths:
-----------
trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/b/RemoveAnonymousEventListener.java
Modified: trunk/MXQuery/xqib_src/ch/ethz/mxqjs/client/Environment.java
===================================================================
--- trunk/MXQuery/xqib_src/ch/ethz/mxqjs/client/Environment.java 2011-06-08 08:50:56 UTC (rev 4391)
+++ trunk/MXQuery/xqib_src/ch/ethz/mxqjs/client/Environment.java 2011-06-08 08:52:53 UTC (rev 4392)
@@ -3,6 +3,7 @@
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
+import java.util.ListIterator;
import ch.ethz.mxquery.contextConfig.CompilerOptions;
import ch.ethz.mxquery.contextConfig.Context;
@@ -12,6 +13,7 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.functions.Function;
import ch.ethz.mxquery.functions.FunctionGallery;
+import ch.ethz.mxquery.functions.FunctionSignature;
import ch.ethz.mxquery.iterators.browser.EventIterator;
import ch.ethz.mxquery.iterators.browser.ListBasedIterator;
import ch.ethz.mxquery.iterators.browser.SingleNodeIterator;
@@ -126,13 +128,54 @@
throw new MXQueryException("Eventlistener cannot be removed",
"handler to remove cannot be found", null);
}
- lst.remove(fi);
+ List<FunctionItemToken> lstnew = new ArrayList<FunctionItemToken>();
+ ListIterator<FunctionItemToken> it = lst.listIterator();
+
+ while (it.hasNext()) {
+ FunctionItemToken ft = it.next();
+ FunctionSignature fts = ft.getFunction().getFunctionSignature();
+ FunctionSignature fis = fi.getFunction().getFunctionSignature();
+ if (!fis.getName().equals(fts.getName()) || fts.getArity() != fis.getArity())
+ lstnew.add(ft);
+ }
+ handlers.remove(test);
+ handlers.put(test, lstnew);
if (lst.isEmpty()) {
handlers.put(test, null);
nativeRemoveEventListener(el, eventName);
}
}
+ public static void removeAnonymousEventListeners(Element el, String eventName, Context ctx) throws MXQueryException {
+ if (eventName.startsWith("on"))
+ eventName = eventName.substring(2);
+ if (handlers == null)
+ throw new MXQueryException("Eventlistener cannot be removed",
+ "handler to remove cannot be found", null);
+ NodeAndEventName test = new NodeAndEventName(el, eventName);
+ List<FunctionItemToken> lst = handlers.get(test);
+ if (lst == null) {
+ throw new MXQueryException("Eventlistener cannot be removed",
+ "handler to remove cannot be found", null);
+ }
+ List<FunctionItemToken> lstnew = new ArrayList<FunctionItemToken>();
+
+ ListIterator<FunctionItemToken> it = lst.listIterator();
+
+ while (it.hasNext()) {
+ FunctionItemToken fi = it.next();
+ if (fi.getFunction().getFunctionSignature().getName() != null)
+ lstnew.add(fi);
+ }
+ handlers.remove(test);
+ handlers.put(test, lstnew);
+ if (lst.isEmpty()) {
+ handlers.put(test, null);
+ nativeRemoveEventListener(el, eventName);
+ }
+ }
+
+
/**
* the callback called by any listened event
*
@@ -151,13 +194,13 @@
test.node);
try {
//TODO: remove name reference - inline functions don't have a name
- log.log(LogLevel.FINER, "Calling eventcallback " + fi.getFunction().getFunctionSignature().getName().toString());
+ //log.log(LogLevel.FINER, "Calling eventcallback " + fi.getFunction().getFunctionSignature().getName().toString());
ListBasedIterator eventiter = new EventIterator(event);
eventiter.setContext(new Context(), true);
Iterator[] subiterators = { nodeiter, eventiter };
Environment.invokeModule(fi, subiterators);
- log.log(LogLevel.FINER, "Eventcallback " + fi.getFunction().getFunctionSignature().getName().toString() + " done");
+ //log.log(LogLevel.FINER, "Eventcallback " + fi.getFunction().getFunctionSignature().getName().toString() + " done");
eventiter = null;
subiterators = null;
nodeiter = null;
Modified: trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/FGPopulator.java
===================================================================
--- trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/FGPopulator.java 2011-06-08 08:50:56 UTC (rev 4391)
+++ trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/FGPopulator.java 2011-06-08 08:52:53 UTC (rev 4392)
@@ -255,34 +255,10 @@
iter, null, type );
fg.add(function);
}
-
+
qn = new QName(
"http://xqib.org",
"b",
- "log");
- paramTypes = new TypeInfo[1];
-
- paramTypes[0] = new TypeInfo(FunctionGallery.getType(
- "xs:string",ctx),FunctionGallery.getOccur("xs:string"),null);
-
- signature = new FunctionSignature(qn, paramTypes, FunctionSignature.SYSTEM_FUNCTION, new Hashtable());
-
-
- {
- ch.ethz.mxquery.functions.b.Log iter = new ch.ethz.mxquery.functions.b.Log();
- iter.setContext(context, false);
-
- type = null;
-
- function = new Function(
- null,signature,
- iter, null, type );
- fg.add(function);
- }
-
- qn = new QName(
- "http://xqib.org",
- "b",
"alert");
paramTypes = new TypeInfo[1];
@@ -443,7 +419,36 @@
iter, null, type );
fg.add(function);
}
-
+
+ qn = new QName(
+ "http://xqib.org",
+ "b",
+ "removeAnonymousEventListeners");
+ paramTypes = new TypeInfo[2];
+
+ paramTypes[0] = new TypeInfo(FunctionGallery.getType(
+ "node()",ctx),FunctionGallery.getOccur("node()"),null);
+
+ paramTypes[1] = new TypeInfo(FunctionGallery.getType(
+ "xs:string",ctx),FunctionGallery.getOccur("xs:string"),null);
+
+ signature = new FunctionSignature(qn, paramTypes, FunctionSignature.SYSTEM_FUNCTION, new Hashtable());
+
+
+ {
+ ch.ethz.mxquery.functions.b.RemoveAnonymousEventListener iter = new ch.ethz.mxquery.functions.b.RemoveAnonymousEventListener();
+ //ch.ethz.mxquery.functions.b.Alert iter = new ch.ethz.mxquery.functions.b.Alert();
+ iter.setContext(context, false);
+
+ type = null;
+
+ function = new Function(
+ null,signature,
+ iter, null, type );
+ fg.add(function);
+ }
+
+
qn = new QName(
"http://xqib.org",
"b",
Copied: trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/b/RemoveAnonymousEventListener.java (from rev 4391, trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/b/RemoveEventListener.java)
===================================================================
--- trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/b/RemoveAnonymousEventListener.java (rev 0)
+++ trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/b/RemoveAnonymousEventListener.java 2011-06-08 08:52:53 UTC (rev 4392)
@@ -0,0 +1,82 @@
+package ch.ethz.mxquery.functions.b;
+
+import java.util.LinkedList;
+import java.util.Vector;
+
+
+import ch.ethz.mxqjs.client.Environment;
+import ch.ethz.mxquery.contextConfig.Context;
+import ch.ethz.mxquery.datamodel.QName;
+import ch.ethz.mxquery.datamodel.types.Type;
+import ch.ethz.mxquery.datamodel.xdm.FunctionItemToken;
+import ch.ethz.mxquery.datamodel.xdm.Token;
+import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
+import ch.ethz.mxquery.exceptions.DynamicException;
+import ch.ethz.mxquery.exceptions.ErrorCodes;
+import ch.ethz.mxquery.exceptions.MXQueryException;
+import ch.ethz.mxquery.exceptions.QueryLocation;
+import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.TokenBasedIterator;
+import ch.ethz.mxquery.model.XDMIterator;
+import ch.ethz.mxquery.update.store.domImpl.ElementNodeToken;
+import ch.ethz.mxquery.util.LogLevel;
+import ch.ethz.mxquery.util.browser.dom.Element;
+
+public class RemoveAnonymousEventListener extends TokenBasedIterator {
+
+
+ protected void init() throws MXQueryException {
+ currentToken = Token.END_SEQUENCE_TOKEN;
+ String eventname = getStringValue(subIters[1]);
+
+ XDMIterator iter = subIters[0];
+ //if (iter instanceof DataValuesIterator) ((DataValuesIterator)iter).setFnData(true);
+ TokenInterface tok;
+ int type;
+ int level = 0;
+ LinkedList<TokenInterface> tokens = new LinkedList<TokenInterface>();
+ do {
+ tok = iter.next();
+ type = tok.getEventType();
+ switch (type) {
+ case Type.END_SEQUENCE:
+ break;
+ case Type.START_TAG:
+ if (level++ == 0)
+ tokens.add(tok);
+ break;
+ case Type.END_TAG:
+ level--;
+ break;
+ default:
+ }
+ } while (type != Type.END_SEQUENCE);
+ for (TokenInterface token:tokens){
+ removeAnonymousEventHandler(token, eventname);
+ }
+ }
+
+ private void removeAnonymousEventHandler(TokenInterface tok, String eventname) throws MXQueryException {
+ if (!(tok instanceof ElementNodeToken)){
+ return;
+ }
+ ElementNodeToken nt = (ElementNodeToken) tok;
+ Element el = (Element)nt.getNode();
+
+ //resolve functionname
+// qfunctionname.setNamespaceURI(this.getContext().getNamespace(qfunctionname.getNamespacePrefix()).getURI());
+ Context ctx = this.getContext().getParent();//Environment.getContext();
+ Environment.removeAnonymousEventListeners(el, eventname, ctx);
+
+ }
+
+ protected XDMIterator copy(Context context, XDMIterator[] subIters,
+ Vector nestedPredCtxStack) throws MXQueryException {
+ RemoveAnonymousEventListener copy = new RemoveAnonymousEventListener();
+ copy.setContext(context, true);
+ copy.setSubIters(subIters);
+ return copy;
+ }
+
+
+}
Modified: trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/b/RemoveEventListener.java
===================================================================
--- trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/b/RemoveEventListener.java 2011-06-08 08:50:56 UTC (rev 4391)
+++ trunk/MXQuery/xqib_src/ch/ethz/mxquery/functions/b/RemoveEventListener.java 2011-06-08 08:52:53 UTC (rev 4392)
@@ -19,6 +19,7 @@
import ch.ethz.mxquery.model.TokenBasedIterator;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.update.store.domImpl.ElementNodeToken;
+import ch.ethz.mxquery.util.LogLevel;
import ch.ethz.mxquery.util.browser.dom.Element;
public class RemoveEventListener extends TokenBasedIterator {
@@ -35,6 +36,10 @@
if (functiontoken.getEventType() != Type.FUNCTION_ITEM && subIters[2].next().getEventType() != Type.END_SEQUENCE)
throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE, "Function Item expected", loc);
+ FunctionItemToken ft = (FunctionItemToken)functiontoken;
+ if (ft.getFunction().getFunctionSignature().getName() == null)
+ throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE, "Cannot remove anonymous functions individually", loc);
+
XDMIterator iter = subIters[0];
//if (iter instanceof DataValuesIterator) ((DataValuesIterator)iter).setFnData(true);
TokenInterface tok;
@@ -58,7 +63,7 @@
}
} while (type != Type.END_SEQUENCE);
for (TokenInterface token:tokens){
- removeEventHandler(token, eventname, (FunctionItemToken)functiontoken);
+ removeEventHandler(token, eventname, ft);
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|