root/trunk/projects/bos/m2/warm-kml-cache.lisp

Revision 3656, 5.8 kB (checked in by ksprotte, 4 months ago)

whitespace cleanup

Line 
1 (in-package :cl-user)
2
3 (defun warm-kml-cache (host)
4   (labels
5       ((find-links-in-xml (node)
6          (when (listp node)
7            (if (equal (cxml-xmls:node-name node) "href")
8                (analyze-href (car (cxml-xmls:node-children node)))
9                (mapc #'find-links-in-xml (cxml-xmls:node-children node)))))
10        (analyze-href (url)
11          (print url)
12          (multiple-value-bind (content status-code headers)
13              (drakma:http-request url)
14            (declare (ignore status-code))
15            (when (find (first (cl-ppcre:split "; *" (cdr (assoc :content-type headers))))
16                        (list "text/xml" "application/vnd.google-earth.kml+xml")
17                        :test #'string-equal)
18              (find-links-in-xml (cxml:parse content (cxml-xmls:make-xmls-builder)))))))
19     (let ((drakma:*text-content-types* '(("text" . "nil")
20                                          ("application" . "vnd.google-earth.kml+xml"))))
21       (analyze-href (make-instance 'puri:uri
22                                    :scheme :http
23                                    :host host
24                                    :path "/kml-root")))))
25
26
27 (defvar *parent-region*)
28 (defvar *parent-link*)
29 (defun kml-test (host &optional (path "/kml-root"))
30   (labels
31       ((find-links-in-xml (node)
32          (when (listp node)
33            (if (equal (cxml-xmls:node-name node) "href")
34                (analyze-kml (car (cxml-xmls:node-children node)))
35                (mapc #'find-links-in-xml (cxml-xmls:node-children node)))))
36        (find-child (name node)
37          (when (listp node)
38            (if (equal (cxml-xmls:node-name node) name)
39                node
40                (some #'(lambda (child) (find-child name child)) (cxml-xmls:node-children node)))))
41        (lispify-region (node)
42          (assert (equal "Region" (cxml-xmls:node-name node)))
43          (assert (equal "LatLonAltBox" (cxml-xmls:node-name (first (cxml-xmls:node-children node)))))
44          (assert (equal "Lod" (cxml-xmls:node-name (second (cxml-xmls:node-children node)))))
45          (let ((*read-default-float-format* 'double-float)
46                (lat-lon-alt-box (first (cxml-xmls:node-children node))))
47            (list
48             (read-from-string (third (assoc "north" (cxml-xmls:node-children lat-lon-alt-box) :test #'equal)))
49             (read-from-string (third (assoc "south" (cxml-xmls:node-children lat-lon-alt-box) :test #'equal)))
50             (read-from-string (third (assoc "west" (cxml-xmls:node-children lat-lon-alt-box) :test #'equal)))
51             (read-from-string (third (assoc "east" (cxml-xmls:node-children lat-lon-alt-box) :test #'equal))))))
52        (region-inside-p (parent region)
53          (destructuring-bind (parent-north parent-south parent-west parent-east) parent
54            (destructuring-bind (region-north region-south region-west region-east) region
55              (and (<= region-north parent-north) ; negative degrees
56                   (>= region-south parent-south) ; negative degrees
57                   (>= region-west parent-west)
58                   (<= region-east parent-east)))))
59        (describe-region-not-inside (parent region)
60          (with-output-to-string (*standard-output*)
61            (destructuring-bind (parent-north parent-south parent-west parent-east) parent
62              (destructuring-bind (region-north region-south region-west region-east) region
63                (when (not (<= region-north parent-north))
64                  (format t "not (<= region-north parent-north)~%"))
65                (when (not (>= region-south parent-south))
66                  (format t "not (>= region-south parent-south)~%"))
67                (when (not (>= region-west parent-west))
68                  (format t "not (>= region-west parent-west)~%"))
69                (when (not (<= region-east parent-east))
70                  (format t "not (<= region-east parent-east)~%"))))))
71        (analyze-kml (url &optional expected-region)
72          (print url)
73          (multiple-value-bind (content status-code)
74              (drakma:http-request (format nil "~A?lang=de" url))
75            (declare (ignore status-code))
76            (let ((*parent-link* url))
77              (analyze-node (cxml:parse content (cxml-xmls:make-xmls-builder)) expected-region))))
78        (analyze-children (node)
79          (mapc #'analyze-node (cxml-xmls:node-children node)))
80        (analyze-node (node &optional expected-region)
81          (when (listp node)
82            (when expected-region
83              (assert (equal expected-region (lispify-region (find-child "Region" node)))))
84            ;; (print (cxml-xmls:node-name node))
85            (arnesi:switch ((cxml-xmls:node-name node) :test #'equal)
86              ("NetworkLink"
87               (let ((region (find-child "Region" node))
88                     (link (find-child "Link" node)))
89                 (assert region)
90                 (assert link)
91                 (print (lispify-region region))
92                 (print 'region-inside-p)
93                 (assert (region-inside-p *parent-region* (lispify-region region)) nil
94                         "region of ~s is not inside region of ~s~%~S~%~S~%REASON:~%~A" (third (find-child "href" link)) *parent-link*
95                         (lispify-region region) *parent-region*
96                         (describe-region-not-inside *parent-region* (lispify-region region)))
97                 (analyze-kml (third (find-child "href" link)) (lispify-region region))))
98              ("kml"
99               (print 'hu)
100               (let ((region (find-child "Region" node)))
101                 (assert region)
102                 (let ((*parent-region* (lispify-region region)))
103                   (analyze-children node))))
104              (t (analyze-children node))))))
105     (analyze-kml (make-instance 'puri:uri
106                                 :scheme :http
107                                 :host host
108                                 :path path))
109     t))
Note: See TracBrowser for help on using the browser.