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

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

Added support for default user parameters when using the 'NEW' verb .

File size: 11.1 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">
93                                                                <xsl:param name="vararg"/>
94                                                                <xsl:template match="/">
95                                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
96                                                                                <xsl:text>let $old-user := /sc:users/*:user[@xml:id = $new-user-id or *:principal = '</xsl:text>
97                                                                                <xsl:value-of select="$vararg/arguments/principal"/>
98                                                                                <xsl:text>'], $new-user := element sc:user { attribute xml:id {$new-user-id}, element sc:principal {'</xsl:text>
99                                                                                <xsl:value-of select="$vararg/arguments/principal"/>
100                                                                                <xsl:text>'}, element sc:displayName {'</xsl:text>
101                                                                                <xsl:value-of select="$vararg/arguments/display-name"/>
102                                                                                <xsl:text>'}</xsl:text>
103                                                                                <xsl:for-each
104                                                                                        select="$vararg/arguments/*[name() eq 'email']">
105                                                                                        <xsl:text>, element sc:email {'</xsl:text>
106                                                                                        <xsl:value-of select="."/>
107                                                                                        <xsl:text>'}</xsl:text>
108                                                                                </xsl:for-each>
109                                                                                <!-- trying to use various roles. This reads the right number of roles passed but all their values resolve to
110                                                                                the first one passed!!!
111                                                                                If this work same can be used for emails -->
112                                                                                <xsl:for-each select="$vararg/arguments/*[name() eq 'role']">
113                                                                                        <xsl:text>, element sc:role {'</xsl:text>
114                                                                                        <xsl:value-of select="."/>
115                                                                                        <xsl:text>'}</xsl:text>
116                                                                                </xsl:for-each>
117                                                                                <xsl:text>} return
118                                                                                        if (empty($old-user))
119                                                        then (insert node $new-user into /sc:users)
120                                                        else (error(xs:QName('sc:uniqueUser'),'There exists already an user with this id or principal!'))</xsl:text>
121                                                                        </query>
122                                                                </xsl:template>
123                                                        </xsl:stylesheet>
124                                                </literal>
125                                        </argument>
126                                        <argument name="vararg">this:arguments</argument>
127                                </request>
128                                <sloot-debug>
129                                        <request>
130                                                <verb>SINK</verb>
131                                                <identifier>res:/debug/org.isocat.schemacat.access.data.user.new.query.xml</identifier>
132                                                <argument name="primary">this:new-user-query</argument>
133                                        </request>
134                                </sloot-debug>
135                                <!-- create the new user by running the query-->
136                                <request>
137                                        <identifier>active:org.basex.query</identifier>
138                                        <argument name="operator">this:new-user-query</argument>
139                                        <argument name="new-user-id">this:new-user-id</argument>
140                                </request>
141                                <log>
142                                        <level>INFO</level>
143                                        <message>
144                                                <literal type="string">Created user[%1] for principal[%2]</literal>
145                                        </message>
146                                        <param>this:new-user-id</param>
147                                        <param>arg:principal</param>
148                                </log>
149                                <request assignment="response">
150                                        <identifier>this:new-user-id</identifier>
151                                </request>
152                        </sequence>
153                </then>
154                <cond>
155                        <request>
156                                <identifier>active:sloot.xpath2</identifier>
157                                <argument name="operand">arg:verb</argument>
158                                <argument name="operator">
159                                        <literal type="string">boolean(.='SINK')</literal>
160                                </argument>
161                        </request>
162                </cond>
163                <then>
164                        <sequence>
165                                <!-- build the 'roles' element for the user -->
166                                <request assignment="roles">
167                                        <identifier>active:xslt2</identifier>
168                                        <argument name="operand">
169                                                <literal type="xml">
170                                                        <dummy></dummy>
171                                                </literal>
172                                        </argument>
173                                        <argument name="operator">
174                                                <literal type="xml">
175                                                        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
176                                                        xmlns:rest="http://basex.org/rest">
177                                                                <xsl:param name="vararg"/>
178                                                                <xsl:template match='/'>
179                                                                        <xsl:for-each select="$vararg/arguments/*[name() eq 'role']">
180                                                                                <xsl:text>element role {'</xsl:text>
181                                                                                <xsl:value-of select="."/>
182                                                                                <xsl:text>'}</xsl:text>
183                                                                                <xsl:if test='position()!=last()'>,</xsl:if>
184                                                                        </xsl:for-each>
185                                                                </xsl:template>
186                                                        </xsl:stylesheet>
187                                                </literal>
188                                        </argument>
189                                        <argument name="vararg">this:arguments</argument>
190                                </request>
191                                <!-- update the user info -->
192                                <request>
193                                        <identifier>active:org.basex.query</identifier>
194                                        <argument name="operator">
195                                                <literal type="xml">
196                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
197                                                                let $user :=
198                                                                element user { attribute xml:id {$args//id}, element principal
199                                                                {$args//principal}, element displayName {$args//display-name}, $roles }
200                                                                return replace node /sc:users/sc:user[(@xml:id eq '$args//id') or (sc:principal eq '$args//principal')] with $user
201                                                                </query>
202                                                </literal>
203                                        <!--    replace value of node /sc:users/sc:user[@xml:id eq '$user-id']/sc:$field with '$new-value' -->
204                                        </argument>
205                                        <argument name="args">this:arguments</argument>
206                                        <argument name="roles">this:roles</argument>
207                                </request>
208                                <literal assignment="response" type="boolean">true</literal>
209                                <log>
210                                        <level>INFO</level>
211                                        <message>
212                                                <literal type="string">Updated user for principal: [%1]</literal>
213                                        </message>
214                                        <param>arg:principal</param>
215                                </log>
216                        </sequence>
217                </then>
218                <cond>
219                        <request>
220                                <identifier>active:sloot.xpath2</identifier>
221                                <argument name="operand">arg:verb</argument>
222                                <argument name="operator">
223                                        <literal type="string">boolean(.='EXISTS')</literal>
224                                </argument>
225                        </request>
226                </cond>
227                <then>
228                        <sequence>
229                                <!-- check if the user exists in the database -->
230                                <request assignment="response">
231                                        <identifier>active:org.basex.booleanQuery</identifier>
232                                        <argument name="operator">
233                                                <literal type="xml">
234                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
235                                                                <b>{exists((//sc:user[@xml:id=$args//id],//sc:user[sc:principal=$args//principal]))}</b>
236                                                        </query>
237                                                </literal>
238                                        </argument>
239                                        <argument name="args">this:arguments</argument>
240                                </request>
241                        </sequence>
242                </then>
243                <cond>
244                        <request>
245                                <identifier>active:sloot.xpath2</identifier>
246                                <argument name="operand">arg:verb</argument>
247                                <argument name="operator">
248                                        <literal type="string">boolean(.='SOURCE')</literal>
249                                </argument>
250                        </request>
251                </cond>
252                <then>
253                        <!-- get the user information -->
254                        <sequence>
255                                <request assignment="res">
256                                        <identifier>active:org.basex.query</identifier>
257                                        <argument name="operator">
258                                                <literal type="xml">
259                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
260                                                                <sc:user>{
261                                                                        let $user := exactly-one((//sc:user[@xml:id=$args//id],//sc:user[sc:principal=$args//principal]))
262                                                                        return ($user/@*,$user/*)
263                                                                }</sc:user>
264                                                        </query>
265                                                </literal>
266                                        </argument>
267                                        <argument name="args">this:arguments</argument>
268                                </request>
269                                <!-- pass the document returned by basex trough sloot.xpath2 so
270                                when we log the response (end of this dpml) the actual user
271                                document is logged instead of the value of its pointer!-->
272                                <request assignment="response">
273                                        <identifier>active:sloot.xpath2</identifier>
274                                        <argument name="operand">this:res</argument>
275                                        <argument name="operator">
276                                                <literal type="xml">
277                                                        <dummy>.</dummy>
278                                                </literal>
279                                        </argument>
280                                </request>
281
282                                <!--    AAM: it would be better  to use sloot.xquery instead of sloot.xpath2
283                for instance to log the user document in its own line. However using it
284                causes a type mismatch in findUser.dpml since sloot.xquery does not seem
285                to return an element of type "document" as expected by findUser.dpml
286               
287                                        <request assignment="response">
288                                        <identifier>active:sloot.xquery</identifier>
289                                        <argument name="operator">
290                                                <literal type="xml"><dummy>{$NL}{$doc}{$NL}</dummy></literal>
291                                        </argument>
292                                        <argument name="NL">
293                                                <literal type="string">
294</literal>
295                                        </argument>
296                                        <argument name="doc">this:res</argument>
297                                </request>-->
298
299                        </sequence>
300                </then>
301                <otherwise>
302                        <throw>
303                                <id>
304                                        <literal type="string">UNSUPPORTED_NK_VERB</literal>
305                                </id>
306                                <message>
307                                        <literal type="string">org.isocat.schemacat.data.user: unsupported verb!</literal>
308                                </message>
309                        </throw>
310                </otherwise>
311        </switch>
312        <sloot-debug>
313                <log>
314                        <level>INFO</level>
315                        <message>
316                                <literal type="string">user accessor response: [%1]</literal>
317                        </message>
318                        <param>this:response</param>
319                </log>
320                <request>
321                        <verb>SINK</verb>
322                        <identifier>res:/debug/org.isocat.schemacat.access.data.user.result.xml</identifier>
323                        <argument name="primary">this:response</argument>
324                </request>
325        </sloot-debug>
326</sequence>
Note: See TracBrowser for help on using the repository browser.