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

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

'NEW user' enpoint generating a dinamic query according to the parameters passed to it.

File size: 9.0 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<sequence debug="false">
3        <sloot-debug>
4                <log>
5                        <level>INFO</level>
6                        <message>
7                                <literal type="string">user accessor verb: %1 for principal : %2</literal>
8                        </message>
9                        <param>arg:verb</param>
10                        <param>arg:principal</param>
11                        <!-- weird!! first call prints principal 2nd call print object id -->
12                </log>
13        </sloot-debug>
14        <switch assignment="response">
15                <cond>
16                        <request>
17                                <identifier>active:sloot.xpath2</identifier>
18                                <argument name="operand">arg:verb</argument>
19                                <argument name="operator">
20                                        <literal type="string">boolean(.='NEW')</literal>
21                                </argument>
22                        </request>
23                </cond>
24                <then>
25                        <sequence>
26                                <!-- compute the id for the new user -->
27                                <request assignment="new-user-id">
28                                        <identifier>active:sloot.generateUUID</identifier>
29                                </request>
30                                <!-- compute the query string for creating a new user -->
31                                <request assignment="new-user-query">
32                                        <identifier>active:xslt2</identifier>
33                                        <argument name="operand">
34                                                <literal type="xml">
35                                                        <dummy/>
36                                                </literal>
37                                        </argument>
38                                        <argument name="operator">
39                                                <literal type="xml">
40                                                        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
41                                                                version="2.0" xmlns:rest="http://basex.org/rest">
42                                                                <xsl:param name="vararg"/>
43                                                                <xsl:template match="/">
44                                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
45                                                                                <xsl:text>let $new-user := element user { attribute xml:id {$new-user-id}, element principal {$principal}, element displayName {$display-name}</xsl:text>
46                                                                                <xsl:for-each
47                                                                                        select="$vararg/arguments/*[name() eq 'email']">
48                                                                                        <xsl:text>, element email {'</xsl:text>
49                                                                                        <xsl:value-of select="unparsed-text(string(.))"/>
50                                                                                        <xsl:text>'}</xsl:text>
51                                                                                </xsl:for-each>
52                                                                                <!-- trying to use various roles. This reads the right number of roles passed but all their values resolve to
53                                                                                the first one passed!!!
54                                                                                If this work same can be used for emails -->
55                                                                                <xsl:for-each select="$vararg/arguments/*[name() eq 'role']">
56                                                                                        <xsl:text>, element role {'</xsl:text>
57                                                                                        <xsl:value-of select="unparsed-text(string(.))"/>
58                                                                                        <xsl:text>'}</xsl:text>
59                                                                                </xsl:for-each>
60                                                                                <xsl:text>} return insert node $new-user into /sc:users </xsl:text>
61                                                                        </query>
62                                                                </xsl:template>
63                                                        </xsl:stylesheet>
64                                                </literal>
65                                        </argument>
66                                        <argument name="vararg">arg:arguments</argument>
67                                </request>
68                                <sloot-debug>
69                                        <request>
70                                                <verb>SINK</verb>
71                                                <identifier>res:/debug/org.isocat.schemacat.access.data.user.new.query.xml</identifier>
72                                                <argument name="primary">arg:query</argument>
73                                        </request>
74                                </sloot-debug>
75                                <!-- create the new user by running the query-->
76                                <request>
77                                        <identifier>active:org.basex.query</identifier>
78                                        <argument name="operator">this:new-user-query</argument>
79                                        <argument name="principal">arg:principal</argument>
80                                        <argument name="display-name">arg:display-name</argument>
81                                        <argument name="new-user-id">this:new-user-id</argument>
82                                </request>
83                                <literal assignment="response" type="boolean">true</literal>
84                                <log>
85                                        <level>INFO</level>
86                                        <message>
87                                                <literal type="string">Created user for principal: [%1]</literal>
88                                        </message>
89                                        <param>arg:principal</param>
90                                </log>
91                        </sequence>
92                </then>
93                <!-- This is the future code for the SINK verb to update a user info -->
94                <!--<cond>
95                        <request>
96                                <identifier>active:sloot.xpath2</identifier>
97                                <argument name="operand">arg:verb</argument>
98                                <argument name="operator">
99                                        <literal type="string">boolean(.='SINK')</literal>
100                                </argument>
101                        </request>
102                </cond>
103                <then>
104                        <sequence>
105                                <!-\- build the 'roles' element for the user -\->
106                                <request assignment="roles">
107                                        <identifier>active:xslt2</identifier>
108                                        <argument name="operand">
109                                                <literal type="xml">
110                                                        <dummy></dummy>
111                                                </literal>
112                                        </argument>
113                                        <argument name="operator">
114                                                <literal type="xml">
115                                                        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
116                                                        xmlns:rest="http://basex.org/rest">
117                                                                <xsl:template match='/'>
118                                                                        <xsl:for-each select="$vararg/arguments/*[name() eq 'role']">
119                                                                                <xsl:text>element role {'</xsl:text>
120                                                                                <xsl:value-of select="{unparsed-text(string(.))}"/>
121                                                                                <xsl:text>'}</xsl:text>
122                                                                                <xsl:if test='not(last(.))'>,</xsl:if>
123                                                                        </xsl:for-each>
124                                                                </xsl:template>
125                                                        </xsl:stylesheet>
126                                                </literal>
127                                        </argument>
128                                        <argument name="vararg">arg:arguments</argument>
129                                </request>
130                                <!-\- update the user info -\->
131                                <request>
132                                        <identifier>active:org.basex.query</identifier>
133                                        <argument name="operator">
134                                                <literal type="xml">
135                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
136                                                                let $user :=
137                                                                element user { attribute xml:id {$user-id}, element principal
138                                                                {$principal}, element displayName {$display-name}, $roles }
139                                                                return replace node /sc:users/sc:user[@xml:id eq '$user-id'] with $user
140                                                                </query>
141                                                </literal>
142                                        <!-\-   replace value of node /sc:users/sc:user[@xml:id eq '$user-id']/sc:$field with '$new-value' -\->
143                                        </argument>
144                                        <argument name="user-id">arg:user-id</argument>
145                                        <argument name="principal">arg:principal</argument>
146                                        <argument name="display-name">arg:display-name</argument>
147                                        <argument name="roles">this:roles</argument>
148                                </request>
149                                <literal assignment="response" type="boolean">true</literal>
150                                <log>
151                                        <level>INFO</level>
152                                        <message>
153                                                <literal type="string">Updated user for principal: [%1]</literal>
154                                        </message>
155                                        <param>arg:principal</param>
156                                </log>
157                        </sequence>
158                </then>-->
159                <cond>
160                        <request>
161                                <identifier>active:sloot.xpath2</identifier>
162                                <argument name="operand">arg:verb</argument>
163                                <argument name="operator">
164                                        <literal type="string">boolean(.='EXISTS')</literal>
165                                </argument>
166                        </request>
167                </cond>
168                <then>
169                        <!-- check if the user exists in the database -->
170                        <!-- TODO: do we always search by principal? also support the user/@xml:id pattern 'u[0-9]+', which is unlikely(?) to clash with the principal? -->
171                        <request>
172                                <identifier>active:org.basex.booleanQuery</identifier>
173                                <argument name="operator">
174                                        <literal type="xml">
175                                                <query xmlns:sc="http://www.isocat.org/ns/schemacat">
176                                                        <b>{exists(//sc:user[sc:principal=$principal])}</b>
177                                                </query>
178                                        </literal>
179                                </argument>
180                                <argument name="principal">arg:principal</argument>
181                        </request>
182                </then>
183                <cond>
184                        <request>
185                                <identifier>active:sloot.xpath2</identifier>
186                                <argument name="operand">arg:verb</argument>
187                                <argument name="operator">
188                                        <literal type="string">boolean(.='SOURCE')</literal>
189                                </argument>
190                        </request>
191                </cond>
192                <then>
193                        <!-- get the user information -->
194                        <sequence>
195                                <request assignment="res">
196                                        <identifier>active:org.basex.query</identifier>
197                                        <argument name="operator">
198                                                <literal type="xml">
199                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
200                                                                <sc:user>{(//sc:user[sc:principal=$principal]/@*,//sc:user[sc:principal=$principal]/*)}</sc:user>
201                                                        </query>
202                                                </literal>
203                                        </argument>
204                                        <argument name="principal">arg:principal</argument>
205                                </request>
206                                <!-- pass the document returned by basex trough sloot.xpath2 so
207                                when we log the response (end of this dpml) the actual user
208                                document is logged instead of the value of its pointer!-->
209                                <request assignment="response">
210                                        <identifier>active:sloot.xpath2</identifier>
211                                        <argument name="operand">this:res</argument>
212                                        <argument name="operator">
213                                                <literal type="xml">
214                                                        <dummy>.</dummy>
215                                                </literal>
216                                        </argument>
217                                </request>
218
219                                <!--    AAM: it would be better  to use sloot.xquery instead of sloot.xpath2
220                for instance to log the user document in its own line. However using it
221                causes a type mismatch in findUser.dpml since sloot.xquery does not seem
222                to return an element of type "document" as expected by findUser.dpml
223               
224                                        <request assignment="response">
225                                        <identifier>active:sloot.xquery</identifier>
226                                        <argument name="operator">
227                                                <literal type="xml"><dummy>{$NL}{$doc}{$NL}</dummy></literal>
228                                        </argument>
229                                        <argument name="NL">
230                                                <literal type="string">
231</literal>
232                                        </argument>
233                                        <argument name="doc">this:res</argument>
234                                </request>-->
235
236                        </sequence>
237                </then>
238                <otherwise>
239                        <throw>
240                                <id>
241                                        <literal type="string">UNSUPPORTED_NK_VERB</literal>
242                                </id>
243                                <message>
244                                        <literal type="string">org.isocat.schemacat.data.user: unsupported verb!</literal>
245                                </message>
246                        </throw>
247                </otherwise>
248        </switch>
249        <sloot-debug>
250                <log>
251                        <level>INFO</level>
252                        <message>
253                                <literal type="string">user accessor response: [%1]</literal>
254                        </message>
255                        <param>this:response</param>
256                </log>
257                <request>
258                        <verb>SINK</verb>
259                        <identifier>res:/debug/org.isocat.schemacat.access.data.user.result.xml</identifier>
260                        <argument name="primary">this:response</argument>
261                </request>
262        </sloot-debug>
263</sequence>
Note: See TracBrowser for help on using the repository browser.