Changeset 3955


Ignore:
Timestamp:
11/06/13 17:44:28 (11 years ago)
Author:
andmor
Message:

Better code to handle NEW and SINK requests to user.dpml
Added golden thread pattern to invalidate user-related resources after a NEW or SINK request to user.dpml

Location:
cats/SCHEMAcat/trunk/urn.org.isocat.schemacat.access.data/access
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cats/SCHEMAcat/trunk/urn.org.isocat.schemacat.access.data/access/user.dpml

    r3873 r3955  
    2525                        </message>
    2626                        <param>arg:verb</param>
    27                         <param>this:arguments</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>
    2858                </log>
    2959        </sloot-debug>
     
    4474                                        <identifier>active:sloot.generateUUID</identifier>
    4575                                </request>
    46                                 <!-- compute the query string for creating a new user -->
    47                                 <request assignment="new-user-query">
    48                                         <identifier>active:xslt2</identifier>
    49                                         <argument name="operand">
    50                                                 <literal type="xml">
    51                                                         <dummy/>
    52                                                 </literal>
    53                                         </argument>
     76                                <!-- create the new user by running the query-->
     77                                <request assignment="response">
     78                                        <identifier>active:org.basex.query</identifier>
    5479                                        <argument name="operator">
    5580                                                <literal type="xml">
    56                                                         <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    57                                                                 version="2.0" xmlns:rest="http://basex.org/rest" xmlns:sloot="http://www.isocat.org/ns/sloot">
    58                                                                 <xsl:import href="active:sloot.xquery.escape"/>
    59                                                                 <xsl:param name="vararg"/>
    60                                                                 <xsl:template match="/">
    61                                                                         <query xmlns:sc="http://www.isocat.org/ns/schemacat">
    62                                                                                 <xsl:text>let $old-user := /sc:users/*:user[@xml:id = $new-user-id or *:principal = '</xsl:text>
    63                                                                                 <xsl:value-of select="sloot:escape-xquery($vararg/arguments/principal)"/>
    64                                                                                 <xsl:text>'], $new-user := element sc:user { attribute xml:id {$new-user-id}, element sc:principal {'</xsl:text>
    65                                                                                 <xsl:value-of select="sloot:escape-xquery($vararg/arguments/principal)"/>
    66                                                                                 <xsl:text>'}, element sc:displayName {'</xsl:text>
    67                                                                                 <xsl:value-of select="sloot:escape-xquery($vararg/arguments/display-name)"/>
    68                                                                                 <xsl:text>'}</xsl:text>
    69                                                                                 <xsl:for-each
    70                                                                                         select="$vararg/arguments/*[name() eq 'email']">
    71                                                                                         <xsl:text>, element sc:email {'</xsl:text>
    72                                                                                         <xsl:value-of select="sloot:escape-xquery(.)"/>
    73                                                                                         <xsl:text>'}</xsl:text>
    74                                                                                 </xsl:for-each>
    75                                                                                 <!-- trying to use various roles. This reads the right number of roles passed but all their values resolve to
    76                                                                                 the first one passed!!!
    77                                                                                 If this work same can be used for emails -->
    78                                                                                 <xsl:for-each select="$vararg/arguments/*[name() eq 'role']">
    79                                                                                         <xsl:text>, element sc:role {'</xsl:text>
    80                                                                                         <xsl:value-of select="sloot:escape-xquery(.)"/>
    81                                                                                         <xsl:text>'}</xsl:text>
    82                                                                                 </xsl:for-each>
    83                                                                                 <xsl:text>} return
    84                                                                                         if (empty($old-user))
    85                                                         then (insert node $new-user into /sc:users)
    86                                                         else (error(xs:QName('sc:uniqueUser'),'There exists already an user with this id or principal!'))</xsl:text>
    87                                                                         </query>
    88                                                                 </xsl:template>
    89                                                         </xsl:stylesheet>
     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($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>
    9097                                                </literal>
    9198                                        </argument>
    92                                         <argument name="vararg">this:arguments</argument>
    93                                 </request>
    94                                 <sloot-debug>
    95                                         <request>
    96                                                 <verb>SINK</verb>
    97                                                 <identifier>res:/debug/org.isocat.schemacat.access.data.user.new.query.xml</identifier>
    98                                                 <argument name="primary">this:new-user-query</argument>
    99                                         </request>
    100                                 </sloot-debug>
    101                                 <!-- create the new user by running the query-->
    102                                 <request>
    103                                         <identifier>active:org.basex.query</identifier>
    104                                         <argument name="operator">this:new-user-query</argument>
     99                                        <argument name="args">this:arguments</argument>
    105100                                        <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>
    106110                                </request>
    107111                                <log>
     
    113117                                        <param>arg:principal</param>
    114118                                </log>
    115                                 <request assignment="response">
    116                                         <identifier>this:new-user-id</identifier>
    117                                 </request>
    118119                        </sequence>
    119120                </then>
     
    129130                <then>
    130131                        <sequence>
    131                                 <!-- build the 'roles' element for the user -->
    132                                 <request assignment="roles">
    133                                         <identifier>active:xslt2</identifier>
    134                                         <argument name="operand">
    135                                                 <literal type="xml">
    136                                                         <dummy></dummy>
    137                                                 </literal>
    138                                         </argument>
    139                                         <argument name="operator">
    140                                                 <literal type="xml">
    141                                                         <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
    142                                                         xmlns:rest="http://basex.org/rest">
    143                                                                 <xsl:param name="vararg"/>
    144                                                                 <xsl:template match='/'>
    145                                                                         <xsl:for-each select="$vararg/arguments/*[name() eq 'role']">
    146                                                                                 <xsl:text>element role {'</xsl:text>
    147                                                                                 <xsl:value-of select="."/>
    148                                                                                 <xsl:text>'}</xsl:text>
    149                                                                                 <xsl:if test='position()!=last()'>,</xsl:if>
    150                                                                         </xsl:for-each>
    151                                                                 </xsl:template>
    152                                                         </xsl:stylesheet>
    153                                                 </literal>
    154                                         </argument>
    155                                         <argument name="vararg">this:arguments</argument>
    156                                 </request>
    157132                                <!-- update the user info -->
    158                                 <request>
     133                                <request assignment="response">
    159134                                        <identifier>active:org.basex.query</identifier>
    160135                                        <argument name="operator">
    161136                                                <literal type="xml">
    162137                                                        <query xmlns:sc="http://www.isocat.org/ns/schemacat">
    163                                                                 let $user :=
    164                                                                 element user { attribute xml:id {$args//id}, element principal
    165                                                                 {$args//principal}, element displayName {$args//display-name}, $roles }
    166                                                                 return replace node /sc:users/sc:user[(@xml:id eq '$args//id') or (sc:principal eq '$args//principal')] with $user
     138                                                                let $oldUser := /sc:users/sc:user[(@xml:id eq $args/id) or (sc:principal eq $args/principal)],
     139                                                                $newUser :=
     140                                                                        element sc:user {
     141                                                                                if(exists($args/id)) then
     142                                                                                        attribute xml:id {$args/id}
     143                                                                                else
     144                                                                                        attribute xml:id {$oldUser/@xml:id},
     145                                                                                if(exists($args/principal/text())) then
     146                                                                                        element sc:principal {$args/principal/text()}
     147                                                                                else
     148                                                                                        $oldUser/sc:principal,
     149                                                                                if(exists($args/display-name/text())) then
     150                                                                                        element sc:displayName {$args/display-name/text()}
     151                                                                                else
     152                                                                                        $oldUser/sc:displayName,
     153                                                                                if(exists($args/email/text())) then
     154                                                                                        for $email in $args/email return
     155                                                                                                element sc:email {$email/text()}
     156                                                                                else
     157                                                                                        $oldUser/sc:email,
     158                                                                                if(exists($args/role/text())) then
     159                                                                                        for $role in $args/role return
     160                                                                                                element sc:role {$role/text()}
     161                                                                                else
     162                                                                                        $oldUser/sc:role                                                               
     163                                                                                }
     164                                                                        return
     165                                                                                if (empty($oldUser)) then
     166                                                                                        (error(xs:QName('sc:nonExistingUser'),'User matching id or principal not found!'))
     167                                                                                else
     168                                                                                        (db:output($newUser), replace node /sc:users/sc:user[(@xml:id eq $args/id) or (sc:principal eq $args/principal)] with $newUser)
    167169                                                                </query>
    168170                                                </literal>
    169                                         <!--    replace value of node /sc:users/sc:user[@xml:id eq '$user-id']/sc:$field with '$new-value' -->
    170171                                        </argument>
    171172                                        <argument name="args">this:arguments</argument>
    172                                         <argument name="roles">this:roles</argument>
    173                                 </request>
    174                                 <literal assignment="response" type="boolean">true</literal>
     173                                </request>
     174                                <!-- Cut the golden threads of the updated resources-->
     175                                <request>
     176                                        <identifier>active:cutGoldenThread</identifier>
     177                                        <argument name="id">userCache</argument>
     178                                </request>
     179                                <request>
     180                                        <identifier>active:cutGoldenThread</identifier>
     181                                        <argument name="id">usersCache</argument>
     182                                </request>
    175183                                <log>
    176184                                        <level>INFO</level>
    177185                                        <message>
    178                                                 <literal type="string">[access.data] Updated user for principal: [%1]</literal>
     186                                                <literal type="string">[access.data] Updated user account for id: [%1]</literal>
    179187                                        </message>
    180                                         <param>arg:principal</param>
     188                                        <param>arg:id</param>
    181189                                </log>
    182190                        </sequence>
     
    287295                </otherwise>
    288296        </switch>
     297        <request>
     298                <identifier>active:attachGoldenThread</identifier>
     299                <argument name="id">userCache</argument>
     300        </request>
    289301        <sloot-debug>
    290302                <log>
     
    294306                        </message>
    295307                        <param>
    296                                 <!-- pass the response trough sloot.toString so the actual
    297                                 user document is logged instead of the value of its pointer!-->
    298                                 <request>
    299                                         <identifier>active:sloot.toString</identifier>
    300                                         <argument name="operand">this:response</argument>
     308                                <request>
     309                                        <identifier>response-string</identifier>
     310                                        <verb>TRANSREPT</verb>
     311                                        <representation>java.lang.String</representation>
     312                                        <argument name="primary">this:response</argument>
    301313                                </request>
    302314                        </param>
  • cats/SCHEMAcat/trunk/urn.org.isocat.schemacat.access.data/access/users.dpml

    r3873 r3955  
    3636                </argument>
    3737        </request>
     38        <request>
     39                <identifier>active:attachGoldenThread</identifier>
     40                <argument name="id">usersCache</argument>
     41        </request>
    3842        <sloot-debug>
    3943                <request>
Note: See TracChangeset for help on using the changeset viewer.