Author: hhubner Date: 2007-04-15 03:07:16 -0400 (Sun, 15 Apr 2007) New Revision: 2149
Modified: trunk/bknr/src/packages.lisp trunk/bknr/src/web/web-server-event.lisp trunk/bknr/src/xml-impex/xml-export.lisp Log: Add method to render arbitary objects as XML, mainly for log inspection.
Modified: trunk/bknr/src/packages.lisp =================================================================== --- trunk/bknr/src/packages.lisp 2007-04-15 05:44:31 UTC (rev 2148) +++ trunk/bknr/src/packages.lisp 2007-04-15 07:07:16 UTC (rev 2149) @@ -283,7 +283,7 @@ #:website-hosts #:website-authorizer #:website-show-page - #:website-show-error + #:website-show-error-page #:website-handler-definitions #:website-admin-navigation #:website-navigation
Modified: trunk/bknr/src/web/web-server-event.lisp =================================================================== --- trunk/bknr/src/web/web-server-event.lisp 2007-04-15 05:44:31 UTC (rev 2148) +++ trunk/bknr/src/web/web-server-event.lisp 2007-04-15 07:07:16 UTC (rev 2149) @@ -27,7 +27,7 @@ (backtrace :read)) (:documentation "Backtrace when an error happens inside a web page"))
-(defmethod print-object ((event web-server-error-event) streaM) +(defmethod print-object ((event web-server-error-event) stream) (format stream "#<~a at ~a error ~a>" (class-name (class-of event)) (format-date-time (event-time event))
Modified: trunk/bknr/src/xml-impex/xml-export.lisp =================================================================== --- trunk/bknr/src/xml-impex/xml-export.lisp 2007-04-15 05:44:31 UTC (rev 2148) +++ trunk/bknr/src/xml-impex/xml-export.lisp 2007-04-15 07:07:16 UTC (rev 2149) @@ -11,6 +11,7 @@
(defmacro with-xml-export* ((&key output indentation canonical) &body body) `(let ((*objects-written* (make-hash-table :test #'equal)) + (cxml::*current-element* nil) (cxml::*sink* (cxml:make-character-stream-sink ,output :indentation ,indentation :canonical ,canonical))) ,@body)) @@ -36,6 +37,18 @@ (sax:characters cxml::*sink* (cxml::string-rod object)) (sax:end-element cxml::*sink* nil nil (cxml::string-rod name)))
+(defmethod write-to-xml ((object standard-object) &key &allow-other-keys) + (cxml:with-element (string-downcase (class-name (class-of object))) + (dolist (slot (pcl:class-slots (class-of object))) + (cxml:with-element (string-downcase (symbol-name (pcl:slot-definition-name slot))) + (let ((value (slot-value object (pcl:slot-definition-name slot)))) + (when value + (cxml:text (handler-case + (cxml::utf8-string-to-rod (princ-to-string value)) + (error (e) + (declare (ignore e)) + (cxml::utf8-string-to-rod "[unprintable]")))))))))) + (defun write-object-reference (class object unique-id-slot-name name) (let ((slotdef (find unique-id-slot-name (class-slots class) :key #'slot-definition-name))) (unless (xml-effective-slot-definition-attribute slotdef) @@ -45,68 +58,65 @@ :value (cxml::string-rod (slot-serialize-value slotdef (slot-value object unique-id-slot-name)))))) (sax:end-element cxml::*sink* nil nil name)))
-(defmethod write-to-xml ((object t) &key name no-recurse) - (let ((class (class-of object))) - (cond - ((typep class 'xml-class) - (xml-object-check-validity object) - (let ((qname (cxml::string-rod (or name (xml-class-element class))))) +(defmethod write-to-xml ((object xml-class) &key name no-recurse) + (xml-object-check-validity object) + (let* ((class (class-of object)) + (qname (cxml::string-rod (or name (xml-class-element class)))))
- ;; If this object has been serialized to the XML stream, - ;; write a reference to the object and return. + ;; If this object has been serialized to the XML stream, + ;; write a reference to the object and return.
- (with-slots (unique-id-slot) class - (when unique-id-slot - (if (gethash (slot-value object (first unique-id-slot)) *objects-written*) - (progn - (write-object-reference class object (first unique-id-slot) qname) - (return-from write-to-xml)) - (setf (gethash (slot-value object (first unique-id-slot)) *objects-written*) t)))) + (with-slots (unique-id-slot) class + (when unique-id-slot + (if (gethash (slot-value object (first unique-id-slot)) *objects-written*) + (progn + (write-object-reference class object (first unique-id-slot) qname) + (return-from write-to-xml)) + (setf (gethash (slot-value object (first unique-id-slot)) *objects-written*) t))))
- ;; Object has not been written to the XML file or no - ;; unique-id-slot is defined for this class. + ;; Object has not been written to the XML file or no + ;; unique-id-slot is defined for this class.
- (let* ((attr-slots (xml-class-attribute-slots class)) - (elt-slots (xml-class-element-slots class)) - (body-slot (xml-class-body-slot class)) - ;; attributes - (attributes (loop for slot in attr-slots - for name = (slot-definition-name slot) - for attdef = (cxml::string-rod (xml-effective-slot-definition-attribute slot)) - when (and (slot-boundp object name) - (slot-value object name)) - collect (sax:make-attribute - :qname attdef - :value - (cxml::string-rod - (slot-serialize-value slot (slot-value object name))))))) - (sax:start-element cxml::*sink* nil nil qname attributes) + (let* ((attr-slots (xml-class-attribute-slots class)) + (elt-slots (xml-class-element-slots class)) + (body-slot (xml-class-body-slot class)) + ;; attributes + (attributes (loop for slot in attr-slots + for name = (slot-definition-name slot) + for attdef = (cxml::string-rod (xml-effective-slot-definition-attribute slot)) + when (and (slot-boundp object name) + (slot-value object name)) + collect (sax:make-attribute + :qname attdef + :value + (cxml::string-rod + (slot-serialize-value slot (slot-value object name))))))) + (sax:start-element cxml::*sink* nil nil qname attributes)
- ;; elements - (dolist (slot elt-slots) - (let ((name (slot-definition-name slot)) - (element-name (xml-effective-slot-definition-element slot)) - (containment (xml-effective-slot-definition-containment slot))) - (when (slot-boundp object name) - (if (consp (slot-value object name)) - (dolist (child (slot-value object name)) - (if (typep (class-of child) 'xml-class) - (write-to-xml child) - (write-to-xml (slot-serialize-value slot child) :name element-name))) - (let ((child (slot-value object name))) - (if (typep (class-of child) 'xml-class) - (write-to-xml child) - (write-to-xml (slot-serialize-value slot child) :name element-name))))))) + ;; elements + (dolist (slot elt-slots) + (let ((name (slot-definition-name slot)) + (element-name (xml-effective-slot-definition-element slot)) + (containment (xml-effective-slot-definition-containment slot))) + (when (slot-boundp object name) + (if (consp (slot-value object name)) + (dolist (child (slot-value object name)) + (if (typep (class-of child) 'xml-class) + (write-to-xml child) + (write-to-xml (slot-serialize-value slot child) :name element-name))) + (let ((child (slot-value object name))) + (if (typep (class-of child) 'xml-class) + (write-to-xml child) + (write-to-xml (slot-serialize-value slot child) :name element-name)))))))
- ;; body slot - (when body-slot - (let ((name (slot-definition-name body-slot))) - (when (slot-boundp object name) - (sax:characters - cxml::*sink* - (cxml::string-rod - (funcall (xml-effective-slot-definition-serializer body-slot) - (slot-value object name))))))) + ;; body slot + (when body-slot + (let ((name (slot-definition-name body-slot))) + (when (slot-boundp object name) + (sax:characters + cxml::*sink* + (cxml::string-rod + (funcall (xml-effective-slot-definition-serializer body-slot) + (slot-value object name))))))) - (sax:end-element cxml::*sink* nil nil qname)))) - (t nil)))) + (sax:end-element cxml::*sink* nil nil qname))))