[isidorus-cvs] r131 - in trunk/src: . unit_tests xml/rdf

Author: lgiessmann Date: Thu Sep 3 10:57:42 2009 New Revision: 131 Log: rdf-importer: fixed some problems with importing isidorus-types; added importers and unit tests for isidorus:Association and isidorus:Role Modified: trunk/src/constants.lisp trunk/src/unit_tests/rdf_importer_test.lisp trunk/src/xml/rdf/importer.lisp trunk/src/xml/rdf/isidorus_constructs_tools.lisp trunk/src/xml/rdf/rdf_tools.lisp Modified: trunk/src/constants.lisp ============================================================================== --- trunk/src/constants.lisp (original) +++ trunk/src/constants.lisp Thu Sep 3 10:57:42 2009 @@ -60,7 +60,8 @@ :*tm2rdf-varianttype-property* :*tm2rdf-occurrencetype-property* :*tm2rdf-roletype-property* - :*tm2rdf-associationtype-property*)) + :*tm2rdf-associationtype-property* + :*tm2rdf-player-property*)) (in-package :constants) @@ -165,3 +166,5 @@ (defparameter *tm2rdf-roletype-property* (concatenate 'string *tm2rdf-ns* "roletype")) (defparameter *tm2rdf-associationtype-property* (concatenate 'string *tm2rdf-ns* "associationtype")) + +(defparameter *tm2rdf-player-property* (concatenate 'string *tm2rdf-ns* "player")) Modified: trunk/src/unit_tests/rdf_importer_test.lisp ============================================================================== --- trunk/src/unit_tests/rdf_importer_test.lisp (original) +++ trunk/src/unit_tests/rdf_importer_test.lisp Thu Sep 3 10:57:42 2009 @@ -73,7 +73,8 @@ :test-isidorus-type-p :test-get-all-isidorus-nodes-by-id :test-import-isidorus-name - :test-import-isidorus-occurrence)) + :test-import-isidorus-occurrence + :test-import-isidorus-association)) (declaim (optimize (debug 3) (speed 0) (safety 3) (space 0) (compilation-speed 0))) @@ -3275,7 +3276,8 @@ " <sw:arc rdf:nodeID=\"node-id-4\"/>" " </rdf:Description>" " <sw:Node rdf:nodeID=\"node-id-4\" " - " xml:base=\"http://base/\">" + " xml:base=\"http://base/\"" + " xml:lang=\"de\">" " <sw:arc>" " <rdf:Description rdf:nodeID=\"node-id-1\" " " xml:base=\"suffix\"/>" @@ -3300,7 +3302,8 @@ (rdf-importer::child-nodes-or-text (elt (rdf-importer::child-nodes-or-text root) 4)) 0)) 0) - :xml-base "http://base/suffix"))) + :xml-base "http://base/" + :xml-lang "de"))) (node-id-2 (elt (rdf-importer::child-nodes-or-text root) 1)) (node-id-3 (elt (rdf-importer::child-nodes-or-text root) 3)) (node-id-4 (elt (rdf-importer::child-nodes-or-text root) 4))) @@ -3318,9 +3321,10 @@ (is (eql (getf (first (rdf-importer::get-all-isidorus-nodes-by-id "node-id-4" root sw-node)) :elem) node-id-4)) - (is (string= (getf (first (rdf-importer::get-all-isidorus-nodes-by-id - "node-id-4" root sw-node)) :xml-base) - "http://base/")) + (is-false (getf (first (rdf-importer::get-all-isidorus-nodes-by-id + "node-id-4" root sw-node)) :xml-base)) + (is-false (getf (first (rdf-importer::get-all-isidorus-nodes-by-id + "node-id-4" root sw-node)) :xml-lang)) (is (= (length (intersection node-id-1 (rdf-importer::get-all-isidorus-nodes-by-id @@ -3578,6 +3582,136 @@ (is (string= (d:datatype occ-3) *xml-string*))))))) +(test test-import-isidorus-association + "Tests all functions that are responsible to import a resource + representing isidorus:Association." + (let ((revision-1 100) + (tm-id "http://test/tm-id") + (document-id "doc-id") + (db-dir "./data_base") + (doc-1 + (concatenate 'string "<rdf:RDF xmlns:rdf=\"" *rdf-ns* "\" " + " xmlns:sw=\"http://test/arcs/\"" + " xmlns:isi=\"" *tm2rdf-ns* "\">" + " <rdf:Description rdf:nodeID=\"association-1\">" + " <rdf:type rdf:resource=\"" *tm2rdf-association-type-uri* "\"/>" + " <isi:associationtype rdf:resource=\"http://associationtype-1\"/>" + " <isi:scope>" + " <rdf:Description rdf:about=\"http://scope-1\">" + " <rdf:type rdf:resource=\"" *tm2rdf-topic-type-uri* "\"/>" + " <isi:subjectLocator rdf:datatype=\"" *xml-uri* "\">http://sl-1</isi:subjectLocator>" + " <isi:subjectLocator rdf:datatype=\"" *xml-uri* "\">http://sl-2</isi:subjectLocator>" + " <isi:name rdf:parseType=\"Resource\">" + " <rdf:type rdf:resource=\"" *tm2rdf-name-type-uri* "\"/>" + " <isi:nametype rdf:resource=\"http://nametype-1\"/>" + " <isi:value rdf:datatype=\"" *xml-string* "\">value-1</isi:value>" + " <isi:scope rdf:parseType=\"Resource\">" + " <sw:arc rdf:parseType=\"Literal\">value-of-arc</sw:arc>" + " </isi:scope>" + " </isi:name>" + " </rdf:Description>" + " </isi:scope>" + " <isi:itemIdentity rdf:datatype=\"" *xml-uri* "\">http://itemIdentity-a1</isi:itemIdentity>" + " <isi:itemIdentity rdf:datatype=\"" *xml-uri* "\">http://itemIdentity-a2</isi:itemIdentity>" + " <isi:role rdf:nodeID=\"role-1\"/>" + " </rdf:Description>" + + " <rdf:Description rdf:nodeID=\"role-1\">" + " <rdf:type rdf:resource=\"" *tm2rdf-role-type-uri* "\"/>" + " <isi:player rdf:resource=\"http://player-1\"/>" + " <isi:itemIdentity rdf:datatype=\"" *xml-uri* "\">http://itemIdentity-3</isi:itemIdentity>" + " <isi:roletype rdf:nodeID=\"roletype-1\"/>" + " </rdf:Description>" + + " <rdf:Description rdf:nodeID=\"association-1\">" + " <isi:itemIdentity rdf:datatype=\"" *xml-uri* "\">http://itemIdentity-a1</isi:itemIdentity>" + " <isi:scope rdf:resource=\"http://scope-2\"/>" + " <isi:role rdf:parseType=\"Resource\">" + " <rdf:type rdf:resource=\"" *tm2rdf-role-type-uri* "\"/>" + " <isi:player rdf:nodeID=\"player-2\"/>" + " <isi:roletype rdf:resource=\"http://roletype-2\"/>" + " </isi:role>" + " <isi:role>" + " <rdf:Description rdf:nodeID=\"role-1\">" + " <isi:itemIdentity rdf:datatype=\"" *xml-uri* "\">http://itemIdentity-3</isi:itemIdentity>" + " </rdf:Description>" + " </isi:role>" + " </rdf:Description>" + "</rdf:RDF>"))) + (let ((root (elt (dom:child-nodes (cxml:parse doc-1 + (cxml-dom:make-dom-builder))) + 0))) + (is (= (length (rdf-importer::child-nodes-or-text root)) 3)) + (rdf-init-db :db-dir db-dir :start-revision revision-1) + (rdf-importer::import-dom root revision-1 :tm-id tm-id + :document-id document-id) + (is (= (length (elephant:get-instances-by-class 'd:AssociationC)) 1)) + (is (= (length (elephant:get-instances-by-class 'd:TopicC)) 28)) + (is (= (length (elephant:get-instances-by-class 'd:OccurrenceC)) 1)) + (is (= (length (elephant:get-instances-by-class 'd:RoleC)) 2)) + (setf d::*current-xtm* document-id) + (let ((assoc (first (elephant:get-instances-by-class 'd:AssociationC))) + (assoc-type (d:get-item-by-psi "http://associationtype-1")) + (scope-1 (d:get-item-by-psi "http://scope-1")) + (player-1 (d:get-item-by-psi "http://player-1")) + (player-2 (d:get-item-by-id "player-2")) + (roletype-1 (d:get-item-by-id "roletype-1")) + (roletype-2 (d:get-item-by-psi "http://roletype-2")) + (nametype-1 (d:get-item-by-psi "http://nametype-1")) + (scope-2 (d:get-item-by-psi "http://scope-2"))) + (let ((role-1 (first (d:used-as-type roletype-1))) + (role-2 (first (d:used-as-type roletype-2)))) + (is-true scope-1) + (is (= (length (intersection + (list + (elephant:get-instance-by-value 'd:SubjectLocatorC + 'd:uri "http://sl-1") + (elephant:get-instance-by-value 'd:SubjectLocatorC + 'd:uri "http://sl-2")) + (d:locators scope-1))) + 2)) + (is (= (length (d:names scope-1)) 1)) + (is (eql (d:instance-of (first (d:names scope-1))) nametype-1)) + (is (string= (d:charvalue (first (d:names scope-1))) "value-1")) + (is (= (length (d:themes (first (d:names scope-1)))) 1)) + (is-false (d:psis (first (d:themes (first (d:names scope-1)))))) + (is-true player-1) + (is-true player-2) + (is-true roletype-1) + (is (string= (d:uri (first (d::topic-identifiers roletype-1))) + "roletype-1")) + (is-true roletype-2) + (is-true assoc-type) + (is-true scope-2) + (is-true role-1) + (is (= (length (intersection + (list + (elephant:get-instance-by-value + 'd:ItemIdentifierC 'd:uri "http://itemIdentity-3")) + (d:item-identifiers role-1))) + 1)) + (is (eql player-1 (d:player role-1))) + (is-true role-2) + (is-false (d:item-identifiers role-2)) + (is (eql player-2 (d:player role-2))) + (is (= (length (intersection (d:roles assoc) + (list role-1 role-2))) + 2)) + (is (= (length (intersection + (d:themes assoc) + (list scope-1 scope-2))) + 2)) + (is (= (length + (intersection + (d:item-identifiers assoc) + (list + (elephant:get-instance-by-value + 'd:ItemIdentifierC 'd:uri "http://itemIdentity-a1") + (elephant:get-instance-by-value + 'd:ItemIdentifierC 'd:uri "http://itemIdentity-a2")))) + 2))))))) + + (defun run-rdf-importer-tests() "Runs all defined tests." (when elephant:*store-controller* @@ -3606,4 +3740,5 @@ (it.bese.fiveam:run! 'test-isidorus-type-p) (it.bese.fiveam:run! 'test-get-all-isidorus-nodes-by-id) (it.bese.fiveam:run! 'test-import-isidorus-name) - (it.bese.fiveam:run! 'test-import-isidorus-occurrence)) \ No newline at end of file + (it.bese.fiveam:run! 'test-import-isidorus-occurrence) + (it.bese.fiveam:run! 'test-import-isidorus-association)) \ No newline at end of file Modified: trunk/src/xml/rdf/importer.lisp ============================================================================== --- trunk/src/xml/rdf/importer.lisp (original) +++ trunk/src/xml/rdf/importer.lisp Thu Sep 3 10:57:42 2009 @@ -86,9 +86,19 @@ (loop for child across children when (non-isidorus-type-p child tm-id :parent-xml-base xml-base) do (import-node child tm-id start-revision :document-id document-id - :xml-base xml-base :xml-lang xml-lang)))) - (import-node rdf-dom tm-id start-revision :document-id document-id - :xml-base xml-base :xml-lang xml-lang))) + :xml-base xml-base :xml-lang xml-lang) + when (isidorus-type-p child tm-id 'association + :parent-xml-base xml-base) + do (make-isidorus-association child tm-id start-revision + :parent-xml-base xml-base + :document-id document-id)))) + (if (isidorus-type-p rdf-dom tm-id 'association + :parent-xml-base xml-base) + (make-isidorus-association rdf-dom tm-id start-revision + :parent-xml-base xml-base + :document-id document-id) + (import-node rdf-dom tm-id start-revision :document-id document-id + :xml-base xml-base :xml-lang xml-lang)))) (setf *_n-map* nil)) @@ -104,47 +114,166 @@ (ID (get-absolute-attribute elem tm-id xml-base "ID")) (UUID (get-ns-attribute elem "UUID" :ns-uri *rdf2tm-ns*))) (parse-properties-of-node elem (or about nodeID ID UUID)) - ;TODO: create associations and roles -> and iterate in import-dom - ; over those elements - (let ((literals (append (get-literals-of-node elem fn-xml-lang) - (get-literals-of-node-content - elem tm-id xml-base fn-xml-lang))) - (associations (get-associations-of-node-content elem tm-id xml-base)) - (types (get-types-of-node elem tm-id :parent-xml-base xml-base)) - (super-classes - (get-super-classes-of-node-content elem tm-id xml-base)) - (subject-identities (make-isidorus-identifiers - elem start-revision :what "subjectIdentifier")) - (item-identifiers (make-isidorus-identifiers elem start-revision)) - (subject-locators (make-isidorus-identifiers elem start-revision - :what "subjectLocator"))) - (with-tm (start-revision document-id tm-id) - (let ((this - (make-topic-stub - about ID nodeID UUID start-revision xml-importer::tm - :document-id document-id - :additional-subject-identifiers subject-identities - :item-identifiers item-identifiers - :subject-locators subject-locators))) - (make-isidorus-names elem this tm-id start-revision - :owner-xml-base fn-xml-base - :document-id document-id) - (make-isidorus-occurrences elem this tm-id start-revision - :owner-xml-base fn-xml-base - :document-id document-id) - (make-literals this literals tm-id start-revision - :document-id document-id) - (make-associations this associations xml-importer::tm - start-revision :document-id document-id) - (make-types this types xml-importer::tm start-revision - :document-id document-id) - (make-super-classes this super-classes xml-importer::tm - start-revision :document-id document-id) - (make-recursion-from-node elem tm-id start-revision - :document-id document-id - :xml-base xml-base - :xml-lang xml-lang) - this)))))) + (let ((literals (append (get-literals-of-node elem fn-xml-lang) + (get-literals-of-node-content + elem tm-id xml-base fn-xml-lang))) + (associations (get-associations-of-node-content elem tm-id xml-base)) + (types (get-types-of-node elem tm-id :parent-xml-base xml-base)) + (super-classes + (get-super-classes-of-node-content elem tm-id xml-base)) + (subject-identities (make-isidorus-identifiers + (list elem) + start-revision :what "subjectIdentifier")) + (item-identifiers (make-isidorus-identifiers (list elem) + start-revision)) + (subject-locators (make-isidorus-identifiers + (list elem) start-revision :what "subjectLocator"))) + (with-tm (start-revision document-id tm-id) + (let ((this + (make-topic-stub + about ID nodeID UUID start-revision xml-importer::tm + :document-id document-id + :additional-subject-identifiers subject-identities + :item-identifiers item-identifiers + :subject-locators subject-locators))) + (make-isidorus-names elem this tm-id start-revision + :owner-xml-base fn-xml-base + :document-id document-id) + (make-isidorus-occurrences elem this tm-id start-revision + :owner-xml-base fn-xml-base + :document-id document-id) + (make-literals this literals tm-id start-revision + :document-id document-id) + (make-associations this associations xml-importer::tm + start-revision :document-id document-id) + (make-types this types xml-importer::tm start-revision + :document-id document-id) + (make-super-classes this super-classes xml-importer::tm + start-revision :document-id document-id) + (make-recursion-from-node elem tm-id start-revision + :document-id document-id + :xml-base xml-base + :xml-lang xml-lang) + this)))))) + + +(defun make-isidorus-association (elem tm-id start-revision + &key (parent-xml-base nil) + (document-id *document-id*)) + "Creates an association element of the passed DOM node." + (declare (dom:element elem)) + (declare (string tm-id)) + (let ((nodeID (get-ns-attribute elem "nodeID")) + (err-pref "From make-isidorus-association(): ") + (root (elt (dom:child-nodes (dom:owner-document elem)) 0))) + (let ((nodes (if nodeID + (get-all-isidorus-nodes-by-id + nodeId root *tm2rdf-association-type-uri*) + (list (list :elem elem + :xml-base parent-xml-base))))) + (let ((item-identities + (make-isidorus-identifiers + (map 'list #'(lambda(x) + (getf x :elem)) + nodes) start-revision)) + (association-type (import-topic-of-property + nodes tm-id start-revision + *tm2rdf-associationtype-property* + :document-id document-id)) + (association-scopes (make-scopes nodes tm-id start-revision + :document-id document-id)) + (association-roles (make-isidorus-roles + nodes tm-id start-revision + :document-id document-id))) + (unless association-type + (error "~aassociation type is missing!" err-pref)) + (unless association-roles + (error "~aassociation roles are missing!" err-pref)) + (with-tm (start-revision document-id tm-id) + (add-to-topicmap + xml-importer::tm + (make-construct 'AssociationC + :start-revision start-revision + :item-identifiers item-identities + :instance-of association-type + :themes association-scopes + :roles association-roles))))))) + + +(defun make-isidorus-roles (association-nodes tm-id start-revision + &key (document-id *document-id*)) + "Returns a list of property list of the form + (:instance-of <TopicC> :player <TopicC> :item-identifiers <(ItemIdentifierC)>)." + (declare (string tm-id)) + (let ((err-pref "From make-isidorus-roles(): ") + (all-role-nodes (get-all-role-nodes association-nodes)) + (root (elt (dom:child-nodes (dom:owner-document + (getf (first association-nodes) + :elem))) 0))) + (when (and (not (stringp all-role-nodes)) + (> (length all-role-nodes) 0)) + (loop for property in all-role-nodes + collect + (let ((nodeID (nodeId-of-property-or-child (getf property :elem)))) + (let ((nodes (if nodeID + (get-all-isidorus-nodes-by-id + nodeId root *tm2rdf-role-type-uri*) + (list (list :elem (getf property :elem) + :xml-base (getf property :xml-base) + :xml-lang + (getf property :xml-lang)))))) + (let ((item-identities + (make-isidorus-identifiers + (map 'list #'(lambda(x) + (getf x :elem)) + nodes) start-revision)) + (role-player (import-topic-of-property + nodes tm-id start-revision + *tm2rdf-player-property* + :document-id document-id)) + (role-type (import-topic-of-property + nodes tm-id start-revision + *tm2rdf-roletype-property* + :document-id document-id))) + (unless role-type + (error "~arole type is missing!" err-pref)) + (unless role-player + (error "~arole player is missing!" err-pref)) + (list :instance-of role-type + :player role-player + :item-identifiers item-identities)))))))) + + +(defun get-all-role-nodes (association-nodes) + "Returns all role nodes of the passed association nodes as a + property list of the form (:elem <dom:element> :xml-base <string> + :xml-lang <string>." + (let ((nodes + (loop for association in association-nodes + append + (let ((content (child-nodes-or-text (getf association :elem) + :trim t)) + (xml-base (getf association :xml-base)) + (xml-lang (getf association :xml-lang))) + (unless (stringp content) + (loop for property across content + when (let ((node-ns (dom:namespace-uri property)) + (node-name (get-node-name property))) + (string= (concatenate-uri node-ns node-name) + *tm2rdf-role-property*)) + collect (list :elem property + :xml-base (get-xml-base + (getf association :elem) + :old-base xml-base) + :xml-lang + (get-xml-lang (getf association :elem) + :old-lang xml-lang)))))))) + (remove-duplicates + (remove-if #'null nodes) + :test #'(lambda(x y) + (string= (nodeId-of-property-or-child (getf x :elem)) + (nodeID-of-property-or-child (getf y :elem))))))) + (defun make-isidorus-occurrences (owner-elem owner-topic tm-id start-revision @@ -175,11 +304,11 @@ property *tm2rdf-occurrence-type-uri* :xml-base xml-base)))))) (let ((item-identities - (remove-if #'null - (loop for node in nodes - append (make-isidorus-identifiers - (getf node :elem) start-revision)))) - (occurrence-type (make-x-type + (make-isidorus-identifiers + (map 'list #'(lambda(x) + (getf x :elem)) + nodes) start-revision)) + (occurrence-type (import-topic-of-property nodes tm-id start-revision *tm2rdf-occurrencetype-property* :document-id document-id)) @@ -228,13 +357,14 @@ property *tm2rdf-name-type-uri* :xml-base xml-base)))))) (let ((item-identities - (remove-if #'null - (loop for node in nodes - append (make-isidorus-identifiers - (getf node :elem) start-revision)))) - (name-type (make-x-type nodes tm-id start-revision - *tm2rdf-nametype-property* - :document-id document-id)) + (make-isidorus-identifiers + (map 'list #'(lambda(x) + (getf x :elem)) + nodes) start-revision)) + (name-type (import-topic-of-property + nodes tm-id start-revision + *tm2rdf-nametype-property* + :document-id document-id)) (name-value (getf (make-value nodes tm-id) :value)) (name-scopes (make-scopes nodes tm-id start-revision :document-id document-id))) @@ -289,11 +419,10 @@ :old-base (getf name-node :xml-base)))))))) (let ((item-identities - (remove-if - #'null - (loop for node in nodes - append (make-isidorus-identifiers - (getf node :elem) start-revision)))) + (make-isidorus-identifiers + (map 'list #'(lambda(x) + (getf x :elem)) + nodes) start-revision)) (variant-scopes (append (make-scopes nodes tm-id start-revision @@ -317,36 +446,57 @@ (defun make-scopes (node-list tm-id start-revision &key (document-id *document-id*)) "Creates for every found scope a corresponding topic stub." - (let ((properties + (let ((scopes (remove-if #'null (loop for node in node-list - append (let ((content (child-nodes-or-text (getf node :elem) - :trim t))) - (loop for property across content - when (let ((prop-ns (dom:namespace-uri property)) - (prop-name (get-node-name property))) - (string= (concatenate-uri prop-ns prop-name) - *tm2rdf-scope-property*)) - collect (list :elem property - :xml-base (get-xml-base - property - :old-base - (getf node :xml-base))))))))) - (let ((scope-uris - (remove-if #'null - (map 'list #'(lambda(x) - (get-ref-of-property (getf x :elem) tm-id - (getf x :xml-base))) - properties)))) - (with-tm (start-revision document-id tm-id) - (map 'list #'(lambda(x) - (let ((topicid (getf x :topicid)) - (psi (getf x :psi))) - (make-topic-stub psi nil topicid nil start-revision - xml-importer::tm - :document-id document-id))) - scope-uris))))) + append + (let ((content (child-nodes-or-text (getf node :elem) + :trim t))) + (loop for property across content + when (let ((prop-ns (dom:namespace-uri property)) + (prop-name (get-node-name property))) + (string= (concatenate-uri prop-ns prop-name) + *tm2rdf-scope-property*)) + collect + (let ((nodeID (get-ns-attribute property "nodeID")) + (resource (get-absolute-attribute + property tm-id (getf node :xml-base) + "resource")) + (children (child-nodes-or-text property + :trim t)) + (parseType (let ((pT + (get-ns-attribute property + "parseType"))) + (string= pT "Resource"))) + (type (get-ns-attribute property "type"))) + (if (or parseType type) + (progn + (parse-property property "") + (import-arc property tm-id start-revision + :document-id document-id + :xml-base (getf node :xml-base) + :xml-lang (getf node :xml-lang))) + (if (or nodeID resource) + (with-tm (start-revision document-id tm-id) + (make-topic-stub resource nil nodeID nil + start-revision xml-importer::tm + :document-id document-id)) + (if (and (= (length children) 1) + (not (stringp children))) + (import-node (elt children 0) tm-id + start-revision + :document-id document-id + :xml-base + (get-xml-base + (elt children 0) + :old-base (getf node :xml-base)) + :xml-lang + (get-xml-lang + (elt children 0) + :old-lang (getf node :xml-lang))) + (error "From make-scopes(): scope-property must contain one resource!"))))))))))) + (remove-duplicates scopes))) (defun make-value (node-list tm-id) @@ -401,43 +551,72 @@ -(defun make-x-type (node-list tm-id start-revision uri-of-property - &key (document-id *document-id*)) +(defun import-topic-of-property (node-list tm-id start-revision uri-of-property + &key (document-id *document-id*)) "Creates a topic stub that is the type of the name represented by the passed nodes." - (let ((property - (loop for node in node-list - when (let ((content (child-nodes-or-text (getf node :elem) - :trim t))) - (loop for property across content - when (let ((prop-ns (dom:namespace-uri property)) - (prop-name (get-node-name property))) - (string= (concatenate-uri prop-ns prop-name) - uri-of-property)) - return property)) - return (let ((content (child-nodes-or-text (getf node :elem) + (let ((err-pref "From import-topic-of-property(): ")) + (let ((tops + (loop for node in node-list + when (let ((content (child-nodes-or-text (getf node :elem) :trim t))) (loop for property across content when (let ((prop-ns (dom:namespace-uri property)) (prop-name (get-node-name property))) (string= (concatenate-uri prop-ns prop-name) uri-of-property)) - return (list - :elem property - :xml-base (get-xml-base property - :old-base - (getf - node - :xml-base)))))))) - (when property - (let ((type-uri (get-ref-of-property (getf property :elem) tm-id - (getf property :xml-base)))) - (unless type-uri - (error "From make-x-type(): type-uri is missing!")) - (with-tm (start-revision document-id tm-id) - (make-topic-stub (getf type-uri :psi) nil - (getf type-uri :topicid) nil start-revision - xml-importer::tm :document-id document-id)))))) + return property)) + append + (let ((content (child-nodes-or-text (getf node :elem) + :trim t))) + (loop for property across content + when (let ((prop-ns (dom:namespace-uri property)) + (prop-name (get-node-name property))) + (string= (concatenate-uri prop-ns prop-name) + uri-of-property)) + collect + (let ((nodeID (get-ns-attribute property "nodeID")) + (resource (get-absolute-attribute + property tm-id (getf node :xml-base) + "resource")) + (children (child-nodes-or-text property + :trim t)) + (parseType (let ((pT + (get-ns-attribute property + "parseType"))) + (string= pT "Resource"))) + (type (get-ns-attribute property "type"))) + (if (or parseType type) + (progn + (parse-property (getf node :elem) "") + (import-arc property tm-id start-revision + :document-id document-id + :xml-base (getf node :xml-base) + :xml-lang (getf node :xml-lang))) + (if (or nodeID resource) + (with-tm (start-revision document-id tm-id) + (make-topic-stub resource nil nodeID nil + start-revision xml-importer::tm + :document-id document-id)) + (if (and (= (length children) 1) + (not (stringp children))) + (import-node (elt children 0) tm-id + start-revision + :document-id document-id + :xml-base + (get-xml-base + (elt children 0) + :old-base (getf node :xml-base)) + :xml-lang + (get-xml-lang + (elt children 0) + :old-lang (getf node :xml-lang))) + (error "~aproperty must contain one resource!" + err-pref)))))))))) + (if (> (length (remove-duplicates tops)) 1) + (error "~aproperty must contain one resource node: ~a!" + err-pref (length (remove-duplicates tops))) + (first tops))))) (defun import-arc (elem tm-id start-revision @@ -464,11 +643,11 @@ (parse-properties-of-node elem UUID) (let ((subject-identifiers (make-isidorus-identifiers - elem start-revision :what "subjectIdentifier")) + (list elem) start-revision :what "subjectIdentifier")) (item-identities - (make-isidorus-identifiers elem start-revision)) + (make-isidorus-identifiers (list elem) start-revision)) (subject-locators - (make-isidorus-identifiers elem start-revision + (make-isidorus-identifiers (list elem) start-revision :what "subjectLocator"))) (let ((this (make-topic-stub @@ -608,21 +787,24 @@ (defun make-types (owner-top types tm start-revision &key (document-id *document-id*)) "Creates instance-of associations corresponding to the passed - topic owner-top and the passed types." + topic owner-top and the passed types but not isidorus:Topic." (declare (d:TopicC owner-top)) - (map 'list - #'(lambda(type) - (let ((type-topic - (make-topic-stub (getf type :psi) - nil - (getf type :topicid) - nil start-revision tm - :document-id document-id)) - (ID (getf type :ID))) - (make-instance-of-association owner-top type-topic - ID start-revision tm - :document-id document-id))) - types)) + (remove-if + #'null + (map 'list + #'(lambda(type) + (when (string/= (getf type :psi) *tm2rdf-topic-type-uri*) + (let ((type-topic + (make-topic-stub (getf type :psi) + nil + (getf type :topicid) + nil start-revision tm + :document-id document-id)) + (ID (getf type :ID))) + (make-instance-of-association owner-top type-topic + ID start-revision tm + :document-id document-id)))) + types))) (defun make-super-classes (owner-top super-classes tm start-revision @@ -1244,10 +1426,9 @@ :xml-lang xml-lang)))))))) -(defun make-isidorus-identifiers (owner-elem start-revision &key (what "itemIdentity")) +(defun make-isidorus-identifiers (owner-list start-revision &key (what "itemIdentity")) "Returns a list oc created identifier objects that can be used directly in make-topic-stub." - (declare (dom:element owner-elem)) (declare (string what)) (when (and (string/= what "itemIdentity") (string/= what "subjectIdentifier") @@ -1255,32 +1436,42 @@ (error "From make-identifiers(): what must be set to: ~a but is ~a" (list "itemIdentity" "subjectIdentifiers" "subjectLocator") what)) - (let ((content (child-nodes-or-text owner-elem :trim t)) - (class-symbol (cond - ((string= what "itemIdentity") - 'ItemIdentifierC) - ((string= what "subjectIdentifier") - 'PersistentIdC) - ((string= what "subjectLocator") - 'SubjectLocatorC)))) - (unless (stringp content) - (let ((identifiers - (loop for property across content - when (let ((prop-ns (dom:namespace-uri property)) - (prop-name (get-node-name property)) - (prop-content (child-nodes-or-text property :trim t))) - (and (string= prop-ns *tm2rdf-ns*) - (string= prop-name what) - (stringp prop-content) - (> (length prop-content) 0))) - collect (let ((uri (child-nodes-or-text property :trim t))) - (make-instance class-symbol - :uri uri - :start-revision start-revision)))) - (identifier-attr - (let ((attr (get-ns-attribute owner-elem what :ns-uri *tm2rdf-ns*))) - (when attr - (list (make-instance class-symbol - :uri attr - :start-revision start-revision)))))) - (remove-if #'null (append identifiers identifier-attr)))))) \ No newline at end of file + (let ((class-symbol + (cond + ((string= what "itemIdentity") + 'ItemIdentifierC) + ((string= what "subjectIdentifier") + 'PersistentIdC) + ((string= what "subjectLocator") + 'SubjectLocatorC)))) + (let ((uris + (loop for owner-elem in owner-list + append + (let ((content (child-nodes-or-text owner-elem :trim t))) + (unless (stringp content) + (let ((identifier-uris + (loop for property across content + when + (let ((prop-ns (dom:namespace-uri property)) + (prop-name (get-node-name property)) + (prop-content (child-nodes-or-text + property :trim t))) + (and (string= prop-ns *tm2rdf-ns*) + (string= prop-name what) + (stringp prop-content) + (> (length prop-content) 0))) + collect + (child-nodes-or-text property :trim t))) + (attr-uri + (let ((attr (get-ns-attribute owner-elem what + :ns-uri *tm2rdf-ns*))) + (when attr + (list attr))))) + (append identifier-uris attr-uri))))))) + (map 'list #'(lambda(x) + (make-instance class-symbol + :uri x + :start-revision start-revision)) + (remove-duplicates + (remove-if #'null uris) + :test #'string=))))) \ No newline at end of file Modified: trunk/src/xml/rdf/isidorus_constructs_tools.lisp ============================================================================== --- trunk/src/xml/rdf/isidorus_constructs_tools.lisp (original) +++ trunk/src/xml/rdf/isidorus_constructs_tools.lisp Thu Sep 3 10:57:42 2009 @@ -226,12 +226,14 @@ (string= x-uri *tm2rdf-associationtype-property*) (string= x-uri *tm2rdf-occurrencetype-property*) (string= x-uri *tm2rdf-roletype-property*) - (string= x-uri *tm2rdf-subjectLocator-property*)))) + (string= x-uri *tm2rdf-subjectLocator-property*) + (string= x-uri *tm2rdf-player-property*)))) content)))) (defun get-all-isidorus-nodes-by-id (node-id current-node type-uri &key (parent-xml-base nil) + (parent-xml-lang nil) (collected-nodes nil)) "Returns a list of all nodes that own the given nodeID and are of type type-uri, rdf:Description or when the rdf:parseType is set to @@ -246,6 +248,7 @@ t))) (content (child-nodes-or-text current-node :trim t)) (xml-base (get-xml-base current-node :old-base parent-xml-base)) + (xml-lang (get-xml-lang current-node :old-lang parent-xml-lang)) (nodeID (get-ns-attribute current-node "nodeID")) (node-uri-p (let ((node-uri (concatenate-uri (dom:namespace-uri current-node) @@ -269,7 +272,8 @@ (if (or datatype parseType (stringp content) (not content)) (if (and (string= nodeID node-id) node-uri-p) (append (list (list :elem current-node - :xml-base xml-base)) + :xml-base parent-xml-base + :xml-lang parent-xml-lang)) collected-nodes) collected-nodes) (if (and (string= nodeID node-id) node-uri-p) @@ -277,15 +281,19 @@ append (get-all-isidorus-nodes-by-id node-id item type-uri :collected-nodes (append - (list (list :elem current-node - :xml-base xml-base)) + (list (list + :elem current-node + :xml-base parent-xml-base + :xml-lang parent-xml-lang)) collected-nodes) - :parent-xml-base xml-base)) + :parent-xml-base xml-base + :parent-xml-lang xml-lang)) (loop for item across content append (get-all-isidorus-nodes-by-id node-id item type-uri :collected-nodes collected-nodes - :parent-xml-base xml-base))))) + :parent-xml-base xml-base + :parent-xml-lang xml-lang))))) :test #'(lambda(x y) (eql (getf x :elem) (getf y :elem)))))) Modified: trunk/src/xml/rdf/rdf_tools.lisp ============================================================================== --- trunk/src/xml/rdf/rdf_tools.lisp (original) +++ trunk/src/xml/rdf/rdf_tools.lisp Thu Sep 3 10:57:42 2009 @@ -53,7 +53,8 @@ *tm2rdf-varianttype-property* *tm2rdf-occurrencetype-property* *tm2rdf-roletype-property* - *tm2rdf-associationtype-property*) + *tm2rdf-associationtype-property* + *tm2rdf-player-property*) (:import-from :xml-constants *rdf_core_psis.xtm* *core_psis.xtm*)
participants (1)
-
Lukas Giessmann