[isidorus-cvs] r13 - trunk/src/rest_interface

Christoph Ludwig cludwig at common-lisp.net
Sun Feb 1 21:48:06 UTC 2009


Author: cludwig
Date: Sun Feb  1 21:48:06 2009
New Revision: 13

Log:
check if we already imported any snapshot

Modified:
   trunk/src/rest_interface/read.lisp

Modified: trunk/src/rest_interface/read.lisp
==============================================================================
--- trunk/src/rest_interface/read.lisp	(original)
+++ trunk/src/rest_interface/read.lisp	Sun Feb  1 21:48:06 2009
@@ -83,39 +83,48 @@
     (t 
      (string-max (rest string-list) max))))
 
-(defun import-snapshots-feed (snapshot-feed-url &key tm-id)
-  ;this finds the most recent snapshot and imports that. It returns the entry
-  ;corresponding to that snapshot
+(defun most-recent-entry (entry-list)
+  (let
+      ((most-recent-update (string-max (mapcar #'atom:updated entry-list))))
+    (find most-recent-update entry-list :key #'updated :test #'string=)))
+
+(defun most-recent-imported-snapshot (all-snapshot-entries)
+  (let
+      ((all-imported-entries
+	(remove-if-not #'xtm-id-p all-snapshot-entries :key #'atom:id)))
+    (most-recent-entry all-imported-entries)))
 
- (let
+(defun import-snapshots-feed (snapshot-feed-url &key tm-id)
+  "checks if we already imported any of this feed's snapshots. If not,
+finds the most recent snapshot and imports that. It returns the entry
+corresponding to the snapshot imported (now or previously)."
+ (let*
       ((feed (read-snapshots-feed snapshot-feed-url))
-       (revision (get-revision)))
-   (let*
-       ((most-recent-update (string-max (mapcar #'atom:updated (slot-value feed 'atom:entries))))
-	(entry 
-	 (find
-	  most-recent-update
-	  (slot-value feed 'atom:entries) :key #'updated :test #'string=))
-        (xtm-id (id entry)))
-     ;;that *should* be the algorithm...
-     ;;    If a client has a local topic map that contains topic map
-     ;;    data from more than one server and wants to fetch and update
-     ;;    the latest full topic map from ONE source then it MUST do the
-     ;;    following. Apply the delete topic algorithm from below, but
-     ;;    apply it to the entire topic map. Then proceed in terms of 'A
-     ;;    Clean Start', by fetching the topic map and merging it in
-     ;;    (1b, 1.4.3.2)
-     (unless (xtm-id-p xtm-id)
-       (importer-xtm1.0
-        (dom:document-element
-         (cxml:parse-rod (read-url (link entry)) (cxml-dom:make-dom-builder)))
-        :tm-id tm-id
-        :xtm-id xtm-id :revision revision))
-     entry)))
+       (all-entries (slot-value feed 'atom:entries))
+       (most-recent-imported-entry all-entries))
+   (if most-recent-imported-entry
+       most-recent-imported-entry
+       (let*
+	   ((entry (most-recent-entry all-entries))
+	    (snapshot-dom 
+	     (dom:document-element
+	      (cxml:parse-rod (read-url (link entry)) (cxml-dom:make-dom-builder))))
+	    (xtm-id (id entry))
+	    (revision (get-revision)))
+	 ;;that *should* be the algorithm...
+	 ;;    If a client has a local topic map that contains topic map
+	 ;;    data from more than one server and wants to fetch and update
+	 ;;    the latest full topic map from ONE source then it MUST do the
+	 ;;    following. Apply the delete topic algorithm from below, but
+	 ;;    apply it to the entire topic map. Then proceed in terms of 'A
+	 ;;    Clean Start', by fetching the topic map and merging it in
+	 ;;    (1b, 1.4.3.2)
+	 (importer-xtm1.0 snapshot-dom :tm-id tm-id :xtm-id xtm-id :revision revision)
+	 entry))))
 
 (defun import-tm-feed (feed-url &optional (processed-feed-urls nil))
-  "takes the feed url of a collection feed, imports the first snapshot if
-necessary and then applies all fragments to it"
+  "takes the feed url of a collection feed, processes the dependencies,
+imports the first snapshot if necessary and then applies all fragments to it"
   ;the implementation may be a bit brutal, but relies only on
   ;guaranteed rel-attributes on the links
   (let*
@@ -146,7 +155,8 @@
           (format t "Recursively processing feed ~a~&" dependent-feed-url)
 	  (import-tm-feed dependent-feed-url (append processed-feed-urls feed-url)))))
 	      
-
+    ;; import a snapshot (if necessary) and the process all fragments more 
+    ;; recent than the snapshot
     (let
 	((imported-snapshot-entry
 	  (import-snapshots-feed 




More information about the Isidorus-cvs mailing list