Index: openacs-4/packages/lors/tcl/lors-imsmd-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lors/tcl/lors-imsmd-procs.tcl,v diff -u -r1.10 -r1.11 --- openacs-4/packages/lors/tcl/lors-imsmd-procs.tcl 17 Oct 2008 10:35:28 -0000 1.10 +++ openacs-4/packages/lors/tcl/lors-imsmd-procs.tcl 17 Nov 2008 13:35:03 -0000 1.11 @@ -29,7 +29,6 @@ @param doc Document @param attr_name Attribute we want to fetch - } { if {[$doc hasAttribute $attr_name] == 1} { $doc getAttribute $attr_name @@ -38,6 +37,7 @@ } } + ad_proc -public HasPrefix { {tree} } { @@ -49,14 +49,15 @@ } { set prefix [$tree prefix] return $prefix - } - + } + + ad_proc -public hasMetadata { {tree} } { Checks if the XML node contains a metadata element returns 1 if true; 0 if false. - Later addition: checks also if the metadata record has + Later addition: checks also if the metadata record has child nodes } { if { ![empty_string_p [$tree child all metadata]] } { @@ -69,7 +70,8 @@ return 0 } } - + + ad_proc -public getMDNode { {tree} } { @@ -81,6 +83,7 @@ return [$tree child all metadata] } + ad_proc -public getMDSchema { {tree} } { @@ -97,15 +100,17 @@ if { ![empty_string_p [$tree child all schema]] } { lappend retlist [getElement [$tree child all schema] asXML] } + if { ![empty_string_p [$tree child all schemaversion]] } { - lappend retlist [getElement [$tree child all schemaversion]] + lappend retlist [getElement [$tree child all schemaversion]] } return $retlist } else { return [list 0 0] } } + ad_proc -public getLOM { {tree} {dir} @@ -125,24 +130,30 @@ set var_lom "lom" set prefix "" set lom [$tree child all $var_lom] + } elseif { ![empty_string_p [$tree child all imsmd:lom]] } { set var_lom "imsmd:lom" set prefix [[$tree child all imsmd:lom] prefix] set lom [$tree child all $var_lom] + } elseif { ![empty_string_p [$tree child all record]] } { - # used mostly for IMS Metadata + # used mostly for IMS Metadata set var_lom "record" set prefix "" set lom [$tree child all $var_lom] + } elseif { ![empty_string_p [$tree child all imsmd:record]] } { - # used mostly for IMS Metadata + # used mostly for IMS Metadata set var_lom "imsmd:record" set prefix [[$tree child all imsmd:record] prefix] set lom [$tree child all $var_lom] + } elseif { ![empty_string_p [$tree child all adlcp:location]] } { - set doc [dom parse [::tDOM::xmlReadFile $dir/[ns_urldecode [[$tree child all adlcp:location] text]]]] - set lom [$doc documentElement] + set doc [dom parse [::tDOM::xmlReadFile $dir/[ns_urldecode \ + [[$tree child all adlcp:location] text]]]] + set lom [$doc documentElement] set prefix [$lom prefix] + } else { set lom 0 set prefix 0 @@ -152,7 +163,8 @@ return 0 } } - + + # xmlExtractor extras ad_proc -public xmlExtractor { {element} @@ -163,7 +175,7 @@ } { XML Metadata extractor This is the key MD extractor. - + It uses some different datatypes to extract MD: datatype1 = langstrings @@ -177,7 +189,7 @@ @param element @param tree @param prefix - @param datatype + @param datatype @param att @author Ernie Ghiglione (ErnieG@mm.st) @@ -187,6 +199,7 @@ } else { set md_g_title [$tree child all $prefix:$element] } + if { ![empty_string_p $md_g_title] } { set retlist [list] if {$datatype == 1} { @@ -195,36 +208,42 @@ set retlist "$retlist [getLangStr $one $prefix]" } return $retlist + } elseif {$datatype == 2} { foreach one $md_g_title { #get sources and values set retlist "$retlist [getSourceValue $one $prefix]" } return $retlist + } elseif {$datatype == 3} { foreach one $md_g_title { #get catalogentry set retlist "$retlist [getCatalogEntry $one $prefix]" } return $retlist + } elseif {$datatype == 4} { foreach one $md_g_title { #get date set retlist "$retlist [getDate $one $prefix]" } return $retlist + } elseif {$datatype == 5} { foreach one $md_g_title { #get person / Vcard set retlist "$retlist [getVcard $one $prefix]" } return $retlist + } elseif {$datatype == 6} { foreach one $md_g_title { #get element attribute only. set retlist "$retlist [getAtt $one $att]" } return $retlist + } else { foreach one $md_g_title { #get simple element @@ -233,12 +252,10 @@ return $retlist } } - } ### Datatypes ad_procedures - ad_proc -public getLangStr { {tree} {prefix {}} @@ -255,6 +272,7 @@ } else { set var "langstring" } + set aa [list] set ab [list] set mult 0 @@ -265,13 +283,15 @@ lappend ab $aa incr mult } + if { $mult > 1} { return $ab } else { return $ab } } + ad_proc -public getSourceValue { {tree} {prefix {}} @@ -286,16 +306,19 @@ if { ![empty_string_p $prefix] } { set var_source "$prefix:source" set var_value "$prefix:value" + } else { set var_source "source" set var_value "value" } + set source [$tree child all $var_source] set sv [list] if { ![empty_string_p $source] } { #Gets all the langstrings set sv "$sv [getLangStr $source $prefix]" } + set value [$tree child all $var_value] if { ![empty_string_p $value] } { #Gets all the langstrings @@ -306,8 +329,8 @@ ad_proc -public getCatalogEntry { - {tree} - {prefix {}} + {tree} + {prefix {}} } { Datatype CatalogEntry extractor @@ -319,16 +342,19 @@ if { ![empty_string_p $prefix] } { set var_catalog "$prefix:catalog" set var_entry "$prefix:entry" + } else { set var_catalog "catalog" set var_entry "entry" } + set catalog [$tree child all $var_catalog] set ce [list] if { ![empty_string_p $catalog] } { #Gets all the langstrings set ce "$ce [getElement $catalog $prefix]" } + set entry [$tree child all $var_entry] if { ![empty_string_p $entry] } { #Gets all the langstrings @@ -337,9 +363,10 @@ return [list $ce] } + ad_proc -public getDate { - {tree} - {prefix {}} + {tree} + {prefix {}} } { Datatype Date @@ -351,16 +378,19 @@ if { ![empty_string_p $prefix] } { set var_datetime "$prefix:datetime" set var_description "$prefix:description" + } else { set var_datetime "datetime" set var_description "description" } + set datetime [$tree descendant all $var_datetime] set dt "" if { ![empty_string_p $datetime] } { #Gets all the langstrings set dt [getElement $datetime $prefix] } + set description [$tree descendant all $var_description] if { ![empty_string_p $description] } { #Gets all the langstrings @@ -370,11 +400,10 @@ } - ad_proc -public getElement { - {tree} - {prefix {}} - {att {}} + {tree} + {prefix {}} + {att {}} } { Datatype Element extractor @@ -408,13 +437,14 @@ } else { set var_vcard "vcard" } - + foreach child [$tree child all $var_vcard] { set aa "[$child text]" } return [list $aa] } - + + ## Special Datatypes ad_procedures ad_proc -public getTaxon { {tree} @@ -428,28 +458,26 @@ } { if { ![empty_string_p $prefix] } { set var_taxon $prefix:taxon - } else { set var_taxon taxon } - + set taxon [$tree child all $var_taxon] - if { ![empty_string_p $taxon]} { set taxons $taxon foreach one $taxon { if { ![empty_string_p [$one descendant all $var_taxon]] } { set taxons "$taxons [getTaxon $one $prefix]" - } + } return $taxons } } } ad_proc -public getContribute { - {tree} - {prefix {}} + {tree} + {prefix {}} } { Special extraction of Contributors @@ -463,12 +491,14 @@ set var_role "$prefix:role" set var_centity "$prefix:centity" set var_date "$prefix:date" + } else { set var_contribute "contribute" set var_role "role" set var_centity "centity" set var_date "date" } + set lom_lc_contribute [$tree child all $var_contribute] if { ![empty_string_p $lom_lc_contribute] } { set cont_list [list] @@ -477,6 +507,7 @@ if { ![empty_string_p $role] } { set cont_x [xmlExtractor role $contribute $prefix 2] } + set centity [$contribute child all $var_centity] if { ![empty_string_p $centity] } { set cc [list] @@ -485,6 +516,7 @@ } set cont_x "$cont_x [list $cc]" } + set date [$contribute child all $var_date] if { ![empty_string_p $date] } { set cont_x "$cont_x [list [xmlExtractor date $contribute $prefix 4]]" @@ -495,9 +527,10 @@ } } + ad_proc -public getRequirement { - {tree} - {prefix {}} + {tree} + {prefix {}} } { Gets requirements @@ -511,7 +544,7 @@ } else { set var_requirement "requirement" } - + set lom_te_req [$tree child all $var_requirement] if { ![empty_string_p $lom_te_req] } { # there could be multiple req @@ -527,6 +560,7 @@ } } + ad_proc -public namechild { {a} } { @@ -535,27 +569,26 @@ } { set lix {} foreach node $a { - foreach child [$node child all] {lappend lix [$child localName] [$child prefix]} + foreach child [$node child all] { + lappend lix [$child localName] [$child prefix] + } } return $lix } - ## Metadata extractor function - - ad_proc -public mdGeneral { {-element:required} {-node:required} {-prefix {}} {-att {}} - } { + } { General Metadata extractor returns a list with the attributes and elements if it doesn't exists returns 0 @param element element to retrieve - @param node Node + @param node Node @param prefix Prefix @param att Attribute @author Ernie Ghiglione (ErnieG@mm.st) @@ -566,42 +599,43 @@ } else { set lom_g [$node child all general] } + if { ![empty_string_p $lom_g] } { set retlist [list] switch $element { title { #gets title set retlist [xmlExtractor title $lom_g $prefix 1] - } - catalogentry { + + } catalogentry { #gets catalogentry set retlist [xmlExtractor catalogentry $lom_g $prefix 3] - } - language { + + } language { #gets language set retlist [xmlExtractor language $lom_g $prefix] - } - description { + + } description { #gets description set retlist [xmlExtractor description $lom_g $prefix 1] - } - keyword { + + } keyword { #gets keyword set retlist [xmlExtractor keyword $lom_g $prefix 1] - } - coverage { + + } coverage { #gets coverage set retlist [xmlExtractor coverage $lom_g $prefix 1] - } - structure { + + } structure { #gets structure set retlist [xmlExtractor structure $lom_g $prefix 2] - } - aggregationlevel { + + } aggregationlevel { #gets aggregationlevel set retlist [xmlExtractor aggregationlevel $lom_g $prefix 2] - } - default { + + } default { return 0 } } @@ -610,18 +644,19 @@ return 0 } + ad_proc -public mdLifeCycle { {-element:required} {-node:required} {-prefix {}} {-att {}} - } { + } { Life Cycle Metadata extractor returns a list with the attributes and elements if it doesn't exists returns 0 @param element element to retrieve - @param node Node + @param node Node @param prefix Prefix @param att Attribute @author Ernie Ghiglione (ErnieG@mm.st) @@ -632,22 +667,23 @@ } else { set lom_lc [$node child all lifecycle] } + if { ![empty_string_p $lom_lc] } { set retlist [list] switch $element { version { #gets version set retlist [xmlExtractor version $lom_lc $prefix 1] - } - status { + + } status { #gets status set retlist [xmlExtractor status $lom_lc $prefix 2] - } - contribute { + + } contribute { #gets contribute set retlist [getContribute $lom_lc $prefix] - } - default { + + } default { return 0 } } @@ -656,25 +692,26 @@ return 0 } + ad_proc -public mdMetadata { {-element:required} {-node:required} {-prefix {}} {-att {}} - } { + } { Meta Metadata extractor returns a list with the attributes and elements if it doesn't exists returns 0 @param element element to retrieve - @param node Node + @param node Node @param prefix Prefix @param att Attribute @author Ernie Ghiglione (ErnieG@mm.st) } { if { ![empty_string_p $prefix] } { - set lom_md [$node child all $prefix:metametadata] + set lom_md [$node child all $prefix:metametadata] } else { set lom_md [$node child all metametadata] } @@ -684,16 +721,16 @@ contribute { #gets contribute set retlist [getContribute $lom_md $prefix] - } - catalogentry { + + } catalogentry { #get catalogentry set retlist [xmlExtractor catalogentry $lom_md $prefix 3] - } - metadatascheme { + + } metadatascheme { #get metadatascheme set retlist [xmlExtractor metadatascheme $lom_md $prefix] - } - language { + + } language { #get language set retlist [xmlExtractor language $lom_md $prefix] } @@ -709,13 +746,13 @@ {-node:required} {-prefix {}} {-att {}} - } { + } { Technical Metadata extractor returns a list with the attributes and elements if it doesn't exists returns 0 @param element element to retrieve - @param node Node + @param node Node @param prefix Prefix @param att Attribute @author Ernie Ghiglione (ErnieG@mm.st) @@ -732,32 +769,32 @@ format { #gets format set retlist [xmlExtractor format $lom_te $prefix] - } - location { + + } location { #gets location set retlist [xmlExtractor location $lom_te $prefix 0 type] - } - requirement { + + } requirement { #gets requiremets set retlist [getRequirement $lom_te $prefix] - } - size { + + } size { #gets size set retlist [xmlExtractor size $lom_te $prefix 0] - } - installationremarks { + + } installationremarks { #gets installationremarks set retlist [xmlExtractor installationremarks $lom_te $prefix 1] - } - otherplatformrequirements { + + } otherplatformrequirements { #gets otherplatformrequirements set retlist [xmlExtractor otherplatformrequirements $lom_te $prefix 1] - } - duration { + + } duration { #gets duration set retlist [xmlExtractor duration $lom_te $prefix 4] - } - default { + + } default { return 0 } } @@ -772,13 +809,13 @@ {-node:required} {-prefix {}} {-att {}} - } { + } { Educational Metadata extractor returns a list with the attributes and elements if it doesn't exists returns 0 @param element element to retrieve - @param node Node + @param node Node @param prefix Prefix @param att Attribute @author Ernie Ghiglione (ErnieG@mm.st) @@ -794,70 +831,74 @@ switch $element { interactivitytype { #gets format - set retlist [xmlExtractor interactivitytype $lom_ed $prefix 2] - } - learningresourcetype { + set retlist [xmlExtractor interactivitytype \ + $lom_ed $prefix 2] + + } learningresourcetype { #gets learningresourcetype - set retlist [xmlExtractor learningresourcetype $lom_ed $prefix 2] - } - interactivitylevel { + set retlist [xmlExtractor learningresourcetype \ + $lom_ed $prefix 2] + + } interactivitylevel { #gets interactivitylevel - set retlist [xmlExtractor interactivitylevel $lom_ed $prefix 2] - } - semanticdensity { + set retlist [xmlExtractor interactivitylevel \ + $lom_ed $prefix 2] + + } semanticdensity { #gets semanticdensity set retlist [xmlExtractor semanticdensity $lom_ed $prefix 2] - } - intendedenduserrole { + + } intendedenduserrole { #gets intendedenduserrole - set retlist [xmlExtractor intendedenduserrole $lom_ed $prefix 2] - } - context { + set retlist [xmlExtractor intendedenduserrole \ + $lom_ed $prefix 2] + + } context { #gets context set retlist [xmlExtractor context $lom_ed $prefix 2] - } - typicalagerange { + + } typicalagerange { #gets typicalagerange set retlist [xmlExtractor typicalagerange $lom_ed $prefix 1] - } - difficulty { + + } difficulty { #gets difficulty set retlist [xmlExtractor difficulty $lom_ed $prefix 2] - } - typicallearningtime { + + } typicallearningtime { #gets typicallearningtime set retlist [xmlExtractor typicallearningtime $lom_ed $prefix 4] - } - description { + + } description { #gets description set retlist [xmlExtractor description $lom_ed $prefix 1] - } - language { + + } language { #gets language set retlist [xmlExtractor language $lom_ed $prefix] - } - default { + + } default { return 0 } } return $retlist } return 0 } - + ad_proc -public mdRights { {-element:required} {-node:required} {-prefix {}} {-att {}} - } { + } { Rights Metadata extractor returns a list with the attributes and elements if it doesn't exists returns 0 @param element element to retrieve - @param node Node + @param node Node @param prefix Prefix @param att Attribute @author Ernie Ghiglione (ErnieG@mm.st) @@ -868,40 +909,42 @@ } else { set lom_ri [$node child all rights] } + if { ![empty_string_p $lom_ri] } { set retlist [list] switch $element { cost { #gets cost set retlist [xmlExtractor cost $lom_ri $prefix 2] - } - copyrightandotherrestrictions { + + } copyrightandotherrestrictions { #gets copyrightandotherrestrictions - set retlist [xmlExtractor copyrightandotherrestrictions $lom_ri $prefix 2] - } - description { + set retlist [xmlExtractor copyrightandotherrestrictions \ + $lom_ri $prefix 2] + + } description { #gets description set retlist [xmlExtractor description $lom_ri $prefix 1] - } - default { + + } default { return 0 } } return $retlist } return 0 } - + ad_proc -public mdRelation { {-node:required} {-prefix {}} - } { + } { Relation Metadata extractor returns a list with the attributes and elements if it doesn't exists returns 0 - @param node Node + @param node Node @param prefix Prefix @author Ernie Ghiglione (ErnieG@mm.st) @@ -911,6 +954,7 @@ } else { set lom_re [$node child all relation] } + if { ![empty_string_p $lom_re] } { set retlist [list] foreach relation $lom_re { @@ -923,16 +967,19 @@ } else { set resource [$relation child all resource] } + #printx "Resource ([llength $resource]) " $resource foreach res $resource { # gets resource description - set aa "$aa {[lors::imsmd::xmlExtractor description $res $prefix 1]}" + set aa "$aa {[lors::imsmd::xmlExtractor description + $res $prefix 1]}" # gets resource catalogentry - set aa "$aa {[lors::imsmd::xmlExtractor catalogentry $res $prefix 3]}" + set aa "$aa {[lors::imsmd::xmlExtractor catalogentry + $res $prefix 3]}" } lappend retlist $aa } - return $retlist + return $retlist } return 0 } @@ -941,12 +988,12 @@ ad_proc -public mdAnnotation { {-node:required} {-prefix {}} - } { + } { Annotation Metadata extractor returns a list with the attributes and elements if it doesn't exists returns 0 - @param node Node + @param node Node @param prefix Prefix @author Ernie Ghiglione (ErnieG@mm.st) @@ -956,6 +1003,7 @@ } else { set lom_an [$node child all annotation] } + if { ![empty_string_p $lom_an] } { set retlist [list] foreach annotation $lom_an { @@ -967,24 +1015,23 @@ set aa "$aa {[lors::imsmd::xmlExtractor description $annotation $prefix 1]}" lappend retlist $aa } - return $retlist + return $retlist } return 0 } - + ad_proc -public mdClassification { {-node:required} {-prefix {}} - } { + } { Classification Metadata extractor returns a list with the attributes and elements if it doesn't exists returns 0 - @param node Node + @param node Node @param prefix Prefix @author Ernie Ghiglione (ErnieG@mm.st) - } { if { ![empty_string_p $prefix] } { set lom_cl [$node child all $prefix:classification] @@ -997,20 +1044,21 @@ foreach classification $lom_cl { #gets purpose set aa "{[lors::imsmd::xmlExtractor purpose $classification $prefix 2]}" - + #gets description set aa "$aa {[lors::imsmd::xmlExtractor description $classification $prefix 1]}" - + #gets taxonpath if { ![empty_string_p $prefix] } { set tax [$classification child all $prefix:taxonpath] } else { set tax [$classification child all taxonpath] } + foreach taxonpath $tax { # gets source set bb [lors::imsmd::xmlExtractor source $taxonpath $prefix 1] - + # gets taxons if { ![empty_string_p [lors::imsmd::getTaxon $taxonpath $prefix]] } { set hierarchy 0 @@ -1027,16 +1075,15 @@ } # gets keywords set dd "{[lors::imsmd::xmlExtractor keyword $classification $prefix 1]}" - + lappend retlist "{$aa [list $bbcc] $dd}" } - return $retlist + return $retlist } return 0 } - ad_proc -public getResource { {-node:required} {-att:required} @@ -1045,7 +1092,7 @@ -node the XML node -att the attribute to be extracted - @param node Node + @param node Node @param att Attribute @author Ernie Ghiglione (ErnieG@mm.st) @@ -1054,25 +1101,26 @@ scormtype { # gets the type of resource return [string tolower [lors::imsmd::getAtt $node adlcp:scormtype]] - } - identifier { + + } identifier { # gets identifier return [lors::imsmd::getAtt $node identifier] - } - type { + + } type { # gets type return [lors::imsmd::getAtt $node type] - } - href { + + } href { # gets href return [lors::imsmd::getAtt $node href] - } - files { + + } files { set files [list] # gets files set filex [$node child all file] if { ![empty_string_p $filex] } { foreach file $filex { + # checks for file metadata set file_hasmetadata [lors::imsmd::hasMetadata $file] if {$file_hasmetadata == 1} { @@ -1082,12 +1130,15 @@ #otherwise, just pass 0 (No metadata found) set file_hasmetadata 0 } - lappend files [list [lors::imsmd::getAtt $file href] $file_hasmetadata] + + lappend files [list \ + [lors::imsmd::getAtt $file href] \ + $file_hasmetadata] } } return $files - } - dependencies { + + } dependencies { set dependencies [list] # gets dependencies set depende [$node child all dependency] @@ -1097,42 +1148,40 @@ } } return $dependencies - } - default { + + } default { return [lors::imsmd::getAtt $node $att] } } } - - - + + ad_proc -public getItem { - {tree} + {tree} } { Extracts data from resource\item - @param tree Node + @param tree Node @author Ernie Ghiglione (ErnieG@mm.st) } { set itemx [$tree child all item] - + if { ![empty_string_p $itemx] } { set items [list] foreach itemx [$tree child all item] { - # gets item identifier printx "item identifier: " [getAtt $itemx identifier] - + # gets item identifierref printx "item identifierref: " [getAtt $itemx identifierref] - + # gets item isvisible ? printx "item isvisible: " [getAtt $itemx isvisible] - + # gets item title printx "item title: " [getElement [$itemx child all title]] - + set itemxx [$itemx child all item] if { ![empty_string_p $itemxx] } { printx "

" " " @@ -1145,1108 +1194,1148 @@ ad_proc -public addLOM { - {-lom:required} - {-prefix} - {-acs_object:required} - {-dir {}} + {-lom:required} + {-prefix} + {-acs_object:required} + {-dir {}} } { - Adds LOM metadata for a learning resource. - This is the master function for adding metadata. - This is the MD mama function for entering LOM into the db. + Adds LOM metadata for a learning resource. + This is the master function for adding metadata. + This is the MD mama function for entering LOM into the db. - @param lom the LOM node (XML) for the learning resource - @param acs_object acs object for resource (element) that contains metadata - @param dir dir directory where the imsmanifest.xml file is located. This is use in the case the metadata is in a different file location (adlcp:location). - @author Ernie Ghiglione (ErnieG@mm.st) + @param lom the LOM node (XML) for the learning resource + @param acs_object acs object for resource (element) that contains metadata + @param dir dir directory where the imsmanifest.xml file is located. \ + This is use in the case the metadata is in a different file \ + location (adlcp:location). + @author Ernie Ghiglione (ErnieG@mm.st) } { - set p_ims_md_id $acs_object - set path_to_file $dir + set p_ims_md_id $acs_object + set path_to_file $dir -# db_transaction { - # General + # General - # Title - set titles [lors::imsmd::mdGeneral -element title -node $lom -prefix $prefix] + # Title + set titles [lors::imsmd::mdGeneral -element title -node $lom -prefix $prefix] - # Structure - set structure_s [lindex [lindex [lindex [lors::imsmd::mdGeneral -element structure -node $lom -prefix $prefix] 0] 0] 1] - set structure_v [lindex [lindex [lindex [lors::imsmd::mdGeneral -element structure -node $lom -prefix $prefix] 0] 1] 1] + # Structure + set structure_s [lindex \ + [lindex \ + [lindex [lors::imsmd::mdGeneral \ + -element structure \ + -node $lom \ + -prefix $prefix] 0] 0] 1] + set structure_v [lindex \ + [lindex \ + [lindex [lors::imsmd::mdGeneral \ + -element structure \ + -node $lom \ + -prefix $prefix] 0] 1] 1] - # Aggregation level - set agg_level_s [lindex [lindex [lindex [lors::imsmd::mdGeneral -element aggregationlevel -node $lom -prefix $prefix] 0] 0] 1] - set agg_level_v [lindex [lindex [lindex [lors::imsmd::mdGeneral -element aggregationlevel -node $lom -prefix $prefix] 0] 1] 1] + # Aggregation level + set agg_level_s [lindex \ + [lindex \ + [lindex [lors::imsmd::mdGeneral \ + -element aggregationlevel \ + -node $lom \ + -prefix $prefix] 0] 0] 1] - # Catalogentry - set catalogentries [lors::imsmd::mdGeneral -element catalogentry -node $lom -prefix $prefix] + set agg_level_v [lindex \ + [lindex \ + [lindex [lors::imsmd::mdGeneral \ + -element aggregationlevel \ + -node $lom \ + -prefix $prefix] 0] 1] 1] - # Languages - set languages [lors::imsmd::mdGeneral -element language -node $lom -prefix $prefix] - - # Descriptions - set descriptions [lors::imsmd::mdGeneral -element description -node $lom -prefix $prefix] + # Catalogentry + set catalogentries [lors::imsmd::mdGeneral \ + -element catalogentry \ + -node $lom \ + -prefix $prefix] - # Keywords - set keywords [lors::imsmd::mdGeneral -element keyword -node $lom -prefix $prefix] + # Languages + set languages [lors::imsmd::mdGeneral \ + -element language \ + -node $lom \ + -prefix $prefix] - # Coverages - set coverages [lors::imsmd::mdGeneral -element coverage -node $lom -prefix $prefix] + # Descriptions + set descriptions [lors::imsmd::mdGeneral \ + -element description \ + -node $lom \ + -prefix $prefix] - # Now we insert the values into the DB - db_dml add_new_general { - insert into ims_md_general (ims_md_id, structure_s, structure_v, agg_level_s, agg_level_v) - values - (:p_ims_md_id, :structure_s, :structure_v, :agg_level_s, :agg_level_v) - } + # Keywords + set keywords [lors::imsmd::mdGeneral \ + -element keyword \ + -node $lom \ + -prefix $prefix] + # Coverages + set coverages [lors::imsmd::mdGeneral \ + -element coverage \ + -node $lom \ + -prefix $prefix] - # Adds General Titles + # Now we insert the values into the DB + db_dml add_new_general { + insert into ims_md_general (ims_md_id, structure_s, structure_v, agg_level_s, agg_level_v) + values (:p_ims_md_id, :structure_s, :structure_v, :agg_level_s, :agg_level_v) + } - foreach title $titles { - set p_ims_md_ge_ti_id [db_nextval ims_md_general_title_seq] - set p_title_l [lindex $title 0] - set p_title_s [lindex $title 1] - - db_dml add_new_general_titles { - insert into ims_md_general_title (ims_md_ge_ti_id, ims_md_id, title_l, title_s) - values - (:p_ims_md_ge_ti_id, :p_ims_md_id, :p_title_l, :p_title_s) - } - } + # Adds General Titles - # Adds General Catalog Entries - foreach catalogentry $catalogentries { - set p_ims_md_ge_cata_id [db_nextval ims_md_general_cata_seq] - set p_catalog [lindex $catalogentry 0] - set p_entry_l [lindex [lindex $catalogentry 1] 0] - set p_entry_s [lindex [lindex $catalogentry 1] 1] - - db_dml add_new_general_catalogentries { - - insert into ims_md_general_cata (ims_md_ge_cata_id, ims_md_id, catalog, entry_l, entry_s) - values - (:p_ims_md_ge_cata_id, :p_ims_md_id, :p_catalog, :p_entry_l, :p_entry_s) - } - } + foreach title $titles { + set p_ims_md_ge_ti_id [db_nextval ims_md_general_title_seq] + set p_title_l [lindex $title 0] + set p_title_s [lindex $title 1] - # Adds General Languages - foreach language $languages { - set p_ims_md_ge_lang_id [db_nextval ims_md_general_lang_seq] + db_dml add_new_general_titles { + insert into ims_md_general_title (ims_md_ge_ti_id, ims_md_id, title_l, title_s) + values (:p_ims_md_ge_ti_id, :p_ims_md_id, :p_title_l, :p_title_s) + } - db_dml add_new_general_language { - insert into ims_md_general_lang (ims_md_ge_lang_id, ims_md_id, language) - values - (:p_ims_md_ge_lang_id, :p_ims_md_id, :language) - } - } + } - # Adds General Description - foreach description $descriptions { - set p_ims_md_ge_desc_id [db_nextval ims_md_general_desc_seq] - set p_descrip_l [lindex $description 0] - set p_descrip_s [lindex $description 1] - - db_dml add_new_general_description { - insert into ims_md_general_desc (ims_md_ge_desc_id, ims_md_id, descrip_l, descrip_s) - values - (:p_ims_md_ge_desc_id, :p_ims_md_id, :p_descrip_l, :p_descrip_s) - } - } - - # Adds General Keywords - foreach keyword $keywords { - set p_ims_md_ge_key_id [db_nextval ims_md_general_key_seq] - set p_keyword_l [lindex $keyword 0] - set p_keyword_s [lindex $keyword 1] - - db_dml add_new_general_keyword { - insert into ims_md_general_key (ims_md_ge_key_id, ims_md_id, keyword_l, keyword_s) - values - (:p_ims_md_ge_key_id, :p_ims_md_id, :p_keyword_l, :p_keyword_s) - } - } + # Adds General Catalog Entries + foreach catalogentry $catalogentries { + set p_ims_md_ge_cata_id [db_nextval ims_md_general_cata_seq] + set p_catalog [lindex $catalogentry 0] + set p_entry_l [lindex [lindex $catalogentry 1] 0] + set p_entry_s [lindex [lindex $catalogentry 1] 1] - # Adds General Coverage - foreach coverage $coverages { - set p_ims_md_ge_cove_id [db_nextval ims_md_general_cover_seq] - set p_cover_l [lindex $coverage 0] - set p_cover_s [lindex $coverage 1] - - db_dml add_new_general_coverage { - insert into ims_md_general_cover (ims_md_ge_cove_id, ims_md_id, cover_l, cover_s) - values - (:p_ims_md_ge_cove_id, :p_ims_md_id, :p_cover_l, :p_cover_s) - } - } + db_dml add_new_general_catalogentries { + insert into ims_md_general_cata (ims_md_ge_cata_id, ims_md_id, catalog, entry_l, entry_s) + values (:p_ims_md_ge_cata_id, :p_ims_md_id, :p_catalog, :p_entry_l, :p_entry_s) + } + } - # Lifecycle + # Adds General Languages + foreach language $languages { + set p_ims_md_ge_lang_id [db_nextval ims_md_general_lang_seq] - # Version - set version [lors::imsmd::mdLifeCycle -element version -node $lom -prefix $prefix] - set version_l [lindex [lindex $version 0] 0] - set version_s [lindex [lindex $version 0] 1] - - # Status - set status [lors::imsmd::mdLifeCycle -element status -node $lom -prefix $prefix] - set status_s [lindex [lindex [lindex $status 0] 0] 1] - set status_v [lindex [lindex [lindex $status 0] 1] 1] - - # Contribute - set contributes [lors::imsmd::mdLifeCycle -element contribute -node $lom -prefix $prefix] - - # Adds Lifecycle Version and Status - db_dml add_new_lifecycle { - insert into ims_md_life_cycle (ims_md_id, version_l, version_s, status_s, status_v) - values - (:p_ims_md_id, :version_l, :version_s, :status_s, :status_v) - } + db_dml add_new_general_language { + insert into ims_md_general_lang (ims_md_ge_lang_id, ims_md_id, language) + values (:p_ims_md_ge_lang_id, :p_ims_md_id, :language) + } + } - # Adds Lifecycle Contributes - foreach contribute $contributes { - set p_ims_md_lf_cont_id [db_nextval ims_md_life_cycle_contrib_seq] - set p_role_s [lindex [lindex [lindex $contribute 0] 0] 1] - set p_role_v [lindex [lindex [lindex $contribute 0] 1] 1] - set p_cont_date [lindex [lindex $contribute 2] 0] - set p_cont_date_l [lindex [lindex [lindex $contribute 2] 1] 0] - set p_cont_date_s [lindex [lindex [lindex $contribute 2] 1] 1] - - set p_entities [lindex $contribute 1] - - db_dml add_new_lifecycle_contrib { - insert into ims_md_life_cycle_contrib (ims_md_lf_cont_id, ims_md_id, role_s, role_v, cont_date, cont_date_l, cont_date_s) - values - (:p_ims_md_lf_cont_id, :p_ims_md_id, :p_role_s, :p_role_v, :p_cont_date, :p_cont_date_l, :p_cont_date_s) - } + # Adds General Description + foreach description $descriptions { + set p_ims_md_ge_desc_id [db_nextval ims_md_general_desc_seq] + set p_descrip_l [lindex $description 0] + set p_descrip_s [lindex $description 1] + db_dml add_new_general_description { + insert into ims_md_general_desc (ims_md_ge_desc_id, ims_md_id, descrip_l, descrip_s) + values (:p_ims_md_ge_desc_id, :p_ims_md_id, :p_descrip_l, :p_descrip_s) + } + } - foreach entity $p_entities { - set p_ims_md_lf_cont_enti_id [db_nextval ims_md_life_cycle_contrib_entity_seq] - set p_entity $entity - - db_dml add_new_lifecycle_contrib_entity { - insert into ims_md_life_cycle_contrib_entity (ims_md_lf_cont_enti_id, ims_md_lf_cont_id, entity) - values - (:p_ims_md_lf_cont_enti_id, :p_ims_md_lf_cont_id, :p_entity) - } - } - - } - - # Metadata + # Adds General Keywords + foreach keyword $keywords { + set p_ims_md_ge_key_id [db_nextval ims_md_general_key_seq] + set p_keyword_l [lindex $keyword 0] + set p_keyword_s [lindex $keyword 1] - # Language - set p_language [lors::imsmd::mdMetadata -element language -node $lom -prefix $prefix] - - # Catalogentry - set catalogentries [lors::imsmd::mdMetadata -element catalogentry -node $lom -prefix $prefix] - - # Contribute - set contributes [lors::imsmd::mdMetadata -element contribute -node $lom -prefix $prefix] - - # Metadatascheme - set metadataschemes [lors::imsmd::mdMetadata -element metadatascheme -node $lom -prefix $prefix] + db_dml add_new_general_keyword { + insert into ims_md_general_key (ims_md_ge_key_id, ims_md_id, keyword_l, keyword_s) + values (:p_ims_md_ge_key_id, :p_ims_md_id, :p_keyword_l, :p_keyword_s) + } + } - # Adds Metadata Language - db_dml add_new_metadata { - insert into ims_md_metadata (ims_md_id, language) - values - (:p_ims_md_id, :p_language) - } + # Adds General Coverage + foreach coverage $coverages { + set p_ims_md_ge_cove_id [db_nextval ims_md_general_cover_seq] + set p_cover_l [lindex $coverage 0] + set p_cover_s [lindex $coverage 1] - # Adds Catalogentry - foreach catalogentry $catalogentries { - set p_ims_md_md_cata_id [db_nextval ims_md_metadata_cata_seq] - set p_catalog [lindex $catalogentry 0] - set p_entry_l [lindex [lindex $catalogentry 1] 0] - set p_entry_s [lindex [lindex $catalogentry 1] 1] + db_dml add_new_general_coverage { + insert into ims_md_general_cover (ims_md_ge_cove_id, ims_md_id, cover_l, cover_s) + values (:p_ims_md_ge_cove_id, :p_ims_md_id, :p_cover_l, :p_cover_s) + } + } - db_dml add_new_metadata_catalogentries { - insert into ims_md_metadata_cata (ims_md_md_cata_id, ims_md_id, catalog, entry_l, entry_s) - values - (:p_ims_md_md_cata_id, :p_ims_md_id, :p_catalog, :p_entry_l, :p_entry_s) - } - } + # Lifecycle - # Adds Lifecycle Contributes - foreach contribute $contributes { - set p_ims_md_md_cont_id [db_nextval ims_md_metadata_contrib_seq] - set p_role_s [lindex [lindex [lindex $contribute 0] 0] 1] - set p_role_v [lindex [lindex [lindex $contribute 0] 1] 1] - set p_cont_date [lindex [lindex $contribute 2] 0] - set p_cont_date_l [lindex [lindex [lindex $contribute 2] 1] 0] - set p_cont_date_s [lindex [lindex [lindex $contribute 2] 1] 1] + # Version + set version [lors::imsmd::mdLifeCycle \ + -element version \ + -node $lom \ + -prefix $prefix] + set version_l [lindex [lindex $version 0] 0] + set version_s [lindex [lindex $version 0] 1] - set p_ims_md_md_cont_enti_id [db_nextval ims_md_metadata_contrib_entity_seq] - set p_entity [lindex [lindex $contribute 1] 0] + # Status + set status [lors::imsmd::mdLifeCycle \ + -element status \ + -node $lom \ + -prefix $prefix] + set status_s [lindex [lindex [lindex $status 0] 0] 1] + set status_v [lindex [lindex [lindex $status 0] 1] 1] - db_dml add_new_metadata_contrib { - insert into ims_md_metadata_contrib (ims_md_md_cont_id, ims_md_id, role_s, role_v, cont_date, cont_date_l, cont_date_s) - values - (:p_ims_md_md_cont_id, :p_ims_md_id, :p_role_s, :p_role_v, :p_cont_date, :p_cont_date_l, :p_cont_date_s) - } + # Contribute + set contributes [lors::imsmd::mdLifeCycle \ + -element contribute \ + -node $lom \ + -prefix $prefix] - db_dml add_new_metadata_contrib_entity { - insert into ims_md_metadata_contrib_entity (ims_md_md_cont_enti_id, ims_md_md_cont_id, entity) - values - (:p_ims_md_md_cont_enti_id, :p_ims_md_md_cont_id, :p_entity) - } + # Adds Lifecycle Version and Status + db_dml add_new_lifecycle { + insert into ims_md_life_cycle (ims_md_id, version_l, version_s, status_s, status_v) + values (:p_ims_md_id, :version_l, :version_s, :status_s, :status_v) + } - } + # Adds Lifecycle Contributes + foreach contribute $contributes { + set p_ims_md_lf_cont_id [db_nextval ims_md_life_cycle_contrib_seq] + set p_role_s [lindex [lindex [lindex $contribute 0] 0] 1] + set p_role_v [lindex [lindex [lindex $contribute 0] 1] 1] + set p_cont_date [lindex [lindex $contribute 2] 0] + set p_cont_date_l [lindex [lindex [lindex $contribute 2] 1] 0] + set p_cont_date_s [lindex [lindex [lindex $contribute 2] 1] 1] - # Adds Metadata Schemes - foreach metadatascheme $metadataschemes { - set p_ims_md_md_sch_id [db_nextval ims_md_metadata_scheme_seq] - set p_scheme $metadatascheme - - db_dml add_new_metadata_metadatascheme { - insert into ims_md_metadata_scheme (ims_md_md_sch_id, ims_md_id, scheme) - values - (:p_ims_md_md_sch_id, :p_ims_md_id, :p_scheme) - } - } + set p_entities [lindex $contribute 1] - # Technical + db_dml add_new_lifecycle_contrib { + insert into ims_md_life_cycle_contrib (ims_md_lf_cont_id, ims_md_id, role_s, role_v, cont_date, cont_date_l, cont_date_s) + values (:p_ims_md_lf_cont_id, :p_ims_md_id, :p_role_s, :p_role_v, :p_cont_date, :p_cont_date_l, :p_cont_date_s) + } - # format - set formats [lors::imsmd::mdTechnical -element format -node $lom -prefix $prefix] - - # location - set locations [lors::imsmd::mdTechnical -element location -node $lom -prefix $prefix] - # size, installation remarks, otherplatformrequirements, duration - set p_size [lors::imsmd::mdTechnical -element size -node $lom -prefix $prefix] - set p_instl_rmks [lors::imsmd::mdTechnical -element installationremarks -node $lom -prefix $prefix] - set p_instl_rmks_l [lindex [lindex $p_instl_rmks 0] 0] - set p_instl_rmks_s [lindex [lindex $p_instl_rmks 0] 1] - set p_otr_plt [lors::imsmd::mdTechnical -element otherplatformrequirements -node $lom -prefix $prefix] - set p_otr_plt_l [lindex [lindex $p_otr_plt 0] 0] - set p_otr_plt_s [lindex [lindex $p_otr_plt 0] 1] - set p_durat [lors::imsmd::mdTechnical -element duration -node $lom -prefix $prefix] - set p_duration [lindex $p_durat 0] - set p_duration_l [lindex [lindex $p_durat 1] 0] - set p_duration_s [lindex [lindex $p_durat 1] 1] + foreach entity $p_entities { + set p_ims_md_lf_cont_enti_id [db_nextval ims_md_life_cycle_contrib_entity_seq] + set p_entity $entity - # requirement - set requirements [lors::imsmd::mdTechnical -element requirement -node $lom -prefix $prefix] + db_dml add_new_lifecycle_contrib_entity { + insert into ims_md_life_cycle_contrib_entity (ims_md_lf_cont_enti_id, ims_md_lf_cont_id, entity) + values (:p_ims_md_lf_cont_enti_id, :p_ims_md_lf_cont_id, :p_entity) + } + } + } - # Adds Technical size, installation remarks, otherplatformrequirements, duration - db_dml add_new_technical { - insert into ims_md_technical (ims_md_id, t_size, instl_rmrks_l, instl_rmrks_s, otr_plt_l, otr_plt_s, duration, duration_l, duration_s) - values - (:p_ims_md_id, :p_size, :p_instl_rmks_l, :p_instl_rmks_s, :p_otr_plt_l, :p_otr_plt_s, :p_duration, :p_duration_l, :p_duration_s) - } + # Metadata - # Adds Technical Format + # Language + set p_language [lors::imsmd::mdMetadata \ + -element language \ + -node $lom \ + -prefix $prefix] - foreach format $formats { - set p_ims_md_te_fo_id [db_nextval ims_md_technical_format_seq] - set p_format $format - - db_dml add_new_technical_format { - insert into ims_md_technical_format (ims_md_te_fo_id, ims_md_id, format) - values - (:p_ims_md_te_fo_id, :p_ims_md_id, :p_format) - } - } - - # Adds Technical Location - - foreach location $locations { - set p_ims_md_te_lo_id [db_nextval ims_md_technical_location_seq] - set p_type [lindex $location 1] - set p_location [lindex $location 0] + # Catalogentry + set catalogentries [lors::imsmd::mdMetadata \ + -element catalogentry \ + -node $lom \ + -prefix $prefix] - db_dml add_new_technical_location { - insert into ims_md_technical_location (ims_md_te_lo_id, ims_md_id, type, location) - values - (:p_ims_md_te_lo_id, :p_ims_md_id, :p_type, :p_location) - } - } + # Contribute + set contributes [lors::imsmd::mdMetadata \ + -element contribute \ + -node $lom \ + -prefix $prefix] - # Adds Technical Requirements + # Metadatascheme + set metadataschemes [lors::imsmd::mdMetadata \ + -element metadatascheme \ + -node $lom \ + -prefix $prefix] - foreach requirement $requirements { - set p_ims_md_te_rq_id [db_nextval ims_md_technical_requirement_seq] - set p_type_s [lindex [lindex [lindex $requirement 0] 0] 1] - set p_type_v [lindex [lindex [lindex $requirement 0] 1] 1] - set p_name_s [lindex [lindex [lindex $requirement 1] 0] 1] - set p_name_v [lindex [lindex [lindex $requirement 1] 1] 1] - set p_min_version [lindex $requirement 2] - set p_max_version [lindex $requirement 3] + # Adds Metadata Language + db_dml add_new_metadata { + insert into ims_md_metadata (ims_md_id, language) + values (:p_ims_md_id, :p_language) + } - db_dml add_new_technical_requirement { - insert into ims_md_technical_requirement (ims_md_te_rq_id, ims_md_id, type_s, type_v, name_s, name_v, min_version, max_version) - values - (:p_ims_md_te_rq_id, :p_ims_md_id, :p_type_s, :p_type_v, :p_name_s, :p_name_v, :p_min_version, :p_max_version) - } - } + # Adds Catalogentry + foreach catalogentry $catalogentries { + set p_ims_md_md_cata_id [db_nextval ims_md_metadata_cata_seq] + set p_catalog [lindex $catalogentry 0] + set p_entry_l [lindex [lindex $catalogentry 1] 0] + set p_entry_s [lindex [lindex $catalogentry 1] 1] + db_dml add_new_metadata_catalogentries { + insert into ims_md_metadata_cata (ims_md_md_cata_id, ims_md_id, catalog, entry_l, entry_s) + values (:p_ims_md_md_cata_id, :p_ims_md_id, :p_catalog, :p_entry_l, :p_entry_s) + } + } - # Educational + # Adds Lifecycle Contributes + foreach contribute $contributes { + set p_ims_md_md_cont_id [db_nextval ims_md_metadata_contrib_seq] + set p_role_s [lindex [lindex [lindex $contribute 0] 0] 1] + set p_role_v [lindex [lindex [lindex $contribute 0] 1] 1] + set p_cont_date [lindex [lindex $contribute 2] 0] + set p_cont_date_l [lindex [lindex [lindex $contribute 2] 1] 0] + set p_cont_date_s [lindex [lindex [lindex $contribute 2] 1] 1] - # interactivitytype, interactivitylevel, semanticdensity, difficulty, typical_learning_time, description - set p_int_type [lors::imsmd::mdEducational -element interactivitytype -node $lom -prefix $prefix] - set p_int_type_s [lindex [lindex [lindex $p_int_type 0] 0] 1] - set p_int_type_v [lindex [lindex [lindex $p_int_type 0] 1] 1] - set p_int_level [lors::imsmd::mdEducational -element interactivitylevel -node $lom -prefix $prefix] - set p_int_level_s [lindex [lindex [lindex $p_int_level 0] 0] 1] - set p_int_level_v [lindex [lindex [lindex $p_int_level 0] 1] 1] - set p_sem_density [lors::imsmd::mdEducational -element semanticdensity -node $lom -prefix $prefix] - set p_sem_density_s [lindex [lindex [lindex $p_sem_density 0] 0] 1] - set p_sem_density_v [lindex [lindex [lindex $p_sem_density 0] 1] 1] - set p_difficulty [lors::imsmd::mdEducational -element difficulty -node $lom -prefix $prefix] - set p_difficulty_s [lindex [lindex [lindex $p_difficulty 0] 0] 1] - set p_difficulty_v [lindex [lindex [lindex $p_difficulty 0] 1] 1] - set p_type_lrn_tim [lors::imsmd::mdEducational -element typicallearningtime -node $lom -prefix $prefix] - set p_type_lrn_time [lindex $p_type_lrn_tim 0] - set p_type_lrn_time_l [lindex [lindex $p_type_lrn_tim 1] 0] - set p_type_lrn_time_s [lindex [lindex $p_type_lrn_tim 1] 1] - set descrips [lors::imsmd::mdEducational -element description -node $lom -prefix $prefix] + set p_ims_md_md_cont_enti_id [db_nextval ims_md_metadata_contrib_entity_seq] + set p_entity [lindex [lindex $contribute 1] 0] - # learningresourcetype - set learningresourcetypes [lors::imsmd::mdEducational -element learningresourcetype -node $lom -prefix $prefix] + db_dml add_new_metadata_contrib { + insert into ims_md_metadata_contrib (ims_md_md_cont_id, ims_md_id, role_s, role_v, cont_date, cont_date_l, cont_date_s) + values (:p_ims_md_md_cont_id, :p_ims_md_id, :p_role_s, :p_role_v, :p_cont_date, :p_cont_date_l, :p_cont_date_s) + } + db_dml add_new_metadata_contrib_entity { + insert into ims_md_metadata_contrib_entity (ims_md_md_cont_enti_id, ims_md_md_cont_id, entity) + values (:p_ims_md_md_cont_enti_id, :p_ims_md_md_cont_id, :p_entity) + } + } - # intendedenduserrole - set intendedenduserroles [lors::imsmd::mdEducational -element intendedenduserrole -node $lom -prefix $prefix] + # Adds Metadata Schemes + foreach metadatascheme $metadataschemes { + set p_ims_md_md_sch_id [db_nextval ims_md_metadata_scheme_seq] + set p_scheme $metadatascheme - # context - set contexts [lors::imsmd::mdEducational -element context -node $lom -prefix $prefix] + db_dml add_new_metadata_metadatascheme { + insert into ims_md_metadata_scheme (ims_md_md_sch_id, ims_md_id, scheme) + values (:p_ims_md_md_sch_id, :p_ims_md_id, :p_scheme) + } + } - # typicalagerange - set typicalageranges [lors::imsmd::mdEducational -element typicalagerange -node $lom -prefix $prefix] + # Technical - # language - set languages [lors::imsmd::mdEducational -element language -node $lom -prefix $prefix] + # format + set formats [lors::imsmd::mdTechnical \ + -element format \ + -node $lom \ + -prefix $prefix] + # location + set locations [lors::imsmd::mdTechnical \ + -element location \ + -node $lom \ + -prefix $prefix] - # Adds Educational interactivitytype, interactivitylevel, semanticdensity, difficulty, typical_learning_time - db_dml add_new_educational { - insert into ims_md_educational (ims_md_id, int_type_s, int_type_v, int_level_s, int_level_v, sem_density_s, sem_density_v, difficulty_s, difficulty_v, type_lrn_time, type_lrn_time_l, type_lrn_time_s) - values - (:p_ims_md_id, :p_int_type_s, :p_int_type_v, :p_int_level_s, :p_int_level_v, :p_sem_density_s, :p_sem_density_v, :p_difficulty_s, :p_difficulty_v, :p_type_lrn_time, :p_type_lrn_time_l, :p_type_lrn_time_s) - } + # size, installation remarks, otherplatformrequirements, duration + set p_size [lors::imsmd::mdTechnical -element size \ + -node $lom \ + -prefix $prefix] - # Adds descriptions - foreach descrip $descrips { - set p_ims_md_ed_de_id [db_nextval ims_md_educational_descrip_seq] - set p_descrip_l [lindex $descrip 0] - set p_descrip_s [lindex $descrip 1] + set p_instl_rmks [lors::imsmd::mdTechnical \ + -element installationremarks \ + -node $lom \ + -prefix $prefix] - db_dml add_new_descriptions { - insert into ims_md_educational_descrip (ims_md_ed_de_id, ims_md_id, descrip_l, descrip_s) - values - (:p_ims_md_ed_de_id, :p_ims_md_id, :p_descrip_l, :p_descrip_s) - } - } + set p_instl_rmks_l [lindex [lindex $p_instl_rmks 0] 0] + set p_instl_rmks_s [lindex [lindex $p_instl_rmks 0] 1] + set p_otr_plt [lors::imsmd::mdTechnical \ + -element otherplatformrequirements \ + -node $lom \ + -prefix $prefix] - # Adds learningresourcetype - foreach lrt $learningresourcetypes { - set p_ims_md_ed_lr_id [db_nextval ims_md_educational_lrt_seq] - set p_lrt_s [lindex [lindex $lrt 0] 1] - set p_lrt_v [lindex [lindex $lrt 1] 1] - - db_dml add_new_learningresourcetypes { - insert into ims_md_educational_lrt (ims_md_ed_lr_id, ims_md_id, lrt_s, lrt_v) - values - (:p_ims_md_ed_lr_id, :p_ims_md_id, :p_lrt_s, :p_lrt_v) - } - } + set p_otr_plt_l [lindex [lindex $p_otr_plt 0] 0] + set p_otr_plt_s [lindex [lindex $p_otr_plt 0] 1] + set p_durat [lors::imsmd::mdTechnical \ + -element duration \ + -node $lom \ + -prefix $prefix] - # Adds intendedenduserrole - foreach ieur $intendedenduserroles { - set p_ims_md_ed_ie_id [db_nextval ims_md_educational_ieur_seq] - set p_ieur_s [lindex [lindex $ieur 0] 1] - set p_ieur_v [lindex [lindex $ieur 1] 1] + set p_duration [lindex $p_durat 0] + set p_duration_l [lindex [lindex $p_durat 1] 0] + set p_duration_s [lindex [lindex $p_durat 1] 1] - db_dml add_new_intendedenduserroles { - insert into ims_md_educational_ieur (ims_md_ed_ie_id, ims_md_id, ieur_s, ieur_v) - values - (:p_ims_md_ed_ie_id, :p_ims_md_id, :p_ieur_s, :p_ieur_v) - } - } + # requirement + set requirements [lors::imsmd::mdTechnical \ + -element requirement \ + -node $lom \ + -prefix $prefix] - # Adds context - foreach context $contexts { - set p_ims_md_ed_co_id [db_nextval ims_md_educational_context_seq] - set p_context_s [lindex [lindex $context 0] 1] - set p_context_v [lindex [lindex $context 1] 1] - - db_dml add_new_context { - insert into ims_md_educational_context (ims_md_ed_co_id, ims_md_id, context_s, context_v) - values - (:p_ims_md_ed_co_id, :p_ims_md_id, :p_context_s, :p_context_v) - } - } + # Adds Technical size, installation remarks, otherplatformrequirements, duration + db_dml add_new_technical { + insert into ims_md_technical (ims_md_id, t_size, instl_rmrks_l, instl_rmrks_s, otr_plt_l, otr_plt_s, duration, duration_l, duration_s) + values (:p_ims_md_id, :p_size, :p_instl_rmks_l, :p_instl_rmks_s, :p_otr_plt_l, :p_otr_plt_s, :p_duration, :p_duration_l, :p_duration_s) + } - # Adds typicalagerange - foreach tar $typicalageranges { - set p_ims_md_ed_ta_id [db_nextval ims_md_educational_tar_seq] - set p_tar_l [lindex $tar 0] - set p_tar_s [lindex $tar 1] + # Adds Technical Format - db_dml add_new_typicalagerange { - insert into ims_md_educational_tar (ims_md_ed_ta_id, ims_md_id, tar_l, tar_s) - values - (:p_ims_md_ed_ta_id, :p_ims_md_id, :p_tar_l, :p_tar_s) - } - } + foreach format $formats { + set p_ims_md_te_fo_id [db_nextval ims_md_technical_format_seq] + set p_format $format - # Adds Languages - foreach lang $languages { - set p_ims_md_ed_la_id [db_nextval ims_md_educational_lang_seq] - set p_language $lang - - db_dml add_new_language { - insert into ims_md_educational_lang (ims_md_ed_la_id, ims_md_id, language) - values - (:p_ims_md_ed_la_id, :p_ims_md_id, :p_language) - } - } + db_dml add_new_technical_format { + insert into ims_md_technical_format (ims_md_te_fo_id, ims_md_id, format) + values (:p_ims_md_te_fo_id, :p_ims_md_id, :p_format) + } + } - # Rights - # cost, copyrightsandotherrights, description - set p_cost [lors::imsmd::mdRights -element cost -node $lom -prefix $prefix] - set p_caor [lors::imsmd::mdRights -element copyrightandotherrestrictions -node $lom -prefix $prefix] - set p_descrip [lors::imsmd::mdRights -element description -node $lom -prefix $prefix] - - set p_cost_s [lindex [lindex [lindex $p_cost 0] 0] 1] - set p_cost_v [lindex [lindex [lindex $p_cost 0] 1] 1] + # Adds Technical Location - set p_caor_s [lindex [lindex [lindex $p_caor 0] 0] 1] - set p_caor_v [lindex [lindex [lindex $p_caor 0] 1] 1] + foreach location $locations { + set p_ims_md_te_lo_id [db_nextval ims_md_technical_location_seq] + set p_type [lindex $location 1] + set p_location [lindex $location 0] - set p_descrip_l [lindex [lindex $p_descrip 0] 0] - set p_descrip_s [lindex [lindex $p_descrip 0] 1] + db_dml add_new_technical_location { + insert into ims_md_technical_location (ims_md_te_lo_id, ims_md_id, type, location) + values (:p_ims_md_te_lo_id, :p_ims_md_id, :p_type, :p_location) + } + } - db_dml add_new_rights { - insert into ims_md_rights (ims_md_id, cost_s, cost_v, caor_s, caor_v, descrip_l, descrip_s) - values - (:p_ims_md_id, :p_cost_s, :p_cost_v, :p_caor_s, :p_caor_v, :p_descrip_l, :p_descrip_s) - } + # Adds Technical Requirements - # Relation + foreach requirement $requirements { + set p_ims_md_te_rq_id [db_nextval ims_md_technical_requirement_seq] + set p_type_s [lindex [lindex [lindex $requirement 0] 0] 1] + set p_type_v [lindex [lindex [lindex $requirement 0] 1] 1] + set p_name_s [lindex [lindex [lindex $requirement 1] 0] 1] + set p_name_v [lindex [lindex [lindex $requirement 1] 1] 1] + set p_min_version [lindex $requirement 2] + set p_max_version [lindex $requirement 3] - # Relation returns all in one large list - set relations [lors::imsmd::mdRelation -node $lom -prefix $prefix] - - foreach relation $relations { - - set p_ims_md_re_id [db_nextval ims_md_relation_seq] - set p_kind_s [lindex [lindex [lindex [lindex $relation 0] 0] 0] 1] - set p_kind_v [lindex [lindex [lindex [lindex $relation 0] 0] 1] 1] - - # Adds kind - db_dml add_new_relation { - insert into ims_md_relation (ims_md_re_id, ims_md_id, kind_s, kind_v) - values - (:p_ims_md_re_id, :p_ims_md_id, :p_kind_s, :p_kind_v) - } - - set p_ims_md_re_re_id [db_nextval ims_md_relation_resource_seq] - set p_descrip_l [lindex [lindex [lindex $relation 1] 0] 0] - set p_descrip_s [lindex [lindex [lindex $relation 1] 0] 1] + db_dml add_new_technical_requirement { + insert into ims_md_technical_requirement (ims_md_te_rq_id, ims_md_id, type_s, type_v, name_s, name_v, min_version, max_version) + values (:p_ims_md_te_rq_id, :p_ims_md_id, :p_type_s, :p_type_v, :p_name_s, :p_name_v, :p_min_version, :p_max_version) + } + } - # adds description to resource - db_dml add_new_relation_descrip { - insert into ims_md_relation_resource (ims_md_re_re_id, ims_md_re_id, identifier, descrip_l, descrip_s) - values - (:p_ims_md_re_re_id, :p_ims_md_re_id, null, :p_descrip_l, :p_descrip_s) - } + # Educational - # catalogentries - set catalogentries [lindex $relation 2] + # interactivitytype, interactivitylevel, semanticdensity, difficulty, typical_learning_time, description + set p_int_type [lors::imsmd::mdEducational \ + -element interactivitytype \ + -node $lom \ + -prefix $prefix] - # adds catalogentries - foreach catalogentry $catalogentries { + set p_int_type_s [lindex [lindex [lindex $p_int_type 0] 0] 1] + set p_int_type_v [lindex [lindex [lindex $p_int_type 0] 1] 1] + set p_int_level [lors::imsmd::mdEducational \ + -element interactivitylevel \ + -node $lom \ + -prefix $prefix] - set p_ims_md_re_re_ca_id [db_nextval ims_md_relation_resource_catalog_seq] - set p_catalog [lindex $catalogentry 0] - set p_entry_l [lindex [lindex $catalogentry 1] 0] - set p_entry_s [lindex [lindex $catalogentry 1] 1] - - db_dml add_new_catalogentry { - - insert into ims_md_relation_resource_catalog (ims_md_re_re_ca_id, ims_md_re_re_id, catalog, entry_l, entry_s) - values - (:p_ims_md_re_re_ca_id, :p_ims_md_re_re_id, :p_catalog, :p_entry_l, :p_entry_s) - } - } + set p_int_level_s [lindex [lindex [lindex $p_int_level 0] 0] 1] + set p_int_level_v [lindex [lindex [lindex $p_int_level 0] 1] 1] + set p_sem_density [lors::imsmd::mdEducational \ + -element semanticdensity \ + -node $lom \ + -prefix $prefix] - } + set p_sem_density_s [lindex [lindex [lindex $p_sem_density 0] 0] 1] + set p_sem_density_v [lindex [lindex [lindex $p_sem_density 0] 1] 1] + set p_difficulty [lors::imsmd::mdEducational \ + -element difficulty \ + -node $lom \ + -prefix $prefix] - # Annotation - - set annotations [lors::imsmd::mdAnnotation -node $lom -prefix $prefix] + set p_difficulty_s [lindex [lindex [lindex $p_difficulty 0] 0] 1] + set p_difficulty_v [lindex [lindex [lindex $p_difficulty 0] 1] 1] + set p_type_lrn_tim [lors::imsmd::mdEducational \ + -element typicallearningtime \ + -node $lom \ + -prefix $prefix] - foreach annotation $annotations { - set p_ims_md_an_id [db_nextval ims_md_annotation_seq] - set p_entity [lindex [lindex $annotation 0] 0] - set p_date [lindex [lindex $annotation 1] 0] - set p_date_l [lindex [lindex [lindex $annotation 1] 1] 0] - set p_date_s [lindex [lindex [lindex $annotation 1] 1] 1] + set p_type_lrn_time [lindex $p_type_lrn_tim 0] + set p_type_lrn_time_l [lindex [lindex $p_type_lrn_tim 1] 0] + set p_type_lrn_time_s [lindex [lindex $p_type_lrn_tim 1] 1] + set descrips [lors::imsmd::mdEducational \ + -element description \ + -node $lom \ + -prefix $prefix] - set p_descriptions [lindex $annotation 2] + # learningresourcetype + set learningresourcetypes [lors::imsmd::mdEducational \ + -element learningresourcetype \ + -node $lom \ + -prefix $prefix] - db_dml add_new_annotation { - insert into ims_md_annotation (ims_md_an_id, ims_md_id, entity, date, date_l, date_s) - values - (:p_ims_md_an_id, :p_ims_md_id, :p_entity, :p_date, :p_date_l, :p_date_s) - } + # intendedenduserrole + set intendedenduserroles [lors::imsmd::mdEducational \ + -element intendedenduserrole \ + -node $lom \ + -prefix $prefix] - foreach description $p_descriptions { + # context + set contexts [lors::imsmd::mdEducational \ + -element context \ + -node $lom \ + -prefix $prefix] - set p_ims_md_an_de_id [db_nextval ims_md_annotation_descrip_seq] - set p_descrip_l [lindex $description 0] - set p_descrip_s [lindex $description 1] - - db_dml add_new_ann_descriptions { - insert into ims_md_annotation_descrip (ims_md_an_de_id, ims_md_an_id, descrip_l, descrip_s) - values - (:p_ims_md_an_de_id, :p_ims_md_an_id, :p_descrip_l, :p_descrip_s) - } + # typicalagerange + set typicalageranges [lors::imsmd::mdEducational \ + -element typicalagerange \ + -node $lom \ + -prefix $prefix] - } + # language + set languages [lors::imsmd::mdEducational \ + -element language \ + -node $lom \ + -prefix $prefix] - } + # Adds Educational interactivitytype, interactivitylevel, semanticdensity, difficulty, typical_learning_time + db_dml add_new_educational { + insert into ims_md_educational (ims_md_id, int_type_s, int_type_v, int_level_s, int_level_v, sem_density_s, sem_density_v, difficulty_s, difficulty_v, type_lrn_time, type_lrn_time_l, type_lrn_time_s) + values (:p_ims_md_id, :p_int_type_s, :p_int_type_v, :p_int_level_s, :p_int_level_v, :p_sem_density_s, :p_sem_density_v, :p_difficulty_s, :p_difficulty_v, :p_type_lrn_time, :p_type_lrn_time_l, :p_type_lrn_time_s) + } - # Classification + # Adds descriptions + foreach descrip $descrips { + set p_ims_md_ed_de_id [db_nextval ims_md_educational_descrip_seq] + set p_descrip_l [lindex $descrip 0] + set p_descrip_s [lindex $descrip 1] - set classifications [lors::imsmd::mdClassification -node $lom -prefix $prefix] + db_dml add_new_descriptions { + insert into ims_md_educational_descrip (ims_md_ed_de_id, ims_md_id, descrip_l, descrip_s) + values (:p_ims_md_ed_de_id, :p_ims_md_id, :p_descrip_l, :p_descrip_s) + } + } - foreach class $classifications { + # Adds learningresourcetype + foreach lrt $learningresourcetypes { + set p_ims_md_ed_lr_id [db_nextval ims_md_educational_lrt_seq] + set p_lrt_s [lindex [lindex $lrt 0] 1] + set p_lrt_v [lindex [lindex $lrt 1] 1] - # purpose - set p_ims_md_cl_id [db_nextval ims_md_classification_seq] - set p_purpose_s [lindex [lindex [lindex [lindex [lindex $class 0] 0] 0] 0] 1] - set p_purpose_v [lindex [lindex [lindex [lindex [lindex $class 0] 0] 0] 1] 1] - - db_dml add_new_classification { - insert into ims_md_classification (ims_md_cl_id, ims_md_id, purpose_s, purpose_v) - values - (:p_ims_md_cl_id, :p_ims_md_id, :p_purpose_s, :p_purpose_v) - } + db_dml add_new_learningresourcetypes { + insert into ims_md_educational_lrt (ims_md_ed_lr_id, ims_md_id, lrt_s, lrt_v) + values (:p_ims_md_ed_lr_id, :p_ims_md_id, :p_lrt_s, :p_lrt_v) + } + } - # description - set descriptions [lindex [lindex $class 0] 1] + # Adds intendedenduserrole + foreach ieur $intendedenduserroles { + set p_ims_md_ed_ie_id [db_nextval ims_md_educational_ieur_seq] + set p_ieur_s [lindex [lindex $ieur 0] 1] + set p_ieur_v [lindex [lindex $ieur 1] 1] - foreach desc $descriptions { - set p_ims_md_cl_de_id [db_nextval ims_md_classification_desc_seq] - set p_descrip_l [lindex $desc 0] - set p_descrip_s [lindex $desc 1] - - db_dml add_new_description { - insert into ims_md_classification_descrip (ims_md_cl_de_id, ims_md_cl_id, descrip_l, descrip_s) - values - (:p_ims_md_cl_de_id, :p_ims_md_cl_id, :p_descrip_l, :p_descrip_s) - } - } + db_dml add_new_intendedenduserroles { + insert into ims_md_educational_ieur (ims_md_ed_ie_id, ims_md_id, ieur_s, ieur_v) + values (:p_ims_md_ed_ie_id, :p_ims_md_id, :p_ieur_s, :p_ieur_v) + } + } - # taxonpath - set taxonpaths [lindex [lindex $class 0] 2] + # Adds context + foreach context $contexts { + set p_ims_md_ed_co_id [db_nextval ims_md_educational_context_seq] + set p_context_s [lindex [lindex $context 0] 1] + set p_context_v [lindex [lindex $context 1] 1] - foreach taxonpath $taxonpaths { - - set p_source [lindex $taxonpath 0] - - set p_source_l [lindex [lindex $p_source 0] 0] - set p_source_s [lindex [lindex $p_source 0] 1] - set p_ims_md_cl_ta_id [db_nextval ims_md_classification_taxpath_seq] + db_dml add_new_context { + insert into ims_md_educational_context (ims_md_ed_co_id, ims_md_id, context_s, context_v) + values (:p_ims_md_ed_co_id, :p_ims_md_id, :p_context_s, :p_context_v) + } + } - set taxons [lindex $taxonpath 1] + # Adds typicalagerange + foreach tar $typicalageranges { + set p_ims_md_ed_ta_id [db_nextval ims_md_educational_tar_seq] + set p_tar_l [lindex $tar 0] + set p_tar_s [lindex $tar 1] - db_dml add_new_taxonpaths { - insert into ims_md_classification_taxpath (ims_md_cl_ta_id, ims_md_cl_id, source_l, source_v) - values - (:p_ims_md_cl_ta_id, :p_ims_md_cl_id, :p_source_l, :p_source_s) - } + db_dml add_new_typicalagerange { + insert into ims_md_educational_tar (ims_md_ed_ta_id, ims_md_id, tar_l, tar_s) + values (:p_ims_md_ed_ta_id, :p_ims_md_id, :p_tar_l, :p_tar_s) + } + } - foreach taxon $taxons { + # Adds Languages + foreach lang $languages { + set p_ims_md_ed_la_id [db_nextval ims_md_educational_lang_seq] + set p_language $lang - set p_ims_md_cl_ta_ta_id [db_nextval ims_md_classification_taxpath_taxon_seq] - set p_hierarchy [lindex $taxon 0] - set p_identifier [lindex $taxon 1] - set p_entry_l [lindex [lindex $taxon 2] 0] - set p_entry_s [lindex [lindex $taxon 2] 1] - - db_dml add_new_taxons { - insert into ims_md_classification_taxpath_taxon (ims_md_cl_ta_ta_id, ims_md_cl_ta_id, hierarchy, identifier, entry_l, entry_s) - values - (:p_ims_md_cl_ta_ta_id, :p_ims_md_cl_ta_id, :p_hierarchy, :p_identifier, :p_entry_l, :p_entry_s) - } + db_dml add_new_language { + insert into ims_md_educational_lang (ims_md_ed_la_id, ims_md_id, language) + values (:p_ims_md_ed_la_id, :p_ims_md_id, :p_language) + } + } - } - } + # Rights + # cost, copyrightsandotherrights, description + set p_cost [lors::imsmd::mdRights \ + -element cost \ + -node $lom \ + -prefix $prefix] - # keywords - set keywords [lindex [lindex $class 0] 3] - - foreach keyword $keywords { - set p_ims_md_cl_ke_id [db_nextval ims_md_classification_keyword_seq] - set p_keyword_l [lindex $keyword 0] - set p_keyword_s [lindex $keyword 1] - - db_dml add_new_keywords { - insert into ims_md_classification_keyword (ims_md_cl_ke_id, ims_md_cl_id, keyword_l, keyword_s) - values - (:p_ims_md_cl_ke_id, :p_ims_md_cl_id, :p_keyword_l, :p_keyword_s) - } - } - } -# } on_error { -# ad_return_error "[_ lors.lt_Transaction_Error_in_]" "[_ lors._The] $errmsg" -# } -# -# } + set p_caor [lors::imsmd::mdRights \ + -element copyrightandotherrestrictions \ + -node $lom \ + -prefix $prefix] + set p_descrip [lors::imsmd::mdRights \ + -element description \ + -node $lom \ + -prefix $prefix] - ad_proc -public addMetadata { - {-acs_object:required} - {-node:required} - {-dir {}} - } { - Adds metadata for a learning resource. - - @option acs_object acs object for resource (element) that contains metadata. - @option node XML node that contains the metadata - @option dir directory where the imsmanifest.xml file is located. This is use in the case the metadata is in a different file location (adlcp:location). - @author Ernie Ghiglione (ErnieG@mm.st). + set p_cost_s [lindex [lindex [lindex $p_cost 0] 0] 1] + set p_cost_v [lindex [lindex [lindex $p_cost 0] 1] 1] - } { - set p_ims_md_id $acs_object - set mdnode $node - set path_to_file $dir - #[lors::imsmd::getMDNode $manifest] - - set p_schema [lindex [lindex [lors::imsmd::getMDSchema $mdnode] 0] 0] - set p_schemaversion [lindex [lors::imsmd::getMDSchema $mdnode] 1] + set p_caor_s [lindex [lindex [lindex $p_caor 0] 0] 1] + set p_caor_v [lindex [lindex [lindex $p_caor 0] 1] 1] - set lom [lindex [lors::imsmd::getLOM $mdnode $path_to_file] 0] - set prefix [lindex [lors::imsmd::getLOM $mdnode $path_to_file] 1] + set p_descrip_l [lindex [lindex $p_descrip 0] 0] + set p_descrip_s [lindex [lindex $p_descrip 0] 1] - - # inserts into db -# db_transaction { + db_dml add_new_rights { + insert into ims_md_rights (ims_md_id, cost_s, cost_v, caor_s, caor_v, descrip_l, descrip_s) + values (:p_ims_md_id, :p_cost_s, :p_cost_v, :p_caor_s, :p_caor_v, :p_descrip_l, :p_descrip_s) + } - # Checks if there's a LOM record - if {$lom != 0} { + # Relation - # Adds new MD record to ims_md - - lors::imsmd::addMDSchemaVersion -acs_object $p_ims_md_id -schema $p_schema -schemaversion $p_schemaversion + # Relation returns all in one large list + set relations [lors::imsmd::mdRelation -node $lom -prefix $prefix] - lors::imsmd::addLOM -lom $lom -prefix $prefix -acs_object $p_ims_md_id -dir $path_to_file + foreach relation $relations { - } -# } on_error { -# ad_return_error "[_ lors.lt_Transaction_Error_whi]" "[_ lors.The_error_was] $errmsg" -# } - return 1 - } - + set p_ims_md_re_id [db_nextval ims_md_relation_seq] + set p_kind_s [lindex [lindex [lindex [lindex $relation 0] 0] 0] 1] + set p_kind_v [lindex [lindex [lindex [lindex $relation 0] 0] 1] 1] - ad_proc -public addMDSchemaVersion { - {-acs_object:required} - {-schema:required} - {-schemaversion:required} + # Adds kind + db_dml add_new_relation { + insert into ims_md_relation (ims_md_re_id, ims_md_id, kind_s, kind_v) + values (:p_ims_md_re_id, :p_ims_md_id, :p_kind_s, :p_kind_v) + } - } { - Adds MD schema and schema version to db - If the metedata record already exists, then it deletes it - and creates a new one. + set p_ims_md_re_re_id [db_nextval ims_md_relation_resource_seq] + set p_descrip_l [lindex [lindex [lindex $relation 1] 0] 0] + set p_descrip_s [lindex [lindex [lindex $relation 1] 0] 1] - @param acs_object acs object for resource (element) that contains metadata. - @param schema MD schema used for the learning resource. - @param schemaversion MD schemaversion used for the learning resource. - @author Ernie Ghiglione (ErnieG@mm.st) - } { - set p_ims_md_id $acs_object - set p_schema $schema - set p_schemaversion $schemaversion + # adds description to resource + db_dml add_new_relation_descrip { + insert into ims_md_relation_resource (ims_md_re_re_id, ims_md_re_id, identifier, descrip_l, descrip_s) + values (:p_ims_md_re_re_id, :p_ims_md_re_id, null, :p_descrip_l, :p_descrip_s) + } - # we check if the MD record we are about to insert already - # exists. If that is the case, then we delete it first. - # Yes, we are not versioning metadata (as I believe there's no - # real point on doing so. + # catalogentries + set catalogentries [lindex $relation 2] - lors::imsmd::delMD -acs_object $p_ims_md_id + # adds catalogentries + foreach catalogentry $catalogentries { + set p_ims_md_re_re_ca_id [db_nextval ims_md_relation_resource_catalog_seq] + set p_catalog [lindex $catalogentry 0] + set p_entry_l [lindex [lindex $catalogentry 1] 0] + set p_entry_s [lindex [lindex $catalogentry 1] 1] -# db_transaction { - db_dml add_md { - insert into ims_md (ims_md_id, schema, schemaversion) - values - (:p_ims_md_id, :p_schema, :p_schemaversion) + db_dml add_new_catalogentry { + + insert into ims_md_relation_resource_catalog (ims_md_re_re_ca_id, ims_md_re_re_id, catalog, entry_l, entry_s) + values(:p_ims_md_re_re_ca_id, :p_ims_md_re_re_id, :p_catalog, :p_entry_l, :p_entry_s) + } } -# } on_error { -# ad_return_error "[_ lors.lt_Transaction_Error_in__1] " " [_ lors._The] $errmsg" -# } - } + } - ad_proc -public delMD { - {-acs_object:required} - } { - Deletes an MD record (deletes it ALL from the db). - - @param acs_object the acs object metadata we are deleting. - @author Ernie Ghiglione (ErnieG@mm.st). - } { - set p_ims_md_id $acs_object + # Annotation - # if record exists... - if {[db_0or1row check_md_record {select ims_md_id from ims_md where ims_md_id = :p_ims_md_id}]} { + set annotations [lors::imsmd::mdAnnotation -node $lom -prefix $prefix] - # ... then delete it -# db_transaction { - db_dml add_md { - delete from ims_md where ims_md_id = :p_ims_md_id - } -# } on_error { -# ad_return_error "[_ lors.lt_Transaction_deleting_]" "[_ lors.The_error_was] $errmsg" -# } - } + foreach annotation $annotations { + set p_ims_md_an_id [db_nextval ims_md_annotation_seq] + set p_entity [lindex [lindex $annotation 0] 0] + set p_date [lindex [lindex $annotation 1] 0] + set p_date_l [lindex [lindex [lindex $annotation 1] 1] 0] + set p_date_s [lindex [lindex [lindex $annotation 1] 1] 1] - } + set p_descriptions [lindex $annotation 2] - ad_proc -public mdExist { - {-ims_md_id:required} - } { - Checks whether the acs_object (ims_md_id) does exist. - Returns 1 if that's the case, 0 otherwise - - @param ims_md_id the acs object id - @author Ernie Ghiglione (ErnieG@mm.st). - } { - set p_ims_md_id $ims_md_id + db_dml add_new_annotation { + insert into ims_md_annotation (ims_md_an_id, ims_md_id, entity, date, date_l, date_s) + values (:p_ims_md_an_id, :p_ims_md_id, :p_entity, :p_date, :p_date_l, :p_date_s) + } - # if record exists... returns 1 - return [db_0or1row check_md_record {select ims_md_id from ims_md where ims_md_id = :p_ims_md_id}] + foreach description $p_descriptions { + set p_ims_md_an_de_id [db_nextval ims_md_annotation_descrip_seq] + set p_descrip_l [lindex $description 0] + set p_descrip_s [lindex $description 1] - } + db_dml add_new_ann_descriptions { + insert into ims_md_annotation_descrip (ims_md_an_de_id, ims_md_an_id, descrip_l, descrip_s) + values (:p_ims_md_an_de_id, :p_ims_md_an_id, :p_descrip_l, :p_descrip_s) + } + } + } + # Classification + set classifications [lors::imsmd::mdClassification -node $lom -prefix $prefix] + foreach class $classifications { + # purpose + set p_ims_md_cl_id [db_nextval ims_md_classification_seq] + set p_purpose_s [lindex \ + [lindex \ + [lindex \ + [lindex \ + [lindex $class 0] 0] 0] 0] 1] + set p_purpose_v [lindex \ + [lindex \ + [lindex \ + [lindex \ + [lindex $class 0] 0] 0] 1] 1] + db_dml add_new_classification { + insert into ims_md_classification (ims_md_cl_id, ims_md_id, purpose_s, purpose_v) + values (:p_ims_md_cl_id, :p_ims_md_id, :p_purpose_s, :p_purpose_v) + } + # description + set descriptions [lindex [lindex $class 0] 1] - -} + foreach desc $descriptions { + set p_ims_md_cl_de_id [db_nextval ims_md_classification_desc_seq] + set p_descrip_l [lindex $desc 0] + set p_descrip_s [lindex $desc 1] + db_dml add_new_description { + insert into ims_md_classification_descrip (ims_md_cl_de_id, ims_md_cl_id, descrip_l, descrip_s) + values (:p_ims_md_cl_de_id, :p_ims_md_cl_id, :p_descrip_l, :p_descrip_s) + } + } + # taxonpath + set taxonpaths [lindex [lindex $class 0] 2] -namespace eval lors::imsmd::xml { + foreach taxonpath $taxonpaths { + set p_source [lindex $taxonpath 0] -### Generic XML creating tDOM functions -# Created just to make the super-tedious XML creation with tDOM a bit -# easier + set p_source_l [lindex [lindex $p_source 0] 0] + set p_source_s [lindex [lindex $p_source 0] 1] + set p_ims_md_cl_ta_id [db_nextval ims_md_classification_taxpath_seq] - ad_proc -public newElement { - {-owner:required} - {-name:required} - } { - Creates an XML element node - - @param owner owner node - @param name element name - @author Ernie Ghiglione (ErnieG@mm.st). - } { + set taxons [lindex $taxonpath 1] - return [[$owner ownerDocument] createElement $name] + db_dml add_new_taxonpaths { + insert into ims_md_classification_taxpath (ims_md_cl_ta_id, ims_md_cl_id, source_l, source_v) + values (:p_ims_md_cl_ta_id, :p_ims_md_cl_id, :p_source_l, :p_source_s) + } + foreach taxon $taxons { + set p_ims_md_cl_ta_ta_id [db_nextval ims_md_classification_taxpath_taxon_seq] + set p_hierarchy [lindex $taxon 0] + set p_identifier [lindex $taxon 1] + set p_entry_l [lindex [lindex $taxon 2] 0] + set p_entry_s [lindex [lindex $taxon 2] 1] + + db_dml add_new_taxons { + insert into ims_md_classification_taxpath_taxon (ims_md_cl_ta_ta_id, ims_md_cl_ta_id, hierarchy, identifier, entry_l, entry_s) + values (:p_ims_md_cl_ta_ta_id, :p_ims_md_cl_ta_id, :p_hierarchy, :p_identifier, :p_entry_l, :p_entry_s) + } + } + } + + # keywords + set keywords [lindex [lindex $class 0] 3] + + foreach keyword $keywords { + set p_ims_md_cl_ke_id [db_nextval ims_md_classification_keyword_seq] + set p_keyword_l [lindex $keyword 0] + set p_keyword_s [lindex $keyword 1] + + db_dml add_new_keywords { + insert into ims_md_classification_keyword (ims_md_cl_ke_id, ims_md_cl_id, keyword_l, keyword_s) + values (:p_ims_md_cl_ke_id, :p_ims_md_cl_id, :p_keyword_l, :p_keyword_s) + } + } + } } - ad_proc -public newElementText { - {-owner:required} - {-name:required} - {-text:required} + + ad_proc -public addMetadata { + {-acs_object:required} + {-node:required} + {-dir {}} } { - Creates an XML element with a text node - - @param owner owner node - @param name element name - @param text text - @author Ernie Ghiglione (ErnieG@mm.st). + Adds metadata for a learning resource. + + @option acs_object acs object for resource (element) that contains metadata. + @option node XML node that contains the metadata + @option dir directory where the imsmanifest.xml file is located. This is use in the case the metadata is in a different file location (adlcp:location). + @author Ernie Ghiglione (ErnieG@mm.st). + } { - - set node_text [lors::imsmd::xml::newText -owner $owner -text $text] - set node [lors::imsmd::xml::newElement -owner $owner -name $name] - $node appendChild $node_text - - return $node + set p_ims_md_id $acs_object + set mdnode $node + set path_to_file $dir + #[lors::imsmd::getMDNode $manifest] + set p_schema [lindex [lindex [lors::imsmd::getMDSchema $mdnode] 0] 0] + set p_schemaversion [lindex [lors::imsmd::getMDSchema $mdnode] 1] + + set lom [lindex [lors::imsmd::getLOM $mdnode $path_to_file] 0] + set prefix [lindex [lors::imsmd::getLOM $mdnode $path_to_file] 1] + + + # inserts into db + # Checks if there's a LOM record + if {$lom != 0} { + # Adds new MD record to ims_md + lors::imsmd::addMDSchemaVersion \ + -acs_object $p_ims_md_id \ + -schema $p_schema \ + -schemaversion $p_schemaversion + + lors::imsmd::addLOM \ + -lom $lom \ + -prefix $prefix \ + -acs_object $p_ims_md_id \ + -dir $path_to_file + } + return 1 } - ad_proc -public newText { - {-owner:required} - {-text:required} + + ad_proc -public addMDSchemaVersion { + {-acs_object:required} + {-schema:required} + {-schemaversion:required} } { - Creates an XML Text node - - @param owner owner node - @param text text - @author Ernie Ghiglione (ErnieG@mm.st). + Adds MD schema and schema version to db + If the metedata record already exists, then it deletes it + and creates a new one. + + @param acs_object acs object for resource (element) that contains metadata. + @param schema MD schema used for the learning resource. + @param schemaversion MD schemaversion used for the learning resource. + @author Ernie Ghiglione (ErnieG@mm.st) } { + set p_ims_md_id $acs_object + set p_schema $schema + set p_schemaversion $schemaversion - return [[$owner ownerDocument] createTextNode $text] + # we check if the MD record we are about to insert already + # exists. If that is the case, then we delete it first. + # Yes, we are not versioning metadata (as I believe there's no + # real point on doing so. + lors::imsmd::delMD -acs_object $p_ims_md_id + db_dml add_md { + insert into ims_md (ims_md_id, schema, schemaversion) + values (:p_ims_md_id, :p_schema, :p_schemaversion) + } } - ad_proc -public newComment { - {-owner:required} - {-comment:required} + + ad_proc -public delMD { + {-acs_object:required} } { - Creates an XML Text node - - @param owner owner node - @param comment Comment - @author Ernie Ghiglione (ErnieG@mm.st). + Deletes an MD record (deletes it ALL from the db). + + @param acs_object the acs object metadata we are deleting. + @author Ernie Ghiglione (ErnieG@mm.st). } { + set p_ims_md_id $acs_object - return [[$owner ownerDocument] createComment $comment] - + # if record exists... + if {[db_0or1row check_md_record {select ims_md_id from ims_md where ims_md_id = :p_ims_md_id}]} { + # ... then delete it + db_dml add_md { + delete from ims_md where ims_md_id = :p_ims_md_id + } + } } -### End Generic XML creating tDOM functions -} + ad_proc -public mdExist { + {-ims_md_id:required} + } { + Checks whether the acs_object (ims_md_id) does exist. + Returns 1 if that's the case, 0 otherwise + @param ims_md_id the acs object id + @author Ernie Ghiglione (ErnieG@mm.st). + } { + set p_ims_md_id $ims_md_id + # if record exists... returns 1 + return [db_0or1row check_md_record {select ims_md_id from ims_md where ims_md_id = :p_ims_md_id}] + } +} -namespace eval lors::imsmd::create { +namespace eval lors::imsmd::xml { -### IMS MD XML creation + ### Generic XML creating tDOM functions + # Created just to make the super-tedious XML creation with tDOM a bit + # easier + ad_proc -public newElement { + {-owner:required} + {-name:required} + } { + Creates an XML element node -## LOM data types + @param owner owner node + @param name element name + @author Ernie Ghiglione (ErnieG@mm.st). + } { + return [[$owner ownerDocument] createElement $name] + } -# langstring - ad_proc -public newLangString { - {-owner:required} - {-lang:required} - {-string:required} + ad_proc -public newElementText { + {-owner:required} + {-name:required} + {-text:required} } { - Creates an LangString data type XML node - - @param owner owner node - @param lang language - @param string String - @author Ernie Ghiglione (ErnieG@mm.st). + Creates an XML element with a text node + + @param owner owner node + @param name element name + @param text text + @author Ernie Ghiglione (ErnieG@mm.st). } { + set node_text [lors::imsmd::xml::newText -owner $owner -text $text] + set node [lors::imsmd::xml::newElement -owner $owner -name $name] + $node appendChild $node_text + return $node + } - set ls_string [lors::imsmd::xml::newText -owner $owner -text $string] - set lang_string_node [lors::imsmd::xml::newElement -owner $owner -name langstring] - $lang_string_node setAttribute xml:lang $lang - $lang_string_node appendChild $ls_string - return $lang_string_node + ad_proc -public newText { + {-owner:required} + {-text:required} + } { + Creates an XML Text node + + @param owner owner node + @param text text + @author Ernie Ghiglione (ErnieG@mm.st). + } { + return [[$owner ownerDocument] createTextNode $text] } - ad_proc -public md { - {-owner:required} - {-schema:required} - {-schemaversion:required} - {-lom:required} + ad_proc -public newComment { + {-owner:required} + {-comment:required} } { - Creates a metadata node. + Creates an XML Text node - @param owner Owner node - @param schema schema - @param schemaversion schemaversion - @param lom lom node - @author Ernie Ghiglione (ErnieG@mm.st). + @param owner owner node + @param comment Comment + @author Ernie Ghiglione (ErnieG@mm.st). } { + return [[$owner ownerDocument] createComment $comment] + } - set metadata [lors::imsmd::xml::newElement -owner $owner -name metadata] + ### End Generic XML creating tDOM functions +} - $metadata appendChild [lors::imsmd::xml::newComment -owner $owner -comment "Generated by LORSm"] +namespace eval lors::imsmd::create { - set schema [lors::imsmd::xml::newElementText -owner $owner -name schema -text $schema] - set schemaversion [lors::imsmd::xml::newElementText -owner $owner -name schemaversion -text $schemaversion] + ## IMS MD XML creation + ## LOM data types - $metadata appendChild $schema - $metadata appendChild $schemaversion - $metadata appendChild $lom - - return $metadata + # langstring + ad_proc -public newLangString { + {-owner:required} + {-lang:required} + {-string:required} + } { + Creates an LangString data type XML node + + @param owner owner node + @param lang language + @param string String + @author Ernie Ghiglione (ErnieG@mm.st). + } { + set ls_string [lors::imsmd::xml::newText -owner $owner \ + -text $string] + set lang_string_node [lors::imsmd::xml::newElement -owner $owner \ + -name langstring] + $lang_string_node setAttribute xml:lang $lang + $lang_string_node appendChild $ls_string + return $lang_string_node } - ad_proc -public lom { - {-owner:required} - {-general {}} - {-lifecycle {}} - {-metametadata {}} - {-technical {}} - {-educational {}} - {-rights {}} - {-relation {}} - {-annotation {}} - {-classification {}} + ad_proc -public md { + {-owner:required} + {-schema:required} + {-schemaversion:required} + {-lom:required} } { - Creates a LOM node. - It puts together all the nodes and returns a LOMs node. - - @param owner ownerDocument node - @param general General node - @param lifecycle Lifecycle node - @param metametadata Metametadata node - @param technical Technical node - @param educational Educational node - @param rights Rights node - @param relation Relation node - @param annotation Annotation node - @param classification Classification node + Creates a metadata node. - @author Ernie Ghiglione (ErnieG@mm.st). + @param owner Owner node + @param schema schema + @param schemaversion schemaversion + @param lom lom node + @author Ernie Ghiglione (ErnieG@mm.st). } { + set metadata [lors::imsmd::xml::newElement \ + -owner $owner \ + -name metadata] - set lom [lors::imsmd::xml::newElement -owner $owner -name lom] + $metadata appendChild [lors::imsmd::xml::newComment \ + -owner $owner \ + -comment "Generated by LORSm"] - if {![empty_string_p $general]} { - $lom appendChild $general - } + set schema [lors::imsmd::xml::newElementText \ + -owner $owner \ + -name schema \ + -text $schema] - if {![empty_string_p $lifecycle]} { - $lom appendChild $lifecycle - } + set schemaversion [lors::imsmd::xml::newElementText \ + -owner $owner \ + -name schemaversion \ + -text $schemaversion] - if {![empty_string_p $metametadata]} { - $lom appendChild $metametadata - } + $metadata appendChild $schema + $metadata appendChild $schemaversion + $metadata appendChild $lom - if {![empty_string_p $technical]} { - $lom appendChild $technical - } - - if {![empty_string_p $educational]} { - $lom appendChild $educational - } - - if {![empty_string_p $rights]} { - $lom appendChild $rights - } - - if {![empty_string_p $relation]} { - $lom appendChild $relation - } - - if {![empty_string_p $annotation]} { - $lom appendChild $annotation - } - - if {![empty_string_p $classification]} { - $lom appendChild $classification - } - - return $lom - - + return $metadata } - ad_proc -public lom_general { - {-owner:required} - {-identifier {}} - {-title {}} - {-catalogentry {}} - {-language {}} - {-description {}} - {-keyword {}} - {-coverage {}} - {-structure {}} - {-aggregationlevel {}} + ad_proc -public lom { + {-owner:required} + {-general {}} + {-lifecycle {}} + {-metametadata {}} + {-technical {}} + {-educational {}} + {-rights {}} + {-relation {}} + {-annotation {}} + {-classification {}} } { - Creates a LOM general node. - It puts together all the general nodes + Creates a LOM node. + It puts together all the nodes and returns a LOMs node. - refer to http://www.imsglobal.org/metadata/imsmdv1p2p1/imsmd_bindv1p2p1.html - for further details. + @param owner ownerDocument node + @param general General node + @param lifecycle Lifecycle node + @param metametadata Metametadata node + @param technical Technical node + @param educational Educational node + @param rights Rights node + @param relation Relation node + @param annotation Annotation node + @param classification Classification node + @author Ernie Ghiglione (ErnieG@mm.st). + } { - @param owner ownerDocument node - @param identifier identifier - @param title Name given to the learning object. element occurs 0 or 1 time within the element. - @param catalogentry This data element defines an entry within a catalog. element occurs 0 or more times. - @param language The primary human language or languages used within this learning object to communicate to the intended user.element occurs 0 or more times - @param description A textual description of the content of this learning object.element occurs 0 or more times - @param keyword A collection of keywords or phrases describing this learning object. element occurs 0 or more times - @param coverage The span or extent of such things as time, culture, geography or region that applies to this learning object.element occurs 0 or more times - @param structure Underlying organizational structure element occur 0 or 1 time - @param aggregationlevel The functional granularity. element occurs 0 or 1 time + set lom [lors::imsmd::xml::newElement \ + -owner $owner \ + -name lom] - @author Ernie Ghiglione (ErnieG@mm.st). - } { + if {![empty_string_p $general]} { + $lom appendChild $general + } + if {![empty_string_p $lifecycle]} { + $lom appendChild $lifecycle + } - set general [lors::imsmd::xml::newElement -owner $owner -name general] + if {![empty_string_p $metametadata]} { + $lom appendChild $metametadata + } - # identifier + if {![empty_string_p $technical]} { + $lom appendChild $technical + } - if {![empty_string_p $identifier]} { + if {![empty_string_p $educational]} { + $lom appendChild $educational + } - set identifier_node [lors::imsmd::xml::newElementText \ - -owner $owner \ - -name indentifier \ - -text $identifier] + if {![empty_string_p $rights]} { + $lom appendChild $rights + } - $general appendChild $identifier_node - } + if {![empty_string_p $relation]} { + $lom appendChild $relation + } + if {![empty_string_p $annotation]} { + $lom appendChild $annotation + } - # title + if {![empty_string_p $classification]} { + $lom appendChild $classification + } + return $lom + } - if {![empty_string_p $title]} { - set title_node [lors::imsmd::xml::newElement -owner $owner -name title] - - foreach {y z} $title { - set langstring_node [lors::imsmd::create::newLangString \ - -owner $owner \ - -lang $y \ - -string $z \ - ] - - - $title_node appendChild $langstring_node + ad_proc -public lom_general { + {-owner:required} + {-identifier {}} + {-title {}} + {-catalogentry {}} + {-language {}} + {-description {}} + {-keyword {}} + {-coverage {}} + {-structure {}} + {-aggregationlevel {}} + } { + Creates a LOM general node. + It puts together all the general nodes - } + refer to http://www.imsglobal.org/metadata/imsmdv1p2p1/imsmd_bindv1p2p1.html + for further details. - $general appendChild $title_node - } - - # description - if {![empty_string_p $description]} { + @param owner ownerDocument node + @param identifier identifier + @param title Name given to the learning object. element occurs 0 or 1 time within the element. + @param catalogentry This data element defines an entry within a catalog. element occurs 0 or more times. + @param language The primary human language or languages used within this learning object to communicate to the intended user.element occurs 0 or more times + @param description A textual description of the content of this learning object.element occurs 0 or more times + @param keyword A collection of keywords or phrases describing this learning object. element occurs 0 or more times + @param coverage The span or extent of such things as time, culture, geography or region that applies to this learning object.element occurs 0 or more times + @param structure Underlying organizational structure element occur 0 or 1 time + @param aggregationlevel The functional granularity. element occurs 0 or 1 time - set description_node [lors::imsmd::xml::newElement -owner $owner -name description] - - foreach {y z} $description { - set langstring_node [lors::imsmd::create::newLangString \ - -owner $owner \ - -lang $y \ - -string $z \ - ] - - - $description_node appendChild $langstring_node + @author Ernie Ghiglione (ErnieG@mm.st). + } { + set general [lors::imsmd::xml::newElement \ + -owner $owner \ + -name general] - } + # identifier + if {![empty_string_p $identifier]} { + set identifier_node [lors::imsmd::xml::newElementText \ + -owner $owner \ + -name indentifier \ + -text $identifier] + $general appendChild $identifier_node + } - $general appendChild $description_node - } + # title + if {![empty_string_p $title]} { + set title_node [lors::imsmd::xml::newElement \ + -owner $owner \ + -name title] - return $general + foreach {y z} $title { + set langstring_node [lors::imsmd::create::newLangString \ + -owner $owner \ + -lang $y \ + -string $z] + $title_node appendChild $langstring_node + } + $general appendChild $title_node + } - } + # description + if {![empty_string_p $description]} { + set description_node [lors::imsmd::xml::newElement \ + -owner $owner \ + -name description] + foreach {y z} $description { + set langstring_node [lors::imsmd::create::newLangString \ + -owner $owner \ + -lang $y \ + -string $z] + $description_node appendChild $langstring_node + } + $general appendChild $description_node + } + return $general + } } -