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

Last change on this file since 3379 was 3379, checked in by mwindhouwer, 11 years ago

M urn.org.basex.rest/rest/query.dpml

  • can now also handle variables with XML values
  • looks in the BaseX result to see if there was an error message, if so turn that info an exception

M data*

  • use the sc prefix for the SCHEMAcat namespace everywhere

M urn.org.isocat.schemacat.access.data/test/testlist.xml

  • added tests for user data management

M urn.org.isocat.schemacat.access.data/access/user.dpml

  • EXISTS and SOURCE work with id or principal
  • NEW works
  • TODO: SINK

M urn.org.isocat.schemacat.access.data/debug

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