source: cats/SCHEMAcat/trunk/urn.org.isocat.schemacat.access.data/access/user.dpml @ 3425

Last change on this file since 3425 was 3425, checked in by andmor, 11 years ago

Added escape to xquery illegal characters in element values.

File size: 11.3 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<sequence debug="false">
3        <sloot-debug>
4                <request>
5                        <verb>SINK</verb>
6                        <identifier>res:/debug/org.isocat.schemacat.access.data.user.unresolved-arguments.xml</identifier>
7                        <argument name="primary">arg:arguments</argument>
8                </request>
9        </sloot-debug>
10        <!-- resolve the references in arg:arguments -->
11        <request assignment="arguments">
12                <identifier>active:xslt2</identifier>
13                <argument name="operand">arg:arguments</argument>
14                <argument name="operator">
15                        <literal type="xml">
16                                <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
17                                        version="2.0">
18                                        <xsl:param name="debug"/>
19                                        <xsl:template match="@*|node()">
20                                                <xsl:copy>
21                                                        <xsl:apply-templates select="@*|node()"/>
22                                                </xsl:copy>
23                                        </xsl:template>
24                                        <!-- skip over sloot-operator, which is this DPML script -->
25                                        <xsl:template match="sloot-operator" priority="1"/>
26                                        <xsl:template match="arguments/*">
27                                                <xsl:copy>
28                                                        <xsl:apply-templates select="@*"/>
29                                                        <xsl:variable name="val" select="unparsed-text(.)"/>
30                                                        <xsl:if test="$debug">
31                                                                <xsl:message>DBG: <xsl:value-of select="name()"/>[<xsl:value-of select="."/>][<xsl:value-of select="$val"/>]</xsl:message>
32                                                        </xsl:if>
33                                                        <xsl:choose>
34                                                                <!-- snif if the value is XML -->
35                                                                <xsl:when test="matches(normalize-space($val),'&lt;.*&gt;')">
36                                                                        <xsl:copy-of select="doc(.)"/>
37                                                                </xsl:when>
38                                                                <xsl:otherwise>
39                                                                        <xsl:copy-of select="$val"/>
40                                                                </xsl:otherwise>
41                                                        </xsl:choose>
42                                                </xsl:copy>
43                                        </xsl:template>
44                                </xsl:stylesheet>
45                        </literal>
46                </argument>
47                <argument name="debug">this:sloot-debug</argument>
48        </request>
49        <sloot-debug>
50                <request>
51                        <verb>SINK</verb>
52                        <identifier>res:/debug/org.isocat.schemacat.access.data.user.resolved-arguments.xml</identifier>
53                        <argument name="primary">this:arguments</argument>
54                </request>
55                <log>
56                        <level>INFO</level>
57                        <message>
58                                <literal type="string">user accessor verb: %1 with arguments:&#10;%2</literal>
59                        </message>
60                        <param>arg:verb</param>
61                        <param>this:arguments</param>
62                        <!-- weird!! first call prints principal 2nd call print object id -->
63                </log>
64        </sloot-debug>
65        <switch assignment="response">
66                <cond>
67                        <request>
68                                <identifier>active:sloot.xpath2</identifier>
69                                <argument name="operand">arg:verb</argument>
70                                <argument name="operator">
71                                        <literal type="string">boolean(.='NEW')</literal>
72                                </argument>
73                        </request>
74                </cond>
75                <then>
76                        <sequence>
77                                <!-- compute the id for the new user -->
78                                <request assignment="new-user-id">
79                                        <identifier>active:sloot.generateUUID</identifier>
80                                </request>
81                                <!-- compute the query string for creating a new user -->
82                                <request assignment="new-user-query">
83                                        <identifier>active:xslt2</identifier>
84                                        <argument name="operand">
85                                                <literal type="xml">
86                                                        <dummy/>
87                                                </literal>
88                                        </argument>
89                                        <argument name="operator">
90                                                <literal type="xml">
91                                                        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
92                                                                version="2.0" xmlns:rest="http://basex.org/rest" xmlns:sloot="http://www.isocat.org/ns/sloot">
93                                                                <xsl:import href="active:sloot.xquery.escape"/>
94                                                                <xsl:param name="vararg"/>
95                                                                <xsl:template match="/">
96                                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
97                                                                                <xsl:text>let $old-user := /sc:users/*:user[@xml:id = $new-user-id or *:principal = '</xsl:text>
98                                                                                <xsl:value-of select="sloot:escape-xquery($vararg/arguments/principal)"/>
99                                                                                <xsl:text>'], $new-user := element sc:user { attribute xml:id {$new-user-id}, element sc:principal {'</xsl:text>
100                                                                                <xsl:value-of select="sloot:escape-xquery($vararg/arguments/principal)"/>
101                                                                                <xsl:text>'}, element sc:displayName {'</xsl:text>
102                                                                                <xsl:value-of select="sloot:escape-xquery($vararg/arguments/display-name)"/>
103                                                                                <xsl:text>'}</xsl:text>
104                                                                                <xsl:for-each
105                                                                                        select="$vararg/arguments/*[name() eq 'email']">
106                                                                                        <xsl:text>, element sc:email {'</xsl:text>
107                                                                                        <xsl:value-of select="sloot:escape-xquery(.)"/>
108                                                                                        <xsl:text>'}</xsl:text>
109                                                                                </xsl:for-each>
110                                                                                <!-- trying to use various roles. This reads the right number of roles passed but all their values resolve to
111                                                                                the first one passed!!!
112                                                                                If this work same can be used for emails -->
113                                                                                <xsl:for-each select="$vararg/arguments/*[name() eq 'role']">
114                                                                                        <xsl:text>, element sc:role {'</xsl:text>
115                                                                                        <xsl:value-of select="sloot:escape-xquery(.)"/>
116                                                                                        <xsl:text>'}</xsl:text>
117                                                                                </xsl:for-each>
118                                                                                <xsl:text>} return
119                                                                                        if (empty($old-user))
120                                                        then (insert node $new-user into /sc:users)
121                                                        else (error(xs:QName('sc:uniqueUser'),'There exists already an user with this id or principal!'))</xsl:text>
122                                                                        </query>
123                                                                </xsl:template>
124                                                        </xsl:stylesheet>
125                                                </literal>
126                                        </argument>
127                                        <argument name="vararg">this:arguments</argument>
128                                </request>
129                                <sloot-debug>
130                                        <request>
131                                                <verb>SINK</verb>
132                                                <identifier>res:/debug/org.isocat.schemacat.access.data.user.new.query.xml</identifier>
133                                                <argument name="primary">this:new-user-query</argument>
134                                        </request>
135                                </sloot-debug>
136                                <!-- create the new user by running the query-->
137                                <request>
138                                        <identifier>active:org.basex.query</identifier>
139                                        <argument name="operator">this:new-user-query</argument>
140                                        <argument name="new-user-id">this:new-user-id</argument>
141                                </request>
142                                <log>
143                                        <level>INFO</level>
144                                        <message>
145                                                <literal type="string">Created user[%1] for principal[%2]</literal>
146                                        </message>
147                                        <param>this:new-user-id</param>
148                                        <param>arg:principal</param>
149                                </log>
150                                <request assignment="response">
151                                        <identifier>this:new-user-id</identifier>
152                                </request>
153                        </sequence>
154                </then>
155                <cond>
156                        <request>
157                                <identifier>active:sloot.xpath2</identifier>
158                                <argument name="operand">arg:verb</argument>
159                                <argument name="operator">
160                                        <literal type="string">boolean(.='SINK')</literal>
161                                </argument>
162                        </request>
163                </cond>
164                <then>
165                        <sequence>
166                                <!-- build the 'roles' element for the user -->
167                                <request assignment="roles">
168                                        <identifier>active:xslt2</identifier>
169                                        <argument name="operand">
170                                                <literal type="xml">
171                                                        <dummy></dummy>
172                                                </literal>
173                                        </argument>
174                                        <argument name="operator">
175                                                <literal type="xml">
176                                                        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
177                                                        xmlns:rest="http://basex.org/rest">
178                                                                <xsl:param name="vararg"/>
179                                                                <xsl:template match='/'>
180                                                                        <xsl:for-each select="$vararg/arguments/*[name() eq 'role']">
181                                                                                <xsl:text>element role {'</xsl:text>
182                                                                                <xsl:value-of select="."/>
183                                                                                <xsl:text>'}</xsl:text>
184                                                                                <xsl:if test='position()!=last()'>,</xsl:if>
185                                                                        </xsl:for-each>
186                                                                </xsl:template>
187                                                        </xsl:stylesheet>
188                                                </literal>
189                                        </argument>
190                                        <argument name="vararg">this:arguments</argument>
191                                </request>
192                                <!-- update the user info -->
193                                <request>
194                                        <identifier>active:org.basex.query</identifier>
195                                        <argument name="operator">
196                                                <literal type="xml">
197                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
198                                                                let $user :=
199                                                                element user { attribute xml:id {$args//id}, element principal
200                                                                {$args//principal}, element displayName {$args//display-name}, $roles }
201                                                                return replace node /sc:users/sc:user[(@xml:id eq '$args//id') or (sc:principal eq '$args//principal')] with $user
202                                                                </query>
203                                                </literal>
204                                        <!--    replace value of node /sc:users/sc:user[@xml:id eq '$user-id']/sc:$field with '$new-value' -->
205                                        </argument>
206                                        <argument name="args">this:arguments</argument>
207                                        <argument name="roles">this:roles</argument>
208                                </request>
209                                <literal assignment="response" type="boolean">true</literal>
210                                <log>
211                                        <level>INFO</level>
212                                        <message>
213                                                <literal type="string">Updated user for principal: [%1]</literal>
214                                        </message>
215                                        <param>arg:principal</param>
216                                </log>
217                        </sequence>
218                </then>
219                <cond>
220                        <request>
221                                <identifier>active:sloot.xpath2</identifier>
222                                <argument name="operand">arg:verb</argument>
223                                <argument name="operator">
224                                        <literal type="string">boolean(.='EXISTS')</literal>
225                                </argument>
226                        </request>
227                </cond>
228                <then>
229                        <sequence>
230                                <!-- check if the user exists in the database -->
231                                <request assignment="response">
232                                        <identifier>active:org.basex.booleanQuery</identifier>
233                                        <argument name="operator">
234                                                <literal type="xml">
235                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
236                                                                <b>{exists((//sc:user[@xml:id=$args//id],//sc:user[sc:principal=$args//principal]))}</b>
237                                                        </query>
238                                                </literal>
239                                        </argument>
240                                        <argument name="args">this:arguments</argument>
241                                </request>
242                        </sequence>
243                </then>
244                <cond>
245                        <request>
246                                <identifier>active:sloot.xpath2</identifier>
247                                <argument name="operand">arg:verb</argument>
248                                <argument name="operator">
249                                        <literal type="string">boolean(.='SOURCE')</literal>
250                                </argument>
251                        </request>
252                </cond>
253                <then>
254                        <!-- get the user information -->
255                        <sequence>
256                                <request assignment="res">
257                                        <identifier>active:org.basex.query</identifier>
258                                        <argument name="operator">
259                                                <literal type="xml">
260                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
261                                                                <sc:user>{
262                                                                        let $user := exactly-one((//sc:user[@xml:id=$args//id],//sc:user[sc:principal=$args//principal]))
263                                                                        return ($user/@*,$user/*)
264                                                                }</sc:user>
265                                                        </query>
266                                                </literal>
267                                        </argument>
268                                        <argument name="args">this:arguments</argument>
269                                </request>
270                                <!-- pass the document returned by basex trough sloot.xpath2 so
271                                when we log the response (end of this dpml) the actual user
272                                document is logged instead of the value of its pointer!-->
273                                <request assignment="response">
274                                        <identifier>active:sloot.xpath2</identifier>
275                                        <argument name="operand">this:res</argument>
276                                        <argument name="operator">
277                                                <literal type="xml">
278                                                        <dummy>.</dummy>
279                                                </literal>
280                                        </argument>
281                                </request>
282
283                                <!--    AAM: it would be better  to use sloot.xquery instead of sloot.xpath2
284                for instance to log the user document in its own line. However using it
285                causes a type mismatch in findUser.dpml since sloot.xquery does not seem
286                to return an element of type "document" as expected by findUser.dpml
287               
288                                        <request assignment="response">
289                                        <identifier>active:sloot.xquery</identifier>
290                                        <argument name="operator">
291                                                <literal type="xml"><dummy>{$NL}{$doc}{$NL}</dummy></literal>
292                                        </argument>
293                                        <argument name="NL">
294                                                <literal type="string">
295</literal>
296                                        </argument>
297                                        <argument name="doc">this:res</argument>
298                                </request>-->
299
300                        </sequence>
301                </then>
302                <otherwise>
303                        <throw>
304                                <id>
305                                        <literal type="string">UNSUPPORTED_NK_VERB</literal>
306                                </id>
307                                <message>
308                                        <literal type="string">org.isocat.schemacat.data.user: unsupported verb!</literal>
309                                </message>
310                        </throw>
311                </otherwise>
312        </switch>
313        <sloot-debug>
314                <log>
315                        <level>INFO</level>
316                        <message>
317                                <literal type="string">user accessor response: [%1]</literal>
318                        </message>
319                        <param>this:response</param>
320                </log>
321                <request>
322                        <verb>SINK</verb>
323                        <identifier>res:/debug/org.isocat.schemacat.access.data.user.result.xml</identifier>
324                        <argument name="primary">this:response</argument>
325                </request>
326        </sloot-debug>
327</sequence>
Note: See TracBrowser for help on using the repository browser.