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

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

Added resource endpoint (SOURCE and SINK verbs) for the user IDs authorized to access a schema.
Data layer cache reviewed due to new SINK call.
Improved log messages when SINK or NEW verbs are called on the 'user' resource.

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[sc:principal=$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[sc:principal=$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.