Author: lgiessmann
Date: Mon May 9 09:58:45 2011
New Revision: 462
Log:
JTM: added the functions: make-prefix-list-from-jtm-list, import-construct-from-jtm-string, import-from-jtm, import-topic-map-from-jtm-list, and import-role-from-jtm-list
Modified:
trunk/src/base-tools/base-tools.lisp
trunk/src/json/JTM/jtm_aliases.lisp
trunk/src/json/JTM/jtm_importer.lisp
trunk/src/json/JTM/jtm_tools.lisp
trunk/src/rest_interface/rest-interface.lisp
trunk/src/unit_tests/jtm_test.lisp
trunk/src/xml/rdf/importer.lisp
trunk/src/xml/xtm/setup.lisp
Modified: trunk/src/base-tools/base-tools.lisp
==============================================================================
--- trunk/src/base-tools/base-tools.lisp (original)
+++ trunk/src/base-tools/base-tools.lisp Mon May 9 09:58:45 2011
@@ -46,7 +46,8 @@
:prefix-of-uri
:get-store-spec
:open-tm-store
- :close-tm-store))
+ :close-tm-store
+ :read-file))
(in-package :base-tools)
@@ -576,9 +577,21 @@
"Wraps the function elephant:open-store with the key-parameter
:register, so one store canbe used by several instances of
isidorus in parallel."
- (elephant:open-store (get-store-spec pathname) :register t))
+ (if elephant:*store-controller*
+ (elephant:open-store (get-store-spec pathname) :register t)
+ elephant:*store-controller*))
(defun close-tm-store ()
"Wraps the function elephant:close-store."
- (elephant:close-store))
\ No newline at end of file
+ (elephant:close-store))
+
+
+(defun read-file (file-path)
+ "A helper function that reads a file and returns the content as a string."
+ (with-open-file (stream file-path)
+ (let ((file-string ""))
+ (do ((l (read-line stream) (read-line stream nil 'eof)))
+ ((eq l 'eof))
+ (base-tools:push-string (base-tools::concat l (string #\newline)) file-string))
+ (subseq file-string 0 (max 0 (1- (length file-string)))))))
\ No newline at end of file
Modified: trunk/src/json/JTM/jtm_aliases.lisp
==============================================================================
--- trunk/src/json/JTM/jtm_aliases.lisp (original)
+++ trunk/src/json/JTM/jtm_aliases.lisp Mon May 9 09:58:45 2011
@@ -11,6 +11,7 @@
(:use :cl :json :datamodel :base-tools :isidorus-threading
:constants :exceptions :jtm)
(:export :import-from-jtm
+ :import-form-jtm-string
:export-as-jtm
:export-as-jtm-string
:export-construct-as-jtm-string
Modified: trunk/src/json/JTM/jtm_importer.lisp
==============================================================================
--- trunk/src/json/JTM/jtm_importer.lisp (original)
+++ trunk/src/json/JTM/jtm_importer.lisp Mon May 9 09:58:45 2011
@@ -10,17 +10,119 @@
(in-package :jtm)
-;TODO: write a generic outer method that evaluates the item_type,
-; version, parent, and prefixes and finally calls a special
-; function that creates a construct
-
-
(defun get-item (item-keyword jtm-list)
(declare (Keyword item-keyword)
(List jtm-list))
(rest (find item-keyword jtm-list :key #'first)))
+(defun make-prefix-list-from-jtm-list (jtm-list)
+ "Creates a plist of the form ((:pref 'pref_1' :value 'value-1')
+ (:pref 'pref_2' :value 'value-2')) if the passed jtm-list is
+ of the form ((:PREF--1 . 'value-1')(:PREF--2 . 'value-2'))."
+ (declare (List jtm-list))
+ (loop for item in jtm-list
+ collect (list :pref (json:lisp-to-camel-case
+ (subseq (write-to-string (first item)) 1))
+ :value (rest item))))
+
+
+(defun import-construct-from-jtm-string (jtm-string &key
+ (revision *TM-REVISION*)
+ (jtm-format :1.1) tm-id)
+ "Imports the passed jtm-string.
+ Note tm-id needs not to be declared, but if the imported construct
+ is a topicmap and it has no item-identifiers defined, a JTM-error
+ is thrown."
+ (declare (String jtm-string)
+ (type (or Null String) tm-id))
+
+ (let* ((jtm-list (json:decode-json-from-string jtm-string))
+ (version (get-item :VERSION jtm-list))
+ (item_type (get-item :ITEM--TYPE jtm-list))
+ (prefixes (make-prefix-list-from-jtm-list (get-item :PREFIXES jtm-list)))
+ (format-1.1-p (eql jtm-format :1.1)))
+ (cond ((eql jtm-format :1.0)
+ (unless (string= version "1.0")
+ (error (make-condition 'exceptions:JTM-error :message (format nil "From import-construct-from-jtm-string(): the member version must be set to \"1.0\" in JTM version 1.0, but is ~a" version))))
+ (when prefixes
+ (error (make-condition 'exceptions:JTM-error :message (format nil "From import-construct-from-jtm-string(): the member prefixes must not be set when using JTM version 1.0, but found: ~a" prefixes)))))
+ ((eql jtm-format :1.1)
+ (unless (string= version "1.1")
+ (error (make-condition 'exceptions:JTM-error :message (format nil "From import-construct-from-jtm-string(): the member version must be set to \"1.1\" in JTM version 1.1, but is ~a" version)))))
+ (t
+ (error (make-condition 'exceptions:JTM-error :message (format nil "From import-construct-from-jtm-string(): only JTM format 1.0 and 1.1 is supported, but found: ~a" jtm-format)))))
+ (cond ((or (not item_type)
+ (string= item_type item_type-topicmap))
+ (import-topic-map-from-jtm-list
+ jtm-list tm-id :revision revision :prefixes prefixes
+ :instance-of-p format-1.1-p))
+ ((string= item_type item_type-topic)
+ (import-topic-stub-from-jtm-list jtm-list nil :revision revision
+ :prefixes prefixes)
+ (merge-topic-from-jtm-list jtm-list nil :instance-of-p format-1.1-p
+ :revision revision :prefixes prefixes))
+ ((string= item_type item_type-name)
+ (import-name-from-jtm-list jtm-list nil :revision revision
+ :prefixes prefixes))
+ ((string= item_type item_type-variant)
+ (import-variant-from-jtm-list jtm-list nil :revision revision
+ :prefixes prefixes))
+ ((string= item_type item_type-occurrence)
+ (import-occurrence-from-jtm-list jtm-list nil :revision revision
+ :prefixes prefixes))
+ ((string= item_type item_type-role)
+ (import-role-from-jtm-list jtm-list nil :revision revision
+ :prefixes prefixes))
+ ((string= item_type item_type-association)
+ (import-association-from-jtm-list jtm-list nil :revision revision
+ :prefixes prefixes))
+ (t
+ (error (make-condition 'exceptions:JTM-error :message (format nil "From import-construct-from-jtm-string(): the member \"item_type\" must be set to one of ~a or nil, but found \"~a\". If \"item_type\" is not specified or nil the JTM-data is treated as a topicmap." item_type (list item_type-topicmap item_type-topic item_type-name item_type-variant item_type-occurrence item_type-role item_type-association))))))))
+
+
+(defun import-from-jtm (jtm-path repository-path &key (tm-id (error "you must provide a stable identifier (PSI-style) for this TM")) (revision *TM-REVISION*) (jtm-format :1.1))
+ "Imports the given jtm-file by calling import-construct-from-jtm-string."
+ (declare (type (or Pathname String) jtm-path repository-path)
+ (String tm-id)
+ (Keyword jtm-format)
+ (Integer revision))
+ (open-tm-store repository-path)
+ (import-construct-from-jtm-string (read-file jtm-path) :tm-id tm-id :revision revision
+ :jtm-format jtm-format)
+ (close-tm-store))
+
+
+(defun import-topic-map-from-jtm-list (jtm-list tm-id &key (revision *TM-REVISION*)
+ prefixes (instance-of-p t))
+ "Creates and returns a topic map corresponding to the tm-id or a given
+ item-identifier in the jtm-list and returns the tm construct after all
+ topics and associations contained in the jtm-list has been created."
+ (declare (List jtm-list prefixes)
+ (Integer revision)
+ (Boolean instance-of-p))
+ (let* ((iis (let ((value (append (import-identifiers-from-jtm-strings
+ (get-item :ITEM--IDENTIFIERS jtm-list)
+ :prefixes prefixes)
+ (when tm-id
+ (make-construct 'ItemIdentifierC
+ :uri tm-id)))))
+ (unless value
+ (error (make-condition 'JTM-error :message (format nil "From import-topic-map-from-jtm-list(): no topic-map item-identifier is set for ~a" jtm-list))))
+ value))
+ (j-tops (get-item :TOPICS jtm-list))
+ (j-assocs (get-item :ASSOCIATIONS jtm-list))
+ (tm (make-construct 'TopicMapC :start-revision revision
+ :item-identifiers iis)))
+ (import-topic-stubs-from-jtm-lists j-tops (list tm) :revision revision
+ :prefixes prefixes)
+ (merge-topics-from-jtm-lists j-tops (list tm) :instance-of-p instance-of-p
+ :revision revision :prefixes prefixes)
+ (import-associations-from-jtm-lists j-assocs (list tm) :revision revision
+ :prefixes prefixes)
+ tm))
+
+
(defun import-associations-from-jtm-lists (jtm-lists parents &key
(revision *TM-REVISION*) prefixes)
"Create a listof AssociationC objects corresponding to the passed jtm-lists
@@ -33,6 +135,40 @@
jtm-lists))
+(defun import-role-from-jtm-list (jtm-list parent &key (revision *TM-REVISION*)
+ prefixes)
+ "Creates and returns a role object form the given jtm-list."
+ (let* ((iis (import-identifiers-from-jtm-strings
+ (get-item :ITEM--IDENTIFIERS jtm-list)
+ :prefixes prefixes))
+ (type (get-item :TYPE jtm-list))
+ (reifier (get-item :REIFIER jtm-list))
+ (player (get-item :PLAYER jtm-list))
+ (parent-reference (get-item :PARENT jtm-list))
+ (local-parent
+ (if parent
+ parent
+ (when parent-reference
+ (get-item-from-jtm-reference
+ parent-reference :revision revision :prefixes prefixes)))))
+ (unless local-parent
+ (error (make-condition 'JTM-error :message (format nil "From import-role-from-jtm-list(): the JTM role ~a must have exactly one parent set in its members." jtm-list))))
+ (unless type
+ (error (make-condition 'JTM-error :message (format nil "From import-role-from-jtm-list(): the role ~a must have exactly one type set as member." jtm-list))))
+ (unless player
+ (error (make-condition 'JTM-error :message (format nil "From import-role-from-jtm-list(): the role ~a must have exactly one player set as member." jtm-list))))
+ (make-construct 'RoleC :start-revision revision
+ :item-identifiers iis
+ :reifier (when reifier
+ (get-item-from-jtm-reference
+ reifier :revision revision :prefixes prefixes))
+ :instance-of (get-item-from-jtm-reference
+ type :revision revision :prefixes prefixes)
+ :player (get-item-from-jtm-reference
+ player :revision revision :prefixes prefixes)
+ :parent local-parent)))
+
+
(defun make-plist-of-jtm-role(jtm-list &key (revision *TM-REVISION*) prefixes)
"Returns a plist of the form (:start-revision <rev> :player <top>
:instance-of <top> :reifier <top> :item-identifiers <ii>)."
Modified: trunk/src/json/JTM/jtm_tools.lisp
==============================================================================
--- trunk/src/json/JTM/jtm_tools.lisp (original)
+++ trunk/src/json/JTM/jtm_tools.lisp Mon May 9 09:58:45 2011
@@ -11,10 +11,10 @@
(:use :cl :json :datamodel :base-tools :isidorus-threading
:constants :exceptions)
(:export :import-from-jtm
+ :import-construct-from-jtm-string
:export-as-jtm
:export-as-jtm-string
:export-construct-as-jtm-string
- :*jtm-xtm*
:item_type-topicmap
:item_type-topic
:item_type-name
@@ -25,8 +25,6 @@
(in-package :jtm)
-(defvar *jtm-xtm* "jtm-xtm"); Represents the currently active TM of the JTM-Importer
-
(defvar item_type-topicmap "topicmap")
(defvar item_type-topic "topic")
Modified: trunk/src/rest_interface/rest-interface.lisp
==============================================================================
--- trunk/src/rest_interface/rest-interface.lisp (original)
+++ trunk/src/rest_interface/rest-interface.lisp Mon May 9 09:58:45 2011
@@ -82,8 +82,7 @@
(setf hunchentoot:*show-lisp-errors-p* t) ;for now
(setf hunchentoot:*hunchentoot-default-external-format*
(flex:make-external-format :utf-8 :eol-style :lf))
- (unless elephant:*store-controller*
- (open-tm-store repository-path))
+ (open-tm-store repository-path)
(set-up-json-interface)
(setf *json-server-acceptor*
(make-instance 'hunchentoot:acceptor :address host-name :port port))
@@ -111,8 +110,7 @@
(setf hunchentoot:*hunchentoot-default-external-format*
(flex:make-external-format :utf-8 :eol-style :lf))
(setf atom:*base-url* (format nil "http://~a:~a" host-name port))
- (unless elephant:*store-controller*
- (open-tm-store repository-path))
+ (open-tm-store repository-path)
(load conf-file)
(publish-feed atom:*tm-feed*)
(setf *atom-server-acceptor*
Modified: trunk/src/unit_tests/jtm_test.lisp
==============================================================================
--- trunk/src/unit_tests/jtm_test.lisp (original)
+++ trunk/src/unit_tests/jtm_test.lisp Mon May 9 09:58:45 2011
@@ -49,16 +49,6 @@
(in-package :jtm-test)
-(defun read-file (file-path)
- "A helper function that reads a file and returns the content as a string."
- (with-open-file (stream file-path)
- (let ((file-string ""))
- (do ((l (read-line stream) (read-line stream nil 'eof)))
- ((eq l 'eof))
- (base-tools:push-string (base-tools::concat l (string #\newline)) file-string))
- (subseq file-string 0 (max 0 (1- (length file-string)))))))
-
-
(def-suite jtm-tests
:description "tests various functions of the jtm module")
@@ -1639,7 +1629,7 @@
(test test-make-instance-of-association
- "Tests the function make-instance-of-association."
+ "Tests the function make-instance-of-association."1
(with-fixture with-empty-db ("data_base")
(let* ((tt (make-construct 'TopicC :start-revision 100
:psis
@@ -2211,6 +2201,12 @@
+;TODO:
+; *import-role-from-jtm-list
+; *import-construct-from-jtm-string
+; *import-from-jtm
+; *import-topic-map-from-jtm-list
+
(defun run-jtm-tests()
"Runs all tests of this test-suite."
(it.bese.fiveam:run! 'jtm-tests))
\ 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 Mon May 9 09:58:45 2011
@@ -15,8 +15,7 @@
to the give file path is imported."
(declare ((or pathname string) rdf-xml-path))
(declare ((or pathname string) repository-path))
- (unless elephant:*store-controller*
- (open-tm-store repository-path))
+ (open-tm-store repository-path)
(xtm-importer:init-isidorus)
(init-rdf-module)
(import-from-rdf rdf-xml-path repository-path :tm-id tm-id
@@ -34,8 +33,7 @@
(setf *document-id* document-id)
(tm-id-p tm-id "rdf-importer")
(with-writer-lock
- (unless elephant:*store-controller*
- (open-tm-store repository-path))
+ (open-tm-store repository-path)
(let ((rdf-dom
(dom:document-element (cxml:parse-file
(truename rdf-xml-path)
Modified: trunk/src/xml/xtm/setup.lisp
==============================================================================
--- trunk/src/xml/xtm/setup.lisp (original)
+++ trunk/src/xml/xtm/setup.lisp Mon May 9 09:58:45 2011
@@ -26,8 +26,7 @@
(let ((xtm-dom (dom:document-element
(cxml:parse-file
(truename xtm-path) (cxml-dom:make-dom-builder)))))
- (unless elephant:*store-controller*
- (open-tm-store repository-path))
+ (open-tm-store repository-path)
;create the topic stubs so that we can refer to them later on
(setf d:*current-xtm* xtm-id)
(if (eq xtm-format :2.0)
@@ -48,8 +47,7 @@
(declare (type (or pathname string) xtm-path repository-path)
(String tm-id xtm-id)
(Keyword xtm-format))
- (unless elephant:*store-controller*
- (open-tm-store repository-path))
+ (open-tm-store repository-path)
(init-isidorus)
(import-from-xtm xtm-path repository-path :tm-id tm-id :xtm-id xtm-id
:xtm-format xtm-format)