Advertisement
Guest User

Untitled

a guest
Jan 30th, 2014
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
XML 5.84 KB | None | 0 0
  1. xquery version "3.0";
  2.  
  3. declare function local:object.new($xml-fragment as item())
  4. {
  5.     let $clone := $xml-fragment                                                             (: fragment passed by value ? :)
  6.     (: util:deep-copy($xml-fragment) :)                                                     (: TODO -- necessary? :)
  7.  
  8.     return map:new
  9.     (
  10.         (
  11.             map:entry("__id", util:uuid()),
  12.             map:entry("__hash", util:hash($clone,'MD5')),                                  
  13.             map:entry("__object", $clone),
  14.            
  15.             map:entry
  16.             (
  17.                 "valid()",
  18.                 (
  19.                     element description { 'Ensures that the internal hash matches that of the embedded object.' },
  20.                     function($function) { inspect:inspect-function($function) },
  21.                     function($map as map) as xs:boolean { $map("__hash") eq util:hash($map("__object"),'MD5') }
  22.                 )
  23.             ),
  24.             map:entry
  25.             (
  26.                 "id()",
  27.                 (
  28.                     element description { 'Returns the identifier for this object.' },
  29.                     function($function) { inspect:inspect-function($function) },
  30.                     function($map as map) as xs:string { $map("__id") }
  31.                 )
  32.             ),
  33.            
  34.            
  35.             for $object at $pos in $clone//*[@type/string() eq "object"]      (:TODO:)      (: store each found object into map :)
  36.             return
  37.             (
  38.                 map:entry
  39.                 (
  40.                     (:if($object/@name) then $object/@name/string() else $pos,:)            (: BUG -- line throws exception on map value retrieval :)
  41.                     $object/@name/string() || $pos,                                         (: assign map key :)
  42.                     util:node-id($object)                                                   (: store the node-id as map value :)
  43.                 )
  44.             )
  45.         )
  46.     )
  47. };
  48.  
  49. declare function local:object.get($object, $property-name)
  50. {
  51.     if(map:contains($object, $property-name))
  52.     then util:node-by-id($object("__object"), $object($property-name))
  53.     else error(QName('http://haptixgames.com/err', 'PropertyNotFound'), $property-name || ' not found.')
  54. };
  55.  
  56. declare function local:object.call($object, $method-name)
  57. {
  58.     local:object.call($object, $method-name, $object)
  59. };
  60.  
  61. declare function local:object.call($object, $method-name, $arguments)
  62. {
  63.     if(map:contains($object, $method-name))
  64.     then $object($method-name)[3]($arguments)
  65.     else error(QName('http://haptixgames.com/err', 'MethodNotFound'), $method-name || ' not found.')
  66. };
  67.  
  68. declare function local:object.inspect($object)
  69. {
  70.     element object.inspect
  71.     {
  72.         element internals
  73.         {
  74.             for $key in map:keys($object)  
  75.             where starts-with($key, "__") and $key ne '__object'    
  76.             order by $key ascending
  77.             return element { replace($key, "__", "") } { $object($key) }
  78.         },
  79.         element methods
  80.         {
  81.             for $key in map:keys($object)                                                      
  82.             where ends-with($key, "()")                        
  83.             order by $key ascending
  84.             return
  85.             (
  86.                 element method
  87.                 {
  88.                     element name { $key },
  89.                     element description { $object($key)[1]/text() },
  90.                     element signature
  91.                     {
  92.                         let $method := $object($key)
  93.                         return $method[2]($method[3])/*
  94.                     }
  95.                 }
  96.             )
  97.         },
  98.         element properties
  99.         {
  100.             for $key in map:keys($object)                                                      
  101.             where not(starts-with($key, "__")) and not(ends-with($key, "()"))                        
  102.             order by $key ascending
  103.             return
  104.             (
  105.                 element property
  106.                 {
  107.                     element name { $key },                                                      (: show the key :)
  108.                     element node-id { $object($key) },                                              (: show the value which is the node-id :)
  109.                     element node { util:node-by-id($object("__object"), $object($key)) }            (: turn the node-id into a node using the stored fragment :)
  110.                 }
  111.             )
  112.         }
  113.     }
  114. };
  115.  
  116.  
  117. let $xml :=
  118.     <json type="object">
  119.         <pair name="firstName" type="string">John</pair>
  120.         <pair name="lastName" type="string">Smith</pair>
  121.         <pair name="age" type="number">25</pair>
  122.         <pair name="address" type="object">
  123.             <pair name="streetAddress" type="string">21 2nd Street</pair>
  124.             <pair name="city" type="string">New York</pair>
  125.             <pair name="state" type="string">NY</pair>
  126.             <pair name="postalCode" type="number">10021</pair>
  127.             <pair name="alive" type="boolean">true</pair>
  128.         </pair>
  129.         <pair name="phoneNumbers" type="array">
  130.             <item type="object">
  131.                 <pair name="type" type="string">home</pair>
  132.                 <pair name="number" type="string">212 555-1234</pair>
  133.             </item>
  134.             <item type="object">
  135.                 <pair name="type" type="string">fax</pair>
  136.                 <pair name="number" type="string">646 555-4567</pair>
  137.             </item>
  138.         </pair>
  139.     </json>
  140.    
  141. let $object := local:object.new($xml)
  142.  
  143. let $xml := <nothing><more/><to/><see/><here/></nothing>
  144.  
  145. return
  146.     (
  147.         local:object.inspect($object),
  148.         local:object.get($object, "address1"),
  149.         local:object.call($object, "valid()"),
  150.         local:object.call($object, "id()")
  151.     )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement