Author: lgiessmann
Date: Sun Nov 22 13:16:47 2009
New Revision: 145
Log:
added the support for reification in the xtm 2.0 importer
Modified:
trunk/src/model/datamodel.lisp
trunk/src/unit_tests/reification_test.lisp
trunk/src/xml/xtm/importer_xtm2.0.lisp
Modified: trunk/src/model/datamodel.lisp
==============================================================================
--- trunk/src/model/datamodel.lisp (original)
+++ trunk/src/model/datamodel.lisp Sun Nov 22 13:16:47 2009
@@ -1615,6 +1615,7 @@
(merge-reifier-topics (reifier construct) reifier-topic))))))
construct))
+
(defgeneric merge-reifier-topics (old-topic new-topic)
;;the reifier topics are not only merged but also bound to the reified-construct
(:method ((old-topic TopicC) (new-topic TopicC))
@@ -1632,8 +1633,10 @@
(dolist (scoped-construct (used-as-theme new-topic))
(remove-association scoped-construct 'themes new-topic)
(add-association scoped-construct 'themes old-topic))
+ ;merges all topic-maps
(dolist (tm (in-topicmaps new-topic))
(add-association tm 'topic old-topic)) ;the new-topic is removed from this tm by deleting it
+ ;merges all role-players
(dolist (a-role (player-in-roles new-topic))
(remove-association a-role 'player new-topic)
(add-association a-role 'player old-topic))
Modified: trunk/src/unit_tests/reification_test.lisp
==============================================================================
--- trunk/src/unit_tests/reification_test.lisp (original)
+++ trunk/src/unit_tests/reification_test.lisp Sun Nov 22 13:16:47 2009
@@ -96,6 +96,20 @@
:topicid "name-type"
:xtm-id xtm-id-1
:start-revision revision-1))
+ (assoc-type (make-construct 'TopicC
+ :psis (list (make-instance 'PersistentIdC
+ :uri "psi-assoc-type"
+ :start-revision revision-1))
+ :topicid "assoc-type"
+ :xtm-id xtm-id-1
+ :start-revision revision-1))
+ (role-type (make-construct 'TopicC
+ :psis (list (make-instance 'PersistentIdC
+ :uri "psi-role-type"
+ :start-revision revision-1))
+ :topicid "assoc-type"
+ :xtm-id xtm-id-1
+ :start-revision revision-1))
(occurrence-type (make-construct 'TopicC
:psis (list (make-instance 'PersistentIdC
:uri "psi-occurrence-type"
@@ -143,10 +157,29 @@
:themes (list scope-1 topic-2)
:instance-of topic-2
:charvalue "test-name"
- :start-revision revision-2)))
- (is (= (length (elephant:get-instances-by-class 'TopicC)) 6))
+ :start-revision revision-2))
+ (assoc (make-construct 'AssociationC
+ :item-identifiers nil
+ :instance-of assoc-type
+ :themes nil
+ :roles
+ (list
+ (list :instance-of role-type
+ :player topic-1
+ :item-identifiers
+ (list (make-instance 'ItemIdentifierC
+ :uri "role-1"
+ :start-revision revision-1)))
+ (list :instance-of role-type
+ :player topic-2
+ :item-identifiers
+ (list (make-instance 'ItemIdentifierC
+ :uri "role-2"
+ :start-revision revision-1))))
+ :start-revision revision-1)))
+ (is (= (length (elephant:get-instances-by-class 'TopicC)) 8))
(datamodel::merge-reifier-topics topic-1 topic-2)
- (is (= (length (elephant:get-instances-by-class 'TopicC)) 5))
+ (is (= (length (elephant:get-instances-by-class 'TopicC)) 7))
(is (= (length (union (list ii-1-1 ii-1-2 ii-2-1 ii-2-2)
(item-identifiers topic-1)))
(length (list ii-1-1 ii-1-2 ii-2-1 ii-2-2))))
@@ -168,11 +201,18 @@
(is (= (length (union (d:used-as-theme topic-1)
(list test-name)))
(length (list test-name))))
- ;;TODO: roleplayer, topicmap
+ (is (eql (player (first (roles assoc))) topic-1))
+ (is (eql (player (second (roles assoc))) topic-1))
;;TODO: check all objects and their version-infos
(elephant:close-store))))))
+;;TODO: check xtm1.0 importer
+;;TODO: check xtm2.0 importer
+;;TODO: check rdf importer
+;;TODO: check fragment exporter
+
+
(defun run-reification-tests ()
(it.bese.fiveam:run! 'test-merge-reifier-topics)
)
\ No newline at end of file
Modified: trunk/src/xml/xtm/importer_xtm2.0.lisp
==============================================================================
--- trunk/src/xml/xtm/importer_xtm2.0.lisp (original)
+++ trunk/src/xml/xtm/importer_xtm2.0.lisp Sun Nov 22 13:16:47 2009
@@ -9,6 +9,17 @@
(in-package :xml-importer)
+(defun set-reifier (reifiable-elem reifiable-construct)
+ "Sets the reifier-topic of the passed elem to the passed construct."
+ (declare (dom:element reifiable-elem))
+ (declare (ReifiableConstructC reifiable-construct))
+ (let ((reifier-uri (get-attribute reifiable-elem "reifier")))
+ (when (and (stringp reifier-uri)
+ (> (length reifier-uri) 0))
+ (add-reifier reifiable-construct reifier-uri))
+ reifiable-construct))
+
+
(defun from-identifier-elem (classsymbol elem start-revision)
"Generate an identifier object of type 'classsymbol' (a subclass of
IdentifierC) from a given identifier element for a revision and return
@@ -127,7 +138,7 @@
:themes themes)))
(loop for variant-elem across (xpath-child-elems-by-qname name-elem *xtm2.0-ns* "variant")
do (from-variant-elem variant-elem name start-revision :xtm-id xtm-id))
- name)))
+ (set-reifier name-elem name))))
(defun from-resourceX-elem (parent-elem)
@@ -180,13 +191,14 @@
(unless variant-value
(error "VariantC: one of resourceRef and resourceData must be set"))
- (make-construct 'VariantC
- :start-revision start-revision
- :item-identifiers item-identifiers
- :themes themes
- :charvalue (getf variant-value :data)
- :datatype (getf variant-value :type)
- :name name)))
+ (let ((variant (make-construct 'VariantC
+ :start-revision start-revision
+ :item-identifiers item-identifiers
+ :themes themes
+ :charvalue (getf variant-value :data)
+ :datatype (getf variant-value :type)
+ :name name)))
+ (set-reifier variant-elem variant))))
(defun from-occurrence-elem (occ-elem top start-revision &key (xtm-id *current-xtm*))
@@ -211,14 +223,15 @@
(occurrence-value (from-resourceX-elem occ-elem)))
(unless occurrence-value
(error "OccurrenceC: one of resourceRef and resourceData must be set"))
- (make-construct 'OccurrenceC
- :start-revision start-revision
- :topic top
- :themes themes
- :item-identifiers item-identifiers
- :instance-of instance-of
- :charvalue (getf occurrence-value :data)
- :datatype (getf occurrence-value :type))))
+ (let ((occurrence (make-construct 'OccurrenceC
+ :start-revision start-revision
+ :topic top
+ :themes themes
+ :item-identifiers item-identifiers
+ :instance-of instance-of
+ :charvalue (getf occurrence-value :data)
+ :datatype (getf occurrence-value :type))))
+ (set-reifier occ-elem occurrence))))
@@ -322,7 +335,13 @@
(xpath-single-child-elem-by-qname
role-elem
*xtm2.0-ns*
- "topicRef")) :xtm-id xtm-id)))
+ "topicRef")) :xtm-id xtm-id))
+ (reifier-uri
+ (let ((value (get-attribute role-elem "reifier")))
+ (if (and (stringp value)
+ (> (length value) 0))
+ value
+ nil))))
; (unless (and player instance-of)
; (error "Role in association not complete"))
(unless player ;instance-of will be set later - if there is no one
@@ -331,7 +350,10 @@
role-elem
*xtm2.0-ns*
"topicRef"))))
- (list :instance-of instance-of :player player :item-identifiers item-identifiers))))
+ (list :reifier-uri reifier-uri
+ :instance-of instance-of
+ :player player
+ :item-identifiers item-identifiers))))
(defun from-association-elem (assoc-elem start-revision
@@ -339,7 +361,7 @@
tm
(xtm-id *current-xtm*))
"Constructs an AssociationC object from an association element
-association = element association { reifiable, type, scope?, role+ }"
+ association = element association { reifiable, type, scope?, role+ }"
(declare (dom:element assoc-elem))
(declare (integer start-revision))
(declare (TopicMapC tm))
@@ -366,14 +388,25 @@
assoc-elem
*xtm2.0-ns* "role"))))
(setf roles (set-standard-role-types roles)); sets standard role types if there are missing some of them
-
- (add-to-topicmap tm
- (make-construct 'AssociationC
- :start-revision start-revision
- :item-identifiers item-identifiers
- :instance-of instance-of
- :themes themes
- :roles roles)))))
+ (let ((assoc (add-to-topicmap
+ tm
+ (make-construct 'AssociationC
+ :start-revision start-revision
+ :item-identifiers item-identifiers
+ :instance-of instance-of
+ :themes themes
+ :roles roles))))
+ (map 'list #'(lambda(assoc-role)
+ (map 'list #'(lambda(list-role)
+ (when (and (eql (instance-of assoc-role)
+ (getf list-role :instance-of))
+ (eql (player assoc-role)
+ (getf list-role :player))
+ (getf list-role :reifier-uri))
+ (add-reifier assoc-role (getf list-role :reifier-uri))))
+ roles))
+ (roles assoc))
+ (set-reifier assoc-elem assoc)))))