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

Last change on this file since 4577 was 4577, checked in by andmor, 10 years ago

User principal made case insensitive.

File size: 12.6 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:sloot.dpml.resolve-arguments</identifier>
13                <argument name="primary">arg:arguments</argument>
14        </request>
15        <sloot-debug>
16                <request>
17                        <verb>SINK</verb>
18                        <identifier>res:/debug/org.isocat.schemacat.access.data.user.resolved-arguments.xml</identifier>
19                        <argument name="primary">this:arguments</argument>
20                </request>
21                <log>
22                        <level>INFO</level>
23                        <message>
24                                <literal type="string">[access.data] User accessor verb: [%1] with arguments:&#10;[&#10;%2]</literal>
25                        </message>
26                        <param>arg:verb</param>
27                        <param>
28                                <request>
29                                        <identifier>log-args-string</identifier>
30                                        <verb>TRANSREPT</verb>
31                                        <representation>java.lang.String</representation>
32                                        <argument name="primary">
33                                                <request>
34                                                        <identifier>active:saxonSerialize</identifier>
35                                                        <argument name="operand">this:arguments</argument>
36                                                        <argument name="operator">
37                                                                <literal type="xml">
38                                                                        <serialize>
39                                                                                <indent>yes</indent>
40                                                                                <encoding>UTF-8</encoding>
41                                                                                <omit-declaration>yes</omit-declaration>
42                                                                                <method>xml</method>
43                                                                        </serialize>
44                                                                </literal>
45                                                        </argument>
46                                                </request>
47                                                <!-- it is possible to use a direct transrept of "this:arguments" instead. However, "active:saxonSerialize"
48                                                                allows us to indent the serialization and to omit the xml declaration -->
49                                                <!--<request>
50                                                        <identifier>log-args-binary-stream</identifier>
51                                                        <verb>TRANSREPT</verb>
52                                                        <representation>org.netkernel.layer0.representation.IReadableBinaryStreamRepresentation</representation>
53                                                        <argument name="primary">this:arguments</argument>
54                                                </request>-->
55                                        </argument>
56                                </request>
57                        </param>
58                </log>
59        </sloot-debug>
60        <switch assignment="response">
61                <cond>
62                        <request>
63                                <identifier>active:sloot.xpath2</identifier>
64                                <argument name="operand">arg:verb</argument>
65                                <argument name="operator">
66                                        <literal type="string">boolean(.='NEW')</literal>
67                                </argument>
68                        </request>
69                </cond>
70                <then>
71                        <sequence>
72                                <!-- compute the id for the new user -->
73                                <request assignment="new-user-id">
74                                        <identifier>active:sloot.generateUUID</identifier>
75                                </request>
76                                <!-- create the new user by running the query-->
77                                <request assignment="response">
78                                        <identifier>active:org.basex.query</identifier>
79                                        <argument name="operator">
80                                                <literal type="xml">
81                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
82                                                                let $old-user := /sc:users/*:user[@xml:id = $new-user-id or *:principal = $args/principal/text()],
83                                                                        $new-user := element sc:user { attribute xml:id {$new-user-id}, element sc:principal {$args/principal/text()},
84                                                                        if(exists($args/display-name/text())) then
85                                                                                element sc:displayName {$args/display-name/text()}
86                                                                        else (),
87                                                                        for $email in $args/email return
88                                                                                element sc:email {$email/text()},
89                                                                        for $role in $args/role return
90                                                                                element sc:role {$role/text()}}
91                                                                        return
92                                                                                if (empty($old-user)) then
93                                                                                        (db:output(element sc:response {attribute success {'true'}, element sc:written-data {$new-user}}), insert node $new-user into /sc:users)
94                                                                                else
95                                                                                        (error(xs:QName('sc:uniqueUser'),'There exists already an user with this id or principal!'))
96                                                        </query>
97                                                </literal>
98                                        </argument>
99                                        <argument name="args">this:arguments</argument>
100                                        <argument name="new-user-id">this:new-user-id</argument>
101                                </request>
102                                <!-- Cut the golden threads of the updated resources-->
103                                <request>
104                                        <identifier>active:cutGoldenThread</identifier>
105                                        <argument name="id">userCache</argument>
106                                </request>
107                                <request>
108                                        <identifier>active:cutGoldenThread</identifier>
109                                        <argument name="id">usersCache</argument>
110                                </request>
111                                <log>
112                                        <level>INFO</level>
113                                        <message>
114                                                <literal type="string">[access.data] Created user account with id: [%1] and principal: [%2]&#10;New user data:&#10;[&#10;%3:&#10;]</literal>
115                                        </message>
116                                        <param>this:new-user-id</param>
117                                        <param>arg:principal</param>
118                                        <param>
119                                                <request>
120                                                        <identifier>response-string</identifier>
121                                                        <verb>TRANSREPT</verb>
122                                                        <representation>java.lang.String</representation>
123                                                        <argument name="primary">this:response</argument>
124                                                </request>
125                                        </param>
126                                </log>
127                        </sequence>
128                </then>
129                <cond>
130                        <request>
131                                <identifier>active:sloot.xpath2</identifier>
132                                <argument name="operand">arg:verb</argument>
133                                <argument name="operator">
134                                        <literal type="string">boolean(.='SINK')</literal>
135                                </argument>
136                        </request>
137                </cond>
138                <then>
139                        <sequence>
140                                <!-- update the user info -->
141                                <request assignment="response">
142                                        <identifier>active:org.basex.query</identifier>
143                                        <argument name="operator">
144                                                <literal type="xml">
145                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
146                                                                let $oldUser := /sc:users/sc:user[(@xml:id eq $args/id) or (sc:principal eq $args/principal)],
147                                                                $newUser :=
148                                                                        element sc:user {
149                                                                                if(exists($args/id)) then
150                                                                                        attribute xml:id {$args/id}
151                                                                                else
152                                                                                        attribute xml:id {$oldUser/@xml:id},
153                                                                                if(exists($args/principal/text())) then
154                                                                                        element sc:principal {$args/principal/text()}
155                                                                                else
156                                                                                        $oldUser/sc:principal,
157                                                                                if(exists($args/display-name/text())) then
158                                                                                        element sc:displayName {$args/display-name/text()}
159                                                                                else
160                                                                                        $oldUser/sc:displayName,
161                                                                                if(exists($args/email/text())) then
162                                                                                        for $email in $args/email return
163                                                                                                element sc:email {$email/text()}
164                                                                                else
165                                                                                        $oldUser/sc:email,
166                                                                                if(exists($args/role/text())) then
167                                                                                        for $role in $args/role return
168                                                                                                element sc:role {$role/text()}
169                                                                                else
170                                                                                        $oldUser/sc:role                                                               
171                                                                                }
172                                                                        return
173                                                                                if (empty($oldUser)) then
174                                                                                        (error(xs:QName('sc:nonExistingUser'),'User matching specified id or principal not found!'))
175                                                                                else
176                                                                                        (db:output(element sc:response {attribute success {'true'}, element sc:written-data {$newUser}}), replace node /sc:users/sc:user[(@xml:id eq $args/id) or (sc:principal eq $args/principal)] with $newUser)
177                                                                </query>
178                                                </literal>
179                                        </argument>
180                                        <argument name="args">this:arguments</argument>
181                                </request>
182                                <!-- Cut the golden threads of the updated resources-->
183                                <request>
184                                        <identifier>active:cutGoldenThread</identifier>
185                                        <argument name="id">userCache</argument>
186                                </request>
187                                <request>
188                                        <identifier>active:cutGoldenThread</identifier>
189                                        <argument name="id">usersCache</argument>
190                                </request>                     
191                                <if>
192                                        <cond>
193                                                <request>
194                                                        <identifier>arg:id</identifier>
195                                                        <verb>EXISTS</verb>
196                                                </request>
197                                        </cond>
198                                        <then>
199                                                <sequence>
200                                                        <request assignment="user-identifier-value">
201                                                                <identifier>arg:id</identifier>
202                                                        </request>
203                                                        <literal assignment="user-identifier-field" type="string">id</literal>
204                                                </sequence>
205                                        </then>
206                                        <else>
207                                                <sequence>
208                                                        <request assignment="user-identifier-value">
209                                                                <identifier>arg:principal</identifier>
210                                                        </request>
211                                                        <literal assignment="user-identifier-field" type="string">principal</literal>
212                                                </sequence>
213                                        </else>
214                                </if>
215                                <log>
216                                        <level>INFO</level>
217                                        <message>
218                                                <literal type="string">[access.data] Updated user account with %1: [%2]&#10;Updated data:&#10;[&#10;%3&#10;]</literal>
219                                        </message>
220                                        <param>this:user-identifier-field</param>
221                                        <param>this:user-identifier-value</param>
222                                        <param>
223                                                <request>
224                                                        <identifier>response-string</identifier>
225                                                        <verb>TRANSREPT</verb>
226                                                        <representation>java.lang.String</representation>
227                                                        <argument name="primary">this:response</argument>
228                                                </request>
229                                        </param>
230                                </log>
231                        </sequence>
232                </then>
233                <cond>
234                        <request>
235                                <identifier>active:sloot.xpath2</identifier>
236                                <argument name="operand">arg:verb</argument>
237                                <argument name="operator">
238                                        <literal type="string">boolean(.='EXISTS')</literal>
239                                </argument>
240                        </request>
241                </cond>
242                <then>
243                        <sequence>
244                                <!-- check if the user exists in the database -->
245                                <request assignment="response">
246                                        <identifier>active:org.basex.booleanQuery</identifier>
247                                        <argument name="operator">
248                                                <literal type="xml">
249                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
250                                                                <b>{exists((//sc:user[@xml:id=$args//id],//sc:user[lower-case(sc:principal)=lower-case($args//principal)]))}</b>
251                                                        </query>
252                                                </literal>
253                                        </argument>
254                                        <argument name="args">this:arguments</argument>
255                                </request>
256                        </sequence>
257                </then>
258                <cond>
259                        <request>
260                                <identifier>active:sloot.xpath2</identifier>
261                                <argument name="operand">arg:verb</argument>
262                                <argument name="operator">
263                                        <literal type="string">boolean(.='SOURCE')</literal>
264                                </argument>
265                        </request>
266                </cond>
267                <then>
268                        <!-- get the user information -->
269                        <sequence>
270                                <exception assignment="requester-user-id">
271                                        <try>
272                                                <sequence>
273                                                        <request>
274                                                                <!-- requesting scratch:user in here seems expire this response -->
275                                                                <header name="exclude-dependencies">
276                                                                        <literal type="boolean">true</literal>
277                                                                </header>
278                                                                <identifier>scratch:user</identifier>
279                                                        </request>
280                                                        <request assignment="response">
281                                                                <identifier>active:xpath2</identifier>
282                                                                <argument name="operand">
283                                                                        <request>
284                                                                                <header name="exclude-dependencies">
285                                                                                        <literal type="boolean">true</literal>
286                                                                                </header>
287                                                                                <identifier>this:requester-user</identifier>
288                                                                        </request>
289                                                                </argument>
290                                                                <argument name="operator">
291                                                                        <literal type="string">string(/sc:user/@xml:id)</literal>
292                                                                </argument>
293                                                        </request>
294                                                </sequence>
295                                        </try>
296                                        <catch>
297                                                <literal type="string">unknown</literal>
298                                        </catch>
299                                </exception>
300                                <if>
301                                        <cond>
302                                                <request>
303                                                        <header name="exclude-dependencies">
304                                                                <literal type="boolean">true</literal>
305                                                        </header>
306                                                        <verb>EXISTS</verb>
307                                                        <identifier>arg:id</identifier>
308                                                </request>
309                                        </cond>
310                                        <then>
311                                                <log>
312                                                        <level>INFO</level>
313                                                        <message>
314                                                                <literal type="string">[access.data] [%1] requested user resource with id: [%2]</literal>
315                                                        </message>
316                                                        <param>this:requester-user-id</param>
317                                                        <param>arg:id</param>
318                                                </log>
319                                        </then>
320                                        <sloot-debug>
321                                                <else>
322                                                        <log>
323                                                                <level>INFO</level>
324                                                                <message>
325                                                                        <literal type="string">[access.data] [%1] requested user resource with principal: [%2]</literal>
326                                                                </message>
327                                                                <param>this:requester-user-id</param>
328                                                                <param>arg:principal</param>
329                                                        </log>
330                                                </else>
331                                        </sloot-debug>
332                                </if>
333                                <request assignment="response">
334                                        <header name="exclude-dependencies">
335                                                <literal type="boolean">true</literal>
336                                        </header>
337                                        <identifier>active:org.basex.query</identifier>
338                                        <argument name="operator">
339                                                <literal type="xml">
340                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
341                                                                <sc:user>{
342                                                                        let $user := exactly-one((//sc:user[@xml:id=$args//id],//sc:user[lower-case(sc:principal)=lower-case($args//principal)]))
343                                                                        return ($user/@*,$user/*)
344                                                                        }</sc:user>
345                                                        </query>
346                                                </literal>
347                                        </argument>
348                                        <argument name="args">this:arguments</argument>
349                                </request>
350                        </sequence>
351                </then>
352                <otherwise>
353                        <throw>
354                                <id>
355                                        <literal type="string">UNSUPPORTED_NK_VERB</literal>
356                                </id>
357                                <message>
358                                        <literal type="string">org.isocat.schemacat.access.data.user: unsupported verb!</literal>
359                                </message>
360                        </throw>
361                </otherwise>
362        </switch>
363        <request>
364                <identifier>active:attachGoldenThread</identifier>
365                <argument name="id">userCache</argument>
366        </request>
367        <sloot-debug>
368                <log>
369                        <level>INFO</level>
370                        <message>
371                                <literal type="string">[access.data] User accessor response: [%1]</literal>
372                        </message>
373                        <param>
374                                <request>
375                                        <identifier>response-string</identifier>
376                                        <verb>TRANSREPT</verb>
377                                        <representation>java.lang.String</representation>
378                                        <argument name="primary">this:response</argument>
379                                </request>
380                        </param>
381                </log>
382                <request>
383                        <verb>SINK</verb>
384                        <identifier>res:/debug/org.isocat.schemacat.access.data.user.result.xml</identifier>
385                        <argument name="primary">this:response</argument>
386                </request>
387        </sloot-debug>
388</sequence>
Note: See TracBrowser for help on using the repository browser.