[isidorus-cvs] r237 - branches/new-datamodel/src/model
Lukas Giessmann
lgiessmann at common-lisp.net
Sun Mar 21 09:14:10 UTC 2010
Author: lgiessmann
Date: Sun Mar 21 05:14:10 2010
New Revision: 237
Log:
new-datamodel: fixed some sections that cauesd errors with the "changes.lisp"
Modified:
branches/new-datamodel/src/model/datamodel.lisp
Modified: branches/new-datamodel/src/model/datamodel.lisp
==============================================================================
--- branches/new-datamodel/src/model/datamodel.lisp (original)
+++ branches/new-datamodel/src/model/datamodel.lisp Sun Mar 21 05:14:10 2010
@@ -14,6 +14,8 @@
duplicate-identifier-error)
(:import-from :constants
*xml-string*)
+ (:import-from :constants
+ *instance-psi*)
(:export ;;classes
:TopicMapC
:AssociationC
@@ -114,6 +116,9 @@
:TopicMapConstructC-p
:VersionedConstructC-p
:make-construct
+ :list-instanceOf
+ :in-topicmap
+ :string-start-with
;;globals
:*TM-REVISION*
@@ -315,9 +320,11 @@
(elephant:defpclass TopicMapC (ReifiableConstructC VersionedConstructC)
((topics :associate (TopicC in-topicmaps)
:many-to-many t
+ :accessor topics
:documentation "List of topics that explicitly belong to this TM.")
(associations :associate (AssociationC in-topicmaps)
:many-to-many t
+ :accessor associations
:documentation "List of associations that belong to this TM."))
(:documentation "Represnets a topic map."))
@@ -673,7 +680,28 @@
(merge-constructs merged-construct construct-to-be-merged)))))
+(defgeneric internal-id (construct)
+ (:documentation "Returns the internal id that uniquely identifies a
+ construct (currently simply its OID)."))
+
+
+(defmethod internal-id ((construct TopicMapConstructC))
+ (slot-value construct (find-symbol "OID" 'elephant)))
+
+
+(defun string-starts-with (str prefix)
+ "Checks if string str starts with a given prefix."
+ (declare (string str prefix))
+ (string= str prefix :start1 0 :end1
+ (min (length prefix)
+ (length str))))
+
+
;;; generic definitions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defgeneric get-all-identifiers-of-construct (construct &key revision)
+ (:documentation "Get all identifiers that a given construct has"))
+
+
(defgeneric get-all-characteristics (parent-construct characteristic-symbol)
(:documentation "Returns all characterisitcs of the passed type the parent
construct was ever associated with."))
@@ -700,7 +728,7 @@
(defgeneric in-topicmaps (construct &key revision)
- (:documentation "Returns all TopicMapS-obejcts where the constrict is
+ (:documentation "Returns all TopicMaps-obejcts where the construct is
contained in."))
@@ -1250,6 +1278,14 @@
construct)))
+(defmethod get-all-identifiers-of-construct ((construct TopicC)
+ &key (revision 0))
+ (declare (integer revision))
+ (append (psis construct :revision revision)
+ (locators construct :revision revision)
+ (item-identifiers construct :revision revision)))
+
+
(defgeneric names (construct &key revision)
(:documentation "Returns the NameC-objects that correspond
with the passed construct and the passed version.")
@@ -1489,6 +1525,30 @@
:error-if-nil error-if-nil))
+
+(defgeneric list-instanceOf (topic &key tm)
+ (:documentation "Generates a list of all topics that this topic is an
+ instance of, optionally filtered by a topic map"))
+
+
+(defmethod list-instanceOf ((topic TopicC) &key (tm nil))
+ (remove-if
+ #'null
+ (map 'list #'(lambda(x)
+ (when (loop for psi in (psis (instance-of x))
+ when (string= (uri psi) constants:*instance-psi*)
+ return t)
+ (loop for role in (roles (parent x))
+ when (not (eq role x))
+ return (player role))))
+ (if tm
+ (remove-if-not
+ (lambda (role)
+ (in-topicmap tm (parent role)))
+ (player-in-roles topic))
+ (player-in-roles topic)))))
+
+
;;; CharacteristicC
(defgeneric CharacteristicC-p (class-symbol)
(:documentation "Returns t if the passed symbol is equal to CharacteristicC
@@ -2135,6 +2195,13 @@
(mark-as-deleted assoc-to-delete :revision revision))
construct)))
+
+(defmethod get-all-identifiers-of-construct ((construct ReifiableConstructC)
+ &key (revision 0))
+ (declare (integer revision))
+ (item-identifiers construct :revision revision))
+
+
;;; TypableC
(defgeneric TypableC-p (class-symbol)
(:documentation "Returns t if the passed class is equal to TypableC or
@@ -2343,20 +2410,6 @@
(remove-association construct 'associations assoc)))
-(defgeneric topics (construct &key revision)
- (:documentation "Returns all TopicC-objects that are contained in the tm.")
- (:method ((construct TopicMapC) &key (revision 0))
- (filter-slot-value-by-revision construct 'topics
- :start-revision revision)))
-
-
-(defgeneric associations (construct &key revision)
- (:documentation "Returns all AssociationC-objects that are contained in the tm.")
- (:method ((construct TopicMapC) &key (revision 0))
- (filter-slot-value-by-revision construct 'associations
- :start-revision revision)))
-
-
(defmethod add-to-tm ((construct TopicMapC) (construct-to-add TopicC))
(add-association construct 'topics construct-to-add))
@@ -2374,6 +2427,21 @@
(remove-association construct 'associations construct-to-delete))
+(defgeneric in-topicmap (tm construct &key revision)
+ (:documentation "Is a given construct (topic or assiciation) in this
+ topic map?"))
+
+
+(defmethod in-topicmap ((tm TopicMapC) (top TopicC) &key (revision 0))
+ (when (find-item-by-revision top revision)
+ (find (internal-id top) (topics tm) :test #'= :key #'internal-id)))
+
+
+(defmethod in-topicmap ((tm TopicMapC) (ass AssociationC) &key (revision 0))
+ (when (find-item-by-revision ass revision)
+ (find (internal-id ass) (associations tm) :test #'= :key #'internal-id)))
+
+
;;; make-construct ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun make-construct (class-symbol &rest args)
"Creates a new topic map construct if necessary or
@@ -2386,7 +2454,7 @@
((PointerC-p class-symbol)
(make-pointer class-symbol (getf args :uri) args))
((CharacteristicC-p class-symbol)
- (make-characteristic class-symbol (getf args :charvalue) args))
+ (make-characteristic class-symbol args))
((TopicC-p class-symbol)
(make-topic args))
((TopicMapC-p class-symbol)
More information about the Isidorus-cvs
mailing list