[isidorus-cvs] r276 - in trunk/src: . json

Lukas Giessmann lgiessmann at common-lisp.net
Tue Apr 13 12:06:02 UTC 2010


Author: lgiessmann
Date: Tue Apr 13 08:06:00 2010
New Revision: 276

Log:
json: added the functionality to deleted topics and associations to the json/RESTful-interface

Modified:
   trunk/src/isidorus.asd
   trunk/src/json/json_tmcl.lisp

Modified: trunk/src/isidorus.asd
==============================================================================
--- trunk/src/isidorus.asd	(original)
+++ trunk/src/isidorus.asd	Tue Apr 13 08:06:00 2010
@@ -162,7 +162,7 @@
 					    :depends-on ("json_tmcl_constants" "json_exporter" ))
 				     (:file "json_tmcl_constants")
 				     (:file "json_tmcl"
-					    :depends-on ("json_tmcl_validation")))
+					    :depends-on ("json_tmcl_validation" "json_importer")))
 	                :depends-on ("model"
 				     "xml"))
 	       (:module "ajax"

Modified: trunk/src/json/json_tmcl.lisp
==============================================================================
--- trunk/src/json/json_tmcl.lisp	(original)
+++ trunk/src/json/json_tmcl.lisp	Tue Apr 13 08:06:00 2010
@@ -15,8 +15,9 @@
 ;; =============================================================================
 ; a test string ...
 (defvar cl-user::*js-1*
-  "{\"type\":\"Topic\",
-    \"topics\":[\"http://textgrid.org/isidorus/tmcl/service\"],
+  "{\"type\":\"Association\",
+    \"topics\":[\"http://textgrid.org/isidorus/tmcl/service\",
+                \"http://textgrid.org/isidorus/tmcl/parameter\"],
     \"associations\":[{\"itemIdentities\":null,
                       \"type\":[\"http://psi.topicmaps.org/tmcl/applies-to\"],
                       \"scopes\":null,
@@ -24,7 +25,7 @@
                                   \"type\":[\"http://psi.topicmaps.org/tmcl/constraint-role\"],
                                   \"topicRef\":[\"http://textgrid.org/isidorus/tmcl/exc\"]},
                                  {\"itemIdentities\":null,
-                                  \"type\":[\"http://psi.topicmaps.org/tmcl/topictype-role\"],
+                                  \"type\":[\"http://psi.topicmaps.org/tmcl/topic-type-role\"],
                                   \"topicRef\":[\"http://textgrid.org/isidorus/tmcl/service\"]}]}],
     \"parent-topic\":[\"http://textgrid.org/isidorus/my-service/my-service\"],
     \"parent-name\":{\"itemIdentities\":null,
@@ -85,9 +86,109 @@
 ;                          role>
 ; \"roles\": <a list of roles in the specified json format>}
   (let ((values (json:decode-json-from-string json-data)))
-    values
-    ))
+    (let ((type nil)
+	  (topics nil)
+	  (associations nil)
+	  (parent-topic nil)
+	  (parent-name nil)
+	  (names nil)
+	  (variants nil)
+	  (occurrences nil)
+	  (parent-association nil)
+	  (roles nil)
+	  (rev (get-revision)))
+      (loop for entry in values
+	 when (consp entry)
+	 do (let ((st (car entry))
+		  (nd (cdr entry)))
+	      (cond ((eql st :type) (setf type nd))
+		    ((eql st :topics) (setf topics nd))
+		    ((eql st :associations) (setf associations nd))
+		    ((eql st :parent-topic) (setf parent-topic nd))
+		    ((eql st :parent-name) (setf parent-name nd))
+		    ((eql st :names) (setf names nd))
+		    ((eql st :variants) (setf variants nd))
+		    ((eql st :occurrences) (setf occurrences nd))
+		    ((eql st :parent-association) (setf parent-association nd))
+		    ((eql st :roles) (setf roles nd)))))
+      (cond ((string= type "Topic")
+	     (delete-topics-from-json topics rev))
+	    ((string= type "Association")
+	     (delete-associations-from-json associations rev))
+	    ((string= type "Occurrence")
+	     nil)
+	    ((string= type "Name")
+	     nil)
+	    ((string= type "Variant")
+	     nil)
+	    ((string= type "Role")
+	     nil)
+	    (t
+	     (error "From mark-as-deleted-from-json(): the type ~a is not defined"
+		    type))))))
+
+
 
+(defun find-association-from-json (json-plist)
+  (declare (list json-plist))
+  (let ((type-assocs
+	 (elephant:get-instances-by-value
+	  'd:AssociationC 'd:instance-of
+	  (d:get-item-by-psi (first (getf json-plist :type)))))
+	(scopes nil)
+	(err "From find-association-from-json(): "))
+    (loop for scope-entry in (getf json-plist :scopes)
+       do (let ((top (d:get-item-by-psi (first scope-entry))))
+	    (unless top
+	      (error "~a ~a not found"
+		     err (first scope-entry)))
+	    (pushnew top scopes)))
+    (let ((scope-assocs
+	   (loop for assoc in type-assocs
+	      when (not (set-exclusive-or scopes (themes assoc)))
+	      collect assoc)))
+      (loop for assoc in scope-assocs
+	 when (let ((found-roles
+		     (loop for j-role in (getf json-plist :roles)
+			when (let ((j-player (when (getf j-role :topicRef)
+					       (d:get-item-by-psi (first (getf j-role :topicRef)))))
+				   (j-type (when (getf j-role :type)
+					     (d:get-item-by-psi (first (getf j-role :type))))))
+			       (find-if #'(lambda(role)
+					    (and (eql (instance-of role) j-type)
+						 (eql (player role) j-player)))
+					(roles assoc)))
+			collect j-role)))
+		(= (length (roles assoc)) (length (getf json-plist :roles))
+		   (length found-roles)))
+	 return assoc))))
+
+
+(defun delete-associations-from-json (associations revision)
+  (declare (list associations) (integer revision))
+  (dolist (j-assoc associations)
+    (let ((plist (json-importer::get-association-values-from-json-list j-assoc))
+	  (err "From delete-association-from-json(): "))
+      (let ((assoc (find-association-from-json plist)))
+	(unless assoc
+	  (error "~a ~a not found" err plist))
+	(mark-as-deleted assoc :revision revision)))))
+  
+
+(defun delete-topics-from-json (topics revision)
+  (declare (list topics) (integer revision))
+  (let ((psis nil))
+    (dolist (uri topics)
+      (let ((psi (elephant:get-instance-by-value 'd:PersistentIdC 'd:uri uri)))
+	(unless psi
+	  (error "From delete-topic-from-json(): PSI ~a not found" uri))
+	(pushnew psi psis)))
+    (let ((tops
+	   (remove-duplicates
+	    (map 'list #'d:identified-construct psis))))
+      (dolist (top tops)
+	(let ((psi (uri (first (psis top)))))
+	  (mark-as-deleted top :source-locator psi :revision revision))))))
 
 
 ;; =============================================================================




More information about the Isidorus-cvs mailing list