Class: Scorm::Manifest

Inherits:
Object
  • Object
show all
Defined in:
lib/scorm/manifest.rb

Constant Summary collapse

SUPPORTED_VERSIONS =

Versions of the SCORM standard that is supported when running in strict mode. When not running in strict mode, the library will not care about the version specified in the package manifest and will simply try its best to parse the information that it finds.

['2004 3rd Edition', 'CAM 1.3', '1.2']
MANIFEST_FILES =

List of XML and XML Schema files that are part of the manifest for the package.

%w(imsmanifest.xml adlcp_rootv1p2.xsd ims_xml.xsd
imscp_rootv1p1p2.xsd imsmd_rootv1p2p1.xsd)
RESOURCES_BLACKLIST =

Files that might be present in a package, but that should not be interprested as resources. All files starting with a “.” (i.e. hidden files) is also implicitly included in this list.

[
  '__MACOSX', 'desktop.ini', 'Thumbs.db'
].concat(MANIFEST_FILES)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(package, manifest_data) ⇒ Manifest

Returns a new instance of Manifest


36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/scorm/manifest.rb', line 36

def initialize(package, manifest_data)
  @xmldoc = REXML::Document.new(manifest_data)

  @package = package
  @metadata = Scorm::Metadata.new
  @organizations = Hash.new
  @resources = Hash.new

  # Manifest identifier
  @identifier = @xmldoc.root.attribute('identifier').to_s

  # Read metadata
  if  = REXML::XPath.first(@xmldoc.root, '/manifest/metadata')
    # Read <schema> and <schemaversion>
    schema_el = REXML::XPath.first(, 'schema')
    schemaversion_el = REXML::XPath.first(, 'schemaversion')
    @schema = schema_el.text.to_s unless schema_el.nil?
    @schema_version = schemaversion_el.text.to_s unless schemaversion_el.nil?

    if @package.kind_of?(ActiveRecord::Relation)
      #todo need special scorm course with options
    else
      if @package.options[:strict]
        if (@schema != 'ADL SCORM') || (!SUPPORTED_VERSIONS.include?(@schema_version))
          raise InvalidManifest, "Sorry, unsupported SCORM-version (#{schema_el.text.to_s} #{schemaversion_el.text.to_s}), try turning strict parsing off."
        end
      end
    end

    # Find a <lom> element...
    lom_el = nil
    if adlcp_location = REXML::XPath.first(, 'adlcp:location')
      # Read external metadata file
       = if @package.kind_of?(ActiveRecord::Relation)
                          file_obj = @package.detect{|obj| obj.path.match("#{adlcp_location.text.to_s}")}
                          REXML::Document.new(file_obj.file.read)
                        else
                          REXML::Document.new(@package.file(adlcp_location.text.to_s))
                        end
      if .nil? || (.root.name != 'lom')
        raise InvalidManifest, "Invalid external metadata file (#{adlcp_location.text.to_s})."
      else
        lom_el = .root
      end
    else
      # Read inline metadata
      lom_el = REXML::XPath.first(, 'lom') ||
        REXML::XPath.first(, 'lom:lom')
    end

    # Read lom metadata
    if lom_el
      @metadata = Scorm::Metadata.from_xml(lom_el)
    end
  end

  # Read organizations
  if organizations_el = REXML::XPath.first(@xmldoc.root, '/manifest/organizations')
    default_organization_id = organizations_el.attribute('default').to_s
    REXML::XPath.each(@xmldoc.root, '/manifest/organizations/organization') do |el|
      org = Scorm::Organization.from_xml(el)
      @organizations[org.id.to_s] = org
    end
    # Set the default organization
    @default_organization = @organizations[default_organization_id]
    raise InvalidManifest, "No default organization (#{default_organization_id})." if @default_organization.nil?
  else
    raise InvalidManifest, 'Missing organizations element.'
  end

  # Read resources
  REXML::XPath.each(@xmldoc.root, '/manifest/resources/resource') do |el|
    res = Scorm::Resource.from_xml(el)
    @resources[res.id] = res
  end

  # Read additional resources as assets (this is a fix for packages that
  # don't correctly specify all resource dependencies in the manifest).

  if @package.kind_of?(ActiveRecord::Relation)
    @package.each do |file|
      res = Scorm::Resource.new(file.file, 'webcontent', 'asset', file.file, nil, [file.file])
      @resources[file.file] = res
    end
  else
    @package.files.each do |file|
      next if File.directory?(file)
      next if RESOURCES_BLACKLIST.include?(File.basename(file))
      next if File.basename(file) =~ /^\./
      next unless self.resources(:with_file => file).empty?
      next unless self.resources(:href => file).empty?

      res = Scorm::Resource.new(file, 'webcontent', 'asset', file, nil, [file])
      @resources[file] = res
    end
  end

  # Read (optional) base url for resources
  resources_el = REXML::XPath.first(@xmldoc.root, '/manifest/resources')
  @base_url = (resources_el.attribute('xml:base') || '').to_s

  # Read sub-manifests
  #REXML::XPath.
end

Instance Attribute Details

#base_urlObject

Returns the value of attribute base_url


32
33
34
# File 'lib/scorm/manifest.rb', line 32

def base_url
  @base_url
end

#default_organizationObject

Returns the value of attribute default_organization


30
31
32
# File 'lib/scorm/manifest.rb', line 30

def default_organization
  @default_organization
end

#identifierObject

Returns the value of attribute identifier


27
28
29
# File 'lib/scorm/manifest.rb', line 27

def identifier
  @identifier
end

#metadataObject

Returns the value of attribute metadata


28
29
30
# File 'lib/scorm/manifest.rb', line 28

def 
  @metadata
end

#organizationsObject

Returns the value of attribute organizations


29
30
31
# File 'lib/scorm/manifest.rb', line 29

def organizations
  @organizations
end

#resources(options = nil) ⇒ Object

Returns the value of attribute resources


31
32
33
# File 'lib/scorm/manifest.rb', line 31

def resources
  @resources
end

#schemaObject

Returns the value of attribute schema


33
34
35
# File 'lib/scorm/manifest.rb', line 33

def schema
  @schema
end

#schema_versionObject

Returns the value of attribute schema_version


34
35
36
# File 'lib/scorm/manifest.rb', line 34

def schema_version
  @schema_version
end

Instance Method Details

#sco(item, attribute = nil) ⇒ Object


165
166
167
168
169
# File 'lib/scorm/manifest.rb', line 165

def sco(item, attribute = nil)
  resource = self.resources(:id => item.resource_id).first
  resource = (resource && resource.scorm_type == 'sco') ? resource : nil
  return (resource && attribute) ? resource.send(attribute) : resource
end