[isidorus-cvs] r189 - branches/new-datamodel/src/model

Lukas Giessmann lgiessmann at common-lisp.net
Tue Feb 16 11:54:17 UTC 2010

Author: lgiessmann
Date: Tue Feb 16 06:54:16 2010
New Revision: 189

new-datamodel: added the implementation of TypableC


Modified: branches/new-datamodel/src/model/datamodel.lisp
--- branches/new-datamodel/src/model/datamodel.lisp	(original)
+++ branches/new-datamodel/src/model/datamodel.lisp	Tue Feb 16 06:54:16 2010
@@ -168,6 +168,7 @@
 (defpclass VersionedConstructC()
   ((versions :initarg :versions
 	     :accessor versions
+	     :inherit t
 	     :associate (VersionInfoC versioned-construct)
 	     :documentation "Version infos for former versions of this base
@@ -439,6 +440,7 @@
 (defpclass PointerAssociationC (VersionedAssociationC)
   ((identifier :initarg :identifier
 	       :accessor identifier
+	       :inherit t
 	       :initform (error "From VersionedAssociationC(): identifier must be set")
 	       :associate PointerC
 	       :documentation "The actual data that is associated with
@@ -513,12 +515,14 @@
 (defpclass PointerC(TopicMapConstructC)
   ((uri :initarg :uri
 	:accessor uri
+	:inherit t
 	:type string
 	:initform (error "From PointerC(): uri must be set for a pointer")
 	:index t
 	:documentation "The actual value of a pointer, i.e. uri or ID.")
    (identified-construct :initarg :identified-construct
-			 :associate (PointerAssociationC identifier)))
+			 :associate (PointerAssociationC identifier)
+			 :inherit t))
   (:documentation "An abstract base class for all pointers."))
@@ -550,10 +554,12 @@
 (defpclass ReifiableConstructC(TopicMapConstructC)
   ((item-identifiers :initarg :item-identifiers
 		     :associate (ItemIdAssociationC identified-construct)
+		     :inherit t
 		     :documentation "A relation to all item-identifiers of
                                      this construct.")
    (reifier :initarg :reifier
 	    :associate (ReifierAssociationC reified-construct)
+	    :inherit t
 	    :documentation "A relation to a reifier-topic."))
   (:documentation "Reifiable constructs as per TMDM."))
@@ -656,26 +662,26 @@
 ;;; ScopableC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defpclass ScopableC()
-  ((themes :initarg :themes
-	   :associate (ScopeAssociationC scopable-construct)
+  ((themes :associate (ScopeAssociationC scopable-construct)
 	   :inherit t
-	   :documentation "Contains all Association-objects that contain the
+	   :documentation "Contains all association-objects that contain the
                            actual scope-topics."))
   (:documentation "An abstract base class for all constructs that are scoped."))
 (defmethod delete-construct :before ((construct ScopableC))
   "Deletes all ScopeAssociationCs that are associated with the given object."
-  (dolist (theme (themes construct))
+  (dolist (theme (slot-p construct 'themes))
     (delete-construct theme)))
-(defgeneric themes (construct)
+(defgeneric themes (construct &key revision)
   (:documentation "Returns all topics that are not marked as deleted and are
                    as a scope for the given topic.")
-  (:method ((construct ScopableC))
+  (:method ((construct ScopableC) &key (revision *TM-REVISION*))
     (let ((valid-associations
-	   (remove-if-not #'marked-as-deleted-p (slot-p construct 'themes))))
+	   (filter-slot-value-by-revision construct 'themes
+					  :start-revision revision)))
       (map 'list #'theme-topic valid-associations))))
@@ -712,5 +718,68 @@
 ;;; TypableC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;TODO: implement a TypeAssociationC-class -> extend the uml schema
-;;      --> error if there are more than one types on one revision
\ No newline at end of file
+(defpclass TypableC()
+  ((instance-of :associate (TypeAssociationC type-topic)
+		:inherit t
+		:documentation "Contains all association-objects that contain
+                                the actual type-topic."))
+  (:documentation "An abstract base class for all typed constructcs."))
+(defmethod delete-construct :before ((construct TypableC))
+  "Deletes all TypeAssociationCs that are associated with this object."
+  (dolist (type (slot-p construct 'instance-of))
+    (delete-construct type)))
+(defgeneric instance-of (construct &key revision)
+  (:documentation "Returns the type topic that is set on the passed
+                   revision.")
+  (:method ((construct TypableC) &key (revision *TM-REVISION*))
+    (let ((valid-associations
+	   (filter-slot-value-by-revision construct 'instance-of
+					  :start-revision revision)))
+      (when valid-associations
+	(type-topic (first valid-associations))))))
+(defgeneric add-type (construct type-topic &key revision)
+  (:documentation "Add the passed type-topic as type to the given
+                   typed construct if there is no other type-topic
+                   set at the same revision.")
+  (:method ((construct TypableC) (type-topic TopicC)
+	    &key (revision *TM-REVISION*))
+    (let ((already-set-type
+	   (map 'list #'type-topic
+		(filter-slot-value-by-revision construct 'instance-of
+					       :start-revision revision))))
+      (cond ((and already-set-type
+		  (eql (first already-set-type) type-topic))
+	     (let ((type-assoc
+		    (loop for type-assoc in (slot-p construct 'instance-of)
+		       when (eql type-topic (type-topic type-assoc))
+		       return type-assoc)))
+	       (add-to-version-history type-assoc :start-revision revision)))
+	    ((not already-set-type)
+	     (make-instance 'TypeAssociationC
+			    :start-revision revision
+			    :type-topic type-topic
+			    :typable-construct construct))
+	    (t
+	     (error "From add-type(): ~a can't by typed by ~a since it is already typed by the topic ~a"
+		    construct type-topic already-set-type)))
+      construct)))
+(defgeneric delete-type (construct type-topic &key revision)
+  (:documentation "Deletes the passed type by marking it's association as
+                   deleted in the passed revision.")
+  (:method ((construct TypableC) (type-topic TopicC)
+	    &key (revision (error "From delete-type(): revision must be set")))
+    (let ((assoc-to-delete
+	   (loop for type-assoc in (slot-p construct 'instance-of)
+	      when (eql (type-topic type-assoc) type-topic)
+	      return type-assoc)))
+      (when assoc-to-delete
+	(mark-as-deleted assoc-to-delete :revision revision))
+      construct)))
\ No newline at end of file

More information about the Isidorus-cvs mailing list