Author: hhubner Date: 2006-02-17 14:52:07 -0600 (Fri, 17 Feb 2006) New Revision: 1838
Modified: branches/xml-class-rework/bknr/src/bknr-data-impex.asd branches/xml-class-rework/bknr/src/data/package.lisp branches/xml-class-rework/bknr/src/data/xml-object.lisp branches/xml-class-rework/bknr/src/web/menu.lisp branches/xml-class-rework/bknr/src/xml-impex/tutorial.lisp branches/xml-class-rework/bknr/src/xml-impex/xml-class.lisp branches/xml-class-rework/bknr/src/xml-impex/xml-export.lisp Log: Commit some more pending changes towards the dtd-less xml-class.
Modified: branches/xml-class-rework/bknr/src/bknr-data-impex.asd =================================================================== --- branches/xml-class-rework/bknr/src/bknr-data-impex.asd 2006-02-17 20:46:26 UTC (rev 1837) +++ branches/xml-class-rework/bknr/src/bknr-data-impex.asd 2006-02-17 20:52:07 UTC (rev 1838) @@ -1,3 +1,4 @@ + (in-package :cl-user)
(defpackage :bknr-data-impex.system
Modified: branches/xml-class-rework/bknr/src/data/package.lisp =================================================================== --- branches/xml-class-rework/bknr/src/data/package.lisp 2006-02-17 20:46:26 UTC (rev 1837) +++ branches/xml-class-rework/bknr/src/data/package.lisp 2006-02-17 20:52:07 UTC (rev 1838) @@ -42,6 +42,7 @@ #:persistent-xml-class #:persistent-xml-class-importer #:define-persistent-class + #:define-persistent-xml-class #:defpersistent-class
#:store-object
Modified: branches/xml-class-rework/bknr/src/data/xml-object.lisp =================================================================== --- branches/xml-class-rework/bknr/src/data/xml-object.lisp 2006-02-17 20:46:26 UTC (rev 1837) +++ branches/xml-class-rework/bknr/src/data/xml-object.lisp 2006-02-17 20:52:07 UTC (rev 1838) @@ -39,4 +39,3 @@
(export '(persistent-xml-class))
-
Modified: branches/xml-class-rework/bknr/src/web/menu.lisp =================================================================== --- branches/xml-class-rework/bknr/src/web/menu.lisp 2006-02-17 20:46:26 UTC (rev 1837) +++ branches/xml-class-rework/bknr/src/web/menu.lisp 2006-02-17 20:52:07 UTC (rev 1838) @@ -1,13 +1,13 @@ (in-package :bknr.site-menu)
-(defparameter *menu-dtd* (cxml:parse-dtd-file (merge-pathnames #p"menu.dtd" *load-truename*))) +(defparameter *menu-dtd* (ext:unix-namestring (merge-pathnames #p"menu.dtd" *load-truename*)))
(defclass menu-defs () ((menus :initarg :menus :element "menu" :reader menu-defs-menus)) (:metaclass xml-class) - (:dtd *menu-dtd*) + (:dtd-name *menu-dtd*) (:element "menus"))
(defclass menu () @@ -18,7 +18,7 @@ :element "item" :reader menu-items)) (:metaclass xml-class) - (:dtd *menu-dtd*) + (:dtd-name *menu-dtd*) (:element "menu"))
(defclass item () @@ -39,7 +39,7 @@ :reader item-hover-image)) (:default-initargs :inactive-image nil :active-image nil :hover-image nil) (:metaclass xml-class) - (:dtd *menu-dtd*) + (:dtd-name *menu-dtd*) (:element "item"))
(defparameter *menu-def-classes* (mapcar #'find-class '(menu-defs menu item)))
Modified: branches/xml-class-rework/bknr/src/xml-impex/tutorial.lisp =================================================================== --- branches/xml-class-rework/bknr/src/xml-impex/tutorial.lisp 2006-02-17 20:46:26 UTC (rev 1837) +++ branches/xml-class-rework/bknr/src/xml-impex/tutorial.lisp 2006-02-17 20:52:07 UTC (rev 1838) @@ -31,9 +31,9 @@ ;;;# Obtaining and loading BKNR XML import/export ;;; ;;; You can obtain the current CVS sources of BKNR by following the -;;; instructions at `http://bknr.net/blog/bknr-devel'. Add the `src' -;;; directory of BKNR to your `asdf:*central-registry*', and load the -;;; indices module by evaluating the following form: +;;; instructions at `http://bknr.net/'. Add the `src' directory of +;;; BKNR to your `asdf:*central-registry*', and load the indices +;;; module by evaluating the following form:
(asdf:oos 'asdf:load-op :bknr-impex)
@@ -90,8 +90,7 @@ ;;; class, and by specifying the XML element corresponding to the ;;; class. We also annotate the slot definitions.
-(defvar *tutorial-dtd* - (cxml:parse-dtd-file "xml-impex/tutorial.dtd")) +(defvar *tutorial-dtd* "xml-impex/tutorial.dtd")
(defclass book () ((author :initarg :author :reader book-author @@ -103,7 +102,7 @@ (title :initarg :title :reader book-title :element "title")) (:metaclass xml-class) - (:dtd *tutorial-dtd*) + (:dtd-name *tutorial-dtd*) (:element "book"))
;;; We can now read the XML file containing the book definitions. As @@ -161,7 +160,7 @@ (title :initarg :title :reader book-title :element "title")) (:metaclass xml-class) - (:dtd *tutorial-dtd*) + (:dtd-name *tutorial-dtd*) (:element "book"))
;;; We can now import our XML file and the indices will automatically @@ -243,8 +242,7 @@
;;; We can then write the following class definitions:
-(defvar *test-dtd* - (cxml:parse-dtd-file #p"xml-impex/tutorial2.dtd")) +(defvar *test-dtd* "xml-impex/tutorial2.dtd")
(defclass test-object () ((id :initarg :id :attribute "id" @@ -252,7 +250,7 @@ :index-type unique-index :index-reader object-with-id :index-values all-objects)) (:metaclass xml-class) - (:dtd *test-dtd*) + (:dtd-name *test-dtd*) (:element nil))
(defmethod print-object ((object test-object) stream) @@ -264,7 +262,7 @@ :index-reader test-with-id :index-values all-tests)) (:metaclass xml-class) - (:dtd *test-dtd*) + (:dtd-name *test-dtd*) (:element "test"))
(defclass test2 (test-object) @@ -272,7 +270,7 @@ :index-reader test2-with-id :index-values all-test2s)) (:metaclass xml-class) - (:dtd *test-dtd*) + (:dtd-name *test-dtd*) (:element "test2"))
(defclass test3 (test-object) @@ -280,7 +278,7 @@ :index-reader test3-with-id :index-values all-test3s)) (:metaclass xml-class) - (:dtd *test-dtd*) + (:dtd-name *test-dtd*) (:element "test3"))
;;; When we parse a sample file, we get the following results: @@ -331,8 +329,7 @@
;;; we can write the following class definition:
-(defvar *adult-dtd* - (cxml:parse-dtd-file "xml-impex/tutorial3.dtd")) +(defvar *adult-dtd* "xml-impex/tutorial3.dtd")
(defclass adult () ((name :initarg :name :attribute "name" @@ -340,7 +337,7 @@ (children :initarg :children :element "child" :reader adult-children)) (:metaclass xml-class) - (:dtd *adult-dtd*) + (:dtd-name *adult-dtd*) (:element "adult"))
(defmethod print-object ((adult adult) stream) @@ -351,7 +348,7 @@ ((name :initarg :name :attribute "name" :reader child-name)) (:metaclass xml-class) - (:dtd *adult-dtd*) + (:dtd-name *adult-dtd*) (:element "child"))
(defmethod print-object ((child child) stream) @@ -403,7 +400,7 @@ (parent :initarg :parent :parent t :reader child-parent)) (:metaclass xml-class) - (:dtd *adult-dtd*) + (:dtd-name *adult-dtd*) (:element "child"))
(setf *adults* @@ -429,8 +426,7 @@ book-id CDATA #REQUIRED reviewer CDATA #REQUIRED>
-(defvar *resume-dtd* - (cxml:parse-dtd-file "xml-impex/tutorial4.dtd")) +(defvar *resume-dtd* "xml-impex/tutorial4.dtd")
(defclass book-resume () ((id :initarg :id :attribute "id" @@ -444,7 +440,7 @@ (review :initarg :review :body t :reader book-resume-review)) (:metaclass xml-class) - (:dtd *resume-dtd*) + (:dtd-name *resume-dtd*) (:element "book-resume"))
;;; Parsing the following file gives the results: @@ -498,8 +494,7 @@
;;; We can write the following class definitions:
-(defparameter *book2-dtd* - (cxml:parse-dtd-file "xml-impex/tutorial5.dtd")) +(defparameter *book2-dtd* "xml-impex/tutorial5.dtd")
(defclass author () ((id :initarg :id :reader author-id @@ -509,7 +504,7 @@ (name :initarg :name :reader author-name :element "name")) (:metaclass xml-class) - (:dtd *book2-dtd*) + (:dtd-name *book2-dtd*) (:element "author"))
(defmethod print-object ((author author) stream) @@ -528,7 +523,7 @@ (title :initarg :title :reader book-title :element "title")) (:metaclass xml-class) - (:dtd *book2-dtd*) + (:dtd-name *book2-dtd*) (:element "book"))
;;; We can then read the following XML file:
Modified: branches/xml-class-rework/bknr/src/xml-impex/xml-class.lisp =================================================================== --- branches/xml-class-rework/bknr/src/xml-impex/xml-class.lisp 2006-02-17 20:46:26 UTC (rev 1837) +++ branches/xml-class-rework/bknr/src/xml-impex/xml-class.lisp 2006-02-17 20:52:07 UTC (rev 1838) @@ -1,8 +1,7 @@ (in-package :bknr.impex)
(defclass xml-class (indexed-class) - ((dtd :initarg :dtd :initform nil :accessor xml-class-dtd) - (element :initarg :element :initform nil :accessor xml-class-element) + ((element :initarg :element :initform nil :accessor xml-class-element) (unique-id-slot :initarg :unique-id-slot :initform nil :documentation "if set to a slot name, this signals that the slot can be used as a unique id to refer to an @@ -67,65 +66,15 @@
(defmethod print-object ((slot xml-effective-slot-definition) stream) (print-unreadable-object (slot stream :type t :identity t) - (format stream "~A (~A ~S)" (slot-definition-name slot) - (with-slots (attribute element body parent) slot + (with-slots (attribute element body parent) slot + (format stream "~A (~A~@[~S~])" (slot-definition-name slot) (cond (attribute "ATTRIBUTE") (element "ELEMENT") (body "BODY") (parent "PARENT") - (t "UNKNOWN"))) - (with-slots (attribute element body) slot - (cond ((and attribute (typep attribute 'cxml::attdef)) - (cxml::rod-string (cxml::attdef-name attribute))) - (attribute attribute) - ((and element (typep element 'cxml::elmdef)) - (cxml::rod-string (cxml::elmdef-name element))) - (element element) - (t "")))))) + (t "UNKNOWN")) + (or attribute element)))))
-(defun get-dtd-elmdef (dtd elmdef) - (typecase elmdef - (string (unless dtd - (error "Can not find elmdef ~a in dtd ~A." elmdef dtd)) - (cxml::find-element (cxml::string-rod elmdef) dtd)) - (cxml::elmdef elmdef) - (t (let ((elmdef (eval elmdef))) - (unless (typep elmdef 'cxml::elmdef) - (error "Elmdef ~A is not a CXML elmdef." elmdef)) - elmdef)))) - -(defun get-dtd (dtd) - (cond ((or (stringp dtd) - (pathnamep dtd)) - (cxml:parse-dtd-file dtd)) - ((typep dtd 'cxml::dtd) dtd) - (t (let ((dtd (eval dtd))) - (unless (typep dtd 'cxml::dtd) - (error "DTD ~A is not a CXML dtd." dtd)) - dtd)))) - -(defun get-elmdef-attribute (elmdef attribute) - (typecase attribute - (string (unless elmdef - (error "Can not find attribute ~a in elmdef ~a." attribute elmdef)) - (cxml::find-attribute elmdef (cxml::string-rod attribute))) - (cxml::attdef attribute) - (t (let ((attribute (eval attribute))) - (unless (typep attribute 'cxml::attdef) - (error "Attribute ~A is not a CXML attdef." attribute)) - attribute)))) - -(defmethod initialize-elmdef ((class xml-class) dtd elm) - (let* ((dtd (get-dtd dtd)) - elmdef) - (when elm - (setf elmdef (get-dtd-elmdef dtd elm)) - (unless elmdef - (error "Could not find an element definition for class ~A, elmdef ~A." - (class-name class) elm))) - (setf (xml-class-dtd class) dtd - (xml-class-element class) elmdef))) - (defmethod xml-class-attribute-slots ((class xml-class)) (remove-if #'(lambda (slot) (or (not (typep slot 'xml-effective-slot-definition)) @@ -148,12 +97,12 @@ (defmethod xml-class-find-attribute-slot ((class xml-class) attribute) (find attribute (xml-class-attribute-slots class) :test #'string-equal - :key #'(lambda (slot) (cxml::rod-string (cxml::attdef-name (slot-value slot 'attribute)))))) + :key #'(lambda (slot) (slot-value slot 'attribute))))
(defmethod xml-class-find-element-slot ((class xml-class) element) (find element (xml-class-element-slots class) :test #'string-equal - :key #'(lambda (slot) (cxml::rod-string (cxml::elmdef-name (slot-value slot 'element)))))) + :key #'(lambda (slot) (slot-value slot 'element))))
(defmethod xml-class-parent-slot ((class xml-class)) (let ((parent-slots @@ -165,84 +114,12 @@ (error "Class ~A has more than one parent slot: ~A." class parent-slots)) (first parent-slots)))
-(defmethod elmdef-children ((elmdef cxml::elmdef)) - (let (result) - (labels ((elmdef-children-rec (content containment) - (cond ((and (listp content) - (member (first content) '(cxml::and cxml::or))) - (dolist (child (cdr content)) - (elmdef-children-rec child containment))) - ((and (listp content) - (eql (first content) 'cxml::+)) - (dolist (child (cdr content)) - (elmdef-children-rec child :+))) - ((and (listp content) - (eql (first content) 'cxml::*)) - (dolist (child (cdr content)) - (elmdef-children-rec child :*))) - ((and (listp content) - (eql (first content) 'cxml::?)) - (dolist (child (cdr content)) - (elmdef-children-rec child :optional))) - ((listp content) - (error "Unknown content form ~S (missing element declaration for ~S in DTD?)." content (cxml::elmdef-name elmdef))) - ((eql content :pcdata)) - ((eql content :empty)) - (t (push (list content containment) result))))) - (elmdef-children-rec (cxml::elmdef-content elmdef) :single) - (nreverse result)))) - -;;; called multiple times -(defmethod compute-slots :around ((class xml-class)) - #+nil - (format t "around dtd ~A~%" (xml-class-dtd class)) - (when (and (not (typep (xml-class-dtd class) 'cxml::dtd)) - (xml-class-dtd class)) - (initialize-elmdef class (first (xml-class-dtd class)) - (first (xml-class-element class)))) - (call-next-method)) - -(defmethod xml-class-finalize ((class xml-class)) - (unless (class-finalized-p class) - (finalize-inheritance class)) - - (let ((slots (class-slots class)) - (elmdef (xml-class-element class))) - (unless elmdef - (return-from xml-class-finalize)) - - #+nil - (format t "~S slots attributes ~S~%" slots (xml-class-attribute-slots class)) - ;;; check attributes - (dolist (attr (cxml::elmdef-attributes elmdef)) - (let ((attr-name (cxml::rod-string (cxml::attdef-name attr)))) - (when (eql (cxml::attdef-default attr) :required) - (let ((slot (xml-class-find-attribute-slot class attr-name))) - (when (not slot) - (warn "Could not find slot for required attribute ~A." attr-name)))))) - ;;; check elements - (dolist (child (elmdef-children elmdef)) - (let* ((child-name (cxml::rod-string (first child))) - (child-containment (second child)) - (slot (xml-class-find-element-slot class child-name))) - (if slot - (with-slots (containment required-p) slot - (if containment - (when (not (eql containment child-containment)) - (error "Slot containment ~A is not the same as the child containment ~A." - containment child-containment)) - (setf containment child-containment)) - (when (member child-containment '(:single :+)) - (setf required-p t))) - (when (member child-containment '(:single :+)) - (warn "Could not find a slot for the child element ~A with containment ~A." - child-name child-containment))))) - slots)) - -(defmethod initialize-instance :after ((class xml-class) &key &allow-other-keys) +(defmethod initialize-instance :after ((class xml-class) &key element &allow-other-keys) + (setf (xml-class-element class) (or (first element) (string-downcase (class-name class)))) (xml-class-finalize class))
-(defmethod reinitialize-instance :after ((class xml-class) &key &allow-other-keys) +(defmethod reinitialize-instance :after ((class xml-class) &key element &allow-other-keys) + (setf (xml-class-element class) (or (first element) (string-downcase (class-name class)))) (xml-class-finalize class))
(defmethod direct-slot-definition-class ((class xml-class) &key parent attribute element body &allow-other-keys) @@ -264,22 +141,20 @@
(let ((normal-slot (call-next-method))) (when (and xml-direct - (typep normal-slot 'xml-effective-slot-definition) - (xml-class-element class)) + (typep normal-slot 'xml-effective-slot-definition)) (with-slots (attribute element body parent) xml-direct - (let ((dtd (xml-class-dtd class))) - (unless (or element attribute body parent) - (error "Could not find element or attribute for slot ~A." name)) - (when (> (length (remove nil (list parent element attribute body))) 1) - (error "Only one of ELEMENT, ATTRIBUTE, PARENT or BODY is possible for a slot definition.")) + (when (> (length (remove nil (list parent element attribute body))) 1) + (error "Only one of ELEMENT, ATTRIBUTE, PARENT or BODY is possible for a slot definition.")) + (unless (or body parent) + (unless (or element attribute) + (setf element (string-downcase name))) (when element - (setf element (get-dtd-elmdef dtd element))) + (setf element (if (eq t element) (string-downcase name) element))) (when attribute - (setf attribute (get-elmdef-attribute (xml-class-element class) - attribute))) - (unless (or element attribute body parent) + (setf attribute (if (eq t attribute) (string-downcase name) attribute))) + (unless (or element attribute) (error "Could not find element or attribute for slot ~A." name)))) - + (dolist (slot '(parser serializer body id-to-object object-to-id parent attribute element)) (setf (slot-value normal-slot slot) @@ -290,22 +165,9 @@ (when value (setf (slot-value normal-slot slot) (eval value))))) - - ;;; XXX check emptyness of element - (with-slots (attribute element containment required-p) normal-slot - (when attribute - (when (eql (cxml::attdef-default attribute) :required) - (setf required-p t)))) - + normal-slot)))
-(defmethod xml-class-reload-dtd ((class xml-class) dtd &optional element) - (let ((element (if element - element - (cxml::rod-string (cxml::elmdef-name (xml-class-element class)))))) - (initialize-elmdef class dtd element) - class)) - (defmethod xml-object-check-validity (object) (let ((class (class-of object))) (unless (typep class 'xml-class)
Modified: branches/xml-class-rework/bknr/src/xml-impex/xml-export.lisp =================================================================== --- branches/xml-class-rework/bknr/src/xml-impex/xml-export.lisp 2006-02-17 20:46:26 UTC (rev 1837) +++ branches/xml-class-rework/bknr/src/xml-impex/xml-export.lisp 2006-02-17 20:52:07 UTC (rev 1838) @@ -33,15 +33,15 @@ (let* ((attr-slots (xml-class-attribute-slots class)) (elt-slots (xml-class-element-slots class)) (body-slot (xml-class-body-slot class)) - (qname (cxml::elmdef-name (xml-class-element class))) + (qname (cxml::string-rod (xml-class-element class))) ;; attributes (attributes (loop for slot in attr-slots for name = (slot-definition-name slot) - for attdef = (xml-effective-slot-definition-attribute 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 (cxml::attdef-name attdef) + :qname attdef :value (funcall string-rod-fn (slot-serialize-value slot (slot-value object name)))))))