| 6 | | from collective.imstransport.utilities.imscp.cpreader import CPReader |
| 7 | | from collective.imstransport.utilities.imscp.cpresourcereader import CPResourceReader |
| 8 | | import re |
| 9 | | from collective.imstransport import IMSTransportMessageFactory as _ |
| 10 | | from collective.imstransport.IMS_exceptions import ManifestError |
| 11 | | from xml.dom import minidom |
| 12 | | |
| | 3 | from collective.imstransport.utilities.mit.mitreader import MITReader |
| | 4 | from zope.component import getUtility |
| | 5 | from collective.imstransport.utilities.interfaces import IIMSObjectCreator |
| 40 | | mitcpreader.parseManifest(manifest) |
| 41 | | orgdata = mitcpreader.readOrganizations() |
| 42 | | resourceids = mitcpreader.readResources() |
| | 24 | try: |
| | 25 | doc = mitreader.parseManifest(manifest) |
| | 26 | except ExpatError, e: |
| | 27 | raise ManifestError, str(e) |
| | 28 | base = mitreader.readManifestBase(doc) |
| | 29 | objDict['package'] = mitreader.readPackageMetadata(doc) |
| | 30 | orgs = mitreader.readOrganizations(doc) |
| | 31 | resources = mitreader.readResources(doc) |
| 44 | | for resourceid in resourceids: |
| | 33 | for x in resources: |
| | 34 | resid, restype, reshref = mitreader.readResourceAttributes(x) |
| | 35 | location = mitreader.readLocation(x) |
| | 36 | if location: |
| | 37 | dataxml = source.readFile('%s%s' %(base,location)) |
| | 38 | resdata = mitreader.parseDataFile(dataxml) |
| | 39 | metadata = mitreader.readMetadata(resdata) |
| | 40 | else: |
| | 41 | metadata = {} |
| | 42 | files = mitreader.readFiles(base, x) |
| 46 | | #### Change here from CPResource reader to MIT specific. |
| 47 | | mitresourcereader = MITCPResourceReader(mitcpreader, resourceid, "http://ocw.mit.edu/xmlns/LOM") |
| | 44 | if not files and reshref: |
| | 45 | files = ['%s%s' %(base,reshref),] |
| | 46 | for y in files: |
| | 47 | hash = resid + y |
| | 48 | # If there is only one file, or it matches the reshref |
| | 49 | # add the metadata to it if it exists |
| | 50 | if y == reshref or len(files) == 1: |
| | 51 | objDict[hash] = metadata |
| | 52 | # If it is listed in the org section |
| | 53 | if orgs.has_key(resid): |
| | 54 | numval, navval = orgs[resid] |
| | 55 | if numval: |
| | 56 | objDict[hash]['position'] = numval |
| | 57 | objDict[hash]['excludeFromNav'] = False |
| | 58 | else: |
| | 59 | objDict[hash]['excludeFromNav'] = True |
| | 60 | if navval: |
| | 61 | # Use 'and' as opposed to 'or' to avoid KeyError |
| | 62 | if not (objDict[hash].has_key('title') and objDict[hash]['title']): |
| | 63 | objDict[hash]['title'] = orgs[resid][1] |
| | 64 | else: |
| | 65 | objDict[hash]['excludeFromNav'] = True |
| | 66 | objDict[hash]['type'] = self.determineType(objDict[hash], y) |
| | 67 | if objDict[hash]['type'] == 'Document': |
| | 68 | file = source.readFile(y) |
| | 69 | objDict[hash]['text'] = mitreader.runFilters(file, ['stripchrome']) |
| | 70 | else: |
| | 71 | objDict[hash]['file'] = y |
| | 72 | # If it is just a lowly file |
| | 73 | else: |
| | 74 | objDict[hash] = {} |
| | 75 | objDict[hash]['excludeFromNav'] = True |
| | 76 | objDict[hash]['type'] = self.determineType(objDict[hash], y) |
| | 77 | if objDict[hash]['type'] == 'Document': |
| | 78 | file = source.readFile(y) |
| | 79 | objDict[hash]['text'] = mitreader.runFilters(file, ['stripchrome']) |
| | 80 | else: |
| | 81 | objDict[hash]['file'] = y |
| 52 | | if datafile: |
| 53 | | metadataxml = source.readFile('%s%s' %(base, datafile)) |
| 54 | | mitresourcereader.parseMetadataDoc(metadataxml) |
| 55 | | resdata = self._parseResourceMetadata(mitresourcereader, resourceid) |
| 56 | | |
| 57 | | reshref = mitresourcereader.getHref() |
| 58 | | files = mitresourcereader.readFiles() |
| 59 | | hashref = resourceid |
| 60 | | |
| 61 | | hashref = '' |
| 62 | | if files: |
| 63 | | for relfile in files: |
| 64 | | file = '%s%s' %(base, relfile) |
| 65 | | |
| 66 | | id = self._createIdFromFile(file) |
| 67 | | path = self._createPathFromFile(file) |
| 68 | | |
| 69 | | if reshref == file or len(files) == 1: |
| 70 | | hashref = resourceid |
| 71 | | objDict[hashref] = resdata |
| 72 | | |
| 73 | | # Check if item is in organizations section |
| 74 | | orgs = [org for org in orgdata if org] |
| 75 | | if hashref in orgs: |
| 76 | | objDict[hashref]['excludeFromNav'] = False |
| 77 | | objDict[hashref]['title'] = orgdata[hashref] |
| 78 | | else: |
| 79 | | objDict[hashref]['excludeFromNav'] = True |
| 80 | | |
| 81 | | else: |
| 82 | | hashref = '%s%s' %(resourceid, file) |
| 83 | | objDict[hashref] = {} |
| 84 | | objDict[hashref]['excludeFromNav'] = True |
| 85 | | |
| 86 | | self._parseFile(file, objDict, hashref, id, path) |
| 87 | | |
| 90 | | return |
| 91 | | |
| 92 | | |
| 93 | | ADLCP_namespace = "http://www.adlnet.org/xsd/adlcp_rootv1p2" |
| 94 | | IMSCP_namespace = "http://www.imsglobal.org/xsd/imscp_v1p1" |
| 95 | | |
| 96 | | class MITCPResourceReader(CPResourceReader): |
| 97 | | |
| 98 | | |
| 99 | | def __init__(self, reader, id, lom_namespace): |
| 100 | | """ Constructor for MITResourceReader """ |
| 101 | | self.id = id |
| 102 | | self.reader = reader |
| 103 | | self.document = self.reader.document |
| 104 | | self.resource = None |
| 105 | | self.files = [] |
| 106 | | self.resdict = {} |
| 107 | | self.href = '' |
| 108 | | self.datafile = '' |
| 109 | | self.lom_namespace = lom_namespace |
| 110 | | |
| 111 | | |
| 112 | | |
| 113 | | resources = self.document.getElementsByTagName('resources') |
| 114 | | if resources: |
| 115 | | for res in resources[0].getElementsByTagName('resource'): |
| 116 | | if self.id == res.getAttribute('identifier'): |
| 117 | | self.resource = res |
| 118 | | self.href = res.getAttribute('href') |
| 119 | | break |
| 120 | | |
| 121 | | metadata_nodes = self.resource.getElementsByTagName('metadata') |
| 122 | | if metadata_nodes: |
| 123 | | data_file_nodes = metadata_nodes[0].getElementsByTagNameNS(ADLCP_namespace, 'location') |
| 124 | | if data_file_nodes: |
| 125 | | self.datafile = self.reader.getTextValue(data_file_nodes[0]) |
| 126 | | |
| 127 | | def getDataFile(self): |
| 128 | | """ Return the data file """ |
| 129 | | return self.datafile |
| 130 | | |
| 131 | | def parseMetadataDoc(self, resxml): |
| 132 | | """ Parse xml data file for mit resources """ |
| 133 | | document = minidom.parseString(resxml) |
| 134 | | lom_nodes = document.getElementsByTagNameNS(self.lom_namespace, 'lom') |
| 135 | | if lom_nodes: |
| 136 | | self.lom_node = lom_nodes[0] |
| 137 | | |
| 138 | | class MITCPReader(CPReader): |
| 139 | | |
| 140 | | def getBase(self): |
| 141 | | """ Return the base from the manifest element """ |
| 142 | | manifest_nodes = self.document.getElementsByTagName('manifest') |
| 143 | | if manifest_nodes: |
| 144 | | return manifest_nodes[0].getAttribute('xml:base') |
| 145 | | else: |
| 146 | | return None |
| 147 | | |
| 148 | | |
| 149 | | |
| 150 | | |
| 151 | | |
| 152 | | |
| 153 | | |
| 154 | | |
| 155 | | |