2 // XQueryCommandImpl.cs - core XQueryCommand implementation in System.Xml.dll
5 // Atsushi Enomoto <atsushi@ximian.com>
8 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System
.Collections
;
34 using System
.Reflection
;
35 using System
.Security
.Policy
;
37 using System
.Xml
.Query
;
38 using System
.Xml
.XPath
;
39 using Mono
.Xml
.XPath2
;
40 using Mono
.Xml
.XQuery
.Parser
;
42 namespace Mono
.Xml
.XPath2
44 public class XQueryCommandImpl
46 MethodInfo xqueryCommandOnMessageEventMethod
;
48 MethodInfo
GetEventHandler (object qobj
)
50 if (xqueryCommandOnMessageEventMethod
== null) {
51 EventInfo ei
= qobj
.GetType ().GetEvent ("OnMessageEvent");
52 xqueryCommandOnMessageEventMethod
= ei
.GetRaiseMethod (true);
54 return xqueryCommandOnMessageEventMethod
;
57 XQueryStaticContext staticContext
;
60 public XQueryCommandImpl ()
64 public void Compile (TextReader input
, Evidence evidence
, object xqueryCommand
)
66 staticContext
= XQueryASTCompiler
.Compile (XQueryParser
.Parse (input
), null, evidence
, this);
67 this.xqueryCommand
= xqueryCommand
;
68 // FIXME: generate executable assembly, and load it with evidence.
71 public void Execute (XPathNavigator input
, XmlResolver resolver
, XmlArgumentList args
, XmlWriter writer
)
73 if (staticContext
== null)
74 throw new XmlQueryException ("Query string is not compiled.");
75 // Initialize event handler method info.
76 xqueryCommandOnMessageEventMethod
= null;
78 XQueryContext ctx
= new XQueryContext (new XQueryContextManager (staticContext
, input
, writer
, resolver
, args
));
80 XPathSequence iter
= new SingleItemIterator (input
, ctx
);
82 foreach (ExprSingle expr
in staticContext
.QueryBody
)
83 expr
.Serialize (iter
);
86 internal void ProcessMessageEvent (object sender
, QueryEventArgs e
)
88 // FIXME: how to handle event raise method?
89 throw new NotImplementedException ();
91 MethodInfo mi = GetEventHandler (xqueryCommand);
93 mi.Invoke (xqueryCommand, new object [] {sender, e});