Changeset 2851

Show
Ignore:
Timestamp:
04/02/08 13:25:41 (9 months ago)
Author:
ksprotte
Message:

contract tree handler works fine

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/projects/bos/web/contract-tree.lisp

    r2849 r2851  
    2626(defclass contract-tree-node () 
    2727  ((id :accessor id) 
     28   (timestamp :accessor timestamp :initform (get-universal-time)) 
    2829   (geo-location :initarg :geo-location :reader geo-location) 
    2930   (children :initarg :children :reader children) 
     
    6667                           (pixelize 1) 
    6768                           (max-pixel-per-meter 5)) 
    68   (labels ((stick-on-last (list) 
     69  (labels ((ensure-square (rectangle) 
     70             (geometry:with-rectangle rectangle 
     71               (if (= width height) 
     72                   rectangle 
     73                   (let ((size (max width height))) 
     74                     (list left top size size))))) 
     75           (stick-on-last (list) 
    6976             (let* ((list (copy-list list)) 
    7077                    (last (last list))) 
     
    93100                         (incf safe-top h))) 
    94101                     (incf left w)))))) 
    95            (children-setf-root (node &optional root) 
     102           (children-setf-root (node root) 
    96103             (setf (root node) root) 
    97              (mapc #'(lambda (child) (children-setf-root child (if root root node))) (children node)) 
     104             (mapc #'(lambda (child) (children-setf-root child root)) (children node)) 
    98105             node) 
    99106           (setf-root-slots (root) 
     
    114121                              :pixelize (car pixelize))))) 
    115122    (let ((tree (rec (stick-on-last '(contract-tree contract-tree-node)) 
    116                      geo-location 
     123                     (ensure-square geo-location) 
    117124                     (stick-on-last (alexandria:ensure-list pixelize))))) 
    118       (setf-root-slots (children-setf-root tree))))) 
     125      (setf-root-slots (children-setf-root tree tree))))) 
    119126 
     127;;; handlers 
     128(defclass contract-tree-handler (object-handler) 
     129  () 
     130  (:documentation "A simple html inspector for contract-trees. Mainly 
     131  used for debugging.")) 
     132 
     133(defun img-contract-tree (object) 
     134  (html 
     135   ((:a :href (website-make-path *website* 
     136                                 (format nil "contract-tree/~d" (id object)))) 
     137    ((:img :src (website-make-path *website* 
     138                                   (format nil "contract-tree-image/~d" (id object)))))))) 
     139 
     140(defmethod object-handler-get-object ((handler contract-tree-handler)) 
     141  (let ((id (parse-url))) 
     142    (when id 
     143      (let ((object (find-contract-tree-node (parse-integer id)))) 
     144        (when (typep object 'contract-tree-node) 
     145          object))))) 
     146 
     147(defmethod handle-object ((contract-tree-handler contract-tree-handler) (object contract-tree-node)) 
     148  (with-bknr-page (:title (prin1-to-string object)) 
     149    (:pre 
     150     (:princ 
     151      (arnesi:escape-as-html 
     152       (with-output-to-string (*standard-output*) 
     153         (describe object))))) 
     154    (img-contract-tree object) 
     155    (when (root object) 
     156      (html 
     157       (:p 
     158        ((:a :href (website-make-path *website* 
     159                                      (format nil "contract-tree/~d" (id (root object))))) 
     160         "go to root")))) 
     161    ;; (:p "depth: " (:princ (depth object)) "lod-min:" (:princ (lod-min object)) "lod-max:" (:princ (lod-max object))) 
     162    (:table 
     163     (dolist (row (group-on (children object) :key #'(lambda (obj) (second (geo-location obj))) :include-key nil)) 
     164       (html (:tr 
     165              (dolist (child row) 
     166                (html (:td (img-contract-tree child)))))))) 
     167    )) 
     168 
     169(defclass contract-tree-image-handler (contract-tree-handler) 
     170  ()) 
     171 
     172(defmethod handle-object ((handler contract-tree-image-handler) (object contract-tree-node)) 
     173  (hunchentoot:handle-if-modified-since (timestamp object)) 
     174  (let ((image-size (output-images-size (root object)))) 
     175    (cl-gd:with-image (image image-size image-size t)       
     176      (draw-contract-image image image-size (geo-location object) (pixelize object)) 
     177      (emit-image-to-browser image :png :date (timestamp object))))) 
     178 
  • trunk/projects/bos/web/webserver.lisp

    r2775 r2851  
    203203                                        ("/image-tree-kml-latest" image-tree-kml-latest-handler) 
    204204                                        ("/image-tree-kml" image-tree-kml-handler)                                         
    205                                         ("/image-tree" image-tree-handler)                               
     205                                        ("/image-tree" image-tree-handler) 
     206                                        ("/contract-tree-image" contract-tree-image-handler) 
     207                                        ("/contract-tree" contract-tree-handler)                                         
    206208                                        ("/contract-image" contract-image-handler) 
    207209                                        ("/contract" contract-handler)